yaleh commited on
Commit
76adccc
·
1 Parent(s): 97ecca5

Streamlit works.

Browse files
app/gradio_sample_generator.py ADDED
@@ -0,0 +1,177 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from langchain_community.chat_models import ChatOpenAI
3
+ from meta_prompt.sample_generator import TaskDescriptionGenerator
4
+
5
+ def process_json(input_json, model_name, generating_batch_size, temperature):
6
+ try:
7
+ model = ChatOpenAI(model=model_name, temperature=temperature, max_retries=3)
8
+ generator = TaskDescriptionGenerator(model)
9
+ result = generator.process(input_json, generating_batch_size)
10
+ description = result["description"]
11
+ examples_directly = [[example["input"], example["output"]] for example in result["examples_directly"]["examples"]]
12
+ input_analysis = result["examples_from_briefs"]["input_analysis"]
13
+ new_example_briefs = result["examples_from_briefs"]["new_example_briefs"]
14
+ examples_from_briefs = [[example["input"], example["output"]] for example in result["examples_from_briefs"]["examples"]]
15
+ examples = [[example["input"], example["output"]] for example in result["additional_examples"]]
16
+ return description, examples_directly, input_analysis, new_example_briefs, examples_from_briefs, examples
17
+ except Exception as e:
18
+ raise gr.Error(f"An error occurred: {str(e)}")
19
+
20
+ def generate_description_only(input_json, model_name, temperature):
21
+ try:
22
+ model = ChatOpenAI(model=model_name, temperature=temperature, max_retries=3)
23
+ generator = TaskDescriptionGenerator(model)
24
+ description = generator.generate_description(input_json)
25
+ return description
26
+ except Exception as e:
27
+ raise gr.Error(f"An error occurred: {str(e)}")
28
+
29
+ def analyze_input(description, model_name, temperature):
30
+ try:
31
+ model = ChatOpenAI(model=model_name, temperature=temperature, max_retries=3)
32
+ generator = TaskDescriptionGenerator(model)
33
+ input_analysis = generator.analyze_input(description)
34
+ return input_analysis
35
+ except Exception as e:
36
+ raise gr.Error(f"An error occurred: {str(e)}")
37
+
38
+ def generate_briefs(description, input_analysis, generating_batch_size, model_name, temperature):
39
+ try:
40
+ model = ChatOpenAI(model=model_name, temperature=temperature, max_retries=3)
41
+ generator = TaskDescriptionGenerator(model)
42
+ briefs = generator.generate_briefs(description, input_analysis, generating_batch_size)
43
+ return briefs
44
+ except Exception as e:
45
+ raise gr.Error(f"An error occurred: {str(e)}")
46
+
47
+ def generate_examples_from_briefs(description, new_example_briefs, input_str, generating_batch_size, model_name, temperature):
48
+ try:
49
+ model = ChatOpenAI(model=model_name, temperature=temperature, max_retries=3)
50
+ generator = TaskDescriptionGenerator(model)
51
+ result = generator.generate_examples_from_briefs(description, new_example_briefs, input_str, generating_batch_size)
52
+ examples = [[example["input"], example["output"]] for example in result["examples"]]
53
+ return examples
54
+ except Exception as e:
55
+ raise gr.Error(f"An error occurred: {str(e)}")
56
+
57
+ def generate_examples_directly(description, raw_example, generating_batch_size, model_name, temperature):
58
+ try:
59
+ model = ChatOpenAI(model=model_name, temperature=temperature, max_retries=3)
60
+ generator = TaskDescriptionGenerator(model)
61
+ result = generator.generate_examples_directly(description, raw_example, generating_batch_size)
62
+ examples = [[example["input"], example["output"]] for example in result["examples"]]
63
+ return examples
64
+ except Exception as e:
65
+ raise gr.Error(f"An error occurred: {str(e)}")
66
+
67
+ def format_selected_example(evt: gr.SelectData, examples):
68
+ if evt.index[0] < len(examples):
69
+ selected_example = examples.iloc[evt.index[0]] # Use iloc to access by integer position
70
+ json_example = json.dumps({"input": selected_example.iloc[0], "output": selected_example.iloc[1]}, indent=2, ensure_ascii=False)
71
+ return json_example
72
+ return ""
73
+
74
+ with gr.Blocks(title="Task Description Generator") as demo:
75
+ gr.Markdown("# Task Description Generator")
76
+ gr.Markdown("Enter a JSON object with 'input' and 'output' fields to generate a task description and additional examples.")
77
+
78
+ with gr.Row():
79
+ with gr.Column(scale=1): # Inputs column
80
+ input_json = gr.Textbox(label="Input JSON", lines=10, show_copy_button=True)
81
+ model_name = gr.Dropdown(
82
+ label="Model Name",
83
+ choices=["llama3-70b-8192", "llama3-8b-8192", "llama-3.1-70b-versatile", "llama-3.1-8b-instant", "gemma2-9b-it"],
84
+ value="llama3-70b-8192"
85
+ )
86
+ temperature = gr.Slider(label="Temperature", value=1.0, minimum=0.0, maximum=1.0, step=0.1)
87
+ generating_batch_size = gr.Slider(label="Generating Batch Size", value=3, minimum=1, maximum=10, step=1)
88
+ with gr.Row():
89
+ submit_button = gr.Button("Generate", variant="primary")
90
+ generate_description_button = gr.Button("Generate Description", variant="secondary")
91
+
92
+ with gr.Column(scale=1): # Outputs column
93
+ description_output = gr.Textbox(label="Description", lines=5, show_copy_button=True)
94
+ with gr.Row():
95
+ generate_examples_directly_button = gr.Button("Generate Examples Directly", variant="secondary")
96
+ analyze_input_button = gr.Button("Analyze Input", variant="secondary")
97
+ examples_directly_output = gr.DataFrame(label="Examples Directly", headers=["Input", "Output"], interactive=False)
98
+ input_analysis_output = gr.Textbox(label="Input Analysis", lines=5, show_copy_button=True)
99
+ generate_briefs_button = gr.Button("Generate Briefs", variant="secondary")
100
+ example_briefs_output = gr.Textbox(label="Example Briefs", lines=5, show_copy_button=True)
101
+ generate_examples_from_briefs_button = gr.Button("Generate Examples from Briefs", variant="secondary")
102
+ examples_from_briefs_output = gr.DataFrame(label="Examples from Briefs", headers=["Input", "Output"], interactive=False)
103
+ examples_output = gr.DataFrame(label="Examples", headers=["Input", "Output"], interactive=False)
104
+ new_example_json = gr.Textbox(label="New Example JSON", lines=5, show_copy_button=True)
105
+
106
+ clear_button = gr.ClearButton([input_json, description_output, input_analysis_output,
107
+ example_briefs_output, examples_from_briefs_output,
108
+ examples_output, new_example_json])
109
+
110
+ submit_button.click(
111
+ fn=process_json,
112
+ inputs=[input_json, model_name, generating_batch_size, temperature],
113
+ outputs=[description_output, examples_directly_output, input_analysis_output, example_briefs_output, examples_from_briefs_output, examples_output]
114
+ )
115
+
116
+ generate_description_button.click(
117
+ fn=generate_description_only,
118
+ inputs=[input_json, model_name, temperature],
119
+ outputs=[description_output]
120
+ )
121
+
122
+ generate_examples_directly_button.click(
123
+ fn=generate_examples_directly,
124
+ inputs=[description_output, input_json, generating_batch_size, model_name, temperature],
125
+ outputs=[examples_directly_output]
126
+ )
127
+
128
+ analyze_input_button.click(
129
+ fn=analyze_input,
130
+ inputs=[description_output, model_name, temperature],
131
+ outputs=[input_analysis_output]
132
+ )
133
+
134
+ generate_briefs_button.click(
135
+ fn=generate_briefs,
136
+ inputs=[description_output, input_analysis_output, generating_batch_size, model_name, temperature],
137
+ outputs=[example_briefs_output]
138
+ )
139
+
140
+ generate_examples_from_briefs_button.click(
141
+ fn=generate_examples_from_briefs,
142
+ inputs=[description_output, example_briefs_output, input_json, generating_batch_size, model_name, temperature],
143
+ outputs=[examples_from_briefs_output]
144
+ )
145
+
146
+ examples_directly_output.select(
147
+ fn=format_selected_example,
148
+ inputs=[examples_directly_output],
149
+ outputs=[new_example_json]
150
+ )
151
+
152
+ examples_from_briefs_output.select(
153
+ fn=format_selected_example,
154
+ inputs=[examples_from_briefs_output],
155
+ outputs=[new_example_json]
156
+ )
157
+
158
+ examples_output.select(
159
+ fn=format_selected_example,
160
+ inputs=[examples_output],
161
+ outputs=[new_example_json]
162
+ )
163
+
164
+ gr.Markdown("### Manual Flagging")
165
+ with gr.Row():
166
+ flag_button = gr.Button("Flag")
167
+ flag_reason = gr.Textbox(label="Reason for flagging")
168
+
169
+ flagging_callback = gr.CSVLogger()
170
+ flag_button.click(
171
+ lambda *args: flagging_callback.flag(args),
172
+ inputs=[input_json, model_name, generating_batch_size, description_output, examples_output, flag_reason],
173
+ outputs=[]
174
+ )
175
+
176
+ if __name__ == "__main__":
177
+ demo.launch()
app/streamlit_sample_generator.py ADDED
@@ -0,0 +1,179 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import streamlit as st
3
+ import json
4
+ from langchain_community.chat_models import ChatOpenAI
5
+ from meta_prompt.sample_generator import TaskDescriptionGenerator
6
+
7
+ def process_json(input_json, model_name, generating_batch_size, temperature):
8
+ try:
9
+ model = ChatOpenAI(model=model_name, temperature=temperature, max_retries=3)
10
+ generator = TaskDescriptionGenerator(model)
11
+ result = generator.process(input_json, generating_batch_size)
12
+ description = result["description"]
13
+ examples_directly = [[example["input"], example["output"]] for example in result["examples_directly"]["examples"]]
14
+ input_analysis = result["examples_from_briefs"]["input_analysis"]
15
+ new_example_briefs = result["examples_from_briefs"]["new_example_briefs"]
16
+ examples_from_briefs = [[example["input"], example["output"]] for example in result["examples_from_briefs"]["examples"]]
17
+ examples = [[example["input"], example["output"]] for example in result["additional_examples"]]
18
+ return description, examples_directly, input_analysis, new_example_briefs, examples_from_briefs, examples
19
+ except Exception as e:
20
+ st.error(f"An error occurred: {str(e)}")
21
+
22
+ def generate_description_only(input_json, model_name, temperature):
23
+ try:
24
+ model = ChatOpenAI(model=model_name, temperature=temperature, max_retries=3)
25
+ generator = TaskDescriptionGenerator(model)
26
+ description = generator.generate_description(input_json)
27
+ return description
28
+ except Exception as e:
29
+ st.error(f"An error occurred: {str(e)}")
30
+
31
+ def analyze_input(description, model_name, temperature):
32
+ try:
33
+ model = ChatOpenAI(model=model_name, temperature=temperature, max_retries=3)
34
+ generator = TaskDescriptionGenerator(model)
35
+ input_analysis = generator.analyze_input(description)
36
+ return input_analysis
37
+ except Exception as e:
38
+ st.error(f"An error occurred: {str(e)}")
39
+
40
+ def generate_briefs(description, input_analysis, generating_batch_size, model_name, temperature):
41
+ try:
42
+ model = ChatOpenAI(model=model_name, temperature=temperature, max_retries=3)
43
+ generator = TaskDescriptionGenerator(model)
44
+ briefs = generator.generate_briefs(description, input_analysis, generating_batch_size)
45
+ return briefs
46
+ except Exception as e:
47
+ st.error(f"An error occurred: {str(e)}")
48
+
49
+ def generate_examples_from_briefs(description, new_example_briefs, input_str, generating_batch_size, model_name, temperature):
50
+ try:
51
+ model = ChatOpenAI(model=model_name, temperature=temperature, max_retries=3)
52
+ generator = TaskDescriptionGenerator(model)
53
+ result = generator.generate_examples_from_briefs(description, new_example_briefs, input_str, generating_batch_size)
54
+ examples = [[example["input"], example["output"]] for example in result["examples"]]
55
+ return examples
56
+ except Exception as e:
57
+ st.error(f"An error occurred: {str(e)}")
58
+
59
+ def generate_examples_directly(description, raw_example, generating_batch_size, model_name, temperature):
60
+ try:
61
+ model = ChatOpenAI(model=model_name, temperature=temperature, max_retries=3)
62
+ generator = TaskDescriptionGenerator(model)
63
+ result = generator.generate_examples_directly(description, raw_example, generating_batch_size)
64
+ examples = [[example["input"], example["output"]] for example in result["examples"]]
65
+ return examples
66
+ except Exception as e:
67
+ st.error(f"An error occurred: {str(e)}")
68
+
69
+ # Session State
70
+ if 'description_output_text' not in st.session_state:
71
+ st.session_state.description_output_text = ''
72
+
73
+ if 'input_analysis_output_text' not in st.session_state:
74
+ st.session_state.input_analysis_output_text = ''
75
+
76
+ if 'example_briefs_output_text' not in st.session_state:
77
+ st.session_state.example_briefs_output_text = ''
78
+
79
+ if 'examples_from_briefs_dataframe' not in st.session_state:
80
+ st.session_state.examples_from_briefs_dataframe = pd.DataFrame(columns=["Input", "Output"])
81
+
82
+ if 'examples_directly_dataframe' not in st.session_state:
83
+ st.session_state.examples_directly_dataframe = pd.DataFrame(columns=["Input", "Output"])
84
+
85
+ if 'examples_dataframe' not in st.session_state:
86
+ st.session_state.examples_dataframe = pd.DataFrame(columns=["Input", "Output"])
87
+
88
+ def update_description_output_text():
89
+ st.session_state.description_output_text = generate_description_only(input_json, model_name, temperature)
90
+
91
+ def update_input_analysis_output_text():
92
+ st.session_state.input_analysis_output_text = analyze_input(description_output, model_name, temperature)
93
+
94
+ def update_example_briefs_output_text():
95
+ st.session_state.example_briefs_output_text = generate_briefs(description_output, input_analysis_output, generating_batch_size, model_name, temperature)
96
+
97
+ def update_examples_from_briefs_dataframe():
98
+ st.session_state.examples_from_briefs_dataframe = generate_examples_from_briefs(description_output, example_briefs_output, input_json, generating_batch_size, model_name, temperature)
99
+
100
+ def update_examples_directly_dataframe():
101
+ st.session_state.examples_directly_dataframe = generate_examples_directly(description_output, input_json, generating_batch_size, model_name, temperature)
102
+
103
+ def generate_examples_dataframe():
104
+ result = process_json(input_json, model_name, generating_batch_size, temperature)
105
+ description, examples_directly, input_analysis, new_example_briefs, examples_from_briefs, examples = result
106
+ st.session_state.description_output_text = description
107
+ st.session_state.examples_directly_dataframe = examples_directly
108
+ st.session_state.input_analysis_output_text = input_analysis
109
+ st.session_state.example_briefs_output_text = new_example_briefs
110
+ st.session_state.examples_from_briefs_dataframe = examples_from_briefs
111
+ st.session_state.examples_dataframe = examples
112
+
113
+ # Streamlit UI
114
+ st.title("Task Description Generator")
115
+ st.markdown("Enter a JSON object with 'input' and 'output' fields to generate a task description and additional examples.")
116
+
117
+ # Input column
118
+ input_json = st.text_area("Input JSON", height=200)
119
+ model_name = st.selectbox(
120
+ "Model Name",
121
+ ["llama3-70b-8192", "llama3-8b-8192", "llama-3.1-70b-versatile", "llama-3.1-8b-instant", "gemma2-9b-it"],
122
+ index=0
123
+ )
124
+ temperature = st.slider("Temperature", 0.0, 1.0, 1.0, 0.1)
125
+ generating_batch_size = st.slider("Generating Batch Size", 1, 10, 3, 1)
126
+
127
+ # Buttons
128
+ col1, col2 = st.columns(2)
129
+ with col1:
130
+ submit_button = st.button("Generate", type="primary", on_click=generate_examples_dataframe)
131
+ with col2:
132
+ generate_description_button = st.button("Generate Description", on_click=update_description_output_text)
133
+
134
+ # Output column
135
+
136
+ description_output = st.text_area("Description", value=st.session_state.description_output_text, height=100)
137
+
138
+ col3, col4 = st.columns(2)
139
+ with col3:
140
+ generate_examples_directly_button = st.button("Generate Examples Directly", on_click=update_examples_directly_dataframe)
141
+ with col4:
142
+ analyze_input_button = st.button("Analyze Input", on_click=update_input_analysis_output_text)
143
+
144
+ examples_directly_output = st.dataframe(st.session_state.examples_directly_dataframe, use_container_width=True)
145
+ input_analysis_output = st.text_area("Input Analysis", value=st.session_state.input_analysis_output_text, height=100)
146
+ generate_briefs_button = st.button("Generate Briefs", on_click=update_example_briefs_output_text)
147
+ example_briefs_output = st.text_area("Example Briefs", value=st.session_state.example_briefs_output_text, height=100)
148
+ generate_examples_from_briefs_button = st.button("Generate Examples from Briefs", on_click=update_examples_from_briefs_dataframe)
149
+ examples_from_briefs_output = st.dataframe(st.session_state.examples_from_briefs_dataframe, use_container_width=True)
150
+ examples_output = st.dataframe(st.session_state.examples_dataframe, use_container_width=True)
151
+ new_example_json = st.text_area("New Example JSON", height=100)
152
+
153
+ # Button actions
154
+ if submit_button:
155
+ try:
156
+ result = process_json(
157
+ input_json, model_name, generating_batch_size, temperature
158
+ )
159
+ description, examples_directly, input_analysis, new_example_briefs, examples_from_briefs, examples = result
160
+ description_output = description
161
+ examples_directly_output = examples_directly
162
+ input_analysis_output = input_analysis
163
+ example_briefs_output = new_example_briefs
164
+ examples_from_briefs_output = examples_from_briefs
165
+ examples_output = examples
166
+ except Exception as e:
167
+ st.error(f"An error occurred: {str(e)}")
168
+
169
+ if generate_examples_directly_button:
170
+ examples_directly_output = generate_examples_directly(description_output, input_json, generating_batch_size, model_name, temperature)
171
+
172
+ if analyze_input_button:
173
+ input_analysis_output = analyze_input(description_output, model_name, temperature)
174
+
175
+ if generate_briefs_button:
176
+ example_briefs_output = generate_briefs(description_output, input_analysis_output, generating_batch_size, model_name, temperature)
177
+
178
+ if generate_examples_from_briefs_button:
179
+ examples_from_briefs_output = generate_examples_from_briefs(description_output, example_briefs_output, input_json, generating_batch_size, model_name, temperature)
demo/gradio_demo.ipynb ADDED
@@ -0,0 +1,186 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import gradio as gr\n",
10
+ "\n",
11
+ "def greet(name):\n",
12
+ " return f\"Hello, {name}!\"\n",
13
+ "\n",
14
+ "iface = gr.Interface(fn=greet, inputs=\"text\", outputs=\"text\", title=\"Greeting Demo\")\n",
15
+ "iface.launch()"
16
+ ]
17
+ },
18
+ {
19
+ "cell_type": "code",
20
+ "execution_count": null,
21
+ "metadata": {},
22
+ "outputs": [],
23
+ "source": [
24
+ "import gradio as gr\n",
25
+ "\n",
26
+ "def greet(name):\n",
27
+ " return f\"Hello, {name}!\"\n",
28
+ "\n",
29
+ "def add_example(name, examples):\n",
30
+ " new_example = [name]\n",
31
+ " examples.append(new_example)\n",
32
+ " return examples\n",
33
+ "\n",
34
+ "with gr.Blocks() as demo:\n",
35
+ " name_input = gr.Textbox(label=\"Name\")\n",
36
+ " output = gr.Textbox(label=\"Greeting\")\n",
37
+ " greet_btn = gr.Button(\"Greet\")\n",
38
+ " \n",
39
+ " examples = gr.Examples(\n",
40
+ " examples=[],\n",
41
+ " inputs=[name_input],\n",
42
+ " label=\"Dynamic Examples\"\n",
43
+ " )\n",
44
+ " \n",
45
+ " add_example_input = gr.Textbox(label=\"New Example Name\")\n",
46
+ " add_example_btn = gr.Button(\"Add Example\")\n",
47
+ " \n",
48
+ " greet_btn.click(fn=greet, inputs=name_input, outputs=output)\n",
49
+ " add_example_btn.click(\n",
50
+ " fn=add_example,\n",
51
+ " inputs=[add_example_input, examples],\n",
52
+ " outputs=examples\n",
53
+ " )\n",
54
+ "\n",
55
+ "demo.launch()"
56
+ ]
57
+ },
58
+ {
59
+ "cell_type": "code",
60
+ "execution_count": 1,
61
+ "metadata": {},
62
+ "outputs": [
63
+ {
64
+ "name": "stderr",
65
+ "output_type": "stream",
66
+ "text": [
67
+ "/home/yale/work/meta-prompt/.venv/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
68
+ " from .autonotebook import tqdm as notebook_tqdm\n"
69
+ ]
70
+ },
71
+ {
72
+ "name": "stdout",
73
+ "output_type": "stream",
74
+ "text": [
75
+ "JSON Array: [1, 2, 3, 4, 5]\n",
76
+ "YAML Array: [1, 2, 3, 4, 5]\n",
77
+ "Running on local URL: http://127.0.0.1:7862\n",
78
+ "\n",
79
+ "To create a public link, set `share=True` in `launch()`.\n"
80
+ ]
81
+ },
82
+ {
83
+ "data": {
84
+ "text/html": [
85
+ "<div><iframe src=\"http://127.0.0.1:7862/\" width=\"100%\" height=\"500\" allow=\"autoplay; camera; microphone; clipboard-read; clipboard-write;\" frameborder=\"0\" allowfullscreen></iframe></div>"
86
+ ],
87
+ "text/plain": [
88
+ "<IPython.core.display.HTML object>"
89
+ ]
90
+ },
91
+ "metadata": {},
92
+ "output_type": "display_data"
93
+ },
94
+ {
95
+ "data": {
96
+ "text/plain": []
97
+ },
98
+ "execution_count": 1,
99
+ "metadata": {},
100
+ "output_type": "execute_result"
101
+ },
102
+ {
103
+ "name": "stdout",
104
+ "output_type": "stream",
105
+ "text": [
106
+ "Error loading JSON: Expecting value: line 1 column 1 (char 0)\n",
107
+ "Error loading JSON: Expecting value: line 1 column 1 (char 0)\n"
108
+ ]
109
+ }
110
+ ],
111
+ "source": [
112
+ "import gradio as gr\n",
113
+ "import json\n",
114
+ "import yaml\n",
115
+ "\n",
116
+ "def load_json_array(json_str):\n",
117
+ " try:\n",
118
+ " return json.loads(json_str)\n",
119
+ " except json.JSONDecodeError as e:\n",
120
+ " print(f\"Error loading JSON: {e}\")\n",
121
+ " return None\n",
122
+ "\n",
123
+ "def load_yaml_array(yaml_str):\n",
124
+ " try:\n",
125
+ " return yaml.safe_load(yaml_str)\n",
126
+ " except yaml.YAMLError as e:\n",
127
+ " print(f\"Error loading YAML: {e}\")\n",
128
+ " return None\n",
129
+ "\n",
130
+ "# Example usage\n",
131
+ "json_str = '[1, 2, 3, 4, 5]'\n",
132
+ "yaml_str = '---\\n- 1\\n- 2\\n- 3\\n- 4\\n- 5'\n",
133
+ "\n",
134
+ "json_array = load_json_array(json_str)\n",
135
+ "yaml_array = load_yaml_array(yaml_str)\n",
136
+ "\n",
137
+ "print(\"JSON Array:\", json_array)\n",
138
+ "print(\"YAML Array:\", yaml_array)\n",
139
+ "\n",
140
+ "# Gradio interface\n",
141
+ "with gr.Blocks() as demo:\n",
142
+ " json_input = gr.Textbox(label=\"JSON Array\")\n",
143
+ " yaml_input = gr.Textbox(label=\"YAML Array\")\n",
144
+ " json_output = gr.Textbox(label=\"Loaded JSON Array\")\n",
145
+ " yaml_output = gr.Textbox(label=\"Loaded YAML Array\")\n",
146
+ " \n",
147
+ " load_json_btn = gr.Button(\"Load JSON\")\n",
148
+ " load_yaml_btn = gr.Button(\"Load YAML\")\n",
149
+ " \n",
150
+ " load_json_btn.click(\n",
151
+ " fn=load_json_array,\n",
152
+ " inputs=json_input,\n",
153
+ " outputs=json_output\n",
154
+ " )\n",
155
+ " load_yaml_btn.click(\n",
156
+ " fn=load_yaml_array,\n",
157
+ " inputs=yaml_input,\n",
158
+ " outputs=yaml_output\n",
159
+ " )\n",
160
+ "\n",
161
+ "demo.launch()\n"
162
+ ]
163
+ }
164
+ ],
165
+ "metadata": {
166
+ "kernelspec": {
167
+ "display_name": ".venv",
168
+ "language": "python",
169
+ "name": "python3"
170
+ },
171
+ "language_info": {
172
+ "codemirror_mode": {
173
+ "name": "ipython",
174
+ "version": 3
175
+ },
176
+ "file_extension": ".py",
177
+ "mimetype": "text/x-python",
178
+ "name": "python",
179
+ "nbconvert_exporter": "python",
180
+ "pygments_lexer": "ipython3",
181
+ "version": "3.10.12"
182
+ }
183
+ },
184
+ "nbformat": 4,
185
+ "nbformat_minor": 2
186
+ }
demo/sample_generator.ipynb CHANGED
@@ -21,21 +21,6 @@
21
  "\"\"\")\n",
22
  "]\n",
23
  "\n",
24
- "# INPUT_ANALYSIS_PROMPT = [\n",
25
- "# (\"system\", \"\"\"Describe input dimensions and attributes for a specific task type.\n",
26
- "# Provide names, very brief descriptions, ranges, typical values, extreme values and\n",
27
- "# examples for each.\n",
28
- "\n",
29
- "# Format your response as follows:\n",
30
- "# Input Analysis: [Your analysis here]\n",
31
- "# \"\"\"),\n",
32
- "# (\"user\", \"\"\"Task Description:\n",
33
- "\n",
34
- "# {description}\n",
35
- "\n",
36
- "# \"\"\")\n",
37
- "# ]\n",
38
- "\n",
39
  "INPUT_ANALYSIS_PROMPT = [\n",
40
  " (\"system\", \"\"\"For the specific task type, analyze the possible task inputs across multiple dimensions.\n",
41
  " \n",
 
21
  "\"\"\")\n",
22
  "]\n",
23
  "\n",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  "INPUT_ANALYSIS_PROMPT = [\n",
25
  " (\"system\", \"\"\"For the specific task type, analyze the possible task inputs across multiple dimensions.\n",
26
  " \n",
meta_prompt/sample_generator.py ADDED
@@ -0,0 +1,234 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import yaml
3
+ from langchain.prompts import ChatPromptTemplate
4
+ from langchain.schema.output_parser import StrOutputParser
5
+ from langchain_core.runnables import RunnablePassthrough, RunnableParallel, RunnableLambda
6
+ from langchain_core.output_parsers import JsonOutputParser
7
+ from langchain.output_parsers import YamlOutputParser
8
+
9
+ # Define prompt strings as constants
10
+ DESCRIPTION_PROMPT = [
11
+ ("system", """Given the JSON example(s) for a task type:
12
+
13
+ {raw_example}
14
+
15
+ Provide a concise description of the task type, including the format and style
16
+ of the input and output. If there are multiple examples, provide an overall
17
+ description and ignore unique parts.
18
+
19
+ Format your response as follows:
20
+ Task Description: [Your description here]
21
+ """)
22
+ ]
23
+
24
+ INPUT_ANALYSIS_PROMPT = [
25
+ ("system", """For the specific task type, analyze the possible task inputs across multiple dimensions.
26
+
27
+ Conduct a detailed analysis and enumerate:
28
+
29
+ 1. Core Attributes: Identify the fundamental properties or characteristics of this input type.
30
+ 1. Variation Dimensions: For each dimension that may vary, specify:
31
+ - Dimension name
32
+ - Possible range of values or options
33
+ - Impact on input nature or task difficulty
34
+ 1. Constraints: List any rules or limitations that must be adhered to.
35
+ 1. Edge Cases: Describe extreme or special scenarios that may test the robustness of task processing.
36
+ 1. External Factors: Enumerate factors that might influence input generation or task completion.
37
+ 1. Potential Extensions: Propose ways to expand or modify this input type to create new variants.
38
+
39
+ Format your response as follows:
40
+ Input Analysis: [Your analysis here]
41
+ """),
42
+ ("user", """Task Description:
43
+
44
+ {description}
45
+
46
+ """)
47
+ ]
48
+
49
+ BRIEFS_PROMPT = [
50
+ ("system", """Given the task type description, and input analysis, generate
51
+ descriptions for {generating_batch_size} new examples with detailed attributes
52
+ based on this task type. But don't provide any detailed task output.
53
+
54
+ Use the input analysis to create diverse and comprehensive example briefs that
55
+ cover various input dimensions and attribute ranges.
56
+
57
+ Format your response as a valid YAML object with a single key 'new_example_briefs'
58
+ containing a YAML array of {generating_batch_size} objects, each with a
59
+ 'example_brief' field.
60
+ """),
61
+ ("user", """Task Description:
62
+
63
+ {description}
64
+
65
+ Input Analysis:
66
+
67
+ {input_analysis}
68
+
69
+ """)
70
+ ]
71
+
72
+ EXAMPLES_FROM_BRIEFS_PROMPT = [
73
+ ("system", """Given the task type description, brief descriptions for new examples,
74
+ and JSON example(s), generate {generating_batch_size} more input/output examples for this task type,
75
+ strictly based on the brief descriptions. Ensure that the new examples are
76
+ consistent with the brief descriptions and do not introduce any new information
77
+ not present in the briefs.
78
+
79
+ Format your response as a valid JSON object with a single key 'examples'
80
+ containing a JSON array of {generating_batch_size} objects, each with 'input' and 'output' fields.
81
+ """),
82
+ ("user", """Task Description:
83
+
84
+ {description}
85
+
86
+ New Example Briefs:
87
+
88
+ {new_example_briefs}
89
+
90
+ Example(s):
91
+
92
+ {raw_example}
93
+
94
+ """)
95
+ ]
96
+
97
+ EXAMPLES_DIRECTLY_PROMPT = [
98
+ ("system", """Given the task type description, and input/output example(s), generate {generating_batch_size}
99
+ new input/output examples for this task type.
100
+
101
+ Format your response as a valid JSON object with a single key 'examples'
102
+ containing a JSON array of {generating_batch_size} objects, each with 'input' and 'output' fields.
103
+ """),
104
+ ("user", """Task Description:
105
+
106
+ {description}
107
+
108
+ Example(s):
109
+
110
+ {raw_example}
111
+
112
+ """)
113
+ ]
114
+
115
+
116
+ class TaskDescriptionGenerator:
117
+ def __init__(self, model):
118
+ self.description_prompt = ChatPromptTemplate.from_messages(DESCRIPTION_PROMPT)
119
+ self.input_analysis_prompt = ChatPromptTemplate.from_messages(INPUT_ANALYSIS_PROMPT)
120
+ self.briefs_prompt = ChatPromptTemplate.from_messages(BRIEFS_PROMPT)
121
+ self.examples_from_briefs_prompt = ChatPromptTemplate.from_messages(EXAMPLES_FROM_BRIEFS_PROMPT)
122
+ self.examples_directly_prompt = ChatPromptTemplate.from_messages(EXAMPLES_DIRECTLY_PROMPT)
123
+
124
+ json_model = model.bind(response_format={"type": "json_object"})
125
+
126
+ output_parser = StrOutputParser()
127
+ json_parse = JsonOutputParser()
128
+
129
+ self.description_chain = self.description_prompt | model | output_parser
130
+ self.input_analysis_chain = self.input_analysis_prompt | model | output_parser
131
+ self.briefs_chain = self.briefs_prompt | model | output_parser
132
+ self.examples_from_briefs_chain = self.examples_from_briefs_prompt | json_model | json_parse
133
+ self.examples_directly_chain = self.examples_directly_prompt | json_model | json_parse
134
+
135
+ # New sub-chain for loading and validating input
136
+ self.input_loader = RunnableLambda(self.load_and_validate_input)
137
+
138
+ self.chain = (
139
+ self.input_loader
140
+ | RunnablePassthrough.assign(raw_example = lambda x: json.dumps(x["example"], ensure_ascii=False))
141
+ | RunnablePassthrough.assign(description = self.description_chain)
142
+ | {
143
+ "description": lambda x: x["description"],
144
+ "examples_from_briefs": RunnablePassthrough.assign(input_analysis = self.input_analysis_chain)
145
+ | RunnablePassthrough.assign(new_example_briefs = self.briefs_chain)
146
+ | RunnablePassthrough.assign(examples = self.examples_from_briefs_chain | (lambda x: x["examples"])),
147
+ "examples_directly": self.examples_directly_chain
148
+ }
149
+ | RunnablePassthrough.assign(
150
+ additional_examples=lambda x: (
151
+ list(x["examples_from_briefs"]["examples"])
152
+ + list(x["examples_directly"]["examples"])
153
+ )
154
+ )
155
+ )
156
+
157
+ def load_and_validate_input(self, input_dict):
158
+ input_str = input_dict["input_str"]
159
+ generating_batch_size = input_dict["generating_batch_size"]
160
+
161
+ try:
162
+ try:
163
+ example_dict = json.loads(input_str)
164
+ except ValueError:
165
+ try:
166
+ example_dict = yaml.safe_load(input_str)
167
+ except yaml.YAMLError as e:
168
+ raise ValueError("Invalid input format. Expected a JSON or YAML object.") from e
169
+
170
+ # If example_dict is a list, filter out invalid items
171
+ if isinstance(example_dict, list):
172
+ example_dict = [item for item in example_dict if isinstance(item, dict) and 'input' in item and 'output' in item]
173
+
174
+ # If example_dict is not a list, check if it's a valid dict
175
+ elif not isinstance(example_dict, dict) or 'input' not in example_dict or 'output' not in example_dict:
176
+ raise ValueError("Invalid input format. Expected an object with 'input' and 'output' fields.")
177
+
178
+ # Move the original content to a key named 'example'
179
+ input_dict = {"example": example_dict, "generating_batch_size": generating_batch_size}
180
+
181
+ return input_dict
182
+
183
+ except Exception as e:
184
+ raise RuntimeError(f"An error occurred during processing: {str(e)}")
185
+
186
+ def process(self, input_str, generating_batch_size=3):
187
+ input_dict = {"input_str": input_str, "generating_batch_size": generating_batch_size}
188
+ result = self.chain.invoke(input_dict)
189
+ return result
190
+
191
+ def generate_description(self, input_str, generating_batch_size=3):
192
+ chain = (
193
+ self.input_loader
194
+ | RunnablePassthrough.assign(raw_example = lambda x: json.dumps(x["example"], ensure_ascii=False))
195
+ | self.description_chain
196
+ )
197
+ return chain.invoke({
198
+ "input_str": input_str,
199
+ "generating_batch_size": generating_batch_size
200
+ })
201
+
202
+ def analyze_input(self, description):
203
+ return self.input_analysis_chain.invoke(description)
204
+
205
+ def generate_briefs(self, description, input_analysis, generating_batch_size):
206
+ return self.briefs_chain.invoke({
207
+ "description": description,
208
+ "input_analysis": input_analysis,
209
+ "generating_batch_size": generating_batch_size
210
+ })
211
+
212
+ def generate_examples_from_briefs(self, description, new_example_briefs, input_str, generating_batch_size=3):
213
+ chain = (
214
+ self.input_loader
215
+ | RunnablePassthrough.assign(
216
+ raw_example = lambda x: json.dumps(x["example"], ensure_ascii=False),
217
+ description = lambda x: description,
218
+ new_example_briefs = lambda x: new_example_briefs
219
+ )
220
+ | self.examples_from_briefs_chain
221
+ )
222
+ return chain.invoke({
223
+ "description": description,
224
+ "new_example_briefs": new_example_briefs,
225
+ "input_str": input_str,
226
+ "generating_batch_size": generating_batch_size
227
+ })
228
+
229
+ def generate_examples_directly(self, description, raw_example, generating_batch_size):
230
+ return self.examples_directly_chain.invoke({
231
+ "description": description,
232
+ "raw_example": raw_example,
233
+ "generating_batch_size": generating_batch_size
234
+ })
poetry.lock CHANGED
@@ -179,6 +179,35 @@ doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphin
179
  test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"]
180
  trio = ["trio (>=0.23)"]
181
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
182
  [[package]]
183
  name = "async-timeout"
184
  version = "4.0.3"
@@ -209,6 +238,28 @@ tests = ["attrs[tests-no-zope]", "zope-interface"]
209
  tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"]
210
  tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"]
211
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
212
  [[package]]
213
  name = "certifi"
214
  version = "2024.7.4"
@@ -220,6 +271,85 @@ files = [
220
  {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"},
221
  ]
222
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
223
  [[package]]
224
  name = "charset-normalizer"
225
  version = "3.3.2"
@@ -344,6 +474,23 @@ files = [
344
  {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
345
  ]
346
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
347
  [[package]]
348
  name = "confz"
349
  version = "2.0.1"
@@ -483,6 +630,48 @@ tests = ["Pillow (>=9.4.0)", "absl-py", "elasticsearch (<8.0.0)", "faiss-cpu (>=
483
  torch = ["torch"]
484
  vision = ["Pillow (>=9.4.0)"]
485
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
486
  [[package]]
487
  name = "dill"
488
  version = "0.3.8"
@@ -558,6 +747,20 @@ files = [
558
  [package.extras]
559
  test = ["pytest (>=6)"]
560
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
561
  [[package]]
562
  name = "fastapi"
563
  version = "0.111.0"
@@ -820,6 +1023,38 @@ test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,
820
  test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"]
821
  tqdm = ["tqdm"]
822
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
823
  [[package]]
824
  name = "gradio"
825
  version = "4.37.2"
@@ -1128,6 +1363,96 @@ files = [
1128
  {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
1129
  ]
1130
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1131
  [[package]]
1132
  name = "jinja2"
1133
  version = "3.1.4"
@@ -1275,6 +1600,48 @@ files = [
1275
  [package.dependencies]
1276
  referencing = ">=0.31.0"
1277
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1278
  [[package]]
1279
  name = "kiwisolver"
1280
  version = "1.4.5"
@@ -1406,8 +1773,8 @@ langchain-core = ">=0.2.32,<0.3.0"
1406
  langchain-text-splitters = ">=0.2.0,<0.3.0"
1407
  langsmith = ">=0.1.17,<0.2.0"
1408
  numpy = [
1409
- {version = ">=1,<2", markers = "python_version < \"3.12\""},
1410
  {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""},
 
1411
  ]
1412
  pydantic = ">=1,<3"
1413
  PyYAML = ">=5.3"
@@ -1431,8 +1798,8 @@ jsonpatch = ">=1.33,<2.0"
1431
  langsmith = ">=0.1.75,<0.2.0"
1432
  packaging = ">=23.2,<25"
1433
  pydantic = [
1434
- {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""},
1435
  {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""},
 
1436
  ]
1437
  PyYAML = ">=5.3"
1438
  tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0"
@@ -1496,8 +1863,8 @@ files = [
1496
  [package.dependencies]
1497
  orjson = ">=3.9.14,<4.0.0"
1498
  pydantic = [
1499
- {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""},
1500
  {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""},
 
1501
  ]
1502
  requests = ">=2,<3"
1503
 
@@ -1646,6 +2013,20 @@ python-dateutil = ">=2.7"
1646
  [package.extras]
1647
  dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6)", "setuptools (>=64)", "setuptools_scm (>=7)"]
1648
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1649
  [[package]]
1650
  name = "mdurl"
1651
  version = "0.1.2"
@@ -1780,6 +2161,17 @@ files = [
1780
  [package.dependencies]
1781
  dill = ">=0.3.8"
1782
 
 
 
 
 
 
 
 
 
 
 
 
1783
  [[package]]
1784
  name = "numpy"
1785
  version = "1.26.4"
@@ -1960,9 +2352,9 @@ files = [
1960
 
1961
  [package.dependencies]
1962
  numpy = [
 
1963
  {version = ">=1.22.4", markers = "python_version < \"3.11\""},
1964
  {version = ">=1.23.2", markers = "python_version == \"3.11\""},
1965
- {version = ">=1.26.0", markers = "python_version >= \"3.12\""},
1966
  ]
1967
  python-dateutil = ">=2.8.2"
1968
  pytz = ">=2020.1"
@@ -1993,6 +2385,35 @@ sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-d
1993
  test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"]
1994
  xml = ["lxml (>=4.9.2)"]
1995
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1996
  [[package]]
1997
  name = "pillow"
1998
  version = "10.4.0"
@@ -2090,6 +2511,22 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa
2090
  typing = ["typing-extensions"]
2091
  xmp = ["defusedxml"]
2092
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2093
  [[package]]
2094
  name = "pluggy"
2095
  version = "1.5.0"
@@ -2105,6 +2542,94 @@ files = [
2105
  dev = ["pre-commit", "tox"]
2106
  testing = ["pytest", "pytest-benchmark"]
2107
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2108
  [[package]]
2109
  name = "pyarrow"
2110
  version = "16.1.0"
@@ -2164,6 +2689,17 @@ files = [
2164
  {file = "pyarrow_hotfix-0.6.tar.gz", hash = "sha256:79d3e030f7ff890d408a100ac16d6f00b14d44a502d7897cd9fc3e3a534e9945"},
2165
  ]
2166
 
 
 
 
 
 
 
 
 
 
 
 
2167
  [[package]]
2168
  name = "pydantic"
2169
  version = "2.8.2"
@@ -2179,8 +2715,8 @@ files = [
2179
  annotated-types = ">=0.4.0"
2180
  pydantic-core = "2.20.1"
2181
  typing-extensions = [
2182
- {version = ">=4.6.1", markers = "python_version < \"3.13\""},
2183
  {version = ">=4.12.2", markers = "python_version >= \"3.13\""},
 
2184
  ]
2185
 
2186
  [package.extras]
@@ -2287,6 +2823,25 @@ files = [
2287
  [package.dependencies]
2288
  typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
2289
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2290
  [[package]]
2291
  name = "pydub"
2292
  version = "0.25.1"
@@ -2412,6 +2967,29 @@ files = [
2412
  {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"},
2413
  ]
2414
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2415
  [[package]]
2416
  name = "pyyaml"
2417
  version = "6.0.1"
@@ -2472,6 +3050,127 @@ files = [
2472
  {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"},
2473
  ]
2474
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2475
  [[package]]
2476
  name = "referencing"
2477
  version = "0.35.1"
@@ -2786,6 +3485,17 @@ files = [
2786
  {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
2787
  ]
2788
 
 
 
 
 
 
 
 
 
 
 
 
2789
  [[package]]
2790
  name = "sniffio"
2791
  version = "1.3.1"
@@ -2884,6 +3594,25 @@ postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"]
2884
  pymysql = ["pymysql"]
2885
  sqlcipher = ["sqlcipher3_binary"]
2886
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2887
  [[package]]
2888
  name = "starlette"
2889
  version = "0.37.2"
@@ -2901,6 +3630,41 @@ anyio = ">=3.4.0,<5"
2901
  [package.extras]
2902
  full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"]
2903
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2904
  [[package]]
2905
  name = "tenacity"
2906
  version = "8.4.2"
@@ -3012,6 +3776,26 @@ files = [
3012
  {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"},
3013
  ]
3014
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3015
  [[package]]
3016
  name = "tqdm"
3017
  version = "4.66.4"
@@ -3032,6 +3816,21 @@ notebook = ["ipywidgets (>=6)"]
3032
  slack = ["slack-sdk"]
3033
  telegram = ["requests"]
3034
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3035
  [[package]]
3036
  name = "typer"
3037
  version = "0.12.3"
@@ -3245,6 +4044,53 @@ files = [
3245
  docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"]
3246
  test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"]
3247
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3248
  [[package]]
3249
  name = "watchfiles"
3250
  version = "0.22.0"
@@ -3332,6 +4178,17 @@ files = [
3332
  [package.dependencies]
3333
  anyio = ">=3.0.0"
3334
 
 
 
 
 
 
 
 
 
 
 
 
3335
  [[package]]
3336
  name = "websockets"
3337
  version = "11.0.3"
@@ -3634,4 +4491,4 @@ multidict = ">=4.0"
3634
  [metadata]
3635
  lock-version = "2.0"
3636
  python-versions = "^3.10"
3637
- content-hash = "931a3864ffbdcb913c229a11454979cada41cfd7e9fe202ab09695c1f8c0a416"
 
179
  test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"]
180
  trio = ["trio (>=0.23)"]
181
 
182
+ [[package]]
183
+ name = "appnope"
184
+ version = "0.1.4"
185
+ description = "Disable App Nap on macOS >= 10.9"
186
+ optional = false
187
+ python-versions = ">=3.6"
188
+ files = [
189
+ {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"},
190
+ {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"},
191
+ ]
192
+
193
+ [[package]]
194
+ name = "asttokens"
195
+ version = "2.4.1"
196
+ description = "Annotate AST trees with source code positions"
197
+ optional = false
198
+ python-versions = "*"
199
+ files = [
200
+ {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"},
201
+ {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"},
202
+ ]
203
+
204
+ [package.dependencies]
205
+ six = ">=1.12.0"
206
+
207
+ [package.extras]
208
+ astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"]
209
+ test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"]
210
+
211
  [[package]]
212
  name = "async-timeout"
213
  version = "4.0.3"
 
238
  tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"]
239
  tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"]
240
 
241
+ [[package]]
242
+ name = "blinker"
243
+ version = "1.8.2"
244
+ description = "Fast, simple object-to-object and broadcast signaling"
245
+ optional = false
246
+ python-versions = ">=3.8"
247
+ files = [
248
+ {file = "blinker-1.8.2-py3-none-any.whl", hash = "sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01"},
249
+ {file = "blinker-1.8.2.tar.gz", hash = "sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83"},
250
+ ]
251
+
252
+ [[package]]
253
+ name = "cachetools"
254
+ version = "5.5.0"
255
+ description = "Extensible memoizing collections and decorators"
256
+ optional = false
257
+ python-versions = ">=3.7"
258
+ files = [
259
+ {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"},
260
+ {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"},
261
+ ]
262
+
263
  [[package]]
264
  name = "certifi"
265
  version = "2024.7.4"
 
271
  {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"},
272
  ]
273
 
274
+ [[package]]
275
+ name = "cffi"
276
+ version = "1.17.0"
277
+ description = "Foreign Function Interface for Python calling C code."
278
+ optional = false
279
+ python-versions = ">=3.8"
280
+ files = [
281
+ {file = "cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb"},
282
+ {file = "cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a"},
283
+ {file = "cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42"},
284
+ {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d"},
285
+ {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2"},
286
+ {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab"},
287
+ {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b"},
288
+ {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206"},
289
+ {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa"},
290
+ {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f"},
291
+ {file = "cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc"},
292
+ {file = "cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2"},
293
+ {file = "cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720"},
294
+ {file = "cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9"},
295
+ {file = "cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb"},
296
+ {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424"},
297
+ {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d"},
298
+ {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8"},
299
+ {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6"},
300
+ {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91"},
301
+ {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8"},
302
+ {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb"},
303
+ {file = "cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9"},
304
+ {file = "cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0"},
305
+ {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"},
306
+ {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"},
307
+ {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"},
308
+ {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"},
309
+ {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"},
310
+ {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"},
311
+ {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"},
312
+ {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"},
313
+ {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"},
314
+ {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"},
315
+ {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"},
316
+ {file = "cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118"},
317
+ {file = "cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7"},
318
+ {file = "cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377"},
319
+ {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb"},
320
+ {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555"},
321
+ {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204"},
322
+ {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f"},
323
+ {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0"},
324
+ {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4"},
325
+ {file = "cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a"},
326
+ {file = "cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7"},
327
+ {file = "cffi-1.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c"},
328
+ {file = "cffi-1.17.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e"},
329
+ {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b"},
330
+ {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e"},
331
+ {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401"},
332
+ {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c"},
333
+ {file = "cffi-1.17.0-cp38-cp38-win32.whl", hash = "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499"},
334
+ {file = "cffi-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c"},
335
+ {file = "cffi-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2"},
336
+ {file = "cffi-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759"},
337
+ {file = "cffi-1.17.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4"},
338
+ {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82"},
339
+ {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf"},
340
+ {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058"},
341
+ {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932"},
342
+ {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693"},
343
+ {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3"},
344
+ {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4"},
345
+ {file = "cffi-1.17.0-cp39-cp39-win32.whl", hash = "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb"},
346
+ {file = "cffi-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29"},
347
+ {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"},
348
+ ]
349
+
350
+ [package.dependencies]
351
+ pycparser = "*"
352
+
353
  [[package]]
354
  name = "charset-normalizer"
355
  version = "3.3.2"
 
474
  {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
475
  ]
476
 
477
+ [[package]]
478
+ name = "comm"
479
+ version = "0.2.2"
480
+ description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc."
481
+ optional = false
482
+ python-versions = ">=3.8"
483
+ files = [
484
+ {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"},
485
+ {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"},
486
+ ]
487
+
488
+ [package.dependencies]
489
+ traitlets = ">=4"
490
+
491
+ [package.extras]
492
+ test = ["pytest"]
493
+
494
  [[package]]
495
  name = "confz"
496
  version = "2.0.1"
 
630
  torch = ["torch"]
631
  vision = ["Pillow (>=9.4.0)"]
632
 
633
+ [[package]]
634
+ name = "debugpy"
635
+ version = "1.8.5"
636
+ description = "An implementation of the Debug Adapter Protocol for Python"
637
+ optional = false
638
+ python-versions = ">=3.8"
639
+ files = [
640
+ {file = "debugpy-1.8.5-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7e4d594367d6407a120b76bdaa03886e9eb652c05ba7f87e37418426ad2079f7"},
641
+ {file = "debugpy-1.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4413b7a3ede757dc33a273a17d685ea2b0c09dbd312cc03f5534a0fd4d40750a"},
642
+ {file = "debugpy-1.8.5-cp310-cp310-win32.whl", hash = "sha256:dd3811bd63632bb25eda6bd73bea8e0521794cda02be41fa3160eb26fc29e7ed"},
643
+ {file = "debugpy-1.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:b78c1250441ce893cb5035dd6f5fc12db968cc07f91cc06996b2087f7cefdd8e"},
644
+ {file = "debugpy-1.8.5-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:606bccba19f7188b6ea9579c8a4f5a5364ecd0bf5a0659c8a5d0e10dcee3032a"},
645
+ {file = "debugpy-1.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db9fb642938a7a609a6c865c32ecd0d795d56c1aaa7a7a5722d77855d5e77f2b"},
646
+ {file = "debugpy-1.8.5-cp311-cp311-win32.whl", hash = "sha256:4fbb3b39ae1aa3e5ad578f37a48a7a303dad9a3d018d369bc9ec629c1cfa7408"},
647
+ {file = "debugpy-1.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:345d6a0206e81eb68b1493ce2fbffd57c3088e2ce4b46592077a943d2b968ca3"},
648
+ {file = "debugpy-1.8.5-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:5b5c770977c8ec6c40c60d6f58cacc7f7fe5a45960363d6974ddb9b62dbee156"},
649
+ {file = "debugpy-1.8.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a65b00b7cdd2ee0c2cf4c7335fef31e15f1b7056c7fdbce9e90193e1a8c8cb"},
650
+ {file = "debugpy-1.8.5-cp312-cp312-win32.whl", hash = "sha256:c9f7c15ea1da18d2fcc2709e9f3d6de98b69a5b0fff1807fb80bc55f906691f7"},
651
+ {file = "debugpy-1.8.5-cp312-cp312-win_amd64.whl", hash = "sha256:28ced650c974aaf179231668a293ecd5c63c0a671ae6d56b8795ecc5d2f48d3c"},
652
+ {file = "debugpy-1.8.5-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:3df6692351172a42af7558daa5019651f898fc67450bf091335aa8a18fbf6f3a"},
653
+ {file = "debugpy-1.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd04a73eb2769eb0bfe43f5bfde1215c5923d6924b9b90f94d15f207a402226"},
654
+ {file = "debugpy-1.8.5-cp38-cp38-win32.whl", hash = "sha256:8f913ee8e9fcf9d38a751f56e6de12a297ae7832749d35de26d960f14280750a"},
655
+ {file = "debugpy-1.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:a697beca97dad3780b89a7fb525d5e79f33821a8bc0c06faf1f1289e549743cf"},
656
+ {file = "debugpy-1.8.5-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:0a1029a2869d01cb777216af8c53cda0476875ef02a2b6ff8b2f2c9a4b04176c"},
657
+ {file = "debugpy-1.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84c276489e141ed0b93b0af648eef891546143d6a48f610945416453a8ad406"},
658
+ {file = "debugpy-1.8.5-cp39-cp39-win32.whl", hash = "sha256:ad84b7cde7fd96cf6eea34ff6c4a1b7887e0fe2ea46e099e53234856f9d99a34"},
659
+ {file = "debugpy-1.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:7b0fe36ed9d26cb6836b0a51453653f8f2e347ba7348f2bbfe76bfeb670bfb1c"},
660
+ {file = "debugpy-1.8.5-py2.py3-none-any.whl", hash = "sha256:55919dce65b471eff25901acf82d328bbd5b833526b6c1364bd5133754777a44"},
661
+ {file = "debugpy-1.8.5.zip", hash = "sha256:b2112cfeb34b4507399d298fe7023a16656fc553ed5246536060ca7bd0e668d0"},
662
+ ]
663
+
664
+ [[package]]
665
+ name = "decorator"
666
+ version = "5.1.1"
667
+ description = "Decorators for Humans"
668
+ optional = false
669
+ python-versions = ">=3.5"
670
+ files = [
671
+ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"},
672
+ {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"},
673
+ ]
674
+
675
  [[package]]
676
  name = "dill"
677
  version = "0.3.8"
 
747
  [package.extras]
748
  test = ["pytest (>=6)"]
749
 
750
+ [[package]]
751
+ name = "executing"
752
+ version = "2.0.1"
753
+ description = "Get the currently executing AST node of a frame, and other information"
754
+ optional = false
755
+ python-versions = ">=3.5"
756
+ files = [
757
+ {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"},
758
+ {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"},
759
+ ]
760
+
761
+ [package.extras]
762
+ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"]
763
+
764
  [[package]]
765
  name = "fastapi"
766
  version = "0.111.0"
 
1023
  test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"]
1024
  tqdm = ["tqdm"]
1025
 
1026
+ [[package]]
1027
+ name = "gitdb"
1028
+ version = "4.0.11"
1029
+ description = "Git Object Database"
1030
+ optional = false
1031
+ python-versions = ">=3.7"
1032
+ files = [
1033
+ {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"},
1034
+ {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"},
1035
+ ]
1036
+
1037
+ [package.dependencies]
1038
+ smmap = ">=3.0.1,<6"
1039
+
1040
+ [[package]]
1041
+ name = "gitpython"
1042
+ version = "3.1.43"
1043
+ description = "GitPython is a Python library used to interact with Git repositories"
1044
+ optional = false
1045
+ python-versions = ">=3.7"
1046
+ files = [
1047
+ {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"},
1048
+ {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"},
1049
+ ]
1050
+
1051
+ [package.dependencies]
1052
+ gitdb = ">=4.0.1,<5"
1053
+
1054
+ [package.extras]
1055
+ doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"]
1056
+ test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"]
1057
+
1058
  [[package]]
1059
  name = "gradio"
1060
  version = "4.37.2"
 
1363
  {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
1364
  ]
1365
 
1366
+ [[package]]
1367
+ name = "ipykernel"
1368
+ version = "6.29.5"
1369
+ description = "IPython Kernel for Jupyter"
1370
+ optional = false
1371
+ python-versions = ">=3.8"
1372
+ files = [
1373
+ {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"},
1374
+ {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"},
1375
+ ]
1376
+
1377
+ [package.dependencies]
1378
+ appnope = {version = "*", markers = "platform_system == \"Darwin\""}
1379
+ comm = ">=0.1.1"
1380
+ debugpy = ">=1.6.5"
1381
+ ipython = ">=7.23.1"
1382
+ jupyter-client = ">=6.1.12"
1383
+ jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
1384
+ matplotlib-inline = ">=0.1"
1385
+ nest-asyncio = "*"
1386
+ packaging = "*"
1387
+ psutil = "*"
1388
+ pyzmq = ">=24"
1389
+ tornado = ">=6.1"
1390
+ traitlets = ">=5.4.0"
1391
+
1392
+ [package.extras]
1393
+ cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"]
1394
+ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"]
1395
+ pyqt5 = ["pyqt5"]
1396
+ pyside6 = ["pyside6"]
1397
+ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"]
1398
+
1399
+ [[package]]
1400
+ name = "ipython"
1401
+ version = "8.26.0"
1402
+ description = "IPython: Productive Interactive Computing"
1403
+ optional = false
1404
+ python-versions = ">=3.10"
1405
+ files = [
1406
+ {file = "ipython-8.26.0-py3-none-any.whl", hash = "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff"},
1407
+ {file = "ipython-8.26.0.tar.gz", hash = "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c"},
1408
+ ]
1409
+
1410
+ [package.dependencies]
1411
+ colorama = {version = "*", markers = "sys_platform == \"win32\""}
1412
+ decorator = "*"
1413
+ exceptiongroup = {version = "*", markers = "python_version < \"3.11\""}
1414
+ jedi = ">=0.16"
1415
+ matplotlib-inline = "*"
1416
+ pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""}
1417
+ prompt-toolkit = ">=3.0.41,<3.1.0"
1418
+ pygments = ">=2.4.0"
1419
+ stack-data = "*"
1420
+ traitlets = ">=5.13.0"
1421
+ typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""}
1422
+
1423
+ [package.extras]
1424
+ all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"]
1425
+ black = ["black"]
1426
+ doc = ["docrepr", "exceptiongroup", "intersphinx-registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing-extensions"]
1427
+ kernel = ["ipykernel"]
1428
+ matplotlib = ["matplotlib"]
1429
+ nbconvert = ["nbconvert"]
1430
+ nbformat = ["nbformat"]
1431
+ notebook = ["ipywidgets", "notebook"]
1432
+ parallel = ["ipyparallel"]
1433
+ qtconsole = ["qtconsole"]
1434
+ test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"]
1435
+ test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"]
1436
+
1437
+ [[package]]
1438
+ name = "jedi"
1439
+ version = "0.19.1"
1440
+ description = "An autocompletion tool for Python that can be used for text editors."
1441
+ optional = false
1442
+ python-versions = ">=3.6"
1443
+ files = [
1444
+ {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"},
1445
+ {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"},
1446
+ ]
1447
+
1448
+ [package.dependencies]
1449
+ parso = ">=0.8.3,<0.9.0"
1450
+
1451
+ [package.extras]
1452
+ docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"]
1453
+ qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"]
1454
+ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"]
1455
+
1456
  [[package]]
1457
  name = "jinja2"
1458
  version = "3.1.4"
 
1600
  [package.dependencies]
1601
  referencing = ">=0.31.0"
1602
 
1603
+ [[package]]
1604
+ name = "jupyter-client"
1605
+ version = "8.6.2"
1606
+ description = "Jupyter protocol implementation and client libraries"
1607
+ optional = false
1608
+ python-versions = ">=3.8"
1609
+ files = [
1610
+ {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"},
1611
+ {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"},
1612
+ ]
1613
+
1614
+ [package.dependencies]
1615
+ jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
1616
+ python-dateutil = ">=2.8.2"
1617
+ pyzmq = ">=23.0"
1618
+ tornado = ">=6.2"
1619
+ traitlets = ">=5.3"
1620
+
1621
+ [package.extras]
1622
+ docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"]
1623
+ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"]
1624
+
1625
+ [[package]]
1626
+ name = "jupyter-core"
1627
+ version = "5.7.2"
1628
+ description = "Jupyter core package. A base package on which Jupyter projects rely."
1629
+ optional = false
1630
+ python-versions = ">=3.8"
1631
+ files = [
1632
+ {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"},
1633
+ {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"},
1634
+ ]
1635
+
1636
+ [package.dependencies]
1637
+ platformdirs = ">=2.5"
1638
+ pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""}
1639
+ traitlets = ">=5.3"
1640
+
1641
+ [package.extras]
1642
+ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"]
1643
+ test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"]
1644
+
1645
  [[package]]
1646
  name = "kiwisolver"
1647
  version = "1.4.5"
 
1773
  langchain-text-splitters = ">=0.2.0,<0.3.0"
1774
  langsmith = ">=0.1.17,<0.2.0"
1775
  numpy = [
 
1776
  {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""},
1777
+ {version = ">=1,<2", markers = "python_version < \"3.12\""},
1778
  ]
1779
  pydantic = ">=1,<3"
1780
  PyYAML = ">=5.3"
 
1798
  langsmith = ">=0.1.75,<0.2.0"
1799
  packaging = ">=23.2,<25"
1800
  pydantic = [
 
1801
  {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""},
1802
+ {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""},
1803
  ]
1804
  PyYAML = ">=5.3"
1805
  tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0"
 
1863
  [package.dependencies]
1864
  orjson = ">=3.9.14,<4.0.0"
1865
  pydantic = [
 
1866
  {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""},
1867
+ {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""},
1868
  ]
1869
  requests = ">=2,<3"
1870
 
 
2013
  [package.extras]
2014
  dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6)", "setuptools (>=64)", "setuptools_scm (>=7)"]
2015
 
2016
+ [[package]]
2017
+ name = "matplotlib-inline"
2018
+ version = "0.1.7"
2019
+ description = "Inline Matplotlib backend for Jupyter"
2020
+ optional = false
2021
+ python-versions = ">=3.8"
2022
+ files = [
2023
+ {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"},
2024
+ {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"},
2025
+ ]
2026
+
2027
+ [package.dependencies]
2028
+ traitlets = "*"
2029
+
2030
  [[package]]
2031
  name = "mdurl"
2032
  version = "0.1.2"
 
2161
  [package.dependencies]
2162
  dill = ">=0.3.8"
2163
 
2164
+ [[package]]
2165
+ name = "nest-asyncio"
2166
+ version = "1.6.0"
2167
+ description = "Patch asyncio to allow nested event loops"
2168
+ optional = false
2169
+ python-versions = ">=3.5"
2170
+ files = [
2171
+ {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"},
2172
+ {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"},
2173
+ ]
2174
+
2175
  [[package]]
2176
  name = "numpy"
2177
  version = "1.26.4"
 
2352
 
2353
  [package.dependencies]
2354
  numpy = [
2355
+ {version = ">=1.26.0", markers = "python_version >= \"3.12\""},
2356
  {version = ">=1.22.4", markers = "python_version < \"3.11\""},
2357
  {version = ">=1.23.2", markers = "python_version == \"3.11\""},
 
2358
  ]
2359
  python-dateutil = ">=2.8.2"
2360
  pytz = ">=2020.1"
 
2385
  test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"]
2386
  xml = ["lxml (>=4.9.2)"]
2387
 
2388
+ [[package]]
2389
+ name = "parso"
2390
+ version = "0.8.4"
2391
+ description = "A Python Parser"
2392
+ optional = false
2393
+ python-versions = ">=3.6"
2394
+ files = [
2395
+ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"},
2396
+ {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"},
2397
+ ]
2398
+
2399
+ [package.extras]
2400
+ qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"]
2401
+ testing = ["docopt", "pytest"]
2402
+
2403
+ [[package]]
2404
+ name = "pexpect"
2405
+ version = "4.9.0"
2406
+ description = "Pexpect allows easy control of interactive console applications."
2407
+ optional = false
2408
+ python-versions = "*"
2409
+ files = [
2410
+ {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"},
2411
+ {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"},
2412
+ ]
2413
+
2414
+ [package.dependencies]
2415
+ ptyprocess = ">=0.5"
2416
+
2417
  [[package]]
2418
  name = "pillow"
2419
  version = "10.4.0"
 
2511
  typing = ["typing-extensions"]
2512
  xmp = ["defusedxml"]
2513
 
2514
+ [[package]]
2515
+ name = "platformdirs"
2516
+ version = "4.2.2"
2517
+ description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
2518
+ optional = false
2519
+ python-versions = ">=3.8"
2520
+ files = [
2521
+ {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"},
2522
+ {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"},
2523
+ ]
2524
+
2525
+ [package.extras]
2526
+ docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"]
2527
+ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"]
2528
+ type = ["mypy (>=1.8)"]
2529
+
2530
  [[package]]
2531
  name = "pluggy"
2532
  version = "1.5.0"
 
2542
  dev = ["pre-commit", "tox"]
2543
  testing = ["pytest", "pytest-benchmark"]
2544
 
2545
+ [[package]]
2546
+ name = "prompt-toolkit"
2547
+ version = "3.0.47"
2548
+ description = "Library for building powerful interactive command lines in Python"
2549
+ optional = false
2550
+ python-versions = ">=3.7.0"
2551
+ files = [
2552
+ {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"},
2553
+ {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"},
2554
+ ]
2555
+
2556
+ [package.dependencies]
2557
+ wcwidth = "*"
2558
+
2559
+ [[package]]
2560
+ name = "protobuf"
2561
+ version = "5.27.3"
2562
+ description = ""
2563
+ optional = false
2564
+ python-versions = ">=3.8"
2565
+ files = [
2566
+ {file = "protobuf-5.27.3-cp310-abi3-win32.whl", hash = "sha256:dcb307cd4ef8fec0cf52cb9105a03d06fbb5275ce6d84a6ae33bc6cf84e0a07b"},
2567
+ {file = "protobuf-5.27.3-cp310-abi3-win_amd64.whl", hash = "sha256:16ddf3f8c6c41e1e803da7abea17b1793a97ef079a912e42351eabb19b2cffe7"},
2568
+ {file = "protobuf-5.27.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:68248c60d53f6168f565a8c76dc58ba4fa2ade31c2d1ebdae6d80f969cdc2d4f"},
2569
+ {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:b8a994fb3d1c11156e7d1e427186662b64694a62b55936b2b9348f0a7c6625ce"},
2570
+ {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:a55c48f2a2092d8e213bd143474df33a6ae751b781dd1d1f4d953c128a415b25"},
2571
+ {file = "protobuf-5.27.3-cp38-cp38-win32.whl", hash = "sha256:043853dcb55cc262bf2e116215ad43fa0859caab79bb0b2d31b708f128ece035"},
2572
+ {file = "protobuf-5.27.3-cp38-cp38-win_amd64.whl", hash = "sha256:c2a105c24f08b1e53d6c7ffe69cb09d0031512f0b72f812dd4005b8112dbe91e"},
2573
+ {file = "protobuf-5.27.3-cp39-cp39-win32.whl", hash = "sha256:c84eee2c71ed83704f1afbf1a85c3171eab0fd1ade3b399b3fad0884cbcca8bf"},
2574
+ {file = "protobuf-5.27.3-cp39-cp39-win_amd64.whl", hash = "sha256:af7c0b7cfbbb649ad26132e53faa348580f844d9ca46fd3ec7ca48a1ea5db8a1"},
2575
+ {file = "protobuf-5.27.3-py3-none-any.whl", hash = "sha256:8572c6533e544ebf6899c360e91d6bcbbee2549251643d32c52cf8a5de295ba5"},
2576
+ {file = "protobuf-5.27.3.tar.gz", hash = "sha256:82460903e640f2b7e34ee81a947fdaad89de796d324bcbc38ff5430bcdead82c"},
2577
+ ]
2578
+
2579
+ [[package]]
2580
+ name = "psutil"
2581
+ version = "6.0.0"
2582
+ description = "Cross-platform lib for process and system monitoring in Python."
2583
+ optional = false
2584
+ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
2585
+ files = [
2586
+ {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"},
2587
+ {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"},
2588
+ {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"},
2589
+ {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"},
2590
+ {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"},
2591
+ {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"},
2592
+ {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"},
2593
+ {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"},
2594
+ {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"},
2595
+ {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"},
2596
+ {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"},
2597
+ {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"},
2598
+ {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"},
2599
+ {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"},
2600
+ {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"},
2601
+ {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"},
2602
+ {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"},
2603
+ ]
2604
+
2605
+ [package.extras]
2606
+ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"]
2607
+
2608
+ [[package]]
2609
+ name = "ptyprocess"
2610
+ version = "0.7.0"
2611
+ description = "Run a subprocess in a pseudo terminal"
2612
+ optional = false
2613
+ python-versions = "*"
2614
+ files = [
2615
+ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"},
2616
+ {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"},
2617
+ ]
2618
+
2619
+ [[package]]
2620
+ name = "pure-eval"
2621
+ version = "0.2.3"
2622
+ description = "Safely evaluate AST nodes without side effects"
2623
+ optional = false
2624
+ python-versions = "*"
2625
+ files = [
2626
+ {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"},
2627
+ {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"},
2628
+ ]
2629
+
2630
+ [package.extras]
2631
+ tests = ["pytest"]
2632
+
2633
  [[package]]
2634
  name = "pyarrow"
2635
  version = "16.1.0"
 
2689
  {file = "pyarrow_hotfix-0.6.tar.gz", hash = "sha256:79d3e030f7ff890d408a100ac16d6f00b14d44a502d7897cd9fc3e3a534e9945"},
2690
  ]
2691
 
2692
+ [[package]]
2693
+ name = "pycparser"
2694
+ version = "2.22"
2695
+ description = "C parser in Python"
2696
+ optional = false
2697
+ python-versions = ">=3.8"
2698
+ files = [
2699
+ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"},
2700
+ {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"},
2701
+ ]
2702
+
2703
  [[package]]
2704
  name = "pydantic"
2705
  version = "2.8.2"
 
2715
  annotated-types = ">=0.4.0"
2716
  pydantic-core = "2.20.1"
2717
  typing-extensions = [
 
2718
  {version = ">=4.12.2", markers = "python_version >= \"3.13\""},
2719
+ {version = ">=4.6.1", markers = "python_version < \"3.13\""},
2720
  ]
2721
 
2722
  [package.extras]
 
2823
  [package.dependencies]
2824
  typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
2825
 
2826
+ [[package]]
2827
+ name = "pydeck"
2828
+ version = "0.9.1"
2829
+ description = "Widget for deck.gl maps"
2830
+ optional = false
2831
+ python-versions = ">=3.8"
2832
+ files = [
2833
+ {file = "pydeck-0.9.1-py2.py3-none-any.whl", hash = "sha256:b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038"},
2834
+ {file = "pydeck-0.9.1.tar.gz", hash = "sha256:f74475ae637951d63f2ee58326757f8d4f9cd9f2a457cf42950715003e2cb605"},
2835
+ ]
2836
+
2837
+ [package.dependencies]
2838
+ jinja2 = ">=2.10.1"
2839
+ numpy = ">=1.16.4"
2840
+
2841
+ [package.extras]
2842
+ carto = ["pydeck-carto"]
2843
+ jupyter = ["ipykernel (>=5.1.2)", "ipython (>=5.8.0)", "ipywidgets (>=7,<8)", "traitlets (>=4.3.2)"]
2844
+
2845
  [[package]]
2846
  name = "pydub"
2847
  version = "0.25.1"
 
2967
  {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"},
2968
  ]
2969
 
2970
+ [[package]]
2971
+ name = "pywin32"
2972
+ version = "306"
2973
+ description = "Python for Window Extensions"
2974
+ optional = false
2975
+ python-versions = "*"
2976
+ files = [
2977
+ {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"},
2978
+ {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"},
2979
+ {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"},
2980
+ {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"},
2981
+ {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"},
2982
+ {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"},
2983
+ {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"},
2984
+ {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"},
2985
+ {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"},
2986
+ {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"},
2987
+ {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"},
2988
+ {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"},
2989
+ {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"},
2990
+ {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"},
2991
+ ]
2992
+
2993
  [[package]]
2994
  name = "pyyaml"
2995
  version = "6.0.1"
 
3050
  {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"},
3051
  ]
3052
 
3053
+ [[package]]
3054
+ name = "pyzmq"
3055
+ version = "26.2.0"
3056
+ description = "Python bindings for 0MQ"
3057
+ optional = false
3058
+ python-versions = ">=3.7"
3059
+ files = [
3060
+ {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629"},
3061
+ {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b"},
3062
+ {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764"},
3063
+ {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c"},
3064
+ {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a"},
3065
+ {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88"},
3066
+ {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f"},
3067
+ {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282"},
3068
+ {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea"},
3069
+ {file = "pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2"},
3070
+ {file = "pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971"},
3071
+ {file = "pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa"},
3072
+ {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218"},
3073
+ {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4"},
3074
+ {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef"},
3075
+ {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317"},
3076
+ {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf"},
3077
+ {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e"},
3078
+ {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37"},
3079
+ {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3"},
3080
+ {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6"},
3081
+ {file = "pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4"},
3082
+ {file = "pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5"},
3083
+ {file = "pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003"},
3084
+ {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9"},
3085
+ {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52"},
3086
+ {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08"},
3087
+ {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5"},
3088
+ {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae"},
3089
+ {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711"},
3090
+ {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6"},
3091
+ {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3"},
3092
+ {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b"},
3093
+ {file = "pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7"},
3094
+ {file = "pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a"},
3095
+ {file = "pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b"},
3096
+ {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726"},
3097
+ {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3"},
3098
+ {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50"},
3099
+ {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb"},
3100
+ {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187"},
3101
+ {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b"},
3102
+ {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18"},
3103
+ {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115"},
3104
+ {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e"},
3105
+ {file = "pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5"},
3106
+ {file = "pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad"},
3107
+ {file = "pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797"},
3108
+ {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a"},
3109
+ {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc"},
3110
+ {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5"},
3111
+ {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672"},
3112
+ {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797"},
3113
+ {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386"},
3114
+ {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306"},
3115
+ {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6"},
3116
+ {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0"},
3117
+ {file = "pyzmq-26.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8"},
3118
+ {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8"},
3119
+ {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1"},
3120
+ {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9"},
3121
+ {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27"},
3122
+ {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097"},
3123
+ {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93"},
3124
+ {file = "pyzmq-26.2.0-cp37-cp37m-win32.whl", hash = "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951"},
3125
+ {file = "pyzmq-26.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231"},
3126
+ {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f"},
3127
+ {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2"},
3128
+ {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6"},
3129
+ {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289"},
3130
+ {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732"},
3131
+ {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780"},
3132
+ {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640"},
3133
+ {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd"},
3134
+ {file = "pyzmq-26.2.0-cp38-cp38-win32.whl", hash = "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988"},
3135
+ {file = "pyzmq-26.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f"},
3136
+ {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2"},
3137
+ {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c"},
3138
+ {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98"},
3139
+ {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9"},
3140
+ {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db"},
3141
+ {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073"},
3142
+ {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc"},
3143
+ {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940"},
3144
+ {file = "pyzmq-26.2.0-cp39-cp39-win32.whl", hash = "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44"},
3145
+ {file = "pyzmq-26.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec"},
3146
+ {file = "pyzmq-26.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb"},
3147
+ {file = "pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072"},
3148
+ {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1"},
3149
+ {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d"},
3150
+ {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca"},
3151
+ {file = "pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c"},
3152
+ {file = "pyzmq-26.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c"},
3153
+ {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6"},
3154
+ {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c"},
3155
+ {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6"},
3156
+ {file = "pyzmq-26.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed"},
3157
+ {file = "pyzmq-26.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20"},
3158
+ {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919"},
3159
+ {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5"},
3160
+ {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc"},
3161
+ {file = "pyzmq-26.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277"},
3162
+ {file = "pyzmq-26.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3"},
3163
+ {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a"},
3164
+ {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6"},
3165
+ {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a"},
3166
+ {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4"},
3167
+ {file = "pyzmq-26.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f"},
3168
+ {file = "pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f"},
3169
+ ]
3170
+
3171
+ [package.dependencies]
3172
+ cffi = {version = "*", markers = "implementation_name == \"pypy\""}
3173
+
3174
  [[package]]
3175
  name = "referencing"
3176
  version = "0.35.1"
 
3485
  {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
3486
  ]
3487
 
3488
+ [[package]]
3489
+ name = "smmap"
3490
+ version = "5.0.1"
3491
+ description = "A pure Python implementation of a sliding window memory map manager"
3492
+ optional = false
3493
+ python-versions = ">=3.7"
3494
+ files = [
3495
+ {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"},
3496
+ {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"},
3497
+ ]
3498
+
3499
  [[package]]
3500
  name = "sniffio"
3501
  version = "1.3.1"
 
3594
  pymysql = ["pymysql"]
3595
  sqlcipher = ["sqlcipher3_binary"]
3596
 
3597
+ [[package]]
3598
+ name = "stack-data"
3599
+ version = "0.6.3"
3600
+ description = "Extract data from python stack frames and tracebacks for informative displays"
3601
+ optional = false
3602
+ python-versions = "*"
3603
+ files = [
3604
+ {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"},
3605
+ {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"},
3606
+ ]
3607
+
3608
+ [package.dependencies]
3609
+ asttokens = ">=2.1.0"
3610
+ executing = ">=1.2.0"
3611
+ pure-eval = "*"
3612
+
3613
+ [package.extras]
3614
+ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"]
3615
+
3616
  [[package]]
3617
  name = "starlette"
3618
  version = "0.37.2"
 
3630
  [package.extras]
3631
  full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"]
3632
 
3633
+ [[package]]
3634
+ name = "streamlit"
3635
+ version = "1.38.0"
3636
+ description = "A faster way to build and share data apps"
3637
+ optional = false
3638
+ python-versions = "!=3.9.7,>=3.8"
3639
+ files = [
3640
+ {file = "streamlit-1.38.0-py2.py3-none-any.whl", hash = "sha256:0653ecfe86fef0f1608e3e082aef7eb335d8713f6f31e9c3b19486d1c67d7c41"},
3641
+ {file = "streamlit-1.38.0.tar.gz", hash = "sha256:c4bf36b3ef871499ed4594574834583113f93f077dd3035d516d295786f2ad63"},
3642
+ ]
3643
+
3644
+ [package.dependencies]
3645
+ altair = ">=4.0,<6"
3646
+ blinker = ">=1.0.0,<2"
3647
+ cachetools = ">=4.0,<6"
3648
+ click = ">=7.0,<9"
3649
+ gitpython = ">=3.0.7,<3.1.19 || >3.1.19,<4"
3650
+ numpy = ">=1.20,<3"
3651
+ packaging = ">=20,<25"
3652
+ pandas = ">=1.3.0,<3"
3653
+ pillow = ">=7.1.0,<11"
3654
+ protobuf = ">=3.20,<6"
3655
+ pyarrow = ">=7.0"
3656
+ pydeck = ">=0.8.0b4,<1"
3657
+ requests = ">=2.27,<3"
3658
+ rich = ">=10.14.0,<14"
3659
+ tenacity = ">=8.1.0,<9"
3660
+ toml = ">=0.10.1,<2"
3661
+ tornado = ">=6.0.3,<7"
3662
+ typing-extensions = ">=4.3.0,<5"
3663
+ watchdog = {version = ">=2.1.5,<5", markers = "platform_system != \"Darwin\""}
3664
+
3665
+ [package.extras]
3666
+ snowflake = ["snowflake-connector-python (>=2.8.0)", "snowflake-snowpark-python[modin] (>=1.17.0)"]
3667
+
3668
  [[package]]
3669
  name = "tenacity"
3670
  version = "8.4.2"
 
3776
  {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"},
3777
  ]
3778
 
3779
+ [[package]]
3780
+ name = "tornado"
3781
+ version = "6.4.1"
3782
+ description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
3783
+ optional = false
3784
+ python-versions = ">=3.8"
3785
+ files = [
3786
+ {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"},
3787
+ {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"},
3788
+ {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"},
3789
+ {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"},
3790
+ {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"},
3791
+ {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"},
3792
+ {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"},
3793
+ {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"},
3794
+ {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"},
3795
+ {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"},
3796
+ {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"},
3797
+ ]
3798
+
3799
  [[package]]
3800
  name = "tqdm"
3801
  version = "4.66.4"
 
3816
  slack = ["slack-sdk"]
3817
  telegram = ["requests"]
3818
 
3819
+ [[package]]
3820
+ name = "traitlets"
3821
+ version = "5.14.3"
3822
+ description = "Traitlets Python configuration system"
3823
+ optional = false
3824
+ python-versions = ">=3.8"
3825
+ files = [
3826
+ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"},
3827
+ {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"},
3828
+ ]
3829
+
3830
+ [package.extras]
3831
+ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"]
3832
+ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"]
3833
+
3834
  [[package]]
3835
  name = "typer"
3836
  version = "0.12.3"
 
4044
  docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"]
4045
  test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"]
4046
 
4047
+ [[package]]
4048
+ name = "watchdog"
4049
+ version = "4.0.2"
4050
+ description = "Filesystem events monitoring"
4051
+ optional = false
4052
+ python-versions = ">=3.8"
4053
+ files = [
4054
+ {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ede7f010f2239b97cc79e6cb3c249e72962404ae3865860855d5cbe708b0fd22"},
4055
+ {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2cffa171445b0efa0726c561eca9a27d00a1f2b83846dbd5a4f639c4f8ca8e1"},
4056
+ {file = "watchdog-4.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c50f148b31b03fbadd6d0b5980e38b558046b127dc483e5e4505fcef250f9503"},
4057
+ {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7c7d4bf585ad501c5f6c980e7be9c4f15604c7cc150e942d82083b31a7548930"},
4058
+ {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:914285126ad0b6eb2258bbbcb7b288d9dfd655ae88fa28945be05a7b475a800b"},
4059
+ {file = "watchdog-4.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:984306dc4720da5498b16fc037b36ac443816125a3705dfde4fd90652d8028ef"},
4060
+ {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1cdcfd8142f604630deef34722d695fb455d04ab7cfe9963055df1fc69e6727a"},
4061
+ {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7ab624ff2f663f98cd03c8b7eedc09375a911794dfea6bf2a359fcc266bff29"},
4062
+ {file = "watchdog-4.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:132937547a716027bd5714383dfc40dc66c26769f1ce8a72a859d6a48f371f3a"},
4063
+ {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd67c7df93eb58f360c43802acc945fa8da70c675b6fa37a241e17ca698ca49b"},
4064
+ {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcfd02377be80ef3b6bc4ce481ef3959640458d6feaae0bd43dd90a43da90a7d"},
4065
+ {file = "watchdog-4.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:980b71510f59c884d684b3663d46e7a14b457c9611c481e5cef08f4dd022eed7"},
4066
+ {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:aa160781cafff2719b663c8a506156e9289d111d80f3387cf3af49cedee1f040"},
4067
+ {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f6ee8dedd255087bc7fe82adf046f0b75479b989185fb0bdf9a98b612170eac7"},
4068
+ {file = "watchdog-4.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0b4359067d30d5b864e09c8597b112fe0a0a59321a0f331498b013fb097406b4"},
4069
+ {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:770eef5372f146997638d737c9a3c597a3b41037cfbc5c41538fc27c09c3a3f9"},
4070
+ {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eeea812f38536a0aa859972d50c76e37f4456474b02bd93674d1947cf1e39578"},
4071
+ {file = "watchdog-4.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b2c45f6e1e57ebb4687690c05bc3a2c1fb6ab260550c4290b8abb1335e0fd08b"},
4072
+ {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:10b6683df70d340ac3279eff0b2766813f00f35a1d37515d2c99959ada8f05fa"},
4073
+ {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7c739888c20f99824f7aa9d31ac8a97353e22d0c0e54703a547a218f6637eb3"},
4074
+ {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c100d09ac72a8a08ddbf0629ddfa0b8ee41740f9051429baa8e31bb903ad7508"},
4075
+ {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f5315a8c8dd6dd9425b974515081fc0aadca1d1d61e078d2246509fd756141ee"},
4076
+ {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2d468028a77b42cc685ed694a7a550a8d1771bb05193ba7b24006b8241a571a1"},
4077
+ {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f15edcae3830ff20e55d1f4e743e92970c847bcddc8b7509bcd172aa04de506e"},
4078
+ {file = "watchdog-4.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:936acba76d636f70db8f3c66e76aa6cb5136a936fc2a5088b9ce1c7a3508fc83"},
4079
+ {file = "watchdog-4.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:e252f8ca942a870f38cf785aef420285431311652d871409a64e2a0a52a2174c"},
4080
+ {file = "watchdog-4.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:0e83619a2d5d436a7e58a1aea957a3c1ccbf9782c43c0b4fed80580e5e4acd1a"},
4081
+ {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:88456d65f207b39f1981bf772e473799fcdc10801062c36fd5ad9f9d1d463a73"},
4082
+ {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:32be97f3b75693a93c683787a87a0dc8db98bb84701539954eef991fb35f5fbc"},
4083
+ {file = "watchdog-4.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:c82253cfc9be68e3e49282831afad2c1f6593af80c0daf1287f6a92657986757"},
4084
+ {file = "watchdog-4.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c0b14488bd336c5b1845cee83d3e631a1f8b4e9c5091ec539406e4a324f882d8"},
4085
+ {file = "watchdog-4.0.2-py3-none-win32.whl", hash = "sha256:0d8a7e523ef03757a5aa29f591437d64d0d894635f8a50f370fe37f913ce4e19"},
4086
+ {file = "watchdog-4.0.2-py3-none-win_amd64.whl", hash = "sha256:c344453ef3bf875a535b0488e3ad28e341adbd5a9ffb0f7d62cefacc8824ef2b"},
4087
+ {file = "watchdog-4.0.2-py3-none-win_ia64.whl", hash = "sha256:baececaa8edff42cd16558a639a9b0ddf425f93d892e8392a56bf904f5eff22c"},
4088
+ {file = "watchdog-4.0.2.tar.gz", hash = "sha256:b4dfbb6c49221be4535623ea4474a4d6ee0a9cef4a80b20c28db4d858b64e270"},
4089
+ ]
4090
+
4091
+ [package.extras]
4092
+ watchmedo = ["PyYAML (>=3.10)"]
4093
+
4094
  [[package]]
4095
  name = "watchfiles"
4096
  version = "0.22.0"
 
4178
  [package.dependencies]
4179
  anyio = ">=3.0.0"
4180
 
4181
+ [[package]]
4182
+ name = "wcwidth"
4183
+ version = "0.2.13"
4184
+ description = "Measures the displayed width of unicode strings in a terminal"
4185
+ optional = false
4186
+ python-versions = "*"
4187
+ files = [
4188
+ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"},
4189
+ {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"},
4190
+ ]
4191
+
4192
  [[package]]
4193
  name = "websockets"
4194
  version = "11.0.3"
 
4491
  [metadata]
4492
  lock-version = "2.0"
4493
  python-versions = "^3.10"
4494
+ content-hash = "0def275bcab7394a1ef5ece60bb91b6ad2e2adf3b80219893bb7bdb64a294f1c"
pyproject.toml CHANGED
@@ -12,6 +12,7 @@ langchain = "^0.2.6"
12
  langchain-openai = "^0.1.14"
13
  pydantic = "^2.8.2"
14
  python-json-logger = "^2.0.7"
 
15
 
16
  [tool.poetry.dev-dependencies]
17
  gradio = "^4.37.2"
@@ -20,6 +21,8 @@ confz = "^2.0.1"
20
  [tool.poetry.group.dev.dependencies]
21
  pytest = "^8.2.2"
22
  datasets = "^2.20.0"
 
 
23
 
24
  [build-system]
25
  requires = ["poetry-core>=1.0.0"]
 
12
  langchain-openai = "^0.1.14"
13
  pydantic = "^2.8.2"
14
  python-json-logger = "^2.0.7"
15
+ streamlit = "^1.38.0"
16
 
17
  [tool.poetry.dev-dependencies]
18
  gradio = "^4.37.2"
 
21
  [tool.poetry.group.dev.dependencies]
22
  pytest = "^8.2.2"
23
  datasets = "^2.20.0"
24
+ streamlit = "^1.37.1"
25
+ ipykernel = "^6.29.5"
26
 
27
  [build-system]
28
  requires = ["poetry-core>=1.0.0"]
tests/task_example_generator_test.py ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import unittest
2
+ from unittest.mock import MagicMock
3
+ import json
4
+ from meta_prompt.sample_generator import TaskDescriptionGenerator
5
+
6
+ class TestTaskDescriptionGenerator(unittest.TestCase):
7
+ def setUp(self):
8
+ self.mock_model = MagicMock()
9
+ self.generator = TaskDescriptionGenerator(self.mock_model)
10
+
11
+ def test_load_and_validate_input_json(self):
12
+ valid_json = '{"input": "test input", "output": "test output"}'
13
+ result = self.generator.load_and_validate_input({"input_str": valid_json, "generating_batch_size": 3})
14
+ self.assertEqual(result, {"example": {"input": "test input", "output": "test output"}, "generating_batch_size": 3})
15
+
16
+ def test_load_and_validate_input_yaml(self):
17
+ valid_yaml = 'input: test input\noutput: test output'
18
+ result = self.generator.load_and_validate_input({"input_str": valid_yaml, "generating_batch_size": 3})
19
+ self.assertEqual(result, {"example": {"input": "test input", "output": "test output"}, "generating_batch_size": 3})
20
+
21
+ def test_process(self):
22
+ self.mock_model.return_value = "test description"
23
+ result = self.generator.process('{"input": "test input", "output": "test output"}', 3)
24
+ self.assertIn("description", result)
25
+
26
+ def test_generate_description(self):
27
+ self.mock_model.return_value = "test description"
28
+ result = self.generator.generate_description('{"input": "test input", "output": "test output"}')
29
+ self.assertEqual(result, "test description")
30
+
31
+ def test_analyze_input(self):
32
+ self.mock_model.return_value = "test analysis"
33
+ result = self.generator.analyze_input("test description")
34
+ self.assertEqual(result, "test analysis")
35
+
36
+ def test_generate_briefs(self):
37
+ self.mock_model.return_value = "test briefs"
38
+ result = self.generator.generate_briefs("test description", "test analysis", 3)
39
+ self.assertEqual(result, "test briefs")
40
+
41
+ def test_generate_examples_from_briefs(self):
42
+ self.mock_model.return_value = {"examples": [{"input": "test input", "output": "test output"}]}
43
+ result = self.generator.generate_examples_from_briefs("test description", "test briefs", '{"input": "test input", "output": "test output"}', 3)
44
+ self.assertEqual(result, {"examples": [{"input": "test input", "output": "test output"}]})
45
+
46
+ def test_generate_examples_directly(self):
47
+ self.mock_model.return_value = {"examples": [{"input": "test input", "output": "test output"}]}
48
+ result = self.generator.generate_examples_