From 48f24521ab223229479d5bf5ddd2c3978ec3d248 Mon Sep 17 00:00:00 2001 From: Tianqi Xu <40522713+dandansamax@users.noreply.github.com> Date: Tue, 29 Oct 2024 19:34:06 +0900 Subject: [PATCH] refactor(agent): clean agent part code (#40) Co-authored-by: Isaac Jin --- crab-benchmark-v0/README.md | 4 + crab-benchmark-v0/android_env.py | 3 +- .../4190c90c-b28c-4bb3-ab5c-af3c4fde0a3d.json | 15 + .../4893a9b0-6477-495d-a73c-32503326e24a.json | 14 + .../e55d7a39-7b6b-4852-8711-844cebc88cb8.json | 15 + crab-benchmark-v0/dataset/android_subtasks.py | 2 + .../05a7633d-b966-471c-8848-e18e69ad265f.json | 2 +- crab-benchmark-v0/dataset/handmade_tasks.py | 224 ++- crab-benchmark-v0/main.py | 94 +- crab-benchmark-v0/ubuntu_env.py | 2 + crab/actions/crab_actions.py | 10 + crab/actions/desktop_actions.py | 30 +- crab/agents/backend_models/__init__.py | 118 +- crab/agents/backend_models/camel_model.py | 16 +- crab/agents/backend_models/claude_model.py | 275 ++-- crab/agents/backend_models/gemini_model.py | 253 +-- crab/agents/backend_models/openai_model.py | 265 +++- crab/agents/policies/multi_agent_by_env.py | 28 +- crab/agents/policies/multi_agent_by_func.py | 34 +- crab/agents/policies/single_agent.py | 85 +- crab/agents/utils.py | 105 ++ crab/core/agent_policy.py | 53 +- crab/core/backend_model.py | 15 - crab/core/benchmark.py | 17 +- crab/core/environment.py | 2 +- crab/core/experiment.py | 11 + crab/core/models/__init__.py | 3 +- crab/core/models/agent_interface.py | 3 + crab/core/task_generator.py | 3 + poetry.lock | 1357 +++++++++-------- pyproject.toml | 3 +- .../agents/backend_models/test_camel_model.py | 15 +- .../backend_models/test_claude_model.py | 17 +- .../backend_models/test_gemini_model.py | 14 +- .../backend_models/test_openai_model.py | 18 +- .../policies/test_multi_agent_by_func.py | 11 +- .../policies/test_mutli_agent_by_env.py | 11 +- test/agents/policies/test_single_agent.py | 7 +- 38 files changed, 1997 insertions(+), 1157 deletions(-) create mode 100644 crab-benchmark-v0/dataset/android/4190c90c-b28c-4bb3-ab5c-af3c4fde0a3d.json create mode 100644 crab-benchmark-v0/dataset/android/4893a9b0-6477-495d-a73c-32503326e24a.json create mode 100644 crab-benchmark-v0/dataset/android/e55d7a39-7b6b-4852-8711-844cebc88cb8.json create mode 100644 crab/agents/utils.py diff --git a/crab-benchmark-v0/README.md b/crab-benchmark-v0/README.md index 29c8db8..6965338 100644 --- a/crab-benchmark-v0/README.md +++ b/crab-benchmark-v0/README.md @@ -29,3 +29,7 @@ After setting up the environment, you can start the experiment. A brief overview 2. Start the CRAB server in the Ubuntu environment and get its IP address and port. Let's say they are `192.168.122.72` and `8000`. 3. Choose a task. As an example, we take the task with ID `a3476778-e512-40ca-b1c0-d7aab0c7f18b` from [handmade_tasks](./dataset/handmade_tasks.py). The task is: "Open the 'Tasks' app on Android, check the first incomplete task, then perform the task according to its description." 4. Run [main.py](./main.py) with the command `poetry run python -m crab-benchmark-v0.main --model gpt4o --policy single --remote-url http://192.168.122.72:8000 --task-id a3476778-e512-40ca-b1c0-d7aab0c7f18b`. In this command, `--model gpt4o` and `--policy single` determine the agent system, `--remote-url` specifies the Ubuntu environment interface, and `--task-id` indicates the task to be performed. + +#### Model + +For open source models, we use [VLLM](https://github.com/vllm-project/vllm) to host Pixtral model, check [here](https://docs.vllm.ai/en/latest/models/vlm.html#online-inference) for the setup commands; [SGLang](https://github.com/sgl-project/sglang) to host LLaVa-OneVision model, check [here](https://github.com/sgl-project/sglang?tab=readme-ov-file#supported-models) for the setup commands. \ No newline at end of file diff --git a/crab-benchmark-v0/android_env.py b/crab-benchmark-v0/android_env.py index ec43644..d4d3c91 100644 --- a/crab-benchmark-v0/android_env.py +++ b/crab-benchmark-v0/android_env.py @@ -14,6 +14,7 @@ from crab import EnvironmentConfig from crab.actions.android_actions import ( key_press, + long_tap, open_app_drawer, screenshot, setup, @@ -24,7 +25,7 @@ ANDROID_ENV = EnvironmentConfig( name="android", - action_space=[tap, key_press, write_text, swipe, open_app_drawer], + action_space=[tap, key_press, long_tap, write_text, swipe, open_app_drawer], observation_space=[screenshot], description="""A Google Pixel smartphone runs on the Android operating system. \ The interface displays a current screenshot at each step and primarily \ diff --git a/crab-benchmark-v0/dataset/android/4190c90c-b28c-4bb3-ab5c-af3c4fde0a3d.json b/crab-benchmark-v0/dataset/android/4190c90c-b28c-4bb3-ab5c-af3c4fde0a3d.json new file mode 100644 index 0000000..5ff2b91 --- /dev/null +++ b/crab-benchmark-v0/dataset/android/4190c90c-b28c-4bb3-ab5c-af3c4fde0a3d.json @@ -0,0 +1,15 @@ +{ + "description": "In Android, Using Google Map app, Find the city name of corresponding post code \"1010021\" in the country \"Japan\".", + "tasks": [ + { + "task": "51b2463c-9904-4a32-81ba-507bfb89d61f", + "attribute": { + "country": "Japan", + "number": "101-0021" + }, + "output": "Tokyo" + } + ], + "adjlist": "0", + "id": "4190c90c-b28c-4bb3-ab5c-af3c4fde0a3d" +} diff --git a/crab-benchmark-v0/dataset/android/4893a9b0-6477-495d-a73c-32503326e24a.json b/crab-benchmark-v0/dataset/android/4893a9b0-6477-495d-a73c-32503326e24a.json new file mode 100644 index 0000000..5df87bb --- /dev/null +++ b/crab-benchmark-v0/dataset/android/4893a9b0-6477-495d-a73c-32503326e24a.json @@ -0,0 +1,14 @@ +{ + "description": "In the Android system, use the calendar app to find the title of an event on the date \"16 July 2024,\".", + "tasks": [ + { + "task": "2394b768-2ca7-45e9-b41e-2aa4e9573192", + "attribute": { + "date": "16 July 2024" + }, + "output": "Japan" + } + ], + "adjlist": "0", + "id": "4893a9b0-6477-495d-a73c-32503326e24a" +} diff --git a/crab-benchmark-v0/dataset/android/e55d7a39-7b6b-4852-8711-844cebc88cb8.json b/crab-benchmark-v0/dataset/android/e55d7a39-7b6b-4852-8711-844cebc88cb8.json new file mode 100644 index 0000000..450ac2c --- /dev/null +++ b/crab-benchmark-v0/dataset/android/e55d7a39-7b6b-4852-8711-844cebc88cb8.json @@ -0,0 +1,15 @@ +{ + "description": "In Android, use the \"Google Map\" app to find the city name corresponding to the postcode \"110151\" in Colombia.", + "tasks": [ + { + "task": "51b2463c-9904-4a32-81ba-507bfb89d61f", + "attribute": { + "number": "110151", + "country": "Columbia" + }, + "output": "Bogota" + } + ], + "adjlist": "0", + "id": "e55d7a39-7b6b-4852-8711-844cebc88cb8" +} diff --git a/crab-benchmark-v0/dataset/android_subtasks.py b/crab-benchmark-v0/dataset/android_subtasks.py index 02c7960..80be4be 100644 --- a/crab-benchmark-v0/dataset/android_subtasks.py +++ b/crab-benchmark-v0/dataset/android_subtasks.py @@ -361,6 +361,8 @@ def check_event(date: str, env) -> bool: event_nodes = root.xpath('//node[@class="android.support.v7.widget.RecyclerView"]') if event_nodes is None: return False + if not event_nodes: + return False for node in event_nodes[0]: text = node.get("content-desc") if date in text: diff --git a/crab-benchmark-v0/dataset/cross/05a7633d-b966-471c-8848-e18e69ad265f.json b/crab-benchmark-v0/dataset/cross/05a7633d-b966-471c-8848-e18e69ad265f.json index 2e6c9f0..5837689 100644 --- a/crab-benchmark-v0/dataset/cross/05a7633d-b966-471c-8848-e18e69ad265f.json +++ b/crab-benchmark-v0/dataset/cross/05a7633d-b966-471c-8848-e18e69ad265f.json @@ -1,5 +1,5 @@ { - "description": "In Android, use the \"Google Map\" app to find the city name corresponding to the postal code \"1010021\" in Japan, then paste the name into LibreOffice Writer on an Ubuntu system and save it as an ODT file at \"/home/crab/Desktop\".", + "description": "In Android, use the \"Google Map\" app to find the city name corresponding to the postal code \"1010021\" in Japan, then paste the name into LibreOffice Writer on an Ubuntu system and save it as an ODT file at \"/home/crab/Desktop/target.opt\".", "tasks": [ { "task": "51b2463c-9904-4a32-81ba-507bfb89d61f", diff --git a/crab-benchmark-v0/dataset/handmade_tasks.py b/crab-benchmark-v0/dataset/handmade_tasks.py index ef20a70..f3a15f4 100644 --- a/crab-benchmark-v0/dataset/handmade_tasks.py +++ b/crab-benchmark-v0/dataset/handmade_tasks.py @@ -24,8 +24,10 @@ from .android_subtasks import ( check_current_package_name, + check_google_tasks_name, check_message_text_box_contain, check_message_text_box_empty, + check_note_content, get_xml_etree, ) from .ubuntu_subtasks import * # noqa: F403 @@ -148,6 +150,44 @@ def check_keep_notes_content(text: str, env) -> bool: return text_nodes[0].get("text") == text +@evaluator(env_name="android") +def check_keep_notes_contain_fd(env) -> bool: + global RESULT_fd0576be + text = RESULT_fd0576be + root = get_xml_etree(env) + if root is None or text is None: + return False + edit_node = root.xpath( + '//node[@resource-id="com.google.android.keep:id/editor_bottom_bar"]' + ) + if len(edit_node) != 1: + return False + content_node = root.xpath( + '//node[@resource-id="com.google.android.keep:id/browse_note_interior_content"]' + ) + for node in content_node: + text_nodes = node.getchildren() + if len(text_nodes) != 1: + continue + if text in text_nodes[0].get("text"): + return True + return False + + +@evaluator(env_name="android") +def check_alarm_contains(time: str, env) -> bool: + root = get_xml_etree(env) + if root is None or time is None: + return False + clock_node = root.xpath( + '//node[@resource-id="com.google.android.deskclock:id/digital_clock"]' + ) + for node in clock_node: + if time == node.get("text"): + return True + return False + + @evaluator(env_name="android", local=True) def check_tap_text(text: str, env) -> bool: if env.trajectory: @@ -361,6 +401,112 @@ def evaluator_ca79febf(): return result +def evaluator_dfabf84c(): + result = nx.DiGraph() + keyword = "kaust" + a = check_text_in_current_window_name("Mozilla Firefox") + b = check_contain_input_text(keyword) + c = is_img_url_in_clipboard() + d = download_from_clipboard_and_verify_file("/home/crab/Desktop/download.jpg") + e = check_current_package_name("com.google.android.keep") + f = check_contain_input_text(keyword) + g = check_note_content(keyword) + result.add_edges_from([(a, b), (b, c), (c, d), (d, g)]) + result.add_edges_from([(b, e), (e, f), (f, g)]) + return result + + +def evaluator_aab5555e(): + result = nx.DiGraph() + a = check_current_window_process("gnome-terminal-server") + b = check_contain_input_text("uname -a") + d = check_current_package_name("com.google.android.apps.messaging") + e = check_message_text_box_contain("ubuntu") + f = check_message_text_box_contain("x86") + g = check_message_text_box_contain("linux") + h = check_message_text_box_contain("crab") + sink = check_message_text_box_empty() + result.add_edges_from( + [ + (a, b), + (b, sink), + (d, e), + (d, f), + (d, g), + (d, h), + (e, sink), + (f, sink), + (g, sink), + (h, sink), + ] + ) + return result + + +RESULT_fd0576be = None + + +@action(env_name="ubuntu") +def get_root_usage() -> str: + try: + output = subprocess.check_output(["df", "/"], text=True) + return output.split("\n")[1].split()[4][:-1] + except Exception: + return None + + +@evaluator(env_name="ubuntu", local=True) +def check_contain_input_text_and_get_df_result(text: str, env) -> bool: + global RESULT_fd0576be + RESULT_fd0576be = env._action_endpoint(get_root_usage, parameters={}) + if env.trajectory: + inputs = [ + params["text"].lower() + for action_name, params, _ in env.trajectory + if action_name == "write_text" + ] + return any(text.lower() in input_text for input_text in inputs) + + return False + + +def evaluator_fd0576be(): + result = nx.DiGraph() + a = check_current_window_process("gnome-terminal-server") + b = check_contain_input_text_and_get_df_result("df") + c = check_current_package_name("com.google.android.keep") + d = check_keep_notes_contain_fd() + result.add_edges_from([(a, b), (b, d), (c, d)]) + return result + + +def evaluator_7e08f7d4(): + result = nx.DiGraph() + a = check_text_in_current_window_name("Mozilla Firefox") + b = check_contain_input_text( + "https://farm9.staticflickr.com/8293/7591378270_76059bc1cf_z.jpg" + ) + c = check_current_package_name("com.android.deskclock.DeskClock") + d = check_alarm_contains("7:00\u200aAM") + result.add_edges_from([(a, b), (b, d), (c, d)]) + return result + + +def evaluator_4957e964(): + result = nx.DiGraph() + a = check_current_window_process("gnome-terminal-server") + b = check_contain_input_text("wget") + c = check_contain_input_text( + "https://farm8.staticflickr.com/7451/10001676353_fd762e02f0_z.jpg" + ) + d = check_file_exist("/home/crab/Desktop/download.jpg") + e = check_text_in_current_window_name("Image Viewer") + f = check_current_package_name("com.google.android.apps.tasks") + g = check_google_tasks_name("tennis") + result.add_edges_from([(a, b), (b, c), (c, d), (d, e), (e, g), (f, g)]) + return result + + # Hand-made environment setup guide: # Ubuntu # * Make sure the Ubuntu slack login, and the default channel has at least two messages @@ -370,7 +516,40 @@ def evaluator_ca79febf(): # * Make sure the init page of "Calendar" app is "Day" view. There should be at least one element today. -handmade_tasks = [ +ubuntu_handmade_tasks = [ + Task( + id="82efbd82-c941-4be9-9ac0-a495dc629e02", + description='Download an image file from a given URL "https://media.cntraveller.com/photos/642aa1ad770beda2d4f5cc22/4:3/w_2664,h_1998,c_limit/Fiji-march2023issue-JackJohns15.jpg" to "/home/crab/Downloads/raw.jpg", then use GIMP (GNU Image Manipulation Program) to adjust the brightness of the image from "/home/crab/Downloads/raw.jpg" to be brighter and save the edited file to "/home/crab/Pictures/edited.jpg", and set the adjusted image "/home/crab/Pictures/edited.jpg" as the screen background of the system.', + evaluator=evaluator_82efbd82(), + ), + Task( + id="515a5467-b7ce-4cad-874d-da894361c1a3", + description='Download two image files from given URLs "https://media.cntraveller.com/photos/642aa1ad770beda2d4f5cc22/4:3/w_2664,h_1998,c_limit/Fiji-march2023issue-JackJohns15.jpg" and "https://upload.wikimedia.org/wikipedia/commons/thumb/7/71/Flag_of_Ethiopia.svg/250px-Flag_of_Ethiopia.svg.png" to "/home/crab/Downloads/img_1.jpg" and "/home/crab/Downloads/img_2.jpg", combine the first image ("/home/crab/Downloads/img_1.jpg") with the second image ("/home/crab/Downloads/img_2.jpg") using GIMP (GNU Image Manipulation Program) by placing the first image on the right side of the second image, and save the resulting combined image to "/home/crab/Downloads/combined_editing.jpg". Then, create a new directory "/home/crab/jpg" and copy all files with the specified "jpg" extension from "/home/crab/Downloads" to the newly created directory "/home/crab/jpg".', + evaluator=evaluator_515a5467(), + ), + Task( + id="5a1eba49-ed2d-4955-a684-32472090a45b", + description='Use Firefox to search for an image using the keyword "GPU", copy the URL of the found image to the clipboard, download the image file from the URL stored in the clipboard to "/home/crab/Pictures/GPU.png", and create a new directory "/home/crab/Pictures/png_files" to copy all files with the specified "png" extension from "/home/crab/Pictures" to the newly created directory "/home/crab/Pictures/png_files".', + evaluator=evaluator_5a1eba49(), + ), + Task( + id="c347f78a-4643-43c8-b41e-e437b70a2c5e", + description='Open a file at "/home/crab/assets/content.txt" using vim in a terminal, write the specified "An air quality health advisory is in effect Tuesday for New York City and the lower Hudson Valley, as well as western Connecticut and northern New Jersey, meaning it may not be safe for people with some conditions to be outside long." to it, then save and exit vim. Print the content of the file by printing it to the command line interface through a terminal, and finally, submit the printed content.', + evaluator=evaluator_c347f78a(), + ), + Task( + id="bf83c176-fa15-4057-996f-f75be4338c05", + description='Use Firefox to search for an image using the keyword "Waymo" first, copy the URL of the image to the clipboard, and download the image to "/home/crab/Desktop/waymo.jpg". Then, search for another image using the keyword "Tesla", copy the URL of the image to the clipboard, and download the image to "/home/crab/Desktop/tesla.png". Finally, combine the two images using LibreOffice Impress, placing Image 1 from "/home/crab/Desktop/waymo.jpg" on the left side of Image 2 "/home/crab/Desktop/tesla.png", and save the resulting file in PDF format to "/home/crab/Documents/self_driving.pdf".', + evaluator=evaluator_bf83c176(), + ), + Task( + id="74bb11dd-89ca-43d0-8edf-fe7b5201ecf7", + description='Use Firefox to search for information about the country "France" on Wikipedia. Extract the capital city and population, and save this information in an ODS file at "/home/crab/Documents/FR.ods" using LibreOffice Calc. Then, search for information about the country "Mexico" on Wikipedia, extract the capital city and population, and save this information in a separate ODS file at "/home/crab/Documents/MX.ods" using LibreOffice Calc. The format of the file are, first column for the country name, the second for the capital city name, and the third for the population without any header. Finally, create a new directory "/home/crab/Desktop/country_info" and copy all files with the specified "ods" extension from "/home/crab/Documents" to the newly created directory "/home/crab/Desktop/country_info".', + evaluator=evaluator_74bb11dd(), + ), +] + +corss_environment_tasks = [ Task( id="79832e15-5fd3-43b8-b3e3-66249edfe1db", description='Open slack in Ubuntu desktop, summarize the last two messages in current channel, then use "Messages" app in android phone to send the summary to the first contact in the list.', @@ -401,38 +580,35 @@ def evaluator_ca79febf(): evaluator=evaluator_97e6f333(), ), Task( - id="82efbd82-c941-4be9-9ac0-a495dc629e02", - description='Download an image file from a given URL "https://media.cntraveller.com/photos/642aa1ad770beda2d4f5cc22/4:3/w_2664,h_1998,c_limit/Fiji-march2023issue-JackJohns15.jpg" to "/home/crab/Downloads/raw.jpg", then use GIMP (GNU Image Manipulation Program) to adjust the brightness of the image from "/home/crab/Downloads/raw.jpg" to be brighter and save the edited file to "/home/crab/Pictures/edited.jpg", and set the adjusted image "/home/crab/Pictures/edited.jpg" as the screen background of the system.', - evaluator=evaluator_82efbd82(), + id="ca79febf-cae7-4669-8812-d3ec85ee2868", + description="Open the first note in the Keep Notes app on Android, copy its contents, and paste them into a new document in Google docs. Then, open the newly created document in Firefox on Ubuntu.", + evaluator=evaluator_ca79febf(), ), Task( - id="515a5467-b7ce-4cad-874d-da894361c1a3", - description='Download two image files from given URLs "https://media.cntraveller.com/photos/642aa1ad770beda2d4f5cc22/4:3/w_2664,h_1998,c_limit/Fiji-march2023issue-JackJohns15.jpg" and "https://upload.wikimedia.org/wikipedia/commons/thumb/7/71/Flag_of_Ethiopia.svg/250px-Flag_of_Ethiopia.svg.png" to "/home/crab/Downloads/img_1.jpg" and "/home/crab/Downloads/img_2.jpg", combine the first image ("/home/crab/Downloads/img_1.jpg") with the second image ("/home/crab/Downloads/img_2.jpg") using GIMP (GNU Image Manipulation Program) by placing the first image on the right side of the second image, and save the resulting combined image to "/home/crab/Downloads/combined_editing.jpg". Then, create a new directory "/home/crab/jpg" and copy all files with the specified "jpg" extension from "/home/crab/Downloads" to the newly created directory "/home/crab/jpg".', - evaluator=evaluator_515a5467(), + id="dfabf84c-d05f-4e25-9f21-ba0f08107bd5", + description='Use Firefox to search for an image using the keyword "kaust" and copy the URL of the image to the clipboard. Download a file from the URL stored in the clipboard to "/home/crab/Desktop/download.jpg". Then describe this image and save it in the Android Keep Notes app.', + evaluator=evaluator_dfabf84c(), ), Task( - id="5a1eba49-ed2d-4955-a684-32472090a45b", - description='Use Firefox to search for an image using the keyword "GPU", copy the URL of the found image to the clipboard, download the image file from the URL stored in the clipboard to "/home/crab/Pictures/GPU.png", and create a new directory "/home/crab/Pictures/png_files" to copy all files with the specified "png" extension from "/home/crab/Pictures" to the newly created directory "/home/crab/Pictures/png_files".', - evaluator=evaluator_5a1eba49(), + id="aab5555e-4b72-4ebf-816a-59c1da2cec86", + description="Check the all uname information of the system in Ubuntu, then explain the information to the first contact in the list of the Messages app in Android.", + evaluator=evaluator_aab5555e(), ), Task( - id="c347f78a-4643-43c8-b41e-e437b70a2c5e", - description='Open a file at "/home/crab/assets/content.txt" using vim in a terminal, write the specified "An air quality health advisory is in effect Tuesday for New York City and the lower Hudson Valley, as well as western Connecticut and northern New Jersey, meaning it may not be safe for people with some conditions to be outside long." to it, then save and exit vim. Print the content of the file by printing it to the command line interface through a terminal, and finally, submit the printed content.', - evaluator=evaluator_c347f78a(), + id="fd0576be-8b2c-45ce-b4a2-78659740879b", + description="Check the current disk usage through command line in Ubuntu, check the root directory usage in percentage and save the information to a note in Keep Notes app in Android.", + evaluator=evaluator_fd0576be(), ), Task( - id="bf83c176-fa15-4057-996f-f75be4338c05", - description='Use Firefox to search for an image using the keyword "Waymo" first, copy the URL of the image to the clipboard, and download the image to "/home/crab/Desktop/waymo.jpg". Then, search for another image using the keyword "Tesla", copy the URL of the image to the clipboard, and download the image to "/home/crab/Desktop/tesla.png". Finally, combine the two images using LibreOffice Impress, placing Image 1 from "/home/crab/Desktop/waymo.jpg" on the left side of Image 2 "/home/crab/Desktop/tesla.png", and save the resulting file in PDF format to "/home/crab/Documents/self_driving.pdf".', - evaluator=evaluator_bf83c176(), + id="7e08f7d4-9b11-4aec-9b42-6cbde083fb4c", + description='Use firefox on Ubuntu to openup the image "https://farm9.staticflickr.com/8293/7591378270_76059bc1cf_z.jpg", check the time of the clock in the image, then open the clock app in Android and set an alarm to the same as the image.', + evaluator=evaluator_7e08f7d4(), ), Task( - id="74bb11dd-89ca-43d0-8edf-fe7b5201ecf7", - description='Use Firefox to search for information about the country "France" on Wikipedia. Extract the capital city and population, and save this information in an ODS file at "/home/crab/Documents/FR.ods" using LibreOffice Calc. Then, search for information about the country "Mexico" on Wikipedia, extract the capital city and population, and save this information in a separate ODS file at "/home/crab/Documents/MX.ods" using LibreOffice Calc. The format of the file are, first column for the country name, the second for the capital city name, and the third for the population without any header. Finally, create a new directory "/home/crab/Desktop/country_info" and copy all files with the specified "ods" extension from "/home/crab/Documents" to the newly created directory "/home/crab/Desktop/country_info".', - evaluator=evaluator_74bb11dd(), - ), - Task( - id="ca79febf-cae7-4669-8812-d3ec85ee2868", - description="Open the first note in the Keep Notes app on Android, copy its contents, and paste them into a new document in Google docs. Then, open the newly created document in Firefox on Ubuntu.", - evaluator=evaluator_ca79febf(), + id="4957e964-5dd5-42f6-9d5d-f6a53a9a5d94", + description='Use wget to download the image "https://farm8.staticflickr.com/7451/10001676353_fd762e02f0_z.jpg" to /home/crab/Desktop/download.jpg, what does the people in the image do? Create a task in the Tasks app in Android to remind you to do the same thing.', + evaluator=evaluator_4957e964(), ), ] + +handmade_tasks = ubuntu_handmade_tasks + corss_environment_tasks diff --git a/crab-benchmark-v0/main.py b/crab-benchmark-v0/main.py index c9484b9..f1751ed 100644 --- a/crab-benchmark-v0/main.py +++ b/crab-benchmark-v0/main.py @@ -24,12 +24,12 @@ TaskGenerator, create_benchmark, ) -from crab.actions.crab_actions import complete +from crab.actions.crab_actions import complete, wait from crab.actions.visual_prompt_actions import ( get_elements_prompt, groundingdino_easyocr, ) -from crab.agents.backend_models import ClaudeModel, GeminiModel, OpenAIModel +from crab.agents.backend_models import BackendModelConfig from crab.agents.policies import ( MultiAgentByEnvPolicy, MultiAgentByFuncPolicy, @@ -96,7 +96,7 @@ def get_benchmark(env: str, ubuntu_url: str): tasks=[], environments=[ubuntu_env], prompting_tools=prompting_tools, - root_action_space=[complete], + root_action_space=[complete, wait], multienv=True, ) elif env == "android": @@ -106,7 +106,7 @@ def get_benchmark(env: str, ubuntu_url: str): tasks=[], environments=[ANDROID_ENV], prompting_tools=prompting_tools, - root_action_space=[complete], + root_action_space=[complete, wait], multienv=True, ) elif env == "cross": @@ -119,7 +119,7 @@ def get_benchmark(env: str, ubuntu_url: str): tasks=[], environments=[ubuntu_env, ANDROID_ENV], prompting_tools=prompting_tools, - root_action_space=[complete], + root_action_space=[complete, wait], multienv=True, ) else: @@ -137,7 +137,7 @@ def get_benchmark(env: str, ubuntu_url: str): # Load from handmade tasks benchmark_config.tasks.extend(handmade_tasks) - benchmark_config.step_limit = 15 + benchmark_config.step_limit = 20 return create_benchmark(benchmark_config) @@ -158,7 +158,7 @@ def get_benchmark(env: str, ubuntu_url: str): default="single", ) parser.add_argument( - "--remote-url", + "--ubuntu-url", type=str, help="remote url of Ubunutu environment", default="http://127.0.0.1:8000", @@ -170,12 +170,30 @@ def get_benchmark(env: str, ubuntu_url: str): default="cross", ) parser.add_argument("--task-id", type=str, help="task id") + parser.add_argument( + "--model-base-url", + type=str, + help="URL of the model API", + default="http://127.0.0.1:8000/v1", + ) + parser.add_argument( + "--model-api-key", + type=str, + help="API key of the model API", + default="EMPTY", + ) parser.add_argument( "--loglevel", type=str, help="logger level, debug, info, warning, or error", default="warning", ) + parser.add_argument( + "--history-messages-len", + type=int, + help="The number of rounds of chat history to provide to the model", + default=2, + ) args = parser.parse_args() loglevel = args.loglevel numeric_level = getattr(logging, loglevel.upper(), None) @@ -183,16 +201,66 @@ def get_benchmark(env: str, ubuntu_url: str): raise ValueError("Invalid log level: %s" % loglevel) logging.basicConfig(level=numeric_level) - benchmark = get_benchmark(args.env, args.remote_url) + benchmark = get_benchmark(args.env, args.ubuntu_url) + + if args.model == "human": + expeirment = CrabBenchmarkV0( + benchmark=benchmark, + task_id=args.task_id, + agent_policy="human", + ) + expeirment.start_benchmark() + exit() if args.model == "gpt4o": - model = OpenAIModel(model="gpt-4o", history_messages_len=2) + model = BackendModelConfig( + model_class="openai", + model_name="gpt-4o", + history_messages_len=args.history_messages_len, + ) elif args.model == "gpt4turbo": - model = OpenAIModel(model="gpt-4-turbo", history_messages_len=2) + model = BackendModelConfig( + model_class="openai", + model_name="gpt-4-turbo", + history_messages_len=args.history_messages_len, + ) elif args.model == "gemini": - model = GeminiModel(model="gemini-1.5-pro-latest", history_messages_len=2) + model = BackendModelConfig( + model_class="gemini", + model_name="gemini-1.5-pro-latest", + history_messages_len=args.history_messages_len, + ) elif args.model == "claude": - model = ClaudeModel(model="claude-3-opus-20240229", history_messages_len=2) + model = BackendModelConfig( + model_class="claude", + model_name="claude-3-opus-20240229", + history_messages_len=args.history_messages_len, + ) + elif args.model == "pixtral": + model = BackendModelConfig( + model_class="openai", + model_name="mistralai/Pixtral-12B-2409", + json_structre_output=True, + history_messages_len=args.history_messages_len, + base_url=args.model_base_url, + api_key=args.model_api_key, + ) + elif args.model == "gpt4o-wofc": + model = BackendModelConfig( + model_class="openai", + model_name="gpt-4o", + json_structre_output=True, + history_messages_len=args.history_messages_len, + ) + elif args.model == "llava-ov72b": + model = BackendModelConfig( + model_class="sglang", + model_name="lmms-lab/llava-onevision-qwen2-72b-ov-chat", + json_structre_output=True, + history_messages_len=args.history_messages_len, + base_url=args.model_base_url, + api_key=args.model_api_key, + ) else: print("Unsupported model: ", args.model) exit() @@ -211,7 +279,7 @@ def get_benchmark(env: str, ubuntu_url: str): print("Unsupported policy: ", args.policy) exit() - log_dir = (Path(__file__).parent / "logs").resolve() + log_dir = (Path(__file__).parent / "tianqi_logs").resolve() expeirment = CrabBenchmarkV0( benchmark=benchmark, task_id=args.task_id, diff --git a/crab-benchmark-v0/ubuntu_env.py b/crab-benchmark-v0/ubuntu_env.py index 2ecec7e..2fd5be2 100644 --- a/crab-benchmark-v0/ubuntu_env.py +++ b/crab-benchmark-v0/ubuntu_env.py @@ -13,6 +13,7 @@ # =========== Copyright 2024 @ CAMEL-AI.org. All Rights Reserved. =========== from crab.actions.desktop_actions import ( click, + double_click, key_press, press_hotkey, right_click, @@ -31,6 +32,7 @@ press_hotkey, search_application, right_click, + double_click, ], observation_space=[screenshot], description="""An Ubuntu 22.04 Linux desktop operating system. The interface \ diff --git a/crab/actions/crab_actions.py b/crab/actions/crab_actions.py index d757cf2..8c41d5a 100644 --- a/crab/actions/crab_actions.py +++ b/crab/actions/crab_actions.py @@ -11,6 +11,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # =========== Copyright 2024 @ CAMEL-AI.org. All Rights Reserved. =========== +from time import sleep + from crab import action, evaluator @@ -42,6 +44,14 @@ def complete() -> bool: pass +@action(env_name="root") +def wait() -> bool: + """If the environment is still processing your action and you have nothing to do in + this step, you can use wait(). + """ + sleep(5) + + def get_element_position(element_id, env): """Get element position provided by function `zs_object_detection`""" box = env.element_position_map[element_id] diff --git a/crab/actions/desktop_actions.py b/crab/actions/desktop_actions.py index cf47ddc..861ecdd 100644 --- a/crab/actions/desktop_actions.py +++ b/crab/actions/desktop_actions.py @@ -69,7 +69,7 @@ def right_click(element: int, env) -> None: """ Right-click an UI element shown on the desktop screen using the mouse, which is usually used for opening the menu of the element. A simple use case can be - rght_click(5), which right-clicks the UI element labeled with the number 5 to open + right_click(5), which right-clicks the UI element labeled with the number 5 to open up menu on it. Args: @@ -80,6 +80,34 @@ def right_click(element: int, env) -> None: time.sleep(DELAY) +@action +def double_click_position(x: int, y: int) -> None: + """ + Double-click on the current desktop screen. + + Args: + x: The X coordinate, as a floating-point number in the range [0.0, 1.0]. + y: The Y coordinate, as a floating-point number in the range [0.0, 1.0]. + """ + pyautogui.click(x, y, duration=DURATION, clicks=2, interval=0.2) + + +@action(local=True) +def double_click(element: int, env) -> None: + """ + Double-click an UI element shown on the desktop screen using the mouse, which is + usually used for opening a folder or a file. A simple use case can be + double_click(5), which double-clicks the UI element labeled with the number 5 to + open it. + + Args: + element: A numeric tag assigned to an UI element shown on the screenshot. + """ + x, y = get_element_position(element, env) + env._action_endpoint(double_click_position, {"x": x, "y": y}) + time.sleep(DELAY) + + @action def mouse_scroll(click: int = 1) -> None: """ diff --git a/crab/agents/backend_models/__init__.py b/crab/agents/backend_models/__init__.py index 5f36882..32b21cc 100644 --- a/crab/agents/backend_models/__init__.py +++ b/crab/agents/backend_models/__init__.py @@ -12,7 +12,123 @@ # limitations under the License. # =========== Copyright 2024 @ CAMEL-AI.org. All Rights Reserved. =========== # ruff: noqa: F401 +from typing import Any, Literal + +from pydantic import BaseModel + +from crab.core.backend_model import BackendModel + from .camel_model import CamelModel from .claude_model import ClaudeModel from .gemini_model import GeminiModel -from .openai_model import OpenAIModel +from .openai_model import OpenAIModel, OpenAIModelJSON, SGlangOpenAIModelJSON + + +class BackendModelConfig(BaseModel): + model_class: Literal["openai", "claude", "gemini", "camel", "sglang"] + """Specify the model class to be used. Different model classese use different + APIs. + """ + + model_name: str + """Specify the model name to be used. This value is directly passed to the API, + check model provider API documentation for more details. + """ + + model_platform: str | None = None + """Required for CamelModel. Otherwise, it is ignored. Please check CAMEL + documentation for more details. + """ + + history_messages_len: int = 0 + """Number of rounds of previous messages to be used in the model input. 0 means no + history. + """ + + parameters: dict[str, Any] = {} + """Additional parameters to be passed to the model.""" + + json_structre_output: bool = False + """If True, the model generate action through JSON without using "tool call" or + "function call". SGLang model only supports JSON output. OpenAI model supports both. + Other models do not support JSON output. + """ + + tool_call_required: bool = True + """Specify if the model enforce each round to generate tool/function calls.""" + + base_url: str | None = None + """Specify the base URL of the API. Only used in OpenAI and SGLang currently.""" + + api_key: str | None = None + """Specify the API key to be used. Only used in OpenAI and SGLang currently.""" + + +def create_backend_model(model_config: BackendModelConfig) -> BackendModel: + match model_config.model_class: + case "claude": + if model_config.base_url is not None or model_config.api_key is not None: + raise Warning( + "base_url and api_key are not supported for ClaudeModel currently." + ) + if model_config.json_structre_output: + raise Warning( + "json_structre_output is not supported for ClaudeModel currently." + ) + return ClaudeModel( + model=model_config.model_name, + parameters=model_config.parameters, + history_messages_len=model_config.history_messages_len, + tool_call_required=model_config.tool_call_required, + ) + case "gemini": + if model_config.base_url is not None or model_config.api_key is not None: + raise Warning( + "base_url and api_key are not supported for GeminiModel currently." + ) + if model_config.json_structre_output: + raise Warning( + "json_structre_output is not supported for GeminiModel currently." + ) + return GeminiModel( + model=model_config.model_name, + parameters=model_config.parameters, + history_messages_len=model_config.history_messages_len, + tool_call_required=model_config.tool_call_required, + ) + case "openai": + if not model_config.json_structre_output: + return OpenAIModel( + model=model_config.model_name, + parameters=model_config.parameters, + history_messages_len=model_config.history_messages_len, + base_url=model_config.base_url, + api_key=model_config.api_key, + tool_call_required=model_config.tool_call_required, + ) + else: + return OpenAIModelJSON( + model=model_config.model_name, + parameters=model_config.parameters, + history_messages_len=model_config.history_messages_len, + base_url=model_config.base_url, + api_key=model_config.api_key, + ) + case "sglang": + return SGlangOpenAIModelJSON( + model=model_config.model_name, + parameters=model_config.parameters, + history_messages_len=model_config.history_messages_len, + base_url=model_config.base_url, + api_key=model_config.api_key, + ) + case "camel": + return CamelModel( + model=model_config.model_name, + model_platform=model_config.model_platform, + parameters=model_config.parameters, + history_messages_len=model_config.history_messages_len, + tool_call_required=model_config.tool_call_required, + ) + case _: + raise ValueError(f"Unsupported model name: {model_config.model_name}") diff --git a/crab/agents/backend_models/camel_model.py b/crab/agents/backend_models/camel_model.py index 6631c4c..636006b 100644 --- a/crab/agents/backend_models/camel_model.py +++ b/crab/agents/backend_models/camel_model.py @@ -84,20 +84,20 @@ def __init__( model_platform: str, parameters: dict[str, Any] | None = None, history_messages_len: int = 0, + tool_call_required: bool = True, ) -> None: if not CAMEL_ENABLED: raise ImportError("Please install camel-ai to use CamelModel") - self.parameters = parameters or {} + self.model = model + self.parameters = parameters if parameters is not None else {} + self.history_messages_len = history_messages_len + self.model_type = _get_model_type(model) self.model_platform_type = _get_model_platform_type(model_platform) self.client: ChatAgent | None = None self.token_usage = 0 - - super().__init__( - model, - parameters, - history_messages_len, - ) + self.tool_call_required = tool_call_required + self.history_messages_len = history_messages_len def get_token_usage(self) -> int: return self.token_usage @@ -106,7 +106,7 @@ def reset(self, system_message: str, action_space: list[Action] | None) -> None: action_schema = _convert_action_to_schema(action_space) config = self.parameters.copy() if action_schema is not None: - config["tool_choice"] = "required" + config["tool_choice"] = "required" if self.tool_call_required else "auto" config["tools"] = [ schema.get_openai_tool_schema() for schema in action_schema ] diff --git a/crab/agents/backend_models/claude_model.py b/crab/agents/backend_models/claude_model.py index 7ffc4c2..fcb7dff 100644 --- a/crab/agents/backend_models/claude_model.py +++ b/crab/agents/backend_models/claude_model.py @@ -12,10 +12,11 @@ # limitations under the License. # =========== Copyright 2024 @ CAMEL-AI.org. All Rights Reserved. =========== from copy import deepcopy -from time import sleep from typing import Any -from crab import Action, ActionOutput, BackendModel, BackendOutput, MessageType +from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_fixed + +from crab import Action, ActionOutput, BackendModel, BackendOutput, Message, MessageType try: import anthropic @@ -30,52 +31,85 @@ class ClaudeModel(BackendModel): def __init__( self, model: str, - parameters: dict[str, Any] = dict(), + parameters: dict[str, Any] | None = None, history_messages_len: int = 0, + tool_call_required: bool = True, ) -> None: if anthropic_model_enable is False: raise ImportError("Please install anthropic to use ClaudeModel") - super().__init__( - model, - parameters, - history_messages_len, - ) + self.model = model + self.parameters = parameters if parameters is not None else {} + self.history_messages_len = history_messages_len + + assert self.history_messages_len >= 0 + self.client = anthropic.Anthropic() + self.tool_call_required: bool = tool_call_required + self.system_message: str = "You are a helpful assistant." + self.action_space: list[Action] | None = None + self.action_schema: list[dict] | None = None + self.token_usage: int = 0 + self.chat_history: list[list[dict]] = [] + self.support_tool_call = True def reset(self, system_message: str, action_space: list[Action] | None) -> None: self.system_message = system_message self.action_space = action_space - self.action_schema = self._convert_action_to_schema(self.action_space) + self.action_schema = _convert_action_to_schema(self.action_space) self.token_usage = 0 self.chat_history = [] - def chat(self, message: list[tuple[str, MessageType]]) -> BackendOutput: - # Initialize chat history - request = [] - if self.history_messages_len > 0 and len(self.chat_history) > 0: - for history_message in self.chat_history[-self.history_messages_len :]: - request = request + history_message - - if not isinstance(message, list): + def chat(self, message: list[Message] | Message) -> BackendOutput: + if isinstance(message, tuple): message = [message] - - new_message = { + request = self._fetch_from_memory() + new_message = self._construct_new_message(message) + request.append(new_message) + response_message = self._call_api(request) + self._record_message(new_message, response_message) + return self._generate_backend_output(response_message) + + def _construct_new_message(self, message: list[Message]) -> dict[str, Any]: + parts: list[dict] = [] + for content, msg_type in message: + match msg_type: + case MessageType.TEXT: + parts.append( + { + "type": "text", + "text": content, + } + ) + case MessageType.IMAGE_JPG_BASE64: + parts.append( + { + "type": "image", + "source": { + "data": content, + "type": "base64", + "media_type": "image/png", + }, + } + ) + return { "role": "user", - "content": [self._convert_message(part) for part in message], + "content": parts, } - request.append(new_message) - request = self._merge_request(request) - response = self.call_api(request) - response_message = response - self.record_message(new_message, response_message) - - return self._format_response(response_message.content) + def _fetch_from_memory(self) -> list[dict]: + request: list[dict] = [] + if self.history_messages_len > 0: + fetch_history_len = min(self.history_messages_len, len(self.chat_history)) + for history_message in self.chat_history[-fetch_history_len:]: + request = request + history_message + return request def get_token_usage(self): return self.token_usage - def record_message(self, new_message: dict, response_message: dict) -> None: + def _record_message( + self, new_message: dict, response_message: anthropic.types.Message + ) -> None: self.chat_history.append([new_message]) self.chat_history[-1].append( {"role": response_message.role, "content": response_message.content} @@ -83,125 +117,108 @@ def record_message(self, new_message: dict, response_message: dict) -> None: if self.action_schema: tool_calls = response_message.content - self.chat_history[-1].append( - { - "role": "user", - "content": [ + tool_content = [] + for call in tool_calls: + if isinstance(call, ToolUseBlock): + tool_content.append( { "type": "tool_result", "tool_use_id": call.id, "content": "success", } - for call in tool_calls - ], + ) + self.chat_history[-1].append( + { + "role": "user", + "content": tool_content, } ) - def call_api(self, request_messages: list): - while True: - try: - if self.action_schema is not None: - response = self.client.beta.tools.messages.create( - system=self.system_message, # <-- system prompt - messages=request_messages, # type: ignore - model=self.model, - tools=self.action_schema, - tool_choice={"type": "any"}, - **self.parameters, - ) - else: - response = self.client.messages.create( - system=self.system_message, # <-- system prompt - messages=request_messages, # type: ignore - model=self.model, - **self.parameters, - ) - except anthropic.RateLimitError: - print("Rate Limit Error: Please waiting...") - sleep(10) - except anthropic.APIStatusError: - print(len(request_messages)) - raise - else: - break + @retry( + wait=wait_fixed(10), + stop=stop_after_attempt(7), + retry=retry_if_exception_type( + ( + anthropic.APITimeoutError, + anthropic.APIConnectionError, + anthropic.InternalServerError, + ) + ), + ) + def _call_api(self, request_messages: list[dict]) -> anthropic.types.Message: + request_messages = _merge_request(request_messages) + if self.action_schema is not None: + response = self.client.messages.create( + system=self.system_message, # <-- system prompt + messages=request_messages, # type: ignore + model=self.model, + max_tokens=4096, + tools=self.action_schema, + tool_choice={"type": "any" if self.tool_call_required else "auto"}, + **self.parameters, + ) + else: + response = self.client.messages.create( + system=self.system_message, # <-- system prompt + messages=request_messages, # type: ignore + model=self.model, + max_tokens=4096, + **self.parameters, + ) self.token_usage += response.usage.input_tokens + response.usage.output_tokens return response - @staticmethod - def _convert_message(message: tuple[str, MessageType]): - match message[1]: - case MessageType.TEXT: - return { - "type": "text", - "text": message[0], - } - case MessageType.IMAGE_JPG_BASE64: - return { - "type": "image", - "source": { - "data": message[0], - "type": "base64", - "media_type": "image/png", - }, - } - - @staticmethod - def _convert_action_to_schema(action_space): - if action_space is None: - return None - actions = [] - for action in action_space: - new_action = action.to_openai_json_schema() - new_action["input_schema"] = new_action.pop("parameters") - if "returns" in new_action: - new_action.pop("returns") - if "title" in new_action: - new_action.pop("title") - if "type" in new_action: - new_action["input_schema"]["type"] = new_action.pop("type") - if "required" in new_action: - new_action["input_schema"]["required"] = new_action.pop("required") - - actions.append(new_action) - return actions - - @staticmethod - def _convert_tool_calls_to_action_list(tool_calls) -> list[ActionOutput]: - if tool_calls is None: - return tool_calls - return [ - ActionOutput( - name=call.name, - arguments=call.input, - ) - for call in tool_calls - ] - - @staticmethod - def _merge_request(request: list[dict]): - merge_request = [deepcopy(request[0])] - for idx in range(1, len(request)): - if request[idx]["role"] == merge_request[-1]["role"]: - merge_request[-1]["content"].extend(request[idx]["content"]) - else: - merge_request.append(deepcopy(request[idx])) - - return merge_request - - @classmethod - def _format_response(cls, content: list): - message = None + def _generate_backend_output( + self, response_message: anthropic.types.Message + ) -> BackendOutput: + message = "" action_list = [] - for block in content: + for block in response_message.content: if isinstance(block, TextBlock): - message = block.text + message += block.text elif isinstance(block, ToolUseBlock): - action_list.append(block) + action_list.append( + ActionOutput( + name=block.name, + arguments=block.input, # type: ignore + ) + ) if not action_list: return BackendOutput(message=message, action_list=None) else: return BackendOutput( message=message, - action_list=cls._convert_tool_calls_to_action_list(action_list), + action_list=action_list, ) + + +def _merge_request(request: list[dict]) -> list[dict]: + merge_request = [deepcopy(request[0])] + for idx in range(1, len(request)): + if request[idx]["role"] == merge_request[-1]["role"]: + merge_request[-1]["content"].extend(request[idx]["content"]) + else: + merge_request.append(deepcopy(request[idx])) + + return merge_request + + +def _convert_action_to_schema(action_space): + if action_space is None: + return None + actions = [] + for action in action_space: + new_action = action.to_openai_json_schema() + new_action["input_schema"] = new_action.pop("parameters") + if "returns" in new_action: + new_action.pop("returns") + if "title" in new_action: + new_action.pop("title") + if "type" in new_action: + new_action["input_schema"]["type"] = new_action.pop("type") + if "required" in new_action: + new_action["input_schema"]["required"] = new_action.pop("required") + + actions.append(new_action) + return actions diff --git a/crab/agents/backend_models/gemini_model.py b/crab/agents/backend_models/gemini_model.py index 663aba2..66b49c0 100644 --- a/crab/agents/backend_models/gemini_model.py +++ b/crab/agents/backend_models/gemini_model.py @@ -12,15 +12,22 @@ # limitations under the License. # =========== Copyright 2024 @ CAMEL-AI.org. All Rights Reserved. =========== import os -from time import sleep from typing import Any -from crab import Action, ActionOutput, BackendModel, BackendOutput, MessageType +from PIL.Image import Image +from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_fixed + +from crab import Action, ActionOutput, BackendModel, BackendOutput, Message, MessageType from crab.utils.common import base64_to_image, json_expand_refs try: import google.generativeai as genai - from google.ai.generativelanguage_v1beta import FunctionDeclaration, Part, Tool + from google.ai.generativelanguage_v1beta import ( + Content, + FunctionDeclaration, + Part, + Tool, + ) from google.api_core.exceptions import ResourceExhausted from google.generativeai.types import content_types @@ -33,152 +40,164 @@ class GeminiModel(BackendModel): def __init__( self, model: str, - parameters: dict[str, Any] = dict(), + parameters: dict[str, Any] | None = None, history_messages_len: int = 0, + tool_call_required: bool = True, ) -> None: if gemini_model_enable is False: raise ImportError("Please install google.generativeai to use GeminiModel") - super().__init__( - model, - parameters, - history_messages_len, - ) + + self.model = model + self.parameters = parameters if parameters is not None else {} + self.history_messages_len = history_messages_len + assert self.history_messages_len >= 0 genai.configure(api_key=os.environ["GEMINI_API_KEY"]) self.client = genai + self.tool_call_required = tool_call_required + self.system_message: str = "You are a helpful assistant." + self.action_space: list[Action] | None = None + self.action_schema: list[Tool] | None = None + self.token_usage: int = 0 + self.chat_history: list[list[dict]] = [] + self.support_tool_call = True def reset(self, system_message: str, action_space: list[Action] | None) -> None: self.system_message = system_message self.action_space = action_space - self.action_schema = self._convert_action_to_schema(self.action_space) + self.action_schema = _convert_action_to_schema(self.action_space) self.token_usage = 0 self.chat_history = [] - def chat(self, message: list[tuple[str, MessageType]]) -> BackendOutput: - # Initialize chat history - request = [] - if self.history_messages_len > 0 and len(self.chat_history) > 0: - for history_message in self.chat_history[-self.history_messages_len :]: - request = request + history_message - - if not isinstance(message, list): + def chat(self, message: list[Message] | Message) -> BackendOutput: + if isinstance(message, tuple): message = [message] - - new_message = { + request = self._fetch_from_memory() + new_message = self._construct_new_message(message) + request.append(new_message) + response_message = self._call_api(request) + self._record_message(new_message, response_message) + return self._generate_backend_output(response_message) + + def _construct_new_message(self, message: list[Message]) -> dict[str, Any]: + parts: list[str | Image] = [] + for content, msg_type in message: + match msg_type: + case MessageType.TEXT: + parts.append(content) + case MessageType.IMAGE_JPG_BASE64: + parts.append(base64_to_image(content)) + return { "role": "user", - "parts": [self._convert_message(part) for part in message], + "parts": parts, } - request.append(new_message) - - response = self.call_api(request) - response_message = response.candidates[0].content - self.record_message(new_message, response_message) - tool_calls = [ - Part.to_dict(part)["function_call"] - for part in response.parts - if "function_call" in Part.to_dict(part) - ] + def _generate_backend_output(self, response_message: Content) -> BackendOutput: + tool_calls: list[ActionOutput] = [] + for part in response_message.parts: + if "function_call" in Part.to_dict(part): + call = Part.to_dict(part)["function_call"] + tool_calls.append( + ActionOutput( + name=call["name"], + arguments=call["args"], + ) + ) return BackendOutput( message=response_message.parts[0].text or None, - action_list=self._convert_tool_calls_to_action_list(tool_calls), + action_list=tool_calls or None, ) + def _fetch_from_memory(self) -> list[dict]: + request: list[dict] = [] + if self.history_messages_len > 0: + fetch_history_len = min(self.history_messages_len, len(self.chat_history)) + for history_message in self.chat_history[-fetch_history_len:]: + request = request + history_message + return request + def get_token_usage(self): return self.token_usage - def record_message(self, new_message: dict, response_message: dict) -> None: + def _record_message( + self, new_message: dict[str, Any], response_message: Content + ) -> None: self.chat_history.append([new_message]) self.chat_history[-1].append( {"role": response_message.role, "parts": response_message.parts} ) - def call_api(self, request_messages: list): - while True: - try: - if self.action_schema is not None: - tool_config = content_types.to_tool_config( - {"function_calling_config": {"mode": "ANY"}} - ) - response = self.client.GenerativeModel( - self.model, system_instruction=self.system_message - ).generate_content( - contents=request_messages, - tools=self.action_schema, - tool_config=tool_config, - # **self.parameters, - ) - else: - response = self.client.GenerativeModel( - self.model, system_instruction=self.system_message - ).generate_content( - contents=request_messages, - # **self.parameters, - ) - except ResourceExhausted: - print( - "ResourceExhausted: 429 Resource has been exhausted.", - " Please waiting...", - ) - sleep(10) - else: - break + @retry( + wait=wait_fixed(10), + stop=stop_after_attempt(7), + retry=retry_if_exception_type(ResourceExhausted), + ) + def _call_api(self, request_messages: list) -> Content: + if self.action_schema is not None: + tool_config = content_types.to_tool_config( + { + "function_calling_config": { + "mode": "ANY" if self.tool_call_required else "AUTO" + } + } + ) + response = self.client.GenerativeModel( + self.model, system_instruction=self.system_message + ).generate_content( + contents=request_messages, + tools=self.action_schema, + tool_config=tool_config, + # **self.parameters, # TODO(Tianqi): Fix this line in the future + ) + else: + response = self.client.GenerativeModel( + self.model, system_instruction=self.system_message + ).generate_content( + contents=request_messages, + # **self.parameters, # TODO(Tianqi): Fix this line in the future + ) self.token_usage += response.candidates[0].token_count - return response - - @staticmethod - def _convert_message(message: tuple[str, MessageType]): - match message[1]: - case MessageType.TEXT: - return message[0] - case MessageType.IMAGE_JPG_BASE64: - return base64_to_image(message[0]) - - @classmethod - def _convert_action_to_schema(cls, action_space): - if action_space is None: - return None - actions = [] - for action in action_space: - actions.append( - Tool(function_declarations=[cls._action_to_funcdec_policy(action)]) - ) - return actions - - @staticmethod - def _convert_tool_calls_to_action_list(tool_calls) -> list[ActionOutput]: - if tool_calls: - return [ - ActionOutput( - name=call["name"], - arguments=call["args"], - ) - for call in tool_calls + return response.candidates[0].content + + +def _convert_action_to_schema(action_space: list[Action] | None) -> list[Tool] | None: + if action_space is None: + return None + actions = [ + Tool( + function_declarations=[ + _action_to_func_dec(action) for action in action_space ] - else: - return None - - @classmethod - def _clear_schema(cls, schema_dict: dict): - schema_dict.pop("title", None) - p_type = schema_dict.pop("type", None) - for prop in schema_dict.get("properties", {}).values(): - cls._clear_schema(prop) - if p_type is not None: - schema_dict["type_"] = p_type.upper() - if "items" in schema_dict: - cls._clear_schema(schema_dict["items"]) - - @classmethod - def _action_to_funcdec(cls, action: Action, env: str): - "Converts crab Action to google FunctionDeclaration" - p_schema = action.parameters.model_json_schema() - if "$defs" in p_schema: - p_schema = json_expand_refs(p_schema) - cls._clear_schema(p_schema) + ) + ] + return actions + + +def _clear_schema(schema_dict: dict) -> None: + schema_dict.pop("title", None) + p_type = schema_dict.pop("type", None) + for prop in schema_dict.get("properties", {}).values(): + _clear_schema(prop) + if p_type is not None: + schema_dict["type_"] = p_type.upper() + if "items" in schema_dict: + _clear_schema(schema_dict["items"]) + + +def _action_to_func_dec(action: Action) -> FunctionDeclaration: + "Converts crab Action to google FunctionDeclaration" + p_schema = action.parameters.model_json_schema() + if "$defs" in p_schema: + p_schema = json_expand_refs(p_schema) + _clear_schema(p_schema) + if not p_schema["properties"]: return FunctionDeclaration( - name=action.name + "__in__" + env, - description="In {} environment, {}".format(env, action.description), - parameters=p_schema, + name=action.name, + description=action.description, ) + return FunctionDeclaration( + name=action.name, + description=action.description, + parameters=p_schema, + ) diff --git a/crab/agents/backend_models/openai_model.py b/crab/agents/backend_models/openai_model.py index e959d5e..f60d076 100644 --- a/crab/agents/backend_models/openai_model.py +++ b/crab/agents/backend_models/openai_model.py @@ -14,11 +14,12 @@ import json from typing import Any -from crab import Action, ActionOutput, BackendModel, BackendOutput, MessageType +from crab import Action, ActionOutput, BackendModel, BackendOutput, Message, MessageType +from crab.agents.utils import extract_text_and_code_prompts try: import openai - from openai.types.chat import ChatCompletion + from openai.types.chat import ChatCompletionMessage openai_model_enable = True except ImportError: @@ -29,17 +30,33 @@ class OpenAIModel(BackendModel): def __init__( self, model: str, - parameters: dict[str, Any] = dict(), + parameters: dict[str, Any] | None = None, history_messages_len: int = 0, + tool_call_required: bool = True, + base_url: str | None = None, + api_key: str | None = None, ) -> None: if not openai_model_enable: raise ImportError("Please install openai to use OpenAIModel") - super().__init__( - model, - parameters, - history_messages_len, - ) - self.client = openai.OpenAI() + + self.model = model + self.parameters = parameters if parameters is not None else {} + self.history_messages_len = history_messages_len + + assert self.history_messages_len >= 0 + + self.client = openai.OpenAI(api_key=api_key, base_url=base_url) + self.tool_call_required: bool = tool_call_required + self.system_message: str = "You are a helpful assistant." + self.openai_system_message = { + "role": "system", + "content": self.system_message, + } + self.action_space: list[Action] | None = None + self.action_schema: list[dict] | None = None + self.token_usage: int = 0 + self.chat_history: list[list[ChatCompletionMessage | dict]] = [] + self.support_tool_call = True def reset(self, system_message: str, action_space: list[Action] | None) -> None: self.system_message = system_message @@ -48,63 +65,49 @@ def reset(self, system_message: str, action_space: list[Action] | None) -> None: "content": system_message, } self.action_space = action_space - self.action_schema = self._convert_action_to_schema(self.action_space) + self.action_schema = _convert_action_to_schema(self.action_space) self.token_usage = 0 self.chat_history = [] - def chat(self, message: list[tuple[str, MessageType]]) -> BackendOutput: - # Initialize chat history - request = [self.openai_system_message] - if self.history_messages_len > 0 and len(self.chat_history) > 0: - for history_message in self.chat_history[-self.history_messages_len :]: - request = request + history_message - - if not isinstance(message, list): + def chat(self, message: list[Message] | Message) -> BackendOutput: + if isinstance(message, tuple): message = [message] - - new_message = { - "role": "user", - "content": [self._convert_message(part) for part in message], - } + request = self._fetch_from_memory() + new_message = self._construct_new_message(message) request.append(new_message) - - response = self.call_api(request) - response_message = response.choices[0].message - self.record_message(new_message, response_message) - - return BackendOutput( - message=response_message.content, - action_list=self._convert_tool_calls_to_action_list( - response_message.tool_calls - ), - ) + response_message = self._call_api(request) + self._record_message(new_message, response_message) + return self._generate_backend_output(response_message) def get_token_usage(self): return self.token_usage - def record_message(self, new_message: dict, response_message: dict) -> None: + def _record_message( + self, new_message: dict, response_message: ChatCompletionMessage + ) -> None: self.chat_history.append([new_message]) self.chat_history[-1].append(response_message) - if self.action_schema: - tool_calls = response_message.tool_calls - for tool_call in tool_calls: + if self.action_schema and response_message.tool_calls is not None: + for tool_call in response_message.tool_calls: self.chat_history[-1].append( { "tool_call_id": tool_call.id, "role": "tool", "name": tool_call.function.name, - "content": "", + "content": "success", } ) # extend conversation with function response - def call_api(self, request_messages: list) -> ChatCompletion: + def _call_api( + self, request_messages: list[ChatCompletionMessage | dict] + ) -> ChatCompletionMessage: if self.action_schema is not None: response = self.client.chat.completions.create( messages=request_messages, # type: ignore model=self.model, tools=self.action_schema, - tool_choice="required", + tool_choice="required" if self.tool_call_required else "auto", **self.parameters, ) else: @@ -115,43 +118,153 @@ def call_api(self, request_messages: list) -> ChatCompletion: ) self.token_usage += response.usage.total_tokens - return response - - @staticmethod - def _convert_message(message: tuple[str, MessageType]): - match message[1]: - case MessageType.TEXT: - return { - "type": "text", - "text": message[0], - } - case MessageType.IMAGE_JPG_BASE64: - return { - "type": "image_url", - "image_url": { - "url": f"data:image/jpeg;base64,{message[0]}", - "detail": "high", - }, - } - - @staticmethod - def _convert_action_to_schema(action_space): - if action_space is None: - return None - actions = [] - for action in action_space: - new_action = action.to_openai_json_schema() - actions.append({"type": "function", "function": new_action}) - return actions - - @staticmethod - def _convert_tool_calls_to_action_list(tool_calls) -> list[ActionOutput]: - if tool_calls is None: - return tool_calls - return [ + return response.choices[0].message + + def _fetch_from_memory(self) -> list[ChatCompletionMessage | dict]: + request: list[ChatCompletionMessage | dict] = [self.openai_system_message] + if self.history_messages_len > 0: + fetch_history_len = min(self.history_messages_len, len(self.chat_history)) + for history_message in self.chat_history[-fetch_history_len:]: + request = request + history_message + return request + + def _construct_new_message(self, message: list[Message]) -> dict[str, Any]: + new_message_content: list[dict[str, Any]] = [] + for content, msg_type in message: + match msg_type: + case MessageType.TEXT: + new_message_content.append( + { + "type": "text", + "text": content, + } + ) + case MessageType.IMAGE_JPG_BASE64: + new_message_content.append( + { + "type": "image_url", + "image_url": { + "url": f"data:image/jpeg;base64,{content}", + "detail": "high", + }, + } + ) + + return {"role": "user", "content": new_message_content} + + def _generate_backend_output( + self, response_message: ChatCompletionMessage + ) -> BackendOutput: + if response_message.tool_calls is None: + return BackendOutput(message=response_message.content, action_list=None) + action_list = [ ActionOutput( name=call.function.name, arguments=json.loads(call.function.arguments), ) - for call in tool_calls + for call in response_message.tool_calls ] + return BackendOutput( + message=response_message.content, + action_list=action_list, + ) + + +def _convert_action_to_schema( + action_space: list[Action] | None, +) -> list[dict] | None: + if action_space is None: + return None + actions = [] + for action in action_space: + new_action = action.to_openai_json_schema() + actions.append({"type": "function", "function": new_action}) + return actions + + +class OpenAIModelJSON(OpenAIModel): + def __init__( + self, + model: str, + parameters: dict[str, Any] = dict(), + history_messages_len: int = 0, + base_url: str | None = None, + api_key: str | None = None, + ) -> None: + super().__init__( + model, + parameters, + history_messages_len, + False, + base_url, + api_key, + ) + self.support_tool_call = False + + def reset(self, system_message: str, action_space: list[Action] | None) -> None: + super().reset(system_message, action_space) + self.action_schema = None + + def _record_message( + self, new_message: dict, response_message: ChatCompletionMessage + ) -> None: + self.chat_history.append([new_message]) + self.chat_history[-1].append( + {"role": "assistant", "content": response_message.content} + ) + + def _generate_backend_output( + self, response_message: ChatCompletionMessage + ) -> BackendOutput: + content = response_message.content + text_list, code_list = extract_text_and_code_prompts(content) + + action_list = [] + try: + for code_block in code_list: + action_object = json.loads(code_block) + action_list.append( + ActionOutput( + name=action_object["name"], arguments=action_object["arguments"] + ) + ) + except json.JSONDecodeError as e: + raise RuntimeError(f"Failed to parse code block: {code_block}") from e + except KeyError as e: + raise RuntimeError(f"Received invalid action format: {code_block}") from e + + return BackendOutput( + message="".join(text_list), + action_list=action_list, + ) + + +class SGlangOpenAIModelJSON(OpenAIModelJSON): + def _construct_new_message(self, message: list[Message]) -> dict[str, Any]: + new_message_content: list[dict[str, Any]] = [] + image_count = 0 + for _, msg_type in message: + if msg_type == MessageType.IMAGE_JPG_BASE64: + image_count += 1 + for content, msg_type in message: + match msg_type: + case MessageType.TEXT: + new_message_content.append( + { + "type": "text", + "text": content, + } + ) + case MessageType.IMAGE_JPG_BASE64: + image_content = { + "type": "image_url", + "image_url": { + "url": f"data:image/png;base64,{content}", + "detail": "high", + }, + } + if image_count > 1: + image_content["modalities"] = "multi-images" + new_message_content.append(image_content) + + return {"role": "user", "content": new_message_content} diff --git a/crab/agents/policies/multi_agent_by_env.py b/crab/agents/policies/multi_agent_by_env.py index d2cfc2c..57afc76 100644 --- a/crab/agents/policies/multi_agent_by_env.py +++ b/crab/agents/policies/multi_agent_by_env.py @@ -11,9 +11,9 @@ # See the License for the specific language governing permissions and # limitations under the License. # =========== Copyright 2024 @ CAMEL-AI.org. All Rights Reserved. =========== -from copy import copy - from crab import Action, ActionOutput +from crab.agents.backend_models import BackendModelConfig, create_backend_model +from crab.agents.utils import generate_action_prompt from crab.core.agent_policy import AgentPolicy from crab.core.backend_model import ( BackendModel, @@ -57,12 +57,12 @@ class MultiAgentByEnvPolicy(AgentPolicy): def __init__( self, - main_agent_model_backend: BackendModel, - env_agent_model_backend: BackendModel, + main_agent_model_backend: BackendModelConfig, + env_agent_model_backend: BackendModelConfig, ): - self.main_agent_model_backend = copy(main_agent_model_backend) - self.env_agent_model_backend = env_agent_model_backend - self.reset(task_description="", action_spaces=None, env_descriptions={}) + self.main_agent_model_backend = create_backend_model(main_agent_model_backend) + self.env_agent_model_backend_config = env_agent_model_backend + self.reset(task_description="", action_spaces={}, env_descriptions={}) def reset( self, @@ -82,15 +82,16 @@ def reset( ) self.env_agent_model_backends: dict[str, BackendModel] = {} for env in action_spaces: - backend = copy(self.env_agent_model_backend) + backend = create_backend_model(self.env_agent_model_backend_config) if env == "root": backend.reset(root_agent_system_message, action_spaces[env]) else: + backend.require_tool = True env_agent_system_message = self._env_agent_prompt.format( task_description=task_description, environment=env, env_description=env_descriptions[env], - action_descriptions=self.generate_action_prompt(action_spaces[env]), + action_descriptions=generate_action_prompt(action_spaces[env]), ) backend.reset(env_agent_system_message, action_spaces[env]) self.env_agent_model_backends[env] = backend @@ -105,9 +106,8 @@ def get_token_usage(self): def get_backend_model_name(self): return ( self.main_agent_model_backend.__class__.__name__ - + "(sub: " - + self.env_agent_model_backend.__class__.__name__ - + ")" + + "_" + + self.main_agent_model_backend.model ) def chat( @@ -140,5 +140,7 @@ def chat( ) else: output = backend.chat((main_agent_message, MessageType.TEXT)) + for action in output.action_list: + action.env = env tool_calls.extend(output.action_list) - return self.decode_combined_action(tool_calls) + return tool_calls diff --git a/crab/agents/policies/multi_agent_by_func.py b/crab/agents/policies/multi_agent_by_func.py index 8f95b72..8d4df64 100644 --- a/crab/agents/policies/multi_agent_by_func.py +++ b/crab/agents/policies/multi_agent_by_func.py @@ -11,14 +11,15 @@ # See the License for the specific language governing permissions and # limitations under the License. # =========== Copyright 2024 @ CAMEL-AI.org. All Rights Reserved. =========== -from copy import copy - -from crab import Action, ActionOutput -from crab.core.agent_policy import AgentPolicy -from crab.core.backend_model import ( - BackendModel, - MessageType, +from crab.agents.backend_models import BackendModelConfig, create_backend_model +from crab.agents.utils import ( + combine_multi_env_action_space, + decode_combined_action, + generate_action_prompt, ) +from crab.core import Action, ActionOutput +from crab.core.agent_policy import AgentPolicy +from crab.core.backend_model import MessageType class MultiAgentByFuncPolicy(AgentPolicy): @@ -40,11 +41,11 @@ class MultiAgentByFuncPolicy(AgentPolicy): def __init__( self, - main_agent_model_backend: BackendModel, - tool_agent_model_backend: BackendModel, + main_agent_model_backend: BackendModelConfig, + tool_agent_model_backend: BackendModelConfig, ): - self.main_agent_model_backend = copy(main_agent_model_backend) - self.tool_agent_model_backend = copy(tool_agent_model_backend) + self.main_agent_model_backend = create_backend_model(main_agent_model_backend) + self.tool_agent_model_backend = create_backend_model(tool_agent_model_backend) self.reset(task_description="", action_spaces=None, env_descriptions={}) def reset( @@ -54,11 +55,11 @@ def reset( env_descriptions: dict[str, str], ) -> list[ActionOutput]: self.task_description = task_description - self.action_space = self.combine_multi_env_action_space(action_spaces) + self.action_space = combine_multi_env_action_space(action_spaces) main_agent_system_message = self._system_prompt.format( task_description=task_description, - action_descriptions=self.generate_action_prompt(self.action_space), + action_descriptions=generate_action_prompt(self.action_space), env_description=str(env_descriptions), ) self.main_agent_model_backend.reset(main_agent_system_message, None) @@ -73,9 +74,8 @@ def get_token_usage(self): def get_backend_model_name(self): return ( self.main_agent_model_backend.__class__.__name__ - + "(sub: " - + self.tool_agent_model_backend.__class__.__name__ - + ")" + + "_" + + self.main_agent_model_backend.model ) def chat( @@ -95,4 +95,4 @@ def chat( tool_output = self.tool_agent_model_backend.chat( (output.message, MessageType.TEXT) ) - return self.decode_combined_action(tool_output.action_list) + return decode_combined_action(tool_output.action_list) diff --git a/crab/agents/policies/single_agent.py b/crab/agents/policies/single_agent.py index 7003c11..fa4b846 100644 --- a/crab/agents/policies/single_agent.py +++ b/crab/agents/policies/single_agent.py @@ -11,20 +11,27 @@ # See the License for the specific language governing permissions and # limitations under the License. # =========== Copyright 2024 @ CAMEL-AI.org. All Rights Reserved. =========== -from copy import copy +import logging from crab import Action, ActionOutput +from crab.agents.backend_models import BackendModelConfig, create_backend_model +from crab.agents.utils import ( + combine_multi_env_action_space, + decode_combined_action, + generate_action_prompt, +) from crab.core.agent_policy import AgentPolicy from crab.core.backend_model import ( - BackendModel, MessageType, ) from crab.utils.measure import timed +logger = logging.getLogger(__name__) + class SingleAgentPolicy(AgentPolicy): - _system_prompt = """You are a helpful assistant. Now you have to do a task as - described below: + _system_prompt_with_function_call = """\ + You are a helpful assistant. Now you have to do a task as described below: **"{task_description}."** @@ -44,11 +51,57 @@ class SingleAgentPolicy(AgentPolicy): you. Always do them by yourself using function calls. """ + _system_prompt_no_function_call = """\ + You are a helpful assistant. Now you have to do a task as described below: + + **"{task_description}."** + + You should never forget this task and always perform actions to achieve this task. + And this is the description of each given environment: {env_description}. You will + receive screenshots of the environments. The interactive UI elements on the + screenshot are labeled with numeric tags starting from 1. + + A unit operation you can perform is called Action. You have a limited action space + as function calls: {action_descriptions}. You should generate JSON code blocks to + execute the actions. Each code block MUST contains only one json object, i.e. one + action. You can output multiple code blocks to execute multiple actions in a single + step. You must follow the JSON format below to output the action. + ```json + {{"name": "action_name", "arguments": {{"arg1": "value1", "arg2": "value2"}}}} + ``` + or if not arguments needed: + ```json + {{"name": "action_name", "arguments": {{}}}} + ``` + You MUST use exactly the same "action_name" as I gave to you in the action space. + You SHOULDN'T add any comments in the code blocks. + + In each step, You MUST explain what do you see from the current observation and the + plan of the next action, then use a provided action in each step to achieve the + task. You should state what action to take and what the parameters should be. Your + answer MUST contain at least one code block. You SHOULD NEVER ask me to do anything + for you. Always do them by yourself. + """ + def __init__( self, - model_backend: BackendModel, + model_backend: BackendModelConfig, + function_call: bool = True, ): - self.model_backend = copy(model_backend) + self.model_backend = create_backend_model(model_backend) + self.function_call = function_call + if not self.model_backend.support_tool_call and self.function_call: + logger.warning( + "The backend model does not support tool call: {}".format( + model_backend.model_name + ) + + "\nFallback to no function call mode." + ) + self.function_call = False + if self.function_call: + self.system_prompt = self._system_prompt_with_function_call + else: + self.system_prompt = self._system_prompt_no_function_call self.reset(task_description="", action_spaces=None, env_descriptions={}) def reset( @@ -58,19 +111,25 @@ def reset( env_descriptions: dict[str, str], ) -> list: self.task_description = task_description - self.action_space = self.combine_multi_env_action_space(action_spaces) - system_message = self._system_prompt.format( + self.action_space = combine_multi_env_action_space(action_spaces) + system_message = self.system_prompt.format( task_description=task_description, - action_descriptions=self.generate_action_prompt(self.action_space), + action_descriptions=generate_action_prompt( + self.action_space, + expand=not self.function_call, + ), env_description=str(env_descriptions), ) - self.model_backend.reset(system_message, self.action_space) + if self.function_call: + self.model_backend.reset(system_message, self.action_space) + else: + self.model_backend.reset(system_message, None) def get_token_usage(self): return self.model_backend.get_token_usage() def get_backend_model_name(self): - return self.model_backend.__class__.__name__ + return self.model_backend.__class__.__name__ + "_" + self.model_backend.model @timed def chat( @@ -87,4 +146,6 @@ def chat( ) ) output = self.model_backend.chat(prompt) - return self.decode_combined_action(output.action_list) + # print("Agent Message: " + output.message, flush=True) + # print("Agent Action: " + str(output.action_list), flush=True) + return decode_combined_action(output.action_list) diff --git a/crab/agents/utils.py b/crab/agents/utils.py new file mode 100644 index 0000000..e284406 --- /dev/null +++ b/crab/agents/utils.py @@ -0,0 +1,105 @@ +# =========== Copyright 2024 @ CAMEL-AI.org. All Rights Reserved. =========== +# Licensed under the Apache License, Version 2.0 (the “License”); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an “AS IS” BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# =========== Copyright 2024 @ CAMEL-AI.org. All Rights Reserved. =========== +from crab.core import Action, ActionOutput + + +def combine_multi_env_action_space( + action_space: dict[str, list[Action]] | None, +) -> list[Action]: + """Combine multi-env action space together to fit in a single agent.""" + result = [] + if action_space is None: + return result + for env in action_space: + for action in action_space[env]: + new_action = action.model_copy() + new_action.name = new_action.name + "_in_" + env + new_action.description = f"In {env} environment, " + new_action.description + result.append(new_action) + return result + + +def decode_combined_action( + output_actions: list[ActionOutput], +) -> list[ActionOutput]: + """Decode combined action output to action output with the corresponding + environment. + """ + result = [] + for output in output_actions: + name_env = output.name.split("_in_") + if len(name_env) != 2: + raise RuntimeError( + 'The decoded action name should contain the splitter "_in_".' + ) + new_output = output.model_copy() + new_output.name = name_env[0] + new_output.env = name_env[1] + result.append(new_output) + return result + + +def generate_action_prompt(action_space: list[Action], expand: bool = False) -> str: + if expand: + return "".join( + [ + f"[**{action.name}**:\n" + f"action description: {action.description}\n" + f"action arguments json schema: {action.to_openai_json_schema()}\n" + "]\n" + for action in action_space + ] + ) + else: + return "".join( + [f"[{action.name}: {action.description}]\n" for action in action_space] + ) + + +def extract_text_and_code_prompts(content: str) -> tuple[list[str], list[str]]: + r"""Extract text and code prompts from the message content. + + Returns: + A tuple (text_list, code_list) where, text_list is a list of text and code_list + is a list of extracted codes both from the content. + """ + text_prompts: list[str] = [] + code_prompts: list[str] = [] + + lines = content.split("\n") + idx = 0 + start_idx = 0 + while idx < len(lines): + while idx < len(lines) and (not lines[idx].lstrip().startswith("```")): + idx += 1 + text = "\n".join(lines[start_idx:idx]).strip() + text_prompts.append(text) + + if idx >= len(lines): + break + + # code_type = lines[idx].strip()[3:].strip() + idx += 1 + start_idx = idx + while not lines[idx].lstrip().startswith("```") and idx < len(lines): + idx += 1 + if idx >= len(lines): + break + code = "\n".join(lines[start_idx:idx]).strip() + code_prompts.append(code) + + idx += 1 + start_idx = idx + + return text_prompts, code_prompts diff --git a/crab/core/agent_policy.py b/crab/core/agent_policy.py index 7f460ff..baea1ad 100644 --- a/crab/core/agent_policy.py +++ b/crab/core/agent_policy.py @@ -13,14 +13,14 @@ # =========== Copyright 2024 @ CAMEL-AI.org. All Rights Reserved. =========== from abc import ABC, abstractmethod -from .models import Action, ActionOutput, MessageType +from .models import Action, ActionOutput, Message class AgentPolicy(ABC): @abstractmethod def chat( self, - observation: dict[str, list[tuple[str, MessageType]]], + observation: dict[str, list[Message]], ) -> list[ActionOutput]: ... @abstractmethod @@ -32,54 +32,7 @@ def reset( ) -> None: ... @abstractmethod - def get_token_usage(self): ... + def get_token_usage(self) -> int: ... @abstractmethod def get_backend_model_name(self) -> str: ... - - @staticmethod - def combine_multi_env_action_space( - action_space: dict[str, list[Action]] | None, - ) -> list[Action]: - """Combine multi-env action space together to fit in a single agent.""" - result = [] - if action_space is None: - return result - for env in action_space: - for action in action_space[env]: - new_action = action.model_copy() - new_action.name = new_action.name + "__in__" + env - new_action.description = ( - f"In {env} environment, " + new_action.description - ) - result.append(new_action) - return result - - @staticmethod - def decode_combined_action( - output_actions: list[ActionOutput], - ) -> list[ActionOutput]: - """Decode combined action output to action output with the corresponding - environment. - """ - result = [] - for output in output_actions: - name_env = output.name.split("__in__") - if len(name_env) != 2: - raise RuntimeError( - 'The decoded action name should contain the splitter "__in__".' - ) - new_output = output.model_copy() - new_output.name = name_env[0] - new_output.env = name_env[1] - result.append(new_output) - return result - - @staticmethod - def generate_action_prompt(actions: list[Action] | None): - if actions is None: - return None - result = "" - for action in actions: - result += f"[{action.name}: {action.description}]\n" - return result diff --git a/crab/core/backend_model.py b/crab/core/backend_model.py index 28e11b3..682e8f0 100644 --- a/crab/core/backend_model.py +++ b/crab/core/backend_model.py @@ -12,26 +12,11 @@ # limitations under the License. # =========== Copyright 2024 @ CAMEL-AI.org. All Rights Reserved. =========== from abc import ABC, abstractmethod -from typing import Any from .models import Action, BackendOutput, MessageType class BackendModel(ABC): - def __init__( - self, - model: str, - parameters: dict[str, Any] = dict(), - history_messages_len: int = 0, - ) -> None: - self.model = model - self.parameters = parameters - self.history_messages_len = history_messages_len - - assert self.history_messages_len >= 0 - - self.reset("You are a helpful assistant.", None) - @abstractmethod def chat(self, contents: list[tuple[str, MessageType]]) -> BackendOutput: ... diff --git a/crab/core/benchmark.py b/crab/core/benchmark.py index 87a0611..1c23b60 100644 --- a/crab/core/benchmark.py +++ b/crab/core/benchmark.py @@ -239,7 +239,22 @@ def step( info=info, ) - environment = self._get_env(env_name=env_name, action_name=action) + try: + environment = self._get_env(env_name=env_name, action_name=action) + except Exception: + print(traceback.format_exc()) + terminated = True + info["terminate_reason"] = "action_format_error" + info["exception_detail"] = traceback.format_exc() + environment.reset() + self.close_task() + return StepResult( + truncated=False, + terminated=True, + action_returns=None, + evaluation_results=self.current_evaluator.stat(), + info=info, + ) try: action_returns = environment.step(action, parameters) except Exception: diff --git a/crab/core/environment.py b/crab/core/environment.py index e045353..938c1da 100644 --- a/crab/core/environment.py +++ b/crab/core/environment.py @@ -89,7 +89,7 @@ def __init__( self._client: Client | None = None if remote_url is not None: - self._client = Client(base_url=remote_url) + self._client = Client(base_url=remote_url, timeout=60) for key, value in extra_attributes.items(): setattr(self, key, value) diff --git a/crab/core/experiment.py b/crab/core/experiment.py index 9e14c9e..59721d2 100644 --- a/crab/core/experiment.py +++ b/crab/core/experiment.py @@ -138,6 +138,10 @@ def execute_action(self, response: list[ActionOutput]) -> bool: print("\033[92m" f"Task finished, result: {self.metrics}" "\033[0m") self.write_current_log_row(action) self.write_main_csv_row(benchmark_result.info["terminate_reason"]) + if "exception_detail" in benchmark_result.info: + self.write_exception_detail( + benchmark_result.info["exception_detail"] + ) return True print( "\033[92m" @@ -171,6 +175,7 @@ def step(self, it) -> bool: except Exception: print(traceback.format_exc()) self.write_main_csv_row("agent_exception") + self.write_exception_detail(traceback.format_exc()) return True # content = response["content"] # self.write_message(str(content), it) @@ -214,6 +219,12 @@ def start_benchmark(self): sleep(2) # input("Press enter to do next step:") + def write_exception_detail(self, exception_info: str): + if self.log_dir is None: + return + with open(self.current_experiment_dir / "exception_detail.txt", "w") as file: + file.write(exception_info) + def write_current_log_row(self, action): if self.log_dir is None: return diff --git a/crab/core/models/__init__.py b/crab/core/models/__init__.py index 4a10164..5906c98 100644 --- a/crab/core/models/__init__.py +++ b/crab/core/models/__init__.py @@ -13,7 +13,7 @@ # =========== Copyright 2024 @ CAMEL-AI.org. All Rights Reserved. =========== # ruff: noqa: F401 from .action import Action, ClosedAction -from .agent_interface import ActionOutput, BackendOutput, MessageType +from .agent_interface import ActionOutput, BackendOutput, Message, MessageType from .benchmark_interface import StepResult from .config import BenchmarkConfig, EnvironmentConfig, VMEnvironmentConfig from .evaluator import Evaluator @@ -23,6 +23,7 @@ "Action", "ClosedAction", "MessageType", + "Message", "ActionOutput", "BackendOutput", "StepResult", diff --git a/crab/core/models/agent_interface.py b/crab/core/models/agent_interface.py index 6ba2214..4639f7e 100644 --- a/crab/core/models/agent_interface.py +++ b/crab/core/models/agent_interface.py @@ -24,6 +24,9 @@ class MessageType(IntEnum): IMAGE_JPG_BASE64 = 1 +Message = tuple[str, MessageType] + + class ActionOutput(BaseModel): name: str arguments: dict[str, Any] diff --git a/crab/core/task_generator.py b/crab/core/task_generator.py index 2f373eb..682f875 100644 --- a/crab/core/task_generator.py +++ b/crab/core/task_generator.py @@ -16,6 +16,7 @@ import importlib import itertools import json +import os import random from pathlib import Path @@ -121,6 +122,8 @@ def __init__( self.attribute_pool = attribute_pool self.graph_generation(subtasks) self.task_mapping = {task.id: task for task in subtasks} + if not os.getenv("OPENAI_API_KEY"): + os.environ["OPENAI_API_KEY"] = "EMPTY" self.client = OpenAI() @classmethod diff --git a/poetry.lock b/poetry.lock index b4a2841..8e13102 100644 --- a/poetry.lock +++ b/poetry.lock @@ -51,13 +51,13 @@ tests = ["hypothesis", "pytest"] [[package]] name = "agentops" -version = "0.3.13" +version = "0.3.14" description = "Observability and DevTool Platform for AI Agents" optional = true python-versions = ">=3.7" files = [ - {file = "agentops-0.3.13-py3-none-any.whl", hash = "sha256:81bfdfedd990fbc3064ee42a67422ddbee07b6cd96c5fca7e124eb8c1e0cebdc"}, - {file = "agentops-0.3.13.tar.gz", hash = "sha256:319b7325fb79004ce996191aa21f0982489be22cc1acc2f3f6d02cdff1db2429"}, + {file = "agentops-0.3.14-py3-none-any.whl", hash = "sha256:f4a2fcf1a7caf1d5383bfb66d8a9d567f3cb88fc7495cfd81ade167b0c06a4ea"}, + {file = "agentops-0.3.14.tar.gz", hash = "sha256:fcb515e5743d73efee851b687692bed74797dc88e29a8327b2bbfb21d73a7447"}, ] [package.dependencies] @@ -84,102 +84,102 @@ files = [ [[package]] name = "aiohttp" -version = "3.10.9" +version = "3.10.10" description = "Async http client/server framework (asyncio)" optional = true python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8b3fb28a9ac8f2558760d8e637dbf27aef1e8b7f1d221e8669a1074d1a266bb2"}, - {file = "aiohttp-3.10.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91aa966858593f64c8a65cdefa3d6dc8fe3c2768b159da84c1ddbbb2c01ab4ef"}, - {file = "aiohttp-3.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:63649309da83277f06a15bbdc2a54fbe75efb92caa2c25bb57ca37762789c746"}, - {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3e7fabedb3fe06933f47f1538df7b3a8d78e13d7167195f51ca47ee12690373"}, - {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c070430fda1a550a1c3a4c2d7281d3b8cfc0c6715f616e40e3332201a253067"}, - {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:51d0a4901b27272ae54e42067bc4b9a90e619a690b4dc43ea5950eb3070afc32"}, - {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fec5fac7aea6c060f317f07494961236434928e6f4374e170ef50b3001e14581"}, - {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:172ad884bb61ad31ed7beed8be776eb17e7fb423f1c1be836d5cb357a096bf12"}, - {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d646fdd74c25bbdd4a055414f0fe32896c400f38ffbdfc78c68e62812a9e0257"}, - {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e86260b76786c28acf0b5fe31c8dca4c2add95098c709b11e8c35b424ebd4f5b"}, - {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d7cafc11d70fdd8801abfc2ff276744ae4cb39d8060b6b542c7e44e5f2cfc2"}, - {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fc262c3df78c8ff6020c782d9ce02e4bcffe4900ad71c0ecdad59943cba54442"}, - {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:482c85cf3d429844396d939b22bc2a03849cb9ad33344689ad1c85697bcba33a"}, - {file = "aiohttp-3.10.9-cp310-cp310-win32.whl", hash = "sha256:aeebd3061f6f1747c011e1d0b0b5f04f9f54ad1a2ca183e687e7277bef2e0da2"}, - {file = "aiohttp-3.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:fa430b871220dc62572cef9c69b41e0d70fcb9d486a4a207a5de4c1f25d82593"}, - {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:16e6a51d8bc96b77f04a6764b4ad03eeef43baa32014fce71e882bd71302c7e4"}, - {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8bd9125dd0cc8ebd84bff2be64b10fdba7dc6fd7be431b5eaf67723557de3a31"}, - {file = "aiohttp-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dcf354661f54e6a49193d0b5653a1b011ba856e0b7a76bda2c33e4c6892f34ea"}, - {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42775de0ca04f90c10c5c46291535ec08e9bcc4756f1b48f02a0657febe89b10"}, - {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d1e4185c5d7187684d41ebb50c9aeaaaa06ca1875f4c57593071b0409d2444"}, - {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2695c61cf53a5d4345a43d689f37fc0f6d3a2dc520660aec27ec0f06288d1f9"}, - {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a3f063b41cc06e8d0b3fcbbfc9c05b7420f41287e0cd4f75ce0a1f3d80729e6"}, - {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d37f4718002863b82c6f391c8efd4d3a817da37030a29e2682a94d2716209de"}, - {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2746d8994ebca1bdc55a1e998feff4e94222da709623bb18f6e5cfec8ec01baf"}, - {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6f3c6648aa123bcd73d6f26607d59967b607b0da8ffcc27d418a4b59f4c98c7c"}, - {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:558b3d223fd631ad134d89adea876e7fdb4c93c849ef195049c063ada82b7d08"}, - {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4e6cb75f8ddd9c2132d00bc03c9716add57f4beff1263463724f6398b813e7eb"}, - {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:608cecd8d58d285bfd52dbca5b6251ca8d6ea567022c8a0eaae03c2589cd9af9"}, - {file = "aiohttp-3.10.9-cp311-cp311-win32.whl", hash = "sha256:36d4fba838be5f083f5490ddd281813b44d69685db910907636bc5dca6322316"}, - {file = "aiohttp-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:8be1a65487bdfc285bd5e9baf3208c2132ca92a9b4020e9f27df1b16fab998a9"}, - {file = "aiohttp-3.10.9-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4fd16b30567c5b8e167923be6e027eeae0f20cf2b8a26b98a25115f28ad48ee0"}, - {file = "aiohttp-3.10.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:40ff5b7660f903dc587ed36ef08a88d46840182d9d4b5694e7607877ced698a1"}, - {file = "aiohttp-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4edc3fd701e2b9a0d605a7b23d3de4ad23137d23fc0dbab726aa71d92f11aaaf"}, - {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e525b69ee8a92c146ae5b4da9ecd15e518df4d40003b01b454ad694a27f498b5"}, - {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5002a02c17fcfd796d20bac719981d2fca9c006aac0797eb8f430a58e9d12431"}, - {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4ceeae2fb8cabdd1b71c82bfdd39662473d3433ec95b962200e9e752fb70d0"}, - {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6e395c3d1f773cf0651cd3559e25182eb0c03a2777b53b4575d8adc1149c6e9"}, - {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbdb8def5268f3f9cd753a265756f49228a20ed14a480d151df727808b4531dd"}, - {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f82ace0ec57c94aaf5b0e118d4366cff5889097412c75aa14b4fd5fc0c44ee3e"}, - {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6ebdc3b3714afe1b134b3bbeb5f745eed3ecbcff92ab25d80e4ef299e83a5465"}, - {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f9ca09414003c0e96a735daa1f071f7d7ed06962ef4fa29ceb6c80d06696d900"}, - {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1298b854fd31d0567cbb916091be9d3278168064fca88e70b8468875ef9ff7e7"}, - {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:60ad5b8a7452c0f5645c73d4dad7490afd6119d453d302cd5b72b678a85d6044"}, - {file = "aiohttp-3.10.9-cp312-cp312-win32.whl", hash = "sha256:1a0ee6c0d590c917f1b9629371fce5f3d3f22c317aa96fbdcce3260754d7ea21"}, - {file = "aiohttp-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:c46131c6112b534b178d4e002abe450a0a29840b61413ac25243f1291613806a"}, - {file = "aiohttp-3.10.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2bd9f3eac515c16c4360a6a00c38119333901b8590fe93c3257a9b536026594d"}, - {file = "aiohttp-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8cc0d13b4e3b1362d424ce3f4e8c79e1f7247a00d792823ffd640878abf28e56"}, - {file = "aiohttp-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ba1a599255ad6a41022e261e31bc2f6f9355a419575b391f9655c4d9e5df5ff5"}, - {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:776e9f3c9b377fcf097c4a04b241b15691e6662d850168642ff976780609303c"}, - {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8debb45545ad95b58cc16c3c1cc19ad82cffcb106db12b437885dbee265f0ab5"}, - {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2555e4949c8d8782f18ef20e9d39730d2656e218a6f1a21a4c4c0b56546a02e"}, - {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c54dc329cd44f7f7883a9f4baaefe686e8b9662e2c6c184ea15cceee587d8d69"}, - {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e709d6ac598c5416f879bb1bae3fd751366120ac3fa235a01de763537385d036"}, - {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:17c272cfe7b07a5bb0c6ad3f234e0c336fb53f3bf17840f66bd77b5815ab3d16"}, - {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0c21c82df33b264216abffff9f8370f303dab65d8eee3767efbbd2734363f677"}, - {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9331dd34145ff105177855017920dde140b447049cd62bb589de320fd6ddd582"}, - {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ac3196952c673822ebed8871cf8802e17254fff2a2ed4835d9c045d9b88c5ec7"}, - {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2c33fa6e10bb7ed262e3ff03cc69d52869514f16558db0626a7c5c61dde3c29f"}, - {file = "aiohttp-3.10.9-cp313-cp313-win32.whl", hash = "sha256:a14e4b672c257a6b94fe934ee62666bacbc8e45b7876f9dd9502d0f0fe69db16"}, - {file = "aiohttp-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:a35ed3d03910785f7d9d6f5381f0c24002b2b888b298e6f941b2fc94c5055fcd"}, - {file = "aiohttp-3.10.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f392ef50e22c31fa49b5a46af7f983fa3f118f3eccb8522063bee8bfa6755f8"}, - {file = "aiohttp-3.10.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d1f5c9169e26db6a61276008582d945405b8316aae2bb198220466e68114a0f5"}, - {file = "aiohttp-3.10.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8d9d10d10ec27c0d46ddaecc3c5598c4db9ce4e6398ca872cdde0525765caa2f"}, - {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d97273a52d7f89a75b11ec386f786d3da7723d7efae3034b4dda79f6f093edc1"}, - {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d271f770b52e32236d945911b2082f9318e90ff835d45224fa9e28374303f729"}, - {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7003f33f5f7da1eb02f0446b0f8d2ccf57d253ca6c2e7a5732d25889da82b517"}, - {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6e00c8a92e7663ed2be6fcc08a2997ff06ce73c8080cd0df10cc0321a3168d7"}, - {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a61df62966ce6507aafab24e124e0c3a1cfbe23c59732987fc0fd0d71daa0b88"}, - {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:60555211a006d26e1a389222e3fab8cd379f28e0fbf7472ee55b16c6c529e3a6"}, - {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d15a29424e96fad56dc2f3abed10a89c50c099f97d2416520c7a543e8fddf066"}, - {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:a19caae0d670771ea7854ca30df76f676eb47e0fd9b2ee4392d44708f272122d"}, - {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:99f9678bf0e2b1b695e8028fedac24ab6770937932eda695815d5a6618c37e04"}, - {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2914caa46054f3b5ff910468d686742ff8cff54b8a67319d75f5d5945fd0a13d"}, - {file = "aiohttp-3.10.9-cp38-cp38-win32.whl", hash = "sha256:0bc059ecbce835630e635879f5f480a742e130d9821fbe3d2f76610a6698ee25"}, - {file = "aiohttp-3.10.9-cp38-cp38-win_amd64.whl", hash = "sha256:e883b61b75ca6efc2541fcd52a5c8ccfe288b24d97e20ac08fdf343b8ac672ea"}, - {file = "aiohttp-3.10.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fcd546782d03181b0b1d20b43d612429a90a68779659ba8045114b867971ab71"}, - {file = "aiohttp-3.10.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:85711eec2d875cd88c7eb40e734c4ca6d9ae477d6f26bd2b5bb4f7f60e41b156"}, - {file = "aiohttp-3.10.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:02d1d6610588bcd743fae827bd6f2e47e0d09b346f230824b4c6fb85c6065f9c"}, - {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3668d0c2a4d23fb136a753eba42caa2c0abbd3d9c5c87ee150a716a16c6deec1"}, - {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7c071235a47d407b0e93aa6262b49422dbe48d7d8566e1158fecc91043dd948"}, - {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac74e794e3aee92ae8f571bfeaa103a141e409863a100ab63a253b1c53b707eb"}, - {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bbf94d4a0447705b7775417ca8bb8086cc5482023a6e17cdc8f96d0b1b5aba6"}, - {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb0b2d5d51f96b6cc19e6ab46a7b684be23240426ae951dcdac9639ab111b45e"}, - {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e83dfefb4f7d285c2d6a07a22268344a97d61579b3e0dce482a5be0251d672ab"}, - {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f0a44bb40b6aaa4fb9a5c1ee07880570ecda2065433a96ccff409c9c20c1624a"}, - {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c2b627d3c8982691b06d89d31093cee158c30629fdfebe705a91814d49b554f8"}, - {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:03690541e4cc866eef79626cfa1ef4dd729c5c1408600c8cb9e12e1137eed6ab"}, - {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad3675c126f2a95bde637d162f8231cff6bc0bc9fbe31bd78075f9ff7921e322"}, - {file = "aiohttp-3.10.9-cp39-cp39-win32.whl", hash = "sha256:1321658f12b6caffafdc35cfba6c882cb014af86bef4e78c125e7e794dfb927b"}, - {file = "aiohttp-3.10.9-cp39-cp39-win_amd64.whl", hash = "sha256:9fdf5c839bf95fc67be5794c780419edb0dbef776edcfc6c2e5e2ffd5ee755fa"}, - {file = "aiohttp-3.10.9.tar.gz", hash = "sha256:143b0026a9dab07a05ad2dd9e46aa859bffdd6348ddc5967b42161168c24f857"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68"}, + {file = "aiohttp-3.10.10-cp310-cp310-win32.whl", hash = "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257"}, + {file = "aiohttp-3.10.10-cp310-cp310-win_amd64.whl", hash = "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a"}, + {file = "aiohttp-3.10.10-cp311-cp311-win32.whl", hash = "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94"}, + {file = "aiohttp-3.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205"}, + {file = "aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628"}, + {file = "aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b"}, + {file = "aiohttp-3.10.10-cp313-cp313-win32.whl", hash = "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8"}, + {file = "aiohttp-3.10.10-cp313-cp313-win_amd64.whl", hash = "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b"}, + {file = "aiohttp-3.10.10-cp38-cp38-win32.whl", hash = "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c"}, + {file = "aiohttp-3.10.10-cp38-cp38-win_amd64.whl", hash = "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91"}, + {file = "aiohttp-3.10.10-cp39-cp39-win32.whl", hash = "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983"}, + {file = "aiohttp-3.10.10-cp39-cp39-win_amd64.whl", hash = "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23"}, + {file = "aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a"}, ] [package.dependencies] @@ -267,13 +267,13 @@ files = [ [[package]] name = "anyio" -version = "4.6.0" +version = "4.6.2.post1" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.9" files = [ - {file = "anyio-4.6.0-py3-none-any.whl", hash = "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a"}, - {file = "anyio-4.6.0.tar.gz", hash = "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb"}, + {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"}, + {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"}, ] [package.dependencies] @@ -284,7 +284,7 @@ typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -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.21.0b1)"] +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", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] trio = ["trio (>=0.26.1)"] [[package]] @@ -500,13 +500,13 @@ lxml = ["lxml"] [[package]] name = "botocore" -version = "1.35.36" +version = "1.35.40" description = "Low-level, data-driven core of boto 3." optional = true python-versions = ">=3.8" files = [ - {file = "botocore-1.35.36-py3-none-any.whl", hash = "sha256:64241c778bf2dc863d93abab159e14024d97a926a5715056ef6411418cb9ead3"}, - {file = "botocore-1.35.36.tar.gz", hash = "sha256:354ec1b766f0029b5d6ff0c45d1a0f9e5007b7d2f3ec89bcdd755b208c5bc797"}, + {file = "botocore-1.35.40-py3-none-any.whl", hash = "sha256:072cc47f29cb1de4fa77ce6632e4f0480af29b70816973ff415fbaa3f50bd1db"}, + {file = "botocore-1.35.40.tar.gz", hash = "sha256:547e0a983856c7d7aeaa30fca2a283873c57c07366cd806d2d639856341b3c31"}, ] [package.dependencies] @@ -530,13 +530,13 @@ files = [ [[package]] name = "camel-ai" -version = "0.2.1" +version = "0.2.2" description = "Communicative Agents for AI Society Study" optional = true python-versions = "<3.12,>=3.10.0" files = [ - {file = "camel_ai-0.2.1-py3-none-any.whl", hash = "sha256:6068940a2772b50fb68dac75b7d59e76f01b9af8ef2019267afe8f458b8c19fb"}, - {file = "camel_ai-0.2.1.tar.gz", hash = "sha256:088d0339cc70ff4a972d02e37728dad53a99c3b7d78b9bee92e9d1eadac0ab03"}, + {file = "camel_ai-0.2.2-py3-none-any.whl", hash = "sha256:5b65638d3a87f4a813f5f181123e5b07e6688e33bb4ca9167f34127c1c244126"}, + {file = "camel_ai-0.2.2.tar.gz", hash = "sha256:729ddadc47ae6e0f8d55fe0e0bdf9ef8a7f98b712a48d84f1ee28090a8d6ffbb"}, ] [package.dependencies] @@ -546,7 +546,7 @@ anthropic = ">=0.29.0,<0.30.0" azure-storage-blob = {version = ">=12.21.0,<13.0.0", optional = true, markers = "extra == \"object-storages\" or extra == \"all\""} beautifulsoup4 = {version = ">=4,<5", optional = true, markers = "extra == \"tools\" or extra == \"all\""} botocore = {version = ">=1.35.3,<2.0.0", optional = true, markers = "extra == \"object-storages\" or extra == \"all\""} -cohere = {version = ">=4.56,<5.0", optional = true, markers = "extra == \"retrievers\" or extra == \"all\""} +cohere = {version = ">=4.56,<5.0", optional = true, markers = "extra == \"rag\" or extra == \"retrievers\" or extra == \"all\""} colorama = ">=0,<1" curl_cffi = "0.6.2" datasets = {version = ">=2,<3", optional = true, markers = "extra == \"huggingface-agent\" or extra == \"all\""} @@ -555,7 +555,7 @@ diffusers = {version = ">=0,<1", optional = true, markers = "extra == \"huggingf docker = {version = ">=7.1.0,<8.0.0", optional = true, markers = "extra == \"tools\" or extra == \"all\""} docstring-parser = ">=0.15,<0.16" docx2txt = {version = ">=0.8,<0.9", optional = true, markers = "extra == \"tools\" or extra == \"all\""} -duckduckgo-search = {version = ">=6.1.0,<7.0.0", optional = true, markers = "extra == \"tools\" or extra == \"all\""} +duckduckgo-search = {version = ">=6.2.12,<7.0.0", optional = true, markers = "extra == \"search-tools\" or extra == \"tools\" or extra == \"all\""} eval-type-backport = "0.2.0" firecrawl-py = {version = ">=1.0.0,<2.0.0", optional = true, markers = "extra == \"tools\" or extra == \"all\""} google-cloud-storage = {version = ">=2.18.0,<3.0.0", optional = true, markers = "extra == \"object-storages\" or extra == \"all\""} @@ -568,7 +568,8 @@ jsonschema = ">=4,<5" jupyter_client = {version = ">=8.6.2,<9.0.0", optional = true, markers = "extra == \"tools\" or extra == \"all\""} litellm = {version = ">=1.38.1,<2.0.0", optional = true, markers = "extra == \"model-platforms\" or extra == \"all\""} mistralai = {version = ">=1.0.0,<2.0.0", optional = true, markers = "extra == \"model-platforms\" or extra == \"all\""} -neo4j = {version = ">=5.18.0,<6.0.0", optional = true, markers = "extra == \"graph-storages\" or extra == \"all\""} +nebula3-python = {version = "3.8.2", optional = true, markers = "extra == \"rag\" or extra == \"graph-storages\" or extra == \"all\""} +neo4j = {version = ">=5.18.0,<6.0.0", optional = true, markers = "extra == \"rag\" or extra == \"graph-storages\" or extra == \"all\""} newspaper3k = {version = ">=0.2.8,<0.3.0", optional = true, markers = "extra == \"tools\" or extra == \"all\""} nltk = {version = "3.8.1", optional = true, markers = "extra == \"tools\" or extra == \"all\""} numpy = ">=1,<2" @@ -584,16 +585,16 @@ protobuf = ">=4,<5" pydantic = ">=1.9,<3" pydub = {version = ">=0.25.1,<0.26.0", optional = true, markers = "extra == \"tools\" or extra == \"all\""} pygithub = {version = ">=2.3.0,<3.0.0", optional = true, markers = "extra == \"tools\" or extra == \"all\""} -pymilvus = {version = ">=2.4.0,<3.0.0", optional = true, markers = "extra == \"vector-databases\" or extra == \"all\""} +pymilvus = {version = ">=2.4.0,<3.0.0", optional = true, markers = "extra == \"rag\" or extra == \"vector-databases\" or extra == \"all\""} PyMuPDF = {version = ">=1.22.5,<2.0.0", optional = true, markers = "extra == \"tools\" or extra == \"all\""} pyowm = {version = ">=3.3.0,<4.0.0", optional = true, markers = "extra == \"tools\" or extra == \"all\""} pyTelegramBotAPI = {version = ">=4.18.0,<5.0.0", optional = true, markers = "extra == \"tools\" or extra == \"all\""} -qdrant-client = {version = ">=1.9.0,<2.0.0", optional = true, markers = "extra == \"vector-databases\" or extra == \"all\""} -rank-bm25 = {version = ">=0.2.2,<0.3.0", optional = true, markers = "extra == \"retrievers\" or extra == \"all\""} +qdrant-client = {version = ">=1.9.0,<2.0.0", optional = true, markers = "extra == \"rag\" or extra == \"vector-databases\" or extra == \"all\""} +rank-bm25 = {version = ">=0.2.2,<0.3.0", optional = true, markers = "extra == \"rag\" or extra == \"retrievers\" or extra == \"all\""} redis = {version = ">=5.0.6,<6.0.0", optional = true, markers = "extra == \"kv-stroages\" or extra == \"all\""} reka-api = {version = ">=3.0.8,<4.0.0", optional = true, markers = "extra == \"model-platforms\" or extra == \"all\""} requests_oauthlib = {version = ">=1.3.1,<2.0.0", optional = true, markers = "extra == \"tools\" or extra == \"all\""} -sentence-transformers = {version = ">=3.0.1,<4.0.0", optional = true, markers = "extra == \"encoders\" or extra == \"all\""} +sentence-transformers = {version = ">=3.0.1,<4.0.0", optional = true, markers = "extra == \"rag\" or extra == \"encoders\" or extra == \"all\""} sentencepiece = {version = ">=0,<1", optional = true, markers = "extra == \"huggingface-agent\" or extra == \"all\""} slack-sdk = {version = ">=3.27.2,<4.0.0", optional = true, markers = "extra == \"tools\" or extra == \"all\""} soundfile = {version = ">=0,<1", optional = true, markers = "extra == \"huggingface-agent\" or extra == \"all\""} @@ -601,21 +602,23 @@ textblob = {version = ">=0.18.0.post0,<0.19.0", optional = true, markers = "extr tiktoken = ">=0.7.0,<0.8.0" torch = {version = ">=2,<3", optional = true, markers = "extra == \"huggingface-agent\" or extra == \"all\""} transformers = {version = ">=4,<5", optional = true, markers = "extra == \"huggingface-agent\" or extra == \"all\""} -unstructured = {version = ">=0.10,<0.11", extras = ["all-docs"], optional = true, markers = "extra == \"tools\" or extra == \"all\""} -wikipedia = {version = ">=1,<2", optional = true, markers = "extra == \"tools\" or extra == \"all\""} -wolframalpha = {version = ">=5.0.0,<6.0.0", optional = true, markers = "extra == \"tools\" or extra == \"all\""} +unstructured = {version = ">=0.10,<0.11", extras = ["all-docs"], optional = true, markers = "extra == \"rag\" or extra == \"tools\" or extra == \"all\""} +wikipedia = {version = ">=1,<2", optional = true, markers = "extra == \"search-tools\" or extra == \"tools\" or extra == \"all\""} +wolframalpha = {version = ">=5.0.0,<6.0.0", optional = true, markers = "extra == \"search-tools\" or extra == \"tools\" or extra == \"all\""} [package.extras] -all = ["PyMuPDF (>=1.22.5,<2.0.0)", "accelerate (>=0,<1)", "agentops (>=0.3.6,<0.4.0)", "azure-storage-blob (>=12.21.0,<13.0.0)", "beautifulsoup4 (>=4,<5)", "botocore (>=1.35.3,<2.0.0)", "cohere (>=4.56,<5.0)", "datasets (>=2,<3)", "diffusers (>=0,<1)", "discord.py (>=2.3.2,<3.0.0)", "docker (>=7.1.0,<8.0.0)", "docx2txt (>=0.8,<0.9)", "duckduckgo-search (>=6.1.0,<7.0.0)", "firecrawl-py (>=1.0.0,<2.0.0)", "google-cloud-storage (>=2.18.0,<3.0.0)", "google-generativeai (>=0.6.0,<0.7.0)", "googlemaps (>=4.10.0,<5.0.0)", "imageio[pyav] (>=2.34.2,<3.0.0)", "jupyter_client (>=8.6.2,<9.0.0)", "litellm (>=1.38.1,<2.0.0)", "mistralai (>=1.0.0,<2.0.0)", "neo4j (>=5.18.0,<6.0.0)", "newspaper3k (>=0.2.8,<0.3.0)", "nltk (==3.8.1)", "openapi-spec-validator (>=0.7.1,<0.8.0)", "opencv-python (>=4,<5)", "pillow (>=10.2.0,<11.0.0)", "prance (>=23.6.21.0,<24.0.0.0)", "praw (>=7.7.1,<8.0.0)", "pyTelegramBotAPI (>=4.18.0,<5.0.0)", "pydub (>=0.25.1,<0.26.0)", "pygithub (>=2.3.0,<3.0.0)", "pymilvus (>=2.4.0,<3.0.0)", "pyowm (>=3.3.0,<4.0.0)", "qdrant-client (>=1.9.0,<2.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "redis (>=5.0.6,<6.0.0)", "reka-api (>=3.0.8,<4.0.0)", "requests_oauthlib (>=1.3.1,<2.0.0)", "sentence-transformers (>=3.0.1,<4.0.0)", "sentencepiece (>=0,<1)", "slack-sdk (>=3.27.2,<4.0.0)", "soundfile (>=0,<1)", "textblob (>=0.18.0.post0,<0.19.0)", "torch (>=2,<3)", "transformers (>=4,<5)", "unstructured[all-docs] (>=0.10,<0.11)", "wikipedia (>=1,<2)", "wolframalpha (>=5.0.0,<6.0.0)"] +all = ["PyMuPDF (>=1.22.5,<2.0.0)", "accelerate (>=0,<1)", "agentops (>=0.3.6,<0.4.0)", "azure-storage-blob (>=12.21.0,<13.0.0)", "beautifulsoup4 (>=4,<5)", "botocore (>=1.35.3,<2.0.0)", "cohere (>=4.56,<5.0)", "datasets (>=2,<3)", "diffusers (>=0,<1)", "discord.py (>=2.3.2,<3.0.0)", "docker (>=7.1.0,<8.0.0)", "docx2txt (>=0.8,<0.9)", "duckduckgo-search (>=6.2.12,<7.0.0)", "firecrawl-py (>=1.0.0,<2.0.0)", "google-cloud-storage (>=2.18.0,<3.0.0)", "google-generativeai (>=0.6.0,<0.7.0)", "googlemaps (>=4.10.0,<5.0.0)", "imageio[pyav] (>=2.34.2,<3.0.0)", "jupyter_client (>=8.6.2,<9.0.0)", "litellm (>=1.38.1,<2.0.0)", "mistralai (>=1.0.0,<2.0.0)", "nebula3-python (==3.8.2)", "neo4j (>=5.18.0,<6.0.0)", "newspaper3k (>=0.2.8,<0.3.0)", "nltk (==3.8.1)", "openapi-spec-validator (>=0.7.1,<0.8.0)", "opencv-python (>=4,<5)", "pillow (>=10.2.0,<11.0.0)", "prance (>=23.6.21.0,<24.0.0.0)", "praw (>=7.7.1,<8.0.0)", "pyTelegramBotAPI (>=4.18.0,<5.0.0)", "pydub (>=0.25.1,<0.26.0)", "pygithub (>=2.3.0,<3.0.0)", "pymilvus (>=2.4.0,<3.0.0)", "pyowm (>=3.3.0,<4.0.0)", "qdrant-client (>=1.9.0,<2.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "redis (>=5.0.6,<6.0.0)", "reka-api (>=3.0.8,<4.0.0)", "requests_oauthlib (>=1.3.1,<2.0.0)", "sentence-transformers (>=3.0.1,<4.0.0)", "sentencepiece (>=0,<1)", "slack-sdk (>=3.27.2,<4.0.0)", "soundfile (>=0,<1)", "textblob (>=0.18.0.post0,<0.19.0)", "torch (>=2,<3)", "transformers (>=4,<5)", "unstructured[all-docs] (>=0.10,<0.11)", "wikipedia (>=1,<2)", "wolframalpha (>=5.0.0,<6.0.0)"] encoders = ["sentence-transformers (>=3.0.1,<4.0.0)"] -graph-storages = ["neo4j (>=5.18.0,<6.0.0)"] +graph-storages = ["nebula3-python (==3.8.2)", "neo4j (>=5.18.0,<6.0.0)"] huggingface-agent = ["accelerate (>=0,<1)", "datasets (>=2,<3)", "diffusers (>=0,<1)", "opencv-python (>=4,<5)", "sentencepiece (>=0,<1)", "soundfile (>=0,<1)", "torch (>=2,<3)", "transformers (>=4,<5)"] kv-stroages = ["redis (>=5.0.6,<6.0.0)"] model-platforms = ["google-generativeai (>=0.6.0,<0.7.0)", "litellm (>=1.38.1,<2.0.0)", "mistralai (>=1.0.0,<2.0.0)", "reka-api (>=3.0.8,<4.0.0)"] object-storages = ["azure-storage-blob (>=12.21.0,<13.0.0)", "botocore (>=1.35.3,<2.0.0)", "google-cloud-storage (>=2.18.0,<3.0.0)"] +rag = ["cohere (>=4.56,<5.0)", "nebula3-python (==3.8.2)", "neo4j (>=5.18.0,<6.0.0)", "pymilvus (>=2.4.0,<3.0.0)", "qdrant-client (>=1.9.0,<2.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "sentence-transformers (>=3.0.1,<4.0.0)", "unstructured[all-docs] (>=0.10,<0.11)"] retrievers = ["cohere (>=4.56,<5.0)", "rank-bm25 (>=0.2.2,<0.3.0)"] +search-tools = ["duckduckgo-search (>=6.2.12,<7.0.0)", "wikipedia (>=1,<2)", "wolframalpha (>=5.0.0,<6.0.0)"] test = ["mock (>=5,<6)", "pytest (>=7,<8)", "pytest-asyncio (>=0.23.0,<0.24.0)"] -tools = ["PyMuPDF (>=1.22.5,<2.0.0)", "agentops (>=0.3.6,<0.4.0)", "beautifulsoup4 (>=4,<5)", "discord.py (>=2.3.2,<3.0.0)", "docker (>=7.1.0,<8.0.0)", "docx2txt (>=0.8,<0.9)", "duckduckgo-search (>=6.1.0,<7.0.0)", "firecrawl-py (>=1.0.0,<2.0.0)", "googlemaps (>=4.10.0,<5.0.0)", "imageio[pyav] (>=2.34.2,<3.0.0)", "jupyter_client (>=8.6.2,<9.0.0)", "newspaper3k (>=0.2.8,<0.3.0)", "nltk (==3.8.1)", "openapi-spec-validator (>=0.7.1,<0.8.0)", "pillow (>=10.2.0,<11.0.0)", "prance (>=23.6.21.0,<24.0.0.0)", "praw (>=7.7.1,<8.0.0)", "pyTelegramBotAPI (>=4.18.0,<5.0.0)", "pydub (>=0.25.1,<0.26.0)", "pygithub (>=2.3.0,<3.0.0)", "pyowm (>=3.3.0,<4.0.0)", "requests_oauthlib (>=1.3.1,<2.0.0)", "slack-sdk (>=3.27.2,<4.0.0)", "textblob (>=0.18.0.post0,<0.19.0)", "unstructured[all-docs] (>=0.10,<0.11)", "wikipedia (>=1,<2)", "wolframalpha (>=5.0.0,<6.0.0)"] +tools = ["PyMuPDF (>=1.22.5,<2.0.0)", "agentops (>=0.3.6,<0.4.0)", "beautifulsoup4 (>=4,<5)", "discord.py (>=2.3.2,<3.0.0)", "docker (>=7.1.0,<8.0.0)", "docx2txt (>=0.8,<0.9)", "duckduckgo-search (>=6.2.12,<7.0.0)", "firecrawl-py (>=1.0.0,<2.0.0)", "googlemaps (>=4.10.0,<5.0.0)", "imageio[pyav] (>=2.34.2,<3.0.0)", "jupyter_client (>=8.6.2,<9.0.0)", "newspaper3k (>=0.2.8,<0.3.0)", "nltk (==3.8.1)", "openapi-spec-validator (>=0.7.1,<0.8.0)", "pillow (>=10.2.0,<11.0.0)", "prance (>=23.6.21.0,<24.0.0.0)", "praw (>=7.7.1,<8.0.0)", "pyTelegramBotAPI (>=4.18.0,<5.0.0)", "pydub (>=0.25.1,<0.26.0)", "pygithub (>=2.3.0,<3.0.0)", "pyowm (>=3.3.0,<4.0.0)", "requests_oauthlib (>=1.3.1,<2.0.0)", "slack-sdk (>=3.27.2,<4.0.0)", "textblob (>=0.18.0.post0,<0.19.0)", "unstructured[all-docs] (>=0.10,<0.11)", "wikipedia (>=1,<2)", "wolframalpha (>=5.0.0,<6.0.0)"] vector-databases = ["pymilvus (>=2.4.0,<3.0.0)", "qdrant-client (>=1.9.0,<2.0.0)"] [[package]] @@ -732,101 +735,116 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -1148,33 +1166,37 @@ vision = ["Pillow (>=6.2.1)"] [[package]] name = "debugpy" -version = "1.8.6" +version = "1.8.7" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:30f467c5345d9dfdcc0afdb10e018e47f092e383447500f125b4e013236bf14b"}, - {file = "debugpy-1.8.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d73d8c52614432f4215d0fe79a7e595d0dd162b5c15233762565be2f014803b"}, - {file = "debugpy-1.8.6-cp310-cp310-win32.whl", hash = "sha256:e3e182cd98eac20ee23a00653503315085b29ab44ed66269482349d307b08df9"}, - {file = "debugpy-1.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:e3a82da039cfe717b6fb1886cbbe5c4a3f15d7df4765af857f4307585121c2dd"}, - {file = "debugpy-1.8.6-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:67479a94cf5fd2c2d88f9615e087fcb4fec169ec780464a3f2ba4a9a2bb79955"}, - {file = "debugpy-1.8.6-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb8653f6cbf1dd0a305ac1aa66ec246002145074ea57933978346ea5afdf70b"}, - {file = "debugpy-1.8.6-cp311-cp311-win32.whl", hash = "sha256:cdaf0b9691879da2d13fa39b61c01887c34558d1ff6e5c30e2eb698f5384cd43"}, - {file = "debugpy-1.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:43996632bee7435583952155c06881074b9a742a86cee74e701d87ca532fe833"}, - {file = "debugpy-1.8.6-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:db891b141fc6ee4b5fc6d1cc8035ec329cabc64bdd2ae672b4550c87d4ecb128"}, - {file = "debugpy-1.8.6-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:567419081ff67da766c898ccf21e79f1adad0e321381b0dfc7a9c8f7a9347972"}, - {file = "debugpy-1.8.6-cp312-cp312-win32.whl", hash = "sha256:c9834dfd701a1f6bf0f7f0b8b1573970ae99ebbeee68314116e0ccc5c78eea3c"}, - {file = "debugpy-1.8.6-cp312-cp312-win_amd64.whl", hash = "sha256:e4ce0570aa4aca87137890d23b86faeadf184924ad892d20c54237bcaab75d8f"}, - {file = "debugpy-1.8.6-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:df5dc9eb4ca050273b8e374a4cd967c43be1327eeb42bfe2f58b3cdfe7c68dcb"}, - {file = "debugpy-1.8.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a85707c6a84b0c5b3db92a2df685b5230dd8fb8c108298ba4f11dba157a615a"}, - {file = "debugpy-1.8.6-cp38-cp38-win32.whl", hash = "sha256:538c6cdcdcdad310bbefd96d7850be1cd46e703079cc9e67d42a9ca776cdc8a8"}, - {file = "debugpy-1.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:22140bc02c66cda6053b6eb56dfe01bbe22a4447846581ba1dd6df2c9f97982d"}, - {file = "debugpy-1.8.6-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:c1cef65cffbc96e7b392d9178dbfd524ab0750da6c0023c027ddcac968fd1caa"}, - {file = "debugpy-1.8.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e60bd06bb3cc5c0e957df748d1fab501e01416c43a7bdc756d2a992ea1b881"}, - {file = "debugpy-1.8.6-cp39-cp39-win32.whl", hash = "sha256:f7158252803d0752ed5398d291dee4c553bb12d14547c0e1843ab74ee9c31123"}, - {file = "debugpy-1.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3358aa619a073b620cd0d51d8a6176590af24abcc3fe2e479929a154bf591b51"}, - {file = "debugpy-1.8.6-py2.py3-none-any.whl", hash = "sha256:b48892df4d810eff21d3ef37274f4c60d32cdcafc462ad5647239036b0f0649f"}, - {file = "debugpy-1.8.6.zip", hash = "sha256:c931a9371a86784cee25dec8d65bc2dc7a21f3f1552e3833d9ef8f919d22280a"}, + {file = "debugpy-1.8.7-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:95fe04a573b8b22896c404365e03f4eda0ce0ba135b7667a1e57bd079793b96b"}, + {file = "debugpy-1.8.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:628a11f4b295ffb4141d8242a9bb52b77ad4a63a2ad19217a93be0f77f2c28c9"}, + {file = "debugpy-1.8.7-cp310-cp310-win32.whl", hash = "sha256:85ce9c1d0eebf622f86cc68618ad64bf66c4fc3197d88f74bb695a416837dd55"}, + {file = "debugpy-1.8.7-cp310-cp310-win_amd64.whl", hash = "sha256:29e1571c276d643757ea126d014abda081eb5ea4c851628b33de0c2b6245b037"}, + {file = "debugpy-1.8.7-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:caf528ff9e7308b74a1749c183d6808ffbedbb9fb6af78b033c28974d9b8831f"}, + {file = "debugpy-1.8.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cba1d078cf2e1e0b8402e6bda528bf8fda7ccd158c3dba6c012b7897747c41a0"}, + {file = "debugpy-1.8.7-cp311-cp311-win32.whl", hash = "sha256:171899588bcd412151e593bd40d9907133a7622cd6ecdbdb75f89d1551df13c2"}, + {file = "debugpy-1.8.7-cp311-cp311-win_amd64.whl", hash = "sha256:6e1c4ffb0c79f66e89dfd97944f335880f0d50ad29525dc792785384923e2211"}, + {file = "debugpy-1.8.7-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:4d27d842311353ede0ad572600c62e4bcd74f458ee01ab0dd3a1a4457e7e3706"}, + {file = "debugpy-1.8.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:703c1fd62ae0356e194f3e7b7a92acd931f71fe81c4b3be2c17a7b8a4b546ec2"}, + {file = "debugpy-1.8.7-cp312-cp312-win32.whl", hash = "sha256:2f729228430ef191c1e4df72a75ac94e9bf77413ce5f3f900018712c9da0aaca"}, + {file = "debugpy-1.8.7-cp312-cp312-win_amd64.whl", hash = "sha256:45c30aaefb3e1975e8a0258f5bbd26cd40cde9bfe71e9e5a7ac82e79bad64e39"}, + {file = "debugpy-1.8.7-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:d050a1ec7e925f514f0f6594a1e522580317da31fbda1af71d1530d6ea1f2b40"}, + {file = "debugpy-1.8.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f4349a28e3228a42958f8ddaa6333d6f8282d5edaea456070e48609c5983b7"}, + {file = "debugpy-1.8.7-cp313-cp313-win32.whl", hash = "sha256:11ad72eb9ddb436afb8337891a986302e14944f0f755fd94e90d0d71e9100bba"}, + {file = "debugpy-1.8.7-cp313-cp313-win_amd64.whl", hash = "sha256:2efb84d6789352d7950b03d7f866e6d180284bc02c7e12cb37b489b7083d81aa"}, + {file = "debugpy-1.8.7-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:4b908291a1d051ef3331484de8e959ef3e66f12b5e610c203b5b75d2725613a7"}, + {file = "debugpy-1.8.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da8df5b89a41f1fd31503b179d0a84a5fdb752dddd5b5388dbd1ae23cda31ce9"}, + {file = "debugpy-1.8.7-cp38-cp38-win32.whl", hash = "sha256:b12515e04720e9e5c2216cc7086d0edadf25d7ab7e3564ec8b4521cf111b4f8c"}, + {file = "debugpy-1.8.7-cp38-cp38-win_amd64.whl", hash = "sha256:93176e7672551cb5281577cdb62c63aadc87ec036f0c6a486f0ded337c504596"}, + {file = "debugpy-1.8.7-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:90d93e4f2db442f8222dec5ec55ccfc8005821028982f1968ebf551d32b28907"}, + {file = "debugpy-1.8.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6db2a370e2700557a976eaadb16243ec9c91bd46f1b3bb15376d7aaa7632c81"}, + {file = "debugpy-1.8.7-cp39-cp39-win32.whl", hash = "sha256:a6cf2510740e0c0b4a40330640e4b454f928c7b99b0c9dbf48b11efba08a8cda"}, + {file = "debugpy-1.8.7-cp39-cp39-win_amd64.whl", hash = "sha256:6a9d9d6d31846d8e34f52987ee0f1a904c7baa4912bf4843ab39dadf9b8f3e0d"}, + {file = "debugpy-1.8.7-py2.py3-none-any.whl", hash = "sha256:57b00de1c8d2c84a61b90880f7e5b6deaf4c312ecbde3a0e8912f2a56c4ac9ae"}, + {file = "debugpy-1.8.7.zip", hash = "sha256:18b8f731ed3e2e1df8e9cdaa23fb1fc9c24e570cd0081625308ec51c82efe42e"}, ] [[package]] @@ -1283,13 +1305,13 @@ voice = ["PyNaCl (>=1.3.0,<1.6)"] [[package]] name = "distlib" -version = "0.3.8" +version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" files = [ - {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, - {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, + {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, + {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, ] [[package]] @@ -1379,18 +1401,18 @@ files = [ [[package]] name = "duckduckgo-search" -version = "6.3.0" +version = "6.3.1" description = "Search for words, documents, images, news, maps and text translation using the DuckDuckGo.com search engine." optional = true python-versions = ">=3.8" files = [ - {file = "duckduckgo_search-6.3.0-py3-none-any.whl", hash = "sha256:9a231a7b325226811cf7d35a240f3f501e718ae10a1aa0a638cabc80e129dfe7"}, - {file = "duckduckgo_search-6.3.0.tar.gz", hash = "sha256:e9f56955569325a7d9cacda2488ca78bf6629a459e74415892bee560b664f5eb"}, + {file = "duckduckgo_search-6.3.1-py3-none-any.whl", hash = "sha256:408fbfe07ae084eca5d0b5ebd0234187362d9e507ca1549f264104ce13006b58"}, + {file = "duckduckgo_search-6.3.1.tar.gz", hash = "sha256:f43c7fa61518537bb5327aa9411520b04baa7c32b199d816b97d38f451f71824"}, ] [package.dependencies] click = ">=8.1.7" -primp = ">=0.6.3" +primp = ">=0.6.4" [package.extras] dev = ["mypy (>=1.11.1)", "pytest (>=8.3.1)", "pytest-asyncio (>=0.23.8)", "ruff (>=0.6.1)"] @@ -1675,13 +1697,13 @@ files = [ [[package]] name = "firecrawl-py" -version = "1.2.4" +version = "1.3.1" description = "Python SDK for Firecrawl API" optional = true python-versions = ">=3.8" files = [ - {file = "firecrawl_py-1.2.4-py3-none-any.whl", hash = "sha256:0464992f354f4f7830dc29433dacad127a9cd73e331601c719f811df70bace58"}, - {file = "firecrawl_py-1.2.4.tar.gz", hash = "sha256:bff3cfbce725739f6d7d7f8975b43be392f17c844f601485f19c2ddcf2b4f8de"}, + {file = "firecrawl_py-1.3.1-py3-none-any.whl", hash = "sha256:fe8921e75871982defa6566cf7e23805b10ad5fc1288a14f07f688974329d6f8"}, + {file = "firecrawl_py-1.3.1.tar.gz", hash = "sha256:fa7172f677b9194de26530dfd6cd8290e8187aadda5b6e84b724eca8813845cb"}, ] [package.dependencies] @@ -1900,6 +1922,17 @@ test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe, 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"] tqdm = ["tqdm"] +[[package]] +name = "future" +version = "1.0.0" +description = "Clean single-source support for Python 3 and 2" +optional = true +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"}, + {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, +] + [[package]] name = "geojson" version = "2.5.0" @@ -1930,13 +1963,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-api-core" -version = "2.20.0" +version = "2.21.0" description = "Google API client core library" optional = true python-versions = ">=3.7" files = [ - {file = "google_api_core-2.20.0-py3-none-any.whl", hash = "sha256:ef0591ef03c30bb83f79b3d0575c3f31219001fc9c5cf37024d08310aeffed8a"}, - {file = "google_api_core-2.20.0.tar.gz", hash = "sha256:f74dff1889ba291a4b76c5079df0711810e2d9da81abfdc99957bc961c1eb28f"}, + {file = "google_api_core-2.21.0-py3-none-any.whl", hash = "sha256:6869eacb2a37720380ba5898312af79a4d30b8bca1548fb4093e0697dc4bdf5d"}, + {file = "google_api_core-2.21.0.tar.gz", hash = "sha256:4a152fd11a9f774ea606388d423b68aa7e6d6a0ffe4c8266f74979613ec09f81"}, ] [package.dependencies] @@ -1955,19 +1988,20 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 requests = ">=2.18.0,<3.0.0.dev0" [package.extras] +async-rest = ["google-auth[aiohttp] (>=2.35.0,<3.0.dev0)"] grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.148.0" +version = "2.149.0" description = "Google API Client Library for Python" optional = true python-versions = ">=3.7" files = [ - {file = "google_api_python_client-2.148.0-py2.py3-none-any.whl", hash = "sha256:cae8cbd0a9637d42d2e213c598e72427f8b879d6cf5a3dc448498aefad86e4b5"}, - {file = "google_api_python_client-2.148.0.tar.gz", hash = "sha256:c362581853582a0fec0b8a9f03a4067b4bbbb12720e5492095d166f67bb40320"}, + {file = "google_api_python_client-2.149.0-py2.py3-none-any.whl", hash = "sha256:1a5232e9cfed8c201799d9327e4d44dc7ea7daa3c6e1627fca41aa201539c0da"}, + {file = "google_api_python_client-2.149.0.tar.gz", hash = "sha256:b9d68c6b14ec72580d66001bd33c5816b78e2134b93ccc5cf8f624516b561750"}, ] [package.dependencies] @@ -2404,51 +2438,58 @@ pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0 [[package]] name = "httptools" -version = "0.6.1" +version = "0.6.2" description = "A collection of framework independent HTTP protocol utils." optional = true python-versions = ">=3.8.0" files = [ - {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"}, - {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"}, - {file = "httptools-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58"}, - {file = "httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185"}, - {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142"}, - {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658"}, - {file = "httptools-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b"}, - {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"}, - {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"}, - {file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"}, - {file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"}, - {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"}, - {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"}, - {file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"}, - {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"}, - {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"}, - {file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"}, - {file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"}, - {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"}, - {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"}, - {file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"}, - {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3"}, - {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb"}, - {file = "httptools-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97"}, - {file = "httptools-0.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"}, - {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4"}, - {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf"}, - {file = "httptools-0.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084"}, - {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3"}, - {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e"}, - {file = "httptools-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d"}, - {file = "httptools-0.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da"}, - {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81"}, - {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a"}, - {file = "httptools-0.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e"}, - {file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"}, -] - -[package.extras] -test = ["Cython (>=0.29.24,<0.30.0)"] + {file = "httptools-0.6.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0238f07780782c018e9801d8f5f5aea3a4680a1af132034b444f677718c6fe88"}, + {file = "httptools-0.6.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:10d28e5597d4349390c640232c9366ddc15568114f56724fe30a53de9686b6ab"}, + {file = "httptools-0.6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ddaf99e362ae4169f6a8b3508f3487264e0a1b1e58c0b07b86407bc9ecee831"}, + {file = "httptools-0.6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc9d039b6b8a36b182bc60774bb5d456b8ff9ec44cf97719f2f38bb1dcdd546"}, + {file = "httptools-0.6.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b57cb8a4a8a8ffdaf0395326ef3b9c1aba36e58a421438fc04c002a1f511db63"}, + {file = "httptools-0.6.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b73cda1326738eab5d60640ca0b87ac4e4db09a099423c41b59a5681917e8d1d"}, + {file = "httptools-0.6.2-cp310-cp310-win_amd64.whl", hash = "sha256:352a496244360deb1c1d108391d76cd6f3dd9f53ccf975a082e74c6761af30c9"}, + {file = "httptools-0.6.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2e9d225b178a6cc700c23cf2f5daf85a10f93f1db7c34e9ee4ee0bbc29ad458a"}, + {file = "httptools-0.6.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49b14fcc9b12a52da8667587efa124a18e1a3eb63bbbcabf9882f4008d171d6"}, + {file = "httptools-0.6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d5c33d98b2311ddbe06e92b12b14de334dcfbe64ebcbb2c7a34b5c6036db512"}, + {file = "httptools-0.6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53cd2d776700bf0ed0e6fb203d716b041712ea4906479031cc5ac5421ecaa7d2"}, + {file = "httptools-0.6.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7da016a0dab1fcced89dfff8537033c5dc200015e14023368f3f4a69e39b8716"}, + {file = "httptools-0.6.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d6e0ba155a1b3159551ac6b4551eb20028617e2e4bb71f2c61efed0756e6825"}, + {file = "httptools-0.6.2-cp311-cp311-win_amd64.whl", hash = "sha256:ad44569b0f508e046ffe85b4a547d5b68d1548fd90767df69449cc28021ee709"}, + {file = "httptools-0.6.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c92d2b7c1a914ab2f66454961eeaf904f4fe7529b93ff537619d22c18b82d070"}, + {file = "httptools-0.6.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78f920a75c1dbcb5a48a495f384d73ceb41e437a966c318eb7e56f1c1ad1df3e"}, + {file = "httptools-0.6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56bcd9ba0adf16edb4e3e45b8b9346f5b3b2372402e953d54c84b345d0f691e0"}, + {file = "httptools-0.6.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e350a887adb38ac65c93c2f395b60cf482baca61fd396ed8d6fd313dbcce6fac"}, + {file = "httptools-0.6.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ddc328c2a2daf2cf4bdc7bbc8a458dc4c840637223d4b8e01bce2168cc79fd23"}, + {file = "httptools-0.6.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ddaf38943dbb32333a182c894b6092a68b56c5e36d0c54ba3761d28119b15447"}, + {file = "httptools-0.6.2-cp312-cp312-win_amd64.whl", hash = "sha256:052f7f50e4a38f069478143878371ed17937f268349bcd68f6f7a9de9fcfce21"}, + {file = "httptools-0.6.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:406f7dc5d9db68cd9ac638d14c74d077085f76b45f704d3ec38d43b842b3cb44"}, + {file = "httptools-0.6.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:77e22c33123ce11231ff2773d8905e20b45d77a69459def7481283b72a583955"}, + {file = "httptools-0.6.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41965586b02715c3d83dd9153001f654e5b621de0c5255f5ef0635485212d0c0"}, + {file = "httptools-0.6.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93b1839d54b80a06a51a31b90d024a1770e250d00de57e7ae069bafba932f398"}, + {file = "httptools-0.6.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8fdb4634040d1dbde7e0b373e19668cdb61c0ee8690d3b4064ac748d85365bca"}, + {file = "httptools-0.6.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c30902f9b9da0d74668b6f71d7b57081a4879d9a5ea93d5922dbe15b15b3b24a"}, + {file = "httptools-0.6.2-cp313-cp313-win_amd64.whl", hash = "sha256:cf61238811a75335751b4b17f8b221a35f93f2d57489296742adf98412d2a568"}, + {file = "httptools-0.6.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8d80878cb40ebf88a48839ff7206ceb62e4b54327e0c2f9f15ee12edbd8b907e"}, + {file = "httptools-0.6.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5141ccc9dbd8cdc59d1e93e318d405477a940dc6ebadcb8d9f8da17d2812d353"}, + {file = "httptools-0.6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bb67d47f045f56e9a5da4deccf710bdde21212e4b1f4776b7a542449f6a7682"}, + {file = "httptools-0.6.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76dcb8f5c866f1537ccbaad01ebb3611890d281ef8d25e050d1cc3d90fba6b3d"}, + {file = "httptools-0.6.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:1b7bc59362143dc2d02896dde94004ef54ff1989ceedf4b389ad3b530f312364"}, + {file = "httptools-0.6.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c7a5715b1f46e9852442f496c0df2f8c393cc8f293f5396d2c8d95cac852fb51"}, + {file = "httptools-0.6.2-cp38-cp38-win_amd64.whl", hash = "sha256:3f0246ca7f78fa8e3902ddb985b9f55509d417a862f4634a8fa63a7a496266c8"}, + {file = "httptools-0.6.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1099f73952e18c718ccaaf7a97ae58c94a91839c3d247c6184326f85a2eda7b4"}, + {file = "httptools-0.6.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3e45d004531330030f7d07abe4865bc17963b9989bc1941cebbf7224010fb82"}, + {file = "httptools-0.6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4f2fea370361a90cb9330610a95303587eda9d1e69930dbbee9978eac1d5946"}, + {file = "httptools-0.6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0481154c91725f7e7b729a535190388be6c7cbae3bbf0e793343ca386282312"}, + {file = "httptools-0.6.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d25f8fdbc6cc6561353c7a384d76295e6a85a4945115b8bc347855db150e8c77"}, + {file = "httptools-0.6.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:054bdee08e4f7c15c186f6e7dbc8f0cf974b8dd1832b5f17f988faf8b12815c9"}, + {file = "httptools-0.6.2-cp39-cp39-win_amd64.whl", hash = "sha256:4502620722b453c2c6306fad392c515dcb804dfa9c6d3b90d8926a07a7a01109"}, + {file = "httptools-0.6.2.tar.gz", hash = "sha256:ae694efefcb61317c79b2fa1caebc122060992408e389bb00889567e463a47f1"}, +] + +[package.extras] +test = ["Cython (>=0.29.24)"] [[package]] name = "httpx" @@ -2489,13 +2530,13 @@ files = [ [[package]] name = "huggingface-hub" -version = "0.25.1" +version = "0.25.2" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = true python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.25.1-py3-none-any.whl", hash = "sha256:a5158ded931b3188f54ea9028097312cb0acd50bffaaa2612014c3c526b44972"}, - {file = "huggingface_hub-0.25.1.tar.gz", hash = "sha256:9ff7cb327343211fbd06e2b149b8f362fd1e389454f3f14c6db75a4999ee20ff"}, + {file = "huggingface_hub-0.25.2-py3-none-any.whl", hash = "sha256:1897caf88ce7f97fe0110603d8f66ac264e3ba6accdf30cd66cc0fed5282ad25"}, + {file = "huggingface_hub-0.25.2.tar.gz", hash = "sha256:a1014ea111a5f40ccd23f7f7ba8ac46e20fa3b658ced1f86a00c75c06ec6423c"}, ] [package.dependencies] @@ -2576,13 +2617,13 @@ all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2 [[package]] name = "imageio" -version = "2.35.1" +version = "2.36.0" description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "imageio-2.35.1-py3-none-any.whl", hash = "sha256:6eb2e5244e7a16b85c10b5c2fe0f7bf961b40fcb9f1a9fd1bd1d2c2f8fb3cd65"}, - {file = "imageio-2.35.1.tar.gz", hash = "sha256:4952dfeef3c3947957f6d5dedb1f4ca31c6e509a476891062396834048aeed2a"}, + {file = "imageio-2.36.0-py3-none-any.whl", hash = "sha256:471f1eda55618ee44a3c9960911c35e647d9284c68f077e868df633398f137f0"}, + {file = "imageio-2.36.0.tar.gz", hash = "sha256:1c8f294db862c256e9562354d65aa54725b8dafed7f10f02bb3ec20ec1678850"}, ] [package.dependencies] @@ -2591,8 +2632,8 @@ numpy = "*" pillow = ">=8.3.2" [package.extras] -all-plugins = ["astropy", "av", "imageio-ffmpeg", "psutil", "tifffile"] -all-plugins-pypy = ["av", "imageio-ffmpeg", "psutil", "tifffile"] +all-plugins = ["astropy", "av", "imageio-ffmpeg", "numpy (>2)", "pillow-heif", "psutil", "rawpy", "tifffile"] +all-plugins-pypy = ["av", "imageio-ffmpeg", "pillow-heif", "psutil", "tifffile"] build = ["wheel"] dev = ["black", "flake8", "fsspec[github]", "pytest", "pytest-cov"] docs = ["numpydoc", "pydata-sphinx-theme", "sphinx (<6)"] @@ -2740,13 +2781,13 @@ test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "num [[package]] name = "isodate" -version = "0.7.0" +version = "0.7.2" description = "An ISO 8601 date/time/duration parser and formatter" optional = true -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "isodate-0.7.0-py3-none-any.whl", hash = "sha256:bc2c92e5b9526930bebb884fe5366ef8c4f437228b836a87a49af82d859fdb16"}, - {file = "isodate-0.7.0.tar.gz", hash = "sha256:c6332cf456314b85cc3b6ea2c45a6fa417cb1fddb361f6d2ed8f4f69e843c6d1"}, + {file = "isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15"}, + {file = "isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6"}, ] [[package]] @@ -3271,13 +3312,13 @@ files = [ [[package]] name = "litellm" -version = "1.48.19" +version = "1.49.4" description = "Library to easily interface with LLM API providers" optional = true python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" files = [ - {file = "litellm-1.48.19-py3-none-any.whl", hash = "sha256:bdd4ac069c552db8554aaf54b2e4584fb8bfc6115a72bfa8bd07a08faa83365e"}, - {file = "litellm-1.48.19.tar.gz", hash = "sha256:c0cc0df325f2846ecd983e2d66857f660581526fdc6a1df74b0055cbb08bd360"}, + {file = "litellm-1.49.4-py3-none-any.whl", hash = "sha256:3094a9f74979da993f4b3298372ec4416f7a3f82d11a0831c9c616098b3fb50a"}, + {file = "litellm-1.49.4.tar.gz", hash = "sha256:5f16d40bfa7747fcc21f45f340454c57cbc705178244fe7326abac7c0759e05e"}, ] [package.dependencies] @@ -3944,38 +3985,43 @@ dill = ">=0.3.9" [[package]] name = "mypy" -version = "1.11.2" +version = "1.12.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a"}, - {file = "mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef"}, - {file = "mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383"}, - {file = "mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8"}, - {file = "mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7"}, - {file = "mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385"}, - {file = "mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca"}, - {file = "mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104"}, - {file = "mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4"}, - {file = "mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6"}, - {file = "mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318"}, - {file = "mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36"}, - {file = "mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987"}, - {file = "mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca"}, - {file = "mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70"}, - {file = "mypy-1.11.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:37c7fa6121c1cdfcaac97ce3d3b5588e847aa79b580c1e922bb5d5d2902df19b"}, - {file = "mypy-1.11.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a8a53bc3ffbd161b5b2a4fff2f0f1e23a33b0168f1c0778ec70e1a3d66deb86"}, - {file = "mypy-1.11.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ff93107f01968ed834f4256bc1fc4475e2fecf6c661260066a985b52741ddce"}, - {file = "mypy-1.11.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:edb91dded4df17eae4537668b23f0ff6baf3707683734b6a818d5b9d0c0c31a1"}, - {file = "mypy-1.11.2-cp38-cp38-win_amd64.whl", hash = "sha256:ee23de8530d99b6db0573c4ef4bd8f39a2a6f9b60655bf7a1357e585a3486f2b"}, - {file = "mypy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:801ca29f43d5acce85f8e999b1e431fb479cb02d0e11deb7d2abb56bdaf24fd6"}, - {file = "mypy-1.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70"}, - {file = "mypy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7821776e5c4286b6a13138cc935e2e9b6fde05e081bdebf5cdb2bb97c9df81d"}, - {file = "mypy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539c570477a96a4e6fb718b8d5c3e0c0eba1f485df13f86d2970c91f0673148d"}, - {file = "mypy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f14cd3d386ac4d05c5a39a51b84387403dadbd936e17cb35882134d4f8f0d24"}, - {file = "mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12"}, - {file = "mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79"}, + {file = "mypy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4397081e620dc4dc18e2f124d5e1d2c288194c2c08df6bdb1db31c38cd1fe1ed"}, + {file = "mypy-1.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:684a9c508a283f324804fea3f0effeb7858eb03f85c4402a967d187f64562469"}, + {file = "mypy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cabe4cda2fa5eca7ac94854c6c37039324baaa428ecbf4de4567279e9810f9e"}, + {file = "mypy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:060a07b10e999ac9e7fa249ce2bdcfa9183ca2b70756f3bce9df7a92f78a3c0a"}, + {file = "mypy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:0eff042d7257f39ba4ca06641d110ca7d2ad98c9c1fb52200fe6b1c865d360ff"}, + {file = "mypy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b86de37a0da945f6d48cf110d5206c5ed514b1ca2614d7ad652d4bf099c7de7"}, + {file = "mypy-1.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20c7c5ce0c1be0b0aea628374e6cf68b420bcc772d85c3c974f675b88e3e6e57"}, + {file = "mypy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a64ee25f05fc2d3d8474985c58042b6759100a475f8237da1f4faf7fcd7e6309"}, + {file = "mypy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:faca7ab947c9f457a08dcb8d9a8664fd438080e002b0fa3e41b0535335edcf7f"}, + {file = "mypy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:5bc81701d52cc8767005fdd2a08c19980de9ec61a25dbd2a937dfb1338a826f9"}, + {file = "mypy-1.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8462655b6694feb1c99e433ea905d46c478041a8b8f0c33f1dab00ae881b2164"}, + {file = "mypy-1.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:923ea66d282d8af9e0f9c21ffc6653643abb95b658c3a8a32dca1eff09c06475"}, + {file = "mypy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ebf9e796521f99d61864ed89d1fb2926d9ab6a5fab421e457cd9c7e4dd65aa9"}, + {file = "mypy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e478601cc3e3fa9d6734d255a59c7a2e5c2934da4378f3dd1e3411ea8a248642"}, + {file = "mypy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:c72861b7139a4f738344faa0e150834467521a3fba42dc98264e5aa9507dd601"}, + {file = "mypy-1.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52b9e1492e47e1790360a43755fa04101a7ac72287b1a53ce817f35899ba0521"}, + {file = "mypy-1.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:48d3e37dd7d9403e38fa86c46191de72705166d40b8c9f91a3de77350daa0893"}, + {file = "mypy-1.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f106db5ccb60681b622ac768455743ee0e6a857724d648c9629a9bd2ac3f721"}, + {file = "mypy-1.12.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:233e11b3f73ee1f10efada2e6da0f555b2f3a5316e9d8a4a1224acc10e7181d3"}, + {file = "mypy-1.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:4ae8959c21abcf9d73aa6c74a313c45c0b5a188752bf37dace564e29f06e9c1b"}, + {file = "mypy-1.12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eafc1b7319b40ddabdc3db8d7d48e76cfc65bbeeafaa525a4e0fa6b76175467f"}, + {file = "mypy-1.12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9b9ce1ad8daeb049c0b55fdb753d7414260bad8952645367e70ac91aec90e07e"}, + {file = "mypy-1.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfe012b50e1491d439172c43ccb50db66d23fab714d500b57ed52526a1020bb7"}, + {file = "mypy-1.12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2c40658d4fa1ab27cb53d9e2f1066345596af2f8fe4827defc398a09c7c9519b"}, + {file = "mypy-1.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:dee78a8b9746c30c1e617ccb1307b351ded57f0de0d287ca6276378d770006c0"}, + {file = "mypy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b5df6c8a8224f6b86746bda716bbe4dbe0ce89fd67b1fa4661e11bfe38e8ec8"}, + {file = "mypy-1.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5feee5c74eb9749e91b77f60b30771563327329e29218d95bedbe1257e2fe4b0"}, + {file = "mypy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:77278e8c6ffe2abfba6db4125de55f1024de9a323be13d20e4f73b8ed3402bd1"}, + {file = "mypy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:dcfb754dea911039ac12434d1950d69a2f05acd4d56f7935ed402be09fad145e"}, + {file = "mypy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:06de0498798527451ffb60f68db0d368bd2bae2bbfb5237eae616d4330cc87aa"}, + {file = "mypy-1.12.0-py3-none-any.whl", hash = "sha256:fd313226af375d52e1e36c383f39bf3836e1f192801116b31b090dfcd3ec5266"}, + {file = "mypy-1.12.0.tar.gz", hash = "sha256:65a22d87e757ccd95cbbf6f7e181e6caa87128255eb2b6be901bb71b26d8a99d"}, ] [package.dependencies] @@ -4026,6 +4072,24 @@ rtd = ["ipython", "sphinx (>=7)", "sphinx-autodoc2 (>=0.5.0,<0.6.0)", "sphinx-bo testing = ["beautifulsoup4", "coverage[toml]", "defusedxml", "pytest (>=8,<9)", "pytest-cov", "pytest-param-files (>=0.6.0,<0.7.0)", "pytest-regressions", "sphinx-pytest"] testing-docutils = ["pygments", "pytest (>=8,<9)", "pytest-param-files (>=0.6.0,<0.7.0)"] +[[package]] +name = "nebula3-python" +version = "3.8.2" +description = "Python client for NebulaGraph v3" +optional = true +python-versions = ">=3.6.2" +files = [ + {file = "nebula3_python-3.8.2-py3-none-any.whl", hash = "sha256:8942ef87619f05115f643896408f8cbe602670405a3aeab01fdcc454eeabf0d7"}, + {file = "nebula3_python-3.8.2.tar.gz", hash = "sha256:889df21bac0f7ccad1d3a1807d9b736b2136770b24ed03d4fd49b76b3e2612ea"}, +] + +[package.dependencies] +future = ">=0.18.0" +httplib2 = ">=0.20.0" +httpx = {version = ">=0.22.0", extras = ["http2"]} +pytz = ">=2021.1" +six = ">=1.16.0" + [[package]] name = "neo4j" version = "5.25.0" @@ -4058,20 +4122,21 @@ files = [ [[package]] name = "networkx" -version = "3.3" +version = "3.4.1" description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.10" files = [ - {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, - {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, + {file = "networkx-3.4.1-py3-none-any.whl", hash = "sha256:e30a87b48c9a6a7cc220e732bffefaee585bdb166d13377734446ce1a0620eed"}, + {file = "networkx-3.4.1.tar.gz", hash = "sha256:f9df45e85b78f5bd010993e897b4f1fdb242c11e015b101bd951e5c0e29982d8"}, ] [package.extras] -default = ["matplotlib (>=3.6)", "numpy (>=1.23)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +default = ["matplotlib (>=3.7)", "numpy (>=1.24)", "pandas (>=2.0)", "scipy (>=1.10,!=1.11.0,!=1.11.1)"] developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] -doc = ["myst-nb (>=1.0)", "numpydoc (>=1.7)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] -extra = ["lxml (>=4.6)", "pydot (>=2.0)", "pygraphviz (>=1.12)", "sympy (>=1.10)"] +doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.15)", "sphinx (>=7.3)", "sphinx-gallery (>=0.16)", "texext (>=0.6.7)"] +example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "momepy (>=0.7.2)", "osmnx (>=1.9)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"] +extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"] test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] @@ -5183,19 +5248,19 @@ virtualenv = ">=20.10.0" [[package]] name = "primp" -version = "0.6.3" +version = "0.6.4" description = "HTTP client that can impersonate web browsers, mimicking their headers and `TLS/JA3/JA4/HTTP2` fingerprints" optional = true python-versions = ">=3.8" files = [ - {file = "primp-0.6.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bdbe6a7cdaaf5c9ed863432a941f4a75bd4c6ff626cbc8d32fc232793c70ba06"}, - {file = "primp-0.6.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:eeb53eb987bdcbcd85740633470255cab887d921df713ffa12a36a13366c9cdb"}, - {file = "primp-0.6.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78da53d3c92a8e3f05bd3286ac76c291f1b6fe5e08ea63b7ba92b0f9141800bb"}, - {file = "primp-0.6.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:86337b44deecdac752bd8112909987fc9fa9b894f30191c80a164dc8f895da53"}, - {file = "primp-0.6.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d3cd9a22b97f3eae42b2a5fb99f00480daf4cd6d9b139e05b0ffb03f7cc037f3"}, - {file = "primp-0.6.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7732bec917e2d3c48a31cdb92e1250f4ad6203a1aa4f802bd9abd84f2286a1e0"}, - {file = "primp-0.6.3-cp38-abi3-win_amd64.whl", hash = "sha256:1e4113c34b86c676ae321af185f03a372caef3ee009f1682c2d62e30ec87348c"}, - {file = "primp-0.6.3.tar.gz", hash = "sha256:17d30ebe26864defad5232dbbe1372e80483940012356e1f68846bb182282039"}, + {file = "primp-0.6.4-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e627330c1f2b723b523dc2e47caacbc5b5d0cd51ca11583b42fb8cde4da60d7d"}, + {file = "primp-0.6.4-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:e0cb7c05dd56c8b9741042fd568c0983fc19b0f3aa209a3940ecc04b4fd60314"}, + {file = "primp-0.6.4-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4adc200ccb39e130c478d8b1a94f43a5b359068c6cb65b7c848812f96d96992"}, + {file = "primp-0.6.4-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:0ebae2d3aa36b04028e4accf2609d31d2e6981659e8e2effb09ee8ba960192e1"}, + {file = "primp-0.6.4-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:77f5fa5b34eaf251815622258419a484a2a9179dcbae2a1e702a254d91f613f1"}, + {file = "primp-0.6.4-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:14cddf535cd2c4987412e90ca3ca35ae52cddbee6e0f0953d26b33a652a95692"}, + {file = "primp-0.6.4-cp38-abi3-win_amd64.whl", hash = "sha256:96177ec2dadc47eaecbf0b22d2e93aeaf964a1be9a71e6e318d2ffb9e4242743"}, + {file = "primp-0.6.4.tar.gz", hash = "sha256:0a3de63e46a50664bcdc76e7aaf7060bf8443698efa902864669c5fca0d1abdd"}, ] [package.extras] @@ -5918,13 +5983,13 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pymilvus" -version = "2.4.7" +version = "2.4.8" description = "Python Sdk for Milvus" optional = true python-versions = ">=3.8" files = [ - {file = "pymilvus-2.4.7-py3-none-any.whl", hash = "sha256:1e5d377bd40fa7eb459d3958dbd96201758f5cf997d41eb3d2d169d0b7fa462e"}, - {file = "pymilvus-2.4.7.tar.gz", hash = "sha256:9ef460b940782a42e1b7b8ae0da03d8cc02d9d80044d13f4b689a7c935ec7aa7"}, + {file = "pymilvus-2.4.8-py3-none-any.whl", hash = "sha256:5824f8ef4ecb14cfd4b205bf976aa52576c3a83c3cd848d21c8f5f9bb99b29e1"}, + {file = "pymilvus-2.4.8.tar.gz", hash = "sha256:0ddd18a060635fc8f1d1ab5635d9cc340ef29a97783b73db186df6334fa31ee2"}, ] [package.dependencies] @@ -6084,13 +6149,13 @@ files = [ [[package]] name = "pyparsing" -version = "3.1.4" +version = "3.2.0" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = true -python-versions = ">=3.6.8" +python-versions = ">=3.9" files = [ - {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, - {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, + {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, + {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, ] [package.extras] @@ -6244,128 +6309,128 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments [[package]] name = "python-bidi" -version = "0.6.0" +version = "0.6.1" description = "Python Bidi layout wrapping the Rust crate unicode-bidi" optional = true python-versions = "*" files = [ - {file = "python_bidi-0.6.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:032b16f70c5d4f48c8dc5a4ade071826a0fb64172e0435d49deba6ea66fc5d42"}, - {file = "python_bidi-0.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:53b50f6ad3e633dcc74fc96bb959bf375a84db36db380d76f9c189ce33099ede"}, - {file = "python_bidi-0.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d2928ae4aedff4f49ac2e334d176b9488762276bae8b32045c3b91f41c447e4"}, - {file = "python_bidi-0.6.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f3e5ef9093699300868f9c92975e4d3472131e9da1125501b1950faa0eec62a"}, - {file = "python_bidi-0.6.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0eb05fc7115f296e09e06d47648b032a2dff4322b363b8b7f88d4695be452951"}, - {file = "python_bidi-0.6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6fdf72111aed1e30bb89989f55e167411d5fb7a94ee412a3116b9a9b257516f4"}, - {file = "python_bidi-0.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9daa84f8f8138521a5971d38c92d918bdb0a899268d83d9daa5eba7dce641ce"}, - {file = "python_bidi-0.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2e5bafacba56696712ea2284c27f8a3d3b4ee94684b7dcd06af8775cf650dea"}, - {file = "python_bidi-0.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7214a175dd09a4da5f755dbf19d767261d2087686dfff321b4a3967d09096081"}, - {file = "python_bidi-0.6.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:9f6fe4d9b86c123a960c7506ffb31ebba0c7c465a364b344f96858679bf54401"}, - {file = "python_bidi-0.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ddf12de3ce92bbfcc3f0cdcc4591f9dbbdf3f83388da22646dbf0ba56d66844d"}, - {file = "python_bidi-0.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:550565296af0e3e938cedc87c78a6ba02e38dab7c4bb2fbbf3717f2412e2a6e1"}, - {file = "python_bidi-0.6.0-cp310-none-win32.whl", hash = "sha256:b6958bc4a27e2854c1e9a3d6a2dac0cfd09451834c64f96738c3365d8a053358"}, - {file = "python_bidi-0.6.0-cp310-none-win_amd64.whl", hash = "sha256:712d666331e813f498ad6f16e23b6c9795f21e7a231b7047f32f2843e303ec92"}, - {file = "python_bidi-0.6.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b3984f4d91b75f19c1e1c2e5a52f4263f4c4a11de2c1f5bfb7b8fceb7960d8d8"}, - {file = "python_bidi-0.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:603b4485b7dc588bc58f80f1271f103b859a45b19024b90686c639a451e50b0a"}, - {file = "python_bidi-0.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d4f2a41ba306fd2827a1e5f153e856f5e79176abf4f0ae41def5255113548cc"}, - {file = "python_bidi-0.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb50d50809508f0f9907973e8c99fd663d7d3b2bb124218c7f9d9abe374527c5"}, - {file = "python_bidi-0.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd5d2c89acc022cfd3b2d87b09f3ac8503beb6ca45af2ee31df9bd0fbbbe85ce"}, - {file = "python_bidi-0.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08c7ebd084312706868df172fb46f635ee437344181c0c55302f0da221f3bf75"}, - {file = "python_bidi-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f8689da1893a5a70e5bb6b47fff4571b8ab6a3653b8f9e3d3555ddaaabb607f"}, - {file = "python_bidi-0.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7cac60293dddbe6307bfb15f8a227f614afa882999ff669b5af795dca7db97dc"}, - {file = "python_bidi-0.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4019165cb8e9e73bebec839156ff25e02b499da5f3e849e44c5c76fd487be967"}, - {file = "python_bidi-0.6.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6684e0f1cb2d769281b6b8bbb51c69a700b63b18a6cb6088d3f34a9eb544620a"}, - {file = "python_bidi-0.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7203782c888fcffc0e20e1e6b2d8bfe947ce356796a6709c09c1d751943b6ed7"}, - {file = "python_bidi-0.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f7d98736704548a001fb072becdfbda9d67dde8fd993320494c2370243c92f87"}, - {file = "python_bidi-0.6.0-cp311-none-win32.whl", hash = "sha256:205d885944f929e93283b88a45fe57ae0102c39ba0576ab856f9e5dd50d7a049"}, - {file = "python_bidi-0.6.0-cp311-none-win_amd64.whl", hash = "sha256:b7847f882442179fd67608958c1ce8af9ee4b051a921342c7a3bc071e2ba0fc4"}, - {file = "python_bidi-0.6.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:694373c087f2d5067289832070a21e84fc648ac087163723ccd0759dac3a7161"}, - {file = "python_bidi-0.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd2ae8876412974b8959520688a271c1b3dbb65ef57306e3bf745115147d05b8"}, - {file = "python_bidi-0.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d748eccc2c40ce5b56bde1b7eef72f7b6037e289fb34a38335cd05e3b5f7cd6"}, - {file = "python_bidi-0.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:22b6866cf18e2e8189cdbc5ede22b843c15c8aaef5eb8438fb02f8197fb29bf9"}, - {file = "python_bidi-0.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e056f602e634b8cd3c8c5497f52d43674f5de088df4f1a8d73e99cd97735fb3f"}, - {file = "python_bidi-0.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3adf383d7e1bc50c8357f78ec3591c483066f9b7744a0c2c89d1ef501c75f693"}, - {file = "python_bidi-0.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db9981b2d05ef108a540424dabfa157dff20ec4adb909e5a6d2938cac6cf3987"}, - {file = "python_bidi-0.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7dcf1d8834e1db2f4d3372c607fe2a12acbeeb4a9aba1bf0014cc37474ef08d1"}, - {file = "python_bidi-0.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:58b9628fa1d15b30686fb6196cc2b3d6c1546bfe7e5fbdd9b758d69a76411cd4"}, - {file = "python_bidi-0.6.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7fa5babd7d89a541d6507bddd4839271db1504a54f46a5ee64c959dde41c0596"}, - {file = "python_bidi-0.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0b5c33ad97ad7bb2fa335a0ce63d0a887e99dbc86ce2684f7622c0fb1b25873e"}, - {file = "python_bidi-0.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:48034cc54c792dfeeb017505293600bc4ece89fca1fc28d6fb24f932d7ef1bcf"}, - {file = "python_bidi-0.6.0-cp312-none-win32.whl", hash = "sha256:8483de08f3b41063f1819a397aa6686ae88ac908192e448b72e4bf7caa91a655"}, - {file = "python_bidi-0.6.0-cp312-none-win_amd64.whl", hash = "sha256:a82ee4b48e9b192d4ff3873f2fd063efae063b904b6283119b8cef7165a54084"}, - {file = "python_bidi-0.6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e080e4bf367c3761fc9a430a6a0375dcb10a541721a6b688142a9bbee883e576"}, - {file = "python_bidi-0.6.0-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1002a9b65deae763b236d7d4ea6f046acdb778c85932053ce0d4607f691a1a93"}, - {file = "python_bidi-0.6.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9418a69c7189907cd27ebe783708572dff979be77e1a7d2b646ff0a456f4f59b"}, - {file = "python_bidi-0.6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61c05401d8ff120221b53938e7576a330fde22b22e22bf9243e8fffa225cd35f"}, - {file = "python_bidi-0.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5e8382835ae85a4bacd188e563fcd5c90d73be7406f7e4ee1148f7a3fa61ff1"}, - {file = "python_bidi-0.6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19d07a95ebab603849a639d649a07474dc54485ad822aa045309a12ec0f7d388"}, - {file = "python_bidi-0.6.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:e8695ad198e816b42df61ea2a315f7d84189f69a3aa608c0fa71bb5d9105790e"}, - {file = "python_bidi-0.6.0-cp37-cp37m-musllinux_1_2_armv7l.whl", hash = "sha256:13956919a2bcf0d5f240d66acd99256996abec10ae235d328d93433480dac62a"}, - {file = "python_bidi-0.6.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:88ee27d0ce129b51e0aedcf88a7961e300f0e3b5d0e707ca813e2af33b46e8a1"}, - {file = "python_bidi-0.6.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:50ec1353643a03c8c324968e1216624e0bba57b77af465675932ce6cc5505015"}, - {file = "python_bidi-0.6.0-cp37-none-win32.whl", hash = "sha256:9ec06a91c64fb6832351dc8ab1dc9f970b505e09ccb83b8ff2c91bd04ce31417"}, - {file = "python_bidi-0.6.0-cp37-none-win_amd64.whl", hash = "sha256:4425879da7b1ca6257759ace9277506d9d6cf0fc13820bfa1e779931a6bb9795"}, - {file = "python_bidi-0.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5985ed1f85b8a2853c73976d259e3095122559646956c5bf8f1c6c4eb2bd7ebd"}, - {file = "python_bidi-0.6.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:afb77402c6d79daa1715a8a5d6d0eff13387e0db1a34c0f91a09b40ca6a60972"}, - {file = "python_bidi-0.6.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c6d339b94efde502286a8f80f130db6014762c8218e6f3af23bfe446217b10e"}, - {file = "python_bidi-0.6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afec9e08733d6754ef309eef617ba324eacf4bdf0081c3ec34758cbfb964e889"}, - {file = "python_bidi-0.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2901c29525e8c6071781bd796658f7934143fe6bcfb4f998a11cc80372f756fc"}, - {file = "python_bidi-0.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c71bb7e5fbd67fd64dc7b07c0a69a1b1daffdae0839d543e6e48dbfa82509208"}, - {file = "python_bidi-0.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:782b166b22cdd1738dc557acf7311a1d85565b9f58c48eb4004e4f770854c9d2"}, - {file = "python_bidi-0.6.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:1000815b42e9eba8d4e28e8d6f9558f055d54b9ec746875117d8b8150c86511c"}, - {file = "python_bidi-0.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:dfae0ea2444833acab3f7c62fd38b965f7332617993ef09098672ca9279bb27d"}, - {file = "python_bidi-0.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:65fcf6afe02d64b3ec9a6b97513fad50b858f88b83f785e4c0416a9acac5bc63"}, - {file = "python_bidi-0.6.0-cp38-none-win32.whl", hash = "sha256:0fc9ad821600a0bd4c9bd6327f5cac3c1494f0d291173bf41e655f2ec80f1cee"}, - {file = "python_bidi-0.6.0-cp38-none-win_amd64.whl", hash = "sha256:09cd618b42b6e042140c3c15792942c4a2fd259ed68cd68f224dfe00ff312f1d"}, - {file = "python_bidi-0.6.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:332506db671bc2ba8ae2591ba48c617a25dd2924a0ae185bc970f9f4e386a55f"}, - {file = "python_bidi-0.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c066bffffcb66e13fff3e4cc4a9570d744f4b48e54caa0308faf98a0a8dc4570"}, - {file = "python_bidi-0.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36fe41cc095045b23bfddc5c48a6aef1674dc32b1d1a52ece3b302a5fb28f33a"}, - {file = "python_bidi-0.6.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:018747edf332240e6400335a10d34c66d7d27e096d05ea0761afb61dc4e750b0"}, - {file = "python_bidi-0.6.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6aae20bb48ff0ccc4bd3ede085bfb781918c938f2cc09867c879d23252d18775"}, - {file = "python_bidi-0.6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:600236fbce5e43348c71de7327dd88f1484358cdad04ee742752a289569f1d82"}, - {file = "python_bidi-0.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9dc0ac10d7728b17ce9ac22d09918bd6f8b64e9b92a5199cb9a9cf29016dd41"}, - {file = "python_bidi-0.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6cbccc3484f6c30a682960fdde2ede944d9bc6b9ed8b8ead683e97af066ebe07"}, - {file = "python_bidi-0.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:de1b836e0d8134b8331423a5c76c886b5c25eed8d6f9e5dcac7767feba3d052c"}, - {file = "python_bidi-0.6.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:cfb45fecb08bb070dc0e62e6ee8249bbb6b6622181756fae2cff60c8eb5850e9"}, - {file = "python_bidi-0.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fb6b3545296ff4c1a6cef465359f6ed9b32cfc4bd3d8a6633f0234476414e387"}, - {file = "python_bidi-0.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e511838eeff5b76f053afe0b936920e5aca91ea597c43caa196e0c6b5cd0d623"}, - {file = "python_bidi-0.6.0-cp39-none-win32.whl", hash = "sha256:de171a2e7671dc5d19f957054e9f8fba997a98caebfcd3d386c4189d23e0d73f"}, - {file = "python_bidi-0.6.0-cp39-none-win_amd64.whl", hash = "sha256:75243e17201831d8f626be57a1ba52fe4f62594eb8bc777e2a81785a93745466"}, - {file = "python_bidi-0.6.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a75ca41875c8829295931eb2f0f380da50c1448d64e3c28c3db4966afdfbc53f"}, - {file = "python_bidi-0.6.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4700f71dc553cb65dc8b132de1ee542ae6c518fa8e942b5e0d3ba07bca054a42"}, - {file = "python_bidi-0.6.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13b7a10fa19b949132581dfd621ca800030cf21dc06a13366371a6e71309c6f6"}, - {file = "python_bidi-0.6.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef186911e27c968be69cdbaccaa378f0fa129b224a2854ec491963632ea37ff1"}, - {file = "python_bidi-0.6.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1af301fe73f76c46e3ddd21b0a3c4467b01e0c3a94f69cd185a78db6810300e8"}, - {file = "python_bidi-0.6.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bf6e718dbbf15f4fb24fd199ebe089c8a28ed712aedc7757d7730741e28cff27"}, - {file = "python_bidi-0.6.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:30214494b84c49247624c162d9141e7fc8dbc3957d21959feb92703cb87b474d"}, - {file = "python_bidi-0.6.0-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:5753d3204d13189a12a298c82c8c23eba94c252ee9aab3dddb7014b0cd4f37b1"}, - {file = "python_bidi-0.6.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:959fcb0554ca4136044bbb308654aa88c3ffa9031a6c6b074b29221dbb6d553f"}, - {file = "python_bidi-0.6.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6ca12af1e09355d6296730bd44adf5023a8b696ce77a9a04f35f56b10cd60428"}, - {file = "python_bidi-0.6.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f13deaa892d5dbc742b4ca4f96e9f6255d5f33b4bbfb04c4c77afc4c1b36378a"}, - {file = "python_bidi-0.6.0-pp37-pypy37_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:96b47ad6492fc3f17a8f9335ae76bafec6ae4769138da34c58f493618f653e78"}, - {file = "python_bidi-0.6.0-pp37-pypy37_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56cb6986f7fe97a425c6914d465f7098223263a498a3e48c49dbffc9ebe46ee3"}, - {file = "python_bidi-0.6.0-pp37-pypy37_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b90235b0c665483821fd5ab4a0d4db59025f12769dbd4fa1e2d6b0616e1178d3"}, - {file = "python_bidi-0.6.0-pp37-pypy37_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:9ca5506abe6b3a03f139703deec86852e88c13ad32d6b66109b5630539f9f386"}, - {file = "python_bidi-0.6.0-pp37-pypy37_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:5f6f04dbd30a667a3dd61356ca9e97d33cbdd8fbbe953c5ad3ab86b6901c73e7"}, - {file = "python_bidi-0.6.0-pp37-pypy37_pp73-musllinux_1_2_i686.whl", hash = "sha256:d63cf8bd056c4ec14ff9d8ee7181543cd758c1f4ce0eea0710fa854e1fede644"}, - {file = "python_bidi-0.6.0-pp37-pypy37_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17a9db493051792e71a813dd09a4c555e475cd874bf7594429be9c0cf16e270f"}, - {file = "python_bidi-0.6.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:618a70c0183372e23756766db135930507093e95f386c429187f9ae29c4d965f"}, - {file = "python_bidi-0.6.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4b880e8e75bea3136c5a44960365665d32abdee204024fd77e9a9975809c72ae"}, - {file = "python_bidi-0.6.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f20e5592534f3b06b2beb0a38f1df8ce1fb2c8f628573381637ca53083dd4648"}, - {file = "python_bidi-0.6.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16c8a3284bf874b6c38f8cb10f0f48fd1d7c198cf0a4937d39e73e460096c652"}, - {file = "python_bidi-0.6.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e079ac4ece790fcc4f1a4fcd0b4bfaa290482f2f04bd69936a93aff6a0ce9719"}, - {file = "python_bidi-0.6.0-pp38-pypy38_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:f48486bc16d37361cd21b32a27b2109cb45372cf8e1b4cc59809f2ae4634ad22"}, - {file = "python_bidi-0.6.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:895fe7e1d67acff2d313184148a1414b50fbbf2148df272a5e9a84f8196f2d3e"}, - {file = "python_bidi-0.6.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:18c2d0bffafa590629a5e95ee079c491954ee2249350d62db4497164f7d3f4cf"}, - {file = "python_bidi-0.6.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3dbde6d205610653d17cc5bb785c5d5da5af6ae634e5daf92a7a6e75a50f94a"}, - {file = "python_bidi-0.6.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:132954f67e3af38ca7c7cd85bde6a49c89bd470ba01603acbd0baf8048acbab5"}, - {file = "python_bidi-0.6.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2c8c79faafbc5852db896f8d488090530cb1421765528305a6678694a1961f0"}, - {file = "python_bidi-0.6.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5c0191270c2438953329af2116fdee021c20da3a33f418303f1bf9859984eb"}, - {file = "python_bidi-0.6.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c652bab5b2d978f9abf324e9c1de50cb175599402b5ec14b7553780f68af597d"}, - {file = "python_bidi-0.6.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:657ac6ddf02d40de633d616d8d052e616169787d535902e3a4240738ab902a0c"}, - {file = "python_bidi-0.6.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:8096c8a8d7498750cf54a55de44eb689a236ae8d3b47b642e25e55cfbcff6e4e"}, - {file = "python_bidi-0.6.0-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:0458e2f2d24c115f5f103aa54d9fe8b98c5197b85b616b0db68aaba32908c28c"}, - {file = "python_bidi-0.6.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:ce855e6be84e0b6e00286c62e2dd1ccb505beaeb78f969e270aec5998e53e4fb"}, - {file = "python_bidi-0.6.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:bb3c0dfc5131e706d46df50547ce51ff92722431b6d8d81142ea208374550b3e"}, - {file = "python_bidi-0.6.0.tar.gz", hash = "sha256:0665a0826074a9ff8d29640c0c405a2710b671db14fcc8b1c3ee6615ff10b837"}, + {file = "python_bidi-0.6.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e4d5f46b52a6057540a1d09cc2efcc5ddc99319f4fd9ea1de0007878e08e1f3c"}, + {file = "python_bidi-0.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ca2c05e5a041ff8698e638b196fd1d7629f47e55a5412657abdf5cb09e72b79"}, + {file = "python_bidi-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ea67606546af9eb40c6cfe5d1551fc1a9c96d7f82125c90a776d253fde8d64"}, + {file = "python_bidi-0.6.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f1702455861f5304e73d72bda9a08d5175815780f0cac83743f237610100946"}, + {file = "python_bidi-0.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43bc35c668ec003309e3831c3ae5577e7b0ca564701ddd647b8112c3d38f8dee"}, + {file = "python_bidi-0.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d72cbdf452504e5c18582843859e9a27aa710009db87f56052fcf39a19a7aa9"}, + {file = "python_bidi-0.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a429c12570a7f4ca016a708bb3aa94962ef583863227779caee60b55a68b435"}, + {file = "python_bidi-0.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:24ce7ace8eb7af96b60aaad9bd48283a40d9f13b7b0f3fac48a4d5e4eacbc207"}, + {file = "python_bidi-0.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c4e31fb4fe01bcf4b91bf78695d65c858c684551cf5fb2d107a4625da32be445"}, + {file = "python_bidi-0.6.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:21dc7da0f89876d23c0ef99aebba061059357e0c13fe0281afa9234ab97d2515"}, + {file = "python_bidi-0.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4b2f143f651c010b57f0ccec0c3faa4b794a9ae1afefea5f5e12d7c20132355c"}, + {file = "python_bidi-0.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:531ce6a560e4142a919389e5bbb36b3aeb2923845c71fcde1514ba9f58ca4ab6"}, + {file = "python_bidi-0.6.1-cp310-none-win32.whl", hash = "sha256:449d8b7fd54faa7fbcf56e02273620bc08a8ed8c099883eaa68b0f109845b853"}, + {file = "python_bidi-0.6.1-cp310-none-win_amd64.whl", hash = "sha256:6295a2f0102782353cc657bf57c8254205c5d292c167cfb06315548263c4bd6c"}, + {file = "python_bidi-0.6.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:dce1c4edf396d7b93f8b9718d129675a5aa1bb617245ad4d9c99dd567037cdf1"}, + {file = "python_bidi-0.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0c6437aec52c0a953fd476c82f8ec511b0c611d15ccbe44fccd628887a6adb7a"}, + {file = "python_bidi-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bd97cc94216d3edf5a6f6b6fbe3d49741faa7fbd18395490eda96f0fe27d543"}, + {file = "python_bidi-0.6.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4677aa514898df2031404f3ba77a003f114f8adf4683f46229862317d0962156"}, + {file = "python_bidi-0.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e86bf0a1d92e3e63ba6bbc0a9b8b4e402a87297efc0aa780e68e0a3fa16d2394"}, + {file = "python_bidi-0.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7373a284ef3fd86b1a7a5869a20d138f5ffef011d64f5d0affdaec412e528bb7"}, + {file = "python_bidi-0.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86c5a89577c46ba754cbc61ce5e061828bbb680f884a416bc2dbc8dee9958146"}, + {file = "python_bidi-0.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dae26c1d02124d7ee6fd3e46cf2af4c7d453ddb63324fa445802ad90f867337"}, + {file = "python_bidi-0.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3978e8218a683c9994764e379921536b3f02c9a42b9734542108bd8a90c1d454"}, + {file = "python_bidi-0.6.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:91b54175bd63f3914f4ef91e434416e2ad214cb278bb2c52c386b5e211dcdf72"}, + {file = "python_bidi-0.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2372c47e112614b0936380020c9b07201bc42d20a14eae82bd2b5df2820c1c1a"}, + {file = "python_bidi-0.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3d999ab2f3b884e0e0252fc34d5bb618439ec7852bc68ae1a7cc4bcb7a173079"}, + {file = "python_bidi-0.6.1-cp311-none-win32.whl", hash = "sha256:79f002b542020b59a0797fe18a3a810a81c36f97a449e44b86d666f4adca206d"}, + {file = "python_bidi-0.6.1-cp311-none-win_amd64.whl", hash = "sha256:20ca913be99845c36f1d0a7ffe5278720d29aee432b6a55a17aecafb82aefb42"}, + {file = "python_bidi-0.6.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c039d49cee2ef509290c1e1afdbf1b6158e74f74100afc3127f1e089d8175121"}, + {file = "python_bidi-0.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf2deb32d6295d18b320e74a37eb08f24512f154eccb8f8015d2914d577f6f18"}, + {file = "python_bidi-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6b986a80cc95ccb0826aaddbb8c386d0f7f6a32c92690592188d4c814bc2c00"}, + {file = "python_bidi-0.6.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:16e39952287e2644605bb5f40fd327199e449171863af63b674ef4b91a81530b"}, + {file = "python_bidi-0.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:859ab2a628d483b8db3273802fca128414abff6ace98780984436baada9ae297"}, + {file = "python_bidi-0.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5893348452498797cd3dc0f966c0524ddb187b2702e662984de7e242c266c023"}, + {file = "python_bidi-0.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f306c17f41d7b90cb738c115c6f5c153604672811b195da9b1415c291f732bf0"}, + {file = "python_bidi-0.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05fedcd7d8b1c3997b2a3a8e6786947481fc60a423b5a93e673b9f37920bf8ba"}, + {file = "python_bidi-0.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:57cdf7d407aca3f293fbd0ac744207bdf277928828bd312ac52976986b04d90f"}, + {file = "python_bidi-0.6.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b779e802542768cd89ed934313dd9fa428b931028532b0ba794c6d12765679ab"}, + {file = "python_bidi-0.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b7639a03e2bdb80f5bd7e8ee3d81e794d5cc32a4070a8a64c29020fa97591d30"}, + {file = "python_bidi-0.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2a6291f66d79636815e6360a9de6ef6fc924c05e38fac0343bd3d4cc04d87833"}, + {file = "python_bidi-0.6.1-cp312-none-win32.whl", hash = "sha256:0f46cb78804dd3b04e6da1c9806dc5736565a65fcfed907b2ca158e9b2f0904f"}, + {file = "python_bidi-0.6.1-cp312-none-win_amd64.whl", hash = "sha256:9f72887a61f87dc284b729b8f825687e81c1b01179e1b8d1c9c11897c58323fc"}, + {file = "python_bidi-0.6.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c2209dae25b0d34b53062534a30018e712664ff8841a86516af928355373a78"}, + {file = "python_bidi-0.6.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2a7da8a53296272d39575262b61c813c4397a2f159d21dc8f2145beb78054bee"}, + {file = "python_bidi-0.6.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49565ba1c151fe34be4707c9afe48c25c7651e8f1a8aa59275c0ba966d12afc3"}, + {file = "python_bidi-0.6.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721875c76e8f314a9f90c6d91a50042d64622274457b7f117a3710a4a88219d3"}, + {file = "python_bidi-0.6.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7be39d50f5b2a7c522a7c7ed282f7518cfa163c321cf097e37d91e52138638ae"}, + {file = "python_bidi-0.6.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:357150587cbe5bfb799b690b6d056457d899fa5e3e0389d850a86533598730cc"}, + {file = "python_bidi-0.6.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:eff6d500a4afdd141b3792596a26af5f23b25e9bb5782cda22b6dbd5f173c539"}, + {file = "python_bidi-0.6.1-cp37-cp37m-musllinux_1_2_armv7l.whl", hash = "sha256:e83ce823494fbcaa62521b07590e2df5ab896674b18ee6d2e00cd4a642ee1868"}, + {file = "python_bidi-0.6.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:af335a47ba80df69c4b4c860d0cb2e6b7519a9435d1ddf2ff5d07c12c2457d72"}, + {file = "python_bidi-0.6.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:10b0ee6db22ea9c0208143e68bed3fc044737c674dbdf04d660dad49fc6a9d1f"}, + {file = "python_bidi-0.6.1-cp37-none-win32.whl", hash = "sha256:0c6d806955ba5dbdb25390e0a902a4b230ec061dc46202aaaa90ab00a09246dd"}, + {file = "python_bidi-0.6.1-cp37-none-win_amd64.whl", hash = "sha256:41eed1e3037a44a3de7535307afa4c476a804de97a53f3bba492ad303277054f"}, + {file = "python_bidi-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71f15e1023a47fd151f95d323724f6af035738e61eb454f11844a533473e6de1"}, + {file = "python_bidi-0.6.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:10ff6884eceba3a7592160e0677371bc77c25f1d3bf7e205466d8fe9601b13e9"}, + {file = "python_bidi-0.6.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:67c18c82b95fcbab3d4ce340dfcacc6bdb700a67c46e5d378d5ad5fbc7c8e480"}, + {file = "python_bidi-0.6.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ca23a0b2dda59665170ae7152ba090eea77da39f984b3cd8f79b4039563e946"}, + {file = "python_bidi-0.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:290786e0bca55a65e460eb573ab7430033b731ae07e80f39acfa500342a482c3"}, + {file = "python_bidi-0.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9765498ff033615a5655620ade87ab9fb7936938f9d5bbc967bffa4eea76b6f4"}, + {file = "python_bidi-0.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:07ebf09fb3712027dfb3e052f71978ded8475fdaaa8ee08cc333c372b366acda"}, + {file = "python_bidi-0.6.1-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:1445b9f509f0d48ac09c94ee26c9ce4f94257220fe7cb0710d37b54574c43af1"}, + {file = "python_bidi-0.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:e31e418ebbf8b4c9a59af13ae43cb23304b7da4e75555a8d68525d8f4183e022"}, + {file = "python_bidi-0.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:85d985e38e11b353d37f8be4a0a0b87d8e6bac1db16ced87ca7940c3323ec10b"}, + {file = "python_bidi-0.6.1-cp38-none-win32.whl", hash = "sha256:32f82666e2468104011257722cebcf153236638706f030ebbd738cbe74cde07d"}, + {file = "python_bidi-0.6.1-cp38-none-win_amd64.whl", hash = "sha256:34bb781fb3f2d7102c0a0a3748503f5af2583575ad104ab8987f416d98302fb9"}, + {file = "python_bidi-0.6.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cc794ca257335c56d161b585427ce07122e79f78671ad1ed57ceb7b4d0d1460b"}, + {file = "python_bidi-0.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4a5029f8a2b1eb61aee34ba3c971767105929ef1af0723ba07a866479a861ee6"}, + {file = "python_bidi-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9f101fe2d14f95beef4d0700073e1026e401228bd8af69acb1744e556915a7d"}, + {file = "python_bidi-0.6.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:83a01910edf6a83f025e57cd3d8e05f4933c939c17283be4c8acecd968836a04"}, + {file = "python_bidi-0.6.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf84d89893c0a1cb286a120f1a9de7ee3093b174bdb2be6b3c90f9f241677e0e"}, + {file = "python_bidi-0.6.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:52fb816fb80150a20ea64967f33ec89f509a229b9a880eb097f01d92da616e91"}, + {file = "python_bidi-0.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d56b82fce448b047d7186942e8ce604ab727e8b9e47bdb6af4122aa7ac852c6"}, + {file = "python_bidi-0.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:63c7e61cb7446ad2c8ab679a6ad03037d7f2ec5ce2ba334a1651d66adf47cf3b"}, + {file = "python_bidi-0.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:98c3eb1b1d15140ea52f69194403f08ac76b057fb42a50cb74bd3b2cce155730"}, + {file = "python_bidi-0.6.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:c89b2f708018955ea52cc36c6d65923a0ddd56db2f9ec2672c8a2ddbacc9a3f5"}, + {file = "python_bidi-0.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e420621ad4f57809e3f3817a609ce5f80538f1f75cf9cd6579fbb9bcf590352d"}, + {file = "python_bidi-0.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:121775718e39fd884d5399e46a94375a594f641abe3ab2f1f4857cd0dbc23325"}, + {file = "python_bidi-0.6.1-cp39-none-win32.whl", hash = "sha256:cca50435936c229eb2bd00ff0adb53feaacfe840ed3735d72ebc72702418c32c"}, + {file = "python_bidi-0.6.1-cp39-none-win_amd64.whl", hash = "sha256:0e82b650ffdf30d8a4a809affb96bdf4a7dabe3b9f2c68b2e19616d4f54955db"}, + {file = "python_bidi-0.6.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee41b97746846b53565fbd7606eebac73658ef5a28b5f900ce91c85a5b407e13"}, + {file = "python_bidi-0.6.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b751f4a05657acaca2008afeb11586e088e55a310718d31c20d0e63c4c7b6a22"}, + {file = "python_bidi-0.6.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ce2a05082269b7ff0bf231b29ec7ecb68b096e30d758eb9c969c3cec9e7168f"}, + {file = "python_bidi-0.6.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de7bbb1997c7e6dedf5285482ee8b4d26917b73e0a4f0b1899e16043fac5900f"}, + {file = "python_bidi-0.6.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:076dab730e851820621f296174c0150f0b58f4b41a187c498cf1c9f84c6956a5"}, + {file = "python_bidi-0.6.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:01991cc5a538a4d3a58185dc0a9f01acd8e443b17ca9c78688de982aa46aa4fb"}, + {file = "python_bidi-0.6.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:7ed862af0c9f05ea6df6c480eb207bba5d380fab9ecc3ca7c9741b59d5481000"}, + {file = "python_bidi-0.6.1-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:2687cf56b00fe86a7f8e96d24c8045bf8fb247950fb4d84605655776c2dbb5c9"}, + {file = "python_bidi-0.6.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:4b176c726e74e089bea131e6542f151452d35d7d265590f64a2eb738c1a41795"}, + {file = "python_bidi-0.6.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:b723da2743e73a866f7a14172edd9577bced2e3fba6286b1e5f54a7e1c404b8f"}, + {file = "python_bidi-0.6.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b84d75948959d76dccefe0e656a107550dbc5907ffd47459eda9bb150b57be76"}, + {file = "python_bidi-0.6.1-pp37-pypy37_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2bb9b99e9b9c0479f20880251161c52a15848373852281a60365e030fe39af85"}, + {file = "python_bidi-0.6.1-pp37-pypy37_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2f60f19b6e90dac559cd9e800c09c911acd8dad0cd0d5a3fe8409ce9e5bed723"}, + {file = "python_bidi-0.6.1-pp37-pypy37_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c996e1516cb4daf3ff697525a87ce9ce0362d836fc395fa7b3637b09e11782a2"}, + {file = "python_bidi-0.6.1-pp37-pypy37_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:c6e5a40bcf57c017f3bc59455711c4e52970907d5fbdcde984ab76119cbbd6aa"}, + {file = "python_bidi-0.6.1-pp37-pypy37_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:91308a5ade4ba96c5fc107f68f48e415ddd123f45d1b4a504572743d2547b46b"}, + {file = "python_bidi-0.6.1-pp37-pypy37_pp73-musllinux_1_2_i686.whl", hash = "sha256:b489db2e7037bf4802747900463343c5b356a8437948b6032b07cc859b855956"}, + {file = "python_bidi-0.6.1-pp37-pypy37_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dead77866bd69d948ccc836a772b711a74d4a18f692c1a8d8a45e8367d7a1a0c"}, + {file = "python_bidi-0.6.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52047983079d9c8acea72d777a6fe15dda476ff96e47a784e8aec1aa4a3ed160"}, + {file = "python_bidi-0.6.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:22ed0569e668063b63b5db786ed898718f954ad9271304d65a4be0906c478297"}, + {file = "python_bidi-0.6.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39958c9749c9e57c520c10c777b3688ec766be25a7b94abc717b6dbd4b755c88"}, + {file = "python_bidi-0.6.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1647059eb21181e6ac03894834d96fc282b482e28f4117a748aafc0320c58019"}, + {file = "python_bidi-0.6.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:28df2ed9ca3a971a530b31240839e8d9593d5eaf4de159227aa6e8125d021623"}, + {file = "python_bidi-0.6.1-pp38-pypy38_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:0f460a333b5620cef14bd709b2f2ab95eb882b116cd8777bc006a35ded8be6fd"}, + {file = "python_bidi-0.6.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:6240ccbc0e1e582b17c994667af61a498844b50e2bdb51e76c29d3c2f4f225b8"}, + {file = "python_bidi-0.6.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3d007a8708b490e8f5c89f828395f79e9ab8e19ff09ad8fcbb50d1b7fdea6442"}, + {file = "python_bidi-0.6.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:646faaa87b1cd693c054124a0c4080449b1c125b6d5394cef4d77b56e92b7da1"}, + {file = "python_bidi-0.6.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:38b1cbb292eaf91cc5ea2282b98cccd3d79ae0ed3f1ce5a2f5d83938264227a7"}, + {file = "python_bidi-0.6.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af1c6103847397bb020057737f6c670f62b87dfab0395f3c7e72cfb915e37b43"}, + {file = "python_bidi-0.6.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35840cf91858522cea9887068f007835b9867518ac863379a840bcc58f468be3"}, + {file = "python_bidi-0.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc93b876f7d030c01639aab2d91cebb975a2676a7449347966017324683309e1"}, + {file = "python_bidi-0.6.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:44cee53c32709c8ecb310d90c1fce083065a4f67a91639d749ec562ff14c9cac"}, + {file = "python_bidi-0.6.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d3c34a0d3d038a4e2f064f9c5e723e5aed146cbbd0cad9705f61b45d51dccf92"}, + {file = "python_bidi-0.6.1-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:eedb5fee92fafc2cc118d826b464a31e4ca5875e97f8c6041071db68940a8dba"}, + {file = "python_bidi-0.6.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:b72dc51d43d1ae50f5abafc834d84260d73f011c1811bb0263aed45c98a88c6a"}, + {file = "python_bidi-0.6.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:21aba9a66f49a47a82069f1fc6507af94cbee68e985ffe2282e60f8eb1d73d4b"}, + {file = "python_bidi-0.6.1.tar.gz", hash = "sha256:671c5d331187455a73342c655c0717b1e36969b7fdb8c787c8f2234d0eab47f4"}, ] [package.extras] @@ -6513,29 +6578,29 @@ files = [ [[package]] name = "pywin32" -version = "307" +version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" files = [ - {file = "pywin32-307-cp310-cp310-win32.whl", hash = "sha256:f8f25d893c1e1ce2d685ef6d0a481e87c6f510d0f3f117932781f412e0eba31b"}, - {file = "pywin32-307-cp310-cp310-win_amd64.whl", hash = "sha256:36e650c5e5e6b29b5d317385b02d20803ddbac5d1031e1f88d20d76676dd103d"}, - {file = "pywin32-307-cp310-cp310-win_arm64.whl", hash = "sha256:0c12d61e0274e0c62acee79e3e503c312426ddd0e8d4899c626cddc1cafe0ff4"}, - {file = "pywin32-307-cp311-cp311-win32.whl", hash = "sha256:fec5d27cc893178fab299de911b8e4d12c5954e1baf83e8a664311e56a272b75"}, - {file = "pywin32-307-cp311-cp311-win_amd64.whl", hash = "sha256:987a86971753ed7fdd52a7fb5747aba955b2c7fbbc3d8b76ec850358c1cc28c3"}, - {file = "pywin32-307-cp311-cp311-win_arm64.whl", hash = "sha256:fd436897c186a2e693cd0437386ed79f989f4d13d6f353f8787ecbb0ae719398"}, - {file = "pywin32-307-cp312-cp312-win32.whl", hash = "sha256:07649ec6b01712f36debf39fc94f3d696a46579e852f60157a729ac039df0815"}, - {file = "pywin32-307-cp312-cp312-win_amd64.whl", hash = "sha256:00d047992bb5dcf79f8b9b7c81f72e0130f9fe4b22df613f755ab1cc021d8347"}, - {file = "pywin32-307-cp312-cp312-win_arm64.whl", hash = "sha256:b53658acbfc6a8241d72cc09e9d1d666be4e6c99376bc59e26cdb6223c4554d2"}, - {file = "pywin32-307-cp313-cp313-win32.whl", hash = "sha256:ea4d56e48dc1ab2aa0a5e3c0741ad6e926529510516db7a3b6981a1ae74405e5"}, - {file = "pywin32-307-cp313-cp313-win_amd64.whl", hash = "sha256:576d09813eaf4c8168d0bfd66fb7cb3b15a61041cf41598c2db4a4583bf832d2"}, - {file = "pywin32-307-cp313-cp313-win_arm64.whl", hash = "sha256:b30c9bdbffda6a260beb2919f918daced23d32c79109412c2085cbc513338a0a"}, - {file = "pywin32-307-cp37-cp37m-win32.whl", hash = "sha256:5101472f5180c647d4525a0ed289ec723a26231550dbfd369ec19d5faf60e511"}, - {file = "pywin32-307-cp37-cp37m-win_amd64.whl", hash = "sha256:05de55a7c110478dc4b202230e98af5e0720855360d2b31a44bb4e296d795fba"}, - {file = "pywin32-307-cp38-cp38-win32.whl", hash = "sha256:13d059fb7f10792542082f5731d5d3d9645320fc38814759313e5ee97c3fac01"}, - {file = "pywin32-307-cp38-cp38-win_amd64.whl", hash = "sha256:7e0b2f93769d450a98ac7a31a087e07b126b6d571e8b4386a5762eb85325270b"}, - {file = "pywin32-307-cp39-cp39-win32.whl", hash = "sha256:55ee87f2f8c294e72ad9d4261ca423022310a6e79fb314a8ca76ab3f493854c6"}, - {file = "pywin32-307-cp39-cp39-win_amd64.whl", hash = "sha256:e9d5202922e74985b037c9ef46778335c102b74b95cec70f629453dbe7235d87"}, + {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, + {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, + {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, + {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, + {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, + {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, + {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, + {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, + {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, + {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, + {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, + {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, ] [[package]] @@ -7626,26 +7691,29 @@ test = ["Cython", "array-api-strict (>=2.0)", "asv", "gmpy2", "hypothesis (>=6.3 [[package]] name = "sentence-transformers" -version = "3.1.1" +version = "3.2.0" description = "State-of-the-Art Text Embeddings" optional = true python-versions = ">=3.8" files = [ - {file = "sentence_transformers-3.1.1-py3-none-any.whl", hash = "sha256:c73bf6f17e3676bb9372a6133a254ebfb5907586b470f2bac5a840c64c3cf97e"}, - {file = "sentence_transformers-3.1.1.tar.gz", hash = "sha256:8f00020ef4ad6b918475c38af545c22f61403b67eb22d994860bab06902db160"}, + {file = "sentence_transformers-3.2.0-py3-none-any.whl", hash = "sha256:02dbe96d669d30084ea11af94e7c17895c31748e86f20af4dbcc4ea6522b3506"}, + {file = "sentence_transformers-3.2.0.tar.gz", hash = "sha256:4da78ba340fffc48d60a25415145cbe665216d374c948ec54c3163bd352bcc27"}, ] [package.dependencies] -huggingface-hub = ">=0.19.3" +huggingface-hub = ">=0.20.0" Pillow = "*" scikit-learn = "*" scipy = "*" torch = ">=1.11.0" tqdm = "*" -transformers = ">=4.38.0,<5.0.0" +transformers = ">=4.41.0,<5.0.0" [package.extras] dev = ["accelerate (>=0.20.3)", "datasets", "pre-commit", "pytest", "pytest-cov"] +onnx = ["optimum[onnxruntime] (>=1.23.0)"] +onnx-gpu = ["optimum[onnxruntime-gpu] (>=1.23.0)"] +openvino = ["optimum-intel[openvino] (>=1.20.0)"] train = ["accelerate (>=0.20.3)", "datasets"] [[package]] @@ -8095,7 +8163,7 @@ widechars = ["wcwidth"] name = "tenacity" version = "9.0.0" description = "Retry code until it succeeds" -optional = true +optional = false python-versions = ">=3.8" files = [ {file = "tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539"}, @@ -8226,13 +8294,13 @@ blobfile = ["blobfile (>=2)"] [[package]] name = "timm" -version = "1.0.9" +version = "1.0.10" description = "PyTorch Image Models" optional = true python-versions = ">=3.8" files = [ - {file = "timm-1.0.9-py3-none-any.whl", hash = "sha256:ce5a4bac57a6cbb2be4ee35dc4ce689eede10d647e48dd1836106e2cc199693b"}, - {file = "timm-1.0.9.tar.gz", hash = "sha256:69523aa2c34820cc6db37005302b5e42ddd60c30f476643f133ead4a8c5b5533"}, + {file = "timm-1.0.10-py3-none-any.whl", hash = "sha256:03a1893016343432480217a8b6671f11ce8e5b6e1abe4678b5e7728ede7576bb"}, + {file = "timm-1.0.10.tar.gz", hash = "sha256:2931c2eabcf1d273214a9a12dc4ea7d17d3de2fb16258c2ff20af4fa656e0fd0"}, ] [package.dependencies] @@ -8640,13 +8708,13 @@ tutorials = ["matplotlib", "pandas", "tabulate"] [[package]] name = "types-networkx" -version = "3.2.1.20240918" +version = "3.3.0.20241009" description = "Typing stubs for networkx" optional = false python-versions = ">=3.8" files = [ - {file = "types-networkx-3.2.1.20240918.tar.gz", hash = "sha256:251d256a4d2fe17ca596ee5b40869813a942341a5b876a7975f032e2a47785e1"}, - {file = "types_networkx-3.2.1.20240918-py3-none-any.whl", hash = "sha256:666b6dfdfc89855dbe73ecee2e6f3f6735c3e51f3622be44118177012ba05218"}, + {file = "types-networkx-3.3.0.20241009.tar.gz", hash = "sha256:75f4c6bdff17423953cab76cdfef01ce3507fa816e995dc2b2561e5a4ef73367"}, + {file = "types_networkx-3.3.0.20241009-py3-none-any.whl", hash = "sha256:3655aed4f863c25a4219c1d09ea83327587ebff27dba3b3d8fd47393362325a7"}, ] [package.dependencies] @@ -9021,47 +9089,54 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", [[package]] name = "uvloop" -version = "0.20.0" +version = "0.21.0" description = "Fast implementation of asyncio event loop on top of libuv" optional = true python-versions = ">=3.8.0" files = [ - {file = "uvloop-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9ebafa0b96c62881d5cafa02d9da2e44c23f9f0cd829f3a32a6aff771449c996"}, - {file = "uvloop-0.20.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:35968fc697b0527a06e134999eef859b4034b37aebca537daeb598b9d45a137b"}, - {file = "uvloop-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b16696f10e59d7580979b420eedf6650010a4a9c3bd8113f24a103dfdb770b10"}, - {file = "uvloop-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b04d96188d365151d1af41fa2d23257b674e7ead68cfd61c725a422764062ae"}, - {file = "uvloop-0.20.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94707205efbe809dfa3a0d09c08bef1352f5d3d6612a506f10a319933757c006"}, - {file = "uvloop-0.20.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89e8d33bb88d7263f74dc57d69f0063e06b5a5ce50bb9a6b32f5fcbe655f9e73"}, - {file = "uvloop-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e50289c101495e0d1bb0bfcb4a60adde56e32f4449a67216a1ab2750aa84f037"}, - {file = "uvloop-0.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e237f9c1e8a00e7d9ddaa288e535dc337a39bcbf679f290aee9d26df9e72bce9"}, - {file = "uvloop-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:746242cd703dc2b37f9d8b9f173749c15e9a918ddb021575a0205ec29a38d31e"}, - {file = "uvloop-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82edbfd3df39fb3d108fc079ebc461330f7c2e33dbd002d146bf7c445ba6e756"}, - {file = "uvloop-0.20.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:80dc1b139516be2077b3e57ce1cb65bfed09149e1d175e0478e7a987863b68f0"}, - {file = "uvloop-0.20.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4f44af67bf39af25db4c1ac27e82e9665717f9c26af2369c404be865c8818dcf"}, - {file = "uvloop-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4b75f2950ddb6feed85336412b9a0c310a2edbcf4cf931aa5cfe29034829676d"}, - {file = "uvloop-0.20.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:77fbc69c287596880ecec2d4c7a62346bef08b6209749bf6ce8c22bbaca0239e"}, - {file = "uvloop-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6462c95f48e2d8d4c993a2950cd3d31ab061864d1c226bbf0ee2f1a8f36674b9"}, - {file = "uvloop-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649c33034979273fa71aa25d0fe120ad1777c551d8c4cd2c0c9851d88fcb13ab"}, - {file = "uvloop-0.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a609780e942d43a275a617c0839d85f95c334bad29c4c0918252085113285b5"}, - {file = "uvloop-0.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aea15c78e0d9ad6555ed201344ae36db5c63d428818b4b2a42842b3870127c00"}, - {file = "uvloop-0.20.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0e94b221295b5e69de57a1bd4aeb0b3a29f61be6e1b478bb8a69a73377db7ba"}, - {file = "uvloop-0.20.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fee6044b64c965c425b65a4e17719953b96e065c5b7e09b599ff332bb2744bdf"}, - {file = "uvloop-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:265a99a2ff41a0fd56c19c3838b29bf54d1d177964c300dad388b27e84fd7847"}, - {file = "uvloop-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10c2956efcecb981bf9cfb8184d27d5d64b9033f917115a960b83f11bfa0d6b"}, - {file = "uvloop-0.20.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e7d61fe8e8d9335fac1bf8d5d82820b4808dd7a43020c149b63a1ada953d48a6"}, - {file = "uvloop-0.20.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2beee18efd33fa6fdb0976e18475a4042cd31c7433c866e8a09ab604c7c22ff2"}, - {file = "uvloop-0.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d8c36fdf3e02cec92aed2d44f63565ad1522a499c654f07935c8f9d04db69e95"}, - {file = "uvloop-0.20.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0fac7be202596c7126146660725157d4813aa29a4cc990fe51346f75ff8fde7"}, - {file = "uvloop-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d0fba61846f294bce41eb44d60d58136090ea2b5b99efd21cbdf4e21927c56a"}, - {file = "uvloop-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95720bae002ac357202e0d866128eb1ac82545bcf0b549b9abe91b5178d9b541"}, - {file = "uvloop-0.20.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:36c530d8fa03bfa7085af54a48f2ca16ab74df3ec7108a46ba82fd8b411a2315"}, - {file = "uvloop-0.20.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e97152983442b499d7a71e44f29baa75b3b02e65d9c44ba53b10338e98dedb66"}, - {file = "uvloop-0.20.0.tar.gz", hash = "sha256:4603ca714a754fc8d9b197e325db25b2ea045385e8a3ad05d3463de725fdf469"}, -] - -[package.extras] + {file = "uvloop-0.21.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ec7e6b09a6fdded42403182ab6b832b71f4edaf7f37a9a0e371a01db5f0cb45f"}, + {file = "uvloop-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:196274f2adb9689a289ad7d65700d37df0c0930fd8e4e743fa4834e850d7719d"}, + {file = "uvloop-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f38b2e090258d051d68a5b14d1da7203a3c3677321cf32a95a6f4db4dd8b6f26"}, + {file = "uvloop-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c43e0f13022b998eb9b973b5e97200c8b90823454d4bc06ab33829e09fb9bb"}, + {file = "uvloop-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:10d66943def5fcb6e7b37310eb6b5639fd2ccbc38df1177262b0640c3ca68c1f"}, + {file = "uvloop-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:67dd654b8ca23aed0a8e99010b4c34aca62f4b7fce88f39d452ed7622c94845c"}, + {file = "uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8"}, + {file = "uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0"}, + {file = "uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e"}, + {file = "uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb"}, + {file = "uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6"}, + {file = "uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d"}, + {file = "uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c"}, + {file = "uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2"}, + {file = "uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d"}, + {file = "uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc"}, + {file = "uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb"}, + {file = "uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f"}, + {file = "uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281"}, + {file = "uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af"}, + {file = "uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6"}, + {file = "uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816"}, + {file = "uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc"}, + {file = "uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553"}, + {file = "uvloop-0.21.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:17df489689befc72c39a08359efac29bbee8eee5209650d4b9f34df73d22e414"}, + {file = "uvloop-0.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc09f0ff191e61c2d592a752423c767b4ebb2986daa9ed62908e2b1b9a9ae206"}, + {file = "uvloop-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0ce1b49560b1d2d8a2977e3ba4afb2414fb46b86a1b64056bc4ab929efdafbe"}, + {file = "uvloop-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e678ad6fe52af2c58d2ae3c73dc85524ba8abe637f134bf3564ed07f555c5e79"}, + {file = "uvloop-0.21.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:460def4412e473896ef179a1671b40c039c7012184b627898eea5072ef6f017a"}, + {file = "uvloop-0.21.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:10da8046cc4a8f12c91a1c39d1dd1585c41162a15caaef165c2174db9ef18bdc"}, + {file = "uvloop-0.21.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c097078b8031190c934ed0ebfee8cc5f9ba9642e6eb88322b9958b649750f72b"}, + {file = "uvloop-0.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:46923b0b5ee7fc0020bef24afe7836cb068f5050ca04caf6b487c513dc1a20b2"}, + {file = "uvloop-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e420a3afe22cdcf2a0f4846e377d16e718bc70103d7088a4f7623567ba5fb0"}, + {file = "uvloop-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88cb67cdbc0e483da00af0b2c3cdad4b7c61ceb1ee0f33fe00e09c81e3a6cb75"}, + {file = "uvloop-0.21.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:221f4f2a1f46032b403bf3be628011caf75428ee3cc204a22addf96f586b19fd"}, + {file = "uvloop-0.21.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2d1f581393673ce119355d56da84fe1dd9d2bb8b3d13ce792524e1607139feff"}, + {file = "uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3"}, +] + +[package.extras] +dev = ["Cython (>=3.0,<4.0)", "setuptools (>=60)"] 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)"] -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)"] +test = ["aiohttp (>=3.10.5)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] [[package]] name = "virtualenv" @@ -9444,13 +9519,13 @@ files = [ [[package]] name = "xmltodict" -version = "0.14.0" +version = "0.14.1" description = "Makes working with XML feel like you are working with JSON" optional = true -python-versions = ">=3.4" +python-versions = ">=3.6" files = [ - {file = "xmltodict-0.14.0-py2.py3-none-any.whl", hash = "sha256:6dd20b8de8d0eb84d175ec706cc17b53df236615b0980de33537736319e5ee85"}, - {file = "xmltodict-0.14.0.tar.gz", hash = "sha256:8b39b25b564fd466be566c9e8a869cc4b5083c2fec7f98665f47bf0853f6cc77"}, + {file = "xmltodict-0.14.1-py2.py3-none-any.whl", hash = "sha256:3ef4a7b71c08f19047fcbea572e1d7f4207ab269da1565b5d40e9823d3894e63"}, + {file = "xmltodict-0.14.1.tar.gz", hash = "sha256:338c8431e4fc554517651972d62f06958718f6262b04316917008e8fd677a6b0"}, ] [[package]] @@ -9587,103 +9662,109 @@ files = [ [[package]] name = "yarl" -version = "1.14.0" +version = "1.15.2" description = "Yet another URL library" optional = true python-versions = ">=3.8" files = [ - {file = "yarl-1.14.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1bfc25aa6a7c99cf86564210f79a0b7d4484159c67e01232b116e445b3036547"}, - {file = "yarl-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0cf21f46a15d445417de8fc89f2568852cf57fe8ca1ab3d19ddb24d45c0383ae"}, - {file = "yarl-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1dda53508df0de87b6e6b0a52d6718ff6c62a5aca8f5552748404963df639269"}, - {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:587c3cc59bc148a9b1c07a019346eda2549bc9f468acd2f9824d185749acf0a6"}, - {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3007a5b75cb50140708420fe688c393e71139324df599434633019314ceb8b59"}, - {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06ff23462398333c78b6f4f8d3d70410d657a471c2c5bbe6086133be43fc8f1a"}, - {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689a99a42ee4583fcb0d3a67a0204664aa1539684aed72bdafcbd505197a91c4"}, - {file = "yarl-1.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0547ab1e9345dc468cac8368d88ea4c5bd473ebc1d8d755347d7401982b5dd8"}, - {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:742aef0a99844faaac200564ea6f5e08facb285d37ea18bd1a5acf2771f3255a"}, - {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:176110bff341b6730f64a1eb3a7070e12b373cf1c910a9337e7c3240497db76f"}, - {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:46a9772a1efa93f9cd170ad33101c1817c77e0e9914d4fe33e2da299d7cf0f9b"}, - {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ee2c68e4f2dd1b1c15b849ba1c96fac105fca6ffdb7c1e8be51da6fabbdeafb9"}, - {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:047b258e00b99091b6f90355521f026238c63bd76dcf996d93527bb13320eefd"}, - {file = "yarl-1.14.0-cp310-cp310-win32.whl", hash = "sha256:0aa92e3e30a04f9462a25077db689c4ac5ea9ab6cc68a2e563881b987d42f16d"}, - {file = "yarl-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:d9baec588f015d0ee564057aa7574313c53a530662ffad930b7886becc85abdf"}, - {file = "yarl-1.14.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:07f9eaf57719d6721ab15805d85f4b01a5b509a0868d7320134371bcb652152d"}, - {file = "yarl-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c14b504a74e58e2deb0378b3eca10f3d076635c100f45b113c18c770b4a47a50"}, - {file = "yarl-1.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:16a682a127930f3fc4e42583becca6049e1d7214bcad23520c590edd741d2114"}, - {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73bedd2be05f48af19f0f2e9e1353921ce0c83f4a1c9e8556ecdcf1f1eae4892"}, - {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3ab950f8814f3b7b5e3eebc117986f817ec933676f68f0a6c5b2137dd7c9c69"}, - {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b693c63e7e64b524f54aa4888403c680342d1ad0d97be1707c531584d6aeeb4f"}, - {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85cb3e40eaa98489f1e2e8b29f5ad02ee1ee40d6ce6b88d50cf0f205de1d9d2c"}, - {file = "yarl-1.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f24f08b6c9b9818fd80612c97857d28f9779f0d1211653ece9844fc7b414df2"}, - {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:29a84a46ec3ebae7a1c024c055612b11e9363a8a23238b3e905552d77a2bc51b"}, - {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5cd5dad8366e0168e0fd23d10705a603790484a6dbb9eb272b33673b8f2cce72"}, - {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a152751af7ef7b5d5fa6d215756e508dd05eb07d0cf2ba51f3e740076aa74373"}, - {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:3d569f877ed9a708e4c71a2d13d2940cb0791da309f70bd970ac1a5c088a0a92"}, - {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6a615cad11ec3428020fb3c5a88d85ce1b5c69fd66e9fcb91a7daa5e855325dd"}, - {file = "yarl-1.14.0-cp311-cp311-win32.whl", hash = "sha256:bab03192091681d54e8225c53f270b0517637915d9297028409a2a5114ff4634"}, - {file = "yarl-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:985623575e5c4ea763056ffe0e2d63836f771a8c294b3de06d09480538316b13"}, - {file = "yarl-1.14.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fc2c80bc87fba076e6cbb926216c27fba274dae7100a7b9a0983b53132dd99f2"}, - {file = "yarl-1.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:55c144d363ad4626ca744556c049c94e2b95096041ac87098bb363dcc8635e8d"}, - {file = "yarl-1.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b03384eed107dbeb5f625a99dc3a7de8be04fc8480c9ad42fccbc73434170b20"}, - {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f72a0d746d38cb299b79ce3d4d60ba0892c84bbc905d0d49c13df5bace1b65f8"}, - {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8648180b34faaea4aa5b5ca7e871d9eb1277033fa439693855cf0ea9195f85f1"}, - {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9557c9322aaa33174d285b0c1961fb32499d65ad1866155b7845edc876c3c835"}, - {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f50eb3837012a937a2b649ec872b66ba9541ad9d6f103ddcafb8231cfcafd22"}, - {file = "yarl-1.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8892fa575ac9b1b25fae7b221bc4792a273877b9b56a99ee2d8d03eeb3dbb1d2"}, - {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6a2c5c5bb2556dfbfffffc2bcfb9c235fd2b566d5006dfb2a37afc7e3278a07"}, - {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ab3abc0b78a5dfaa4795a6afbe7b282b6aa88d81cf8c1bb5e394993d7cae3457"}, - {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:47eede5d11d669ab3759b63afb70d28d5328c14744b8edba3323e27dc52d298d"}, - {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fe4d2536c827f508348d7b40c08767e8c7071614250927233bf0c92170451c0a"}, - {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0fd7b941dd1b00b5f0acb97455fea2c4b7aac2dd31ea43fb9d155e9bc7b78664"}, - {file = "yarl-1.14.0-cp312-cp312-win32.whl", hash = "sha256:99ff3744f5fe48288be6bc402533b38e89749623a43208e1d57091fc96b783b9"}, - {file = "yarl-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:1ca3894e9e9f72da93544f64988d9c052254a338a9f855165f37f51edb6591de"}, - {file = "yarl-1.14.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5d02d700705d67e09e1f57681f758f0b9d4412eeb70b2eb8d96ca6200b486db3"}, - {file = "yarl-1.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:30600ba5db60f7c0820ef38a2568bb7379e1418ecc947a0f76fd8b2ff4257a97"}, - {file = "yarl-1.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e85d86527baebb41a214cc3b45c17177177d900a2ad5783dbe6f291642d4906f"}, - {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37001e5d4621cef710c8dc1429ca04e189e572f128ab12312eab4e04cf007132"}, - {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4f4547944d4f5cfcdc03f3f097d6f05bbbc915eaaf80a2ee120d0e756de377d"}, - {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75ff4c819757f9bdb35de049a509814d6ce851fe26f06eb95a392a5640052482"}, - {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68ac1a09392ed6e3fd14be880d39b951d7b981fd135416db7d18a6208c536561"}, - {file = "yarl-1.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96952f642ac69075e44c7d0284528938fdff39422a1d90d3e45ce40b72e5e2d9"}, - {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a56fbe3d7f3bce1d060ea18d2413a2ca9ca814eea7cedc4d247b5f338d54844e"}, - {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7e2637d75e92763d1322cb5041573279ec43a80c0f7fbbd2d64f5aee98447b17"}, - {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9abe80ae2c9d37c17599557b712e6515f4100a80efb2cda15f5f070306477cd2"}, - {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:217a782020b875538eebf3948fac3a7f9bbbd0fd9bf8538f7c2ad7489e80f4e8"}, - {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9cfef3f14f75bf6aba73a76caf61f9d00865912a04a4393c468a7ce0981b519"}, - {file = "yarl-1.14.0-cp313-cp313-win32.whl", hash = "sha256:d8361c7d04e6a264481f0b802e395f647cd3f8bbe27acfa7c12049efea675bd1"}, - {file = "yarl-1.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:bc24f968b82455f336b79bf37dbb243b7d76cd40897489888d663d4e028f5069"}, - {file = "yarl-1.14.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:91d875f75fabf76b3018c5f196bf3d308ed2b49ddcb46c1576d6b075754a1393"}, - {file = "yarl-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4009def9be3a7e5175db20aa2d7307ecd00bbf50f7f0f989300710eee1d0b0b9"}, - {file = "yarl-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:582cedde49603f139be572252a318b30dc41039bc0b8165f070f279e5d12187f"}, - {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbd9ff43a04f8ffe8a959a944c2dca10d22f5f99fc6a459f49c3ebfb409309d9"}, - {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9f805e37ed16cc212fdc538a608422d7517e7faf539bedea4fe69425bc55d76"}, - {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95e16e9eaa2d7f5d87421b8fe694dd71606aa61d74b824c8d17fc85cc51983d1"}, - {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:816d24f584edefcc5ca63428f0b38fee00b39fe64e3c5e558f895a18983efe96"}, - {file = "yarl-1.14.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd2660c01367eb3ef081b8fa0a5da7fe767f9427aa82023a961a5f28f0d4af6c"}, - {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:94b2bb9bcfd5be9d27004ea4398fb640373dd0c1a9e219084f42c08f77a720ab"}, - {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c2089a9afef887664115f7fa6d3c0edd6454adaca5488dba836ca91f60401075"}, - {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:2192f718db4a8509f63dd6d950f143279211fa7e6a2c612edc17d85bf043d36e"}, - {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:8385ab36bf812e9d37cf7613999a87715f27ef67a53f0687d28c44b819df7cb0"}, - {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b4c1ecba93e7826dc71ddba75fb7740cdb52e7bd0be9f03136b83f54e6a1f511"}, - {file = "yarl-1.14.0-cp38-cp38-win32.whl", hash = "sha256:e749af6c912a7bb441d105c50c1a3da720474e8acb91c89350080dd600228f0e"}, - {file = "yarl-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:147e36331f6f63e08a14640acf12369e041e0751bb70d9362df68c2d9dcf0c87"}, - {file = "yarl-1.14.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a9f917966d27f7ce30039fe8d900f913c5304134096554fd9bea0774bcda6d1"}, - {file = "yarl-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a2f8fb7f944bcdfecd4e8d855f84c703804a594da5123dd206f75036e536d4d"}, - {file = "yarl-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f4e475f29a9122f908d0f1f706e1f2fc3656536ffd21014ff8a6f2e1b14d1d8"}, - {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8089d4634d8fa2b1806ce44fefa4979b1ab2c12c0bc7ef3dfa45c8a374811348"}, - {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b16f6c75cffc2dc0616ea295abb0e1967601bd1fb1e0af6a1de1c6c887f3439"}, - {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498b3c55087b9d762636bca9b45f60d37e51d24341786dc01b81253f9552a607"}, - {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3f8bfc1db82589ef965ed234b87de30d140db8b6dc50ada9e33951ccd8ec07a"}, - {file = "yarl-1.14.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:625f207b1799e95e7c823f42f473c1e9dbfb6192bd56bba8695656d92be4535f"}, - {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:781e2495e408a81e4eaeedeb41ba32b63b1980dddf8b60dbbeff6036bcd35049"}, - {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:659603d26d40dd4463200df9bfbc339fbfaed3fe32e5c432fe1dc2b5d4aa94b4"}, - {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4e0d45ebf975634468682c8bec021618b3ad52c37619e5c938f8f831fa1ac5c0"}, - {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a2e4725a08cb2b4794db09e350c86dee18202bb8286527210e13a1514dc9a59a"}, - {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:19268b4fec1d7760134f2de46ef2608c2920134fb1fa61e451f679e41356dc55"}, - {file = "yarl-1.14.0-cp39-cp39-win32.whl", hash = "sha256:337912bcdcf193ade64b9aae5a4017a0a1950caf8ca140362e361543c6773f21"}, - {file = "yarl-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:b6d0147574ce2e7b812c989e50fa72bbc5338045411a836bd066ce5fc8ac0bce"}, - {file = "yarl-1.14.0-py3-none-any.whl", hash = "sha256:c8ed4034f0765f8861620c1f2f2364d2e58520ea288497084dae880424fc0d9f"}, - {file = "yarl-1.14.0.tar.gz", hash = "sha256:88c7d9d58aab0724b979ab5617330acb1c7030b79379c8138c1c8c94e121d1b3"}, + {file = "yarl-1.15.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e4ee8b8639070ff246ad3649294336b06db37a94bdea0d09ea491603e0be73b8"}, + {file = "yarl-1.15.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a7cf963a357c5f00cb55b1955df8bbe68d2f2f65de065160a1c26b85a1e44172"}, + {file = "yarl-1.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:43ebdcc120e2ca679dba01a779333a8ea76b50547b55e812b8b92818d604662c"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3433da95b51a75692dcf6cc8117a31410447c75a9a8187888f02ad45c0a86c50"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38d0124fa992dbacd0c48b1b755d3ee0a9f924f427f95b0ef376556a24debf01"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ded1b1803151dd0f20a8945508786d57c2f97a50289b16f2629f85433e546d47"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace4cad790f3bf872c082366c9edd7f8f8f77afe3992b134cfc810332206884f"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c77494a2f2282d9bbbbcab7c227a4d1b4bb829875c96251f66fb5f3bae4fb053"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b7f227ca6db5a9fda0a2b935a2ea34a7267589ffc63c8045f0e4edb8d8dcf956"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:31561a5b4d8dbef1559b3600b045607cf804bae040f64b5f5bca77da38084a8a"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3e52474256a7db9dcf3c5f4ca0b300fdea6c21cca0148c8891d03a025649d935"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0e1af74a9529a1137c67c887ed9cde62cff53aa4d84a3adbec329f9ec47a3936"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:15c87339490100c63472a76d87fe7097a0835c705eb5ae79fd96e343473629ed"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:74abb8709ea54cc483c4fb57fb17bb66f8e0f04438cff6ded322074dbd17c7ec"}, + {file = "yarl-1.15.2-cp310-cp310-win32.whl", hash = "sha256:ffd591e22b22f9cb48e472529db6a47203c41c2c5911ff0a52e85723196c0d75"}, + {file = "yarl-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:1695497bb2a02a6de60064c9f077a4ae9c25c73624e0d43e3aa9d16d983073c2"}, + {file = "yarl-1.15.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9fcda20b2de7042cc35cf911702fa3d8311bd40055a14446c1e62403684afdc5"}, + {file = "yarl-1.15.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0545de8c688fbbf3088f9e8b801157923be4bf8e7b03e97c2ecd4dfa39e48e0e"}, + {file = "yarl-1.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbda058a9a68bec347962595f50546a8a4a34fd7b0654a7b9697917dc2bf810d"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ac2bc069f4a458634c26b101c2341b18da85cb96afe0015990507efec2e417"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd126498171f752dd85737ab1544329a4520c53eed3997f9b08aefbafb1cc53b"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3db817b4e95eb05c362e3b45dafe7144b18603e1211f4a5b36eb9522ecc62bcf"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:076b1ed2ac819933895b1a000904f62d615fe4533a5cf3e052ff9a1da560575c"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f8cfd847e6b9ecf9f2f2531c8427035f291ec286c0a4944b0a9fce58c6446046"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:32b66be100ac5739065496c74c4b7f3015cef792c3174982809274d7e51b3e04"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:34a2d76a1984cac04ff8b1bfc939ec9dc0914821264d4a9c8fd0ed6aa8d4cfd2"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0afad2cd484908f472c8fe2e8ef499facee54a0a6978be0e0cff67b1254fd747"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c68e820879ff39992c7f148113b46efcd6ec765a4865581f2902b3c43a5f4bbb"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:98f68df80ec6ca3015186b2677c208c096d646ef37bbf8b49764ab4a38183931"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c56ec1eacd0a5d35b8a29f468659c47f4fe61b2cab948ca756c39b7617f0aa5"}, + {file = "yarl-1.15.2-cp311-cp311-win32.whl", hash = "sha256:eedc3f247ee7b3808ea07205f3e7d7879bc19ad3e6222195cd5fbf9988853e4d"}, + {file = "yarl-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:0ccaa1bc98751fbfcf53dc8dfdb90d96e98838010fc254180dd6707a6e8bb179"}, + {file = "yarl-1.15.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:82d5161e8cb8f36ec778fd7ac4d740415d84030f5b9ef8fe4da54784a1f46c94"}, + {file = "yarl-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa2bea05ff0a8fb4d8124498e00e02398f06d23cdadd0fe027d84a3f7afde31e"}, + {file = "yarl-1.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99e12d2bf587b44deb74e0d6170fec37adb489964dbca656ec41a7cd8f2ff178"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:243fbbbf003754fe41b5bdf10ce1e7f80bcc70732b5b54222c124d6b4c2ab31c"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:856b7f1a7b98a8c31823285786bd566cf06226ac4f38b3ef462f593c608a9bd6"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:553dad9af802a9ad1a6525e7528152a015b85fb8dbf764ebfc755c695f488367"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30c3ff305f6e06650a761c4393666f77384f1cc6c5c0251965d6bfa5fbc88f7f"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:353665775be69bbfc6d54c8d134bfc533e332149faeddd631b0bc79df0897f46"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f4fe99ce44128c71233d0d72152db31ca119711dfc5f2c82385ad611d8d7f897"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9c1e3ff4b89cdd2e1a24c214f141e848b9e0451f08d7d4963cb4108d4d798f1f"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:711bdfae4e699a6d4f371137cbe9e740dc958530cb920eb6f43ff9551e17cfbc"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4388c72174868884f76affcdd3656544c426407e0043c89b684d22fb265e04a5"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f0e1844ad47c7bd5d6fa784f1d4accc5f4168b48999303a868fe0f8597bde715"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5cafb02cf097a82d74403f7e0b6b9df3ffbfe8edf9415ea816314711764a27b"}, + {file = "yarl-1.15.2-cp312-cp312-win32.whl", hash = "sha256:156ececdf636143f508770bf8a3a0498de64da5abd890c7dbb42ca9e3b6c05b8"}, + {file = "yarl-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:435aca062444a7f0c884861d2e3ea79883bd1cd19d0a381928b69ae1b85bc51d"}, + {file = "yarl-1.15.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:416f2e3beaeae81e2f7a45dc711258be5bdc79c940a9a270b266c0bec038fb84"}, + {file = "yarl-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:173563f3696124372831007e3d4b9821746964a95968628f7075d9231ac6bb33"}, + {file = "yarl-1.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9ce2e0f6123a60bd1a7f5ae3b2c49b240c12c132847f17aa990b841a417598a2"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaea112aed589131f73d50d570a6864728bd7c0c66ef6c9154ed7b59f24da611"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4ca3b9f370f218cc2a0309542cab8d0acdfd66667e7c37d04d617012485f904"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23ec1d3c31882b2a8a69c801ef58ebf7bae2553211ebbddf04235be275a38548"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75119badf45f7183e10e348edff5a76a94dc19ba9287d94001ff05e81475967b"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78e6fdc976ec966b99e4daa3812fac0274cc28cd2b24b0d92462e2e5ef90d368"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8657d3f37f781d987037f9cc20bbc8b40425fa14380c87da0cb8dfce7c92d0fb"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:93bed8a8084544c6efe8856c362af08a23e959340c87a95687fdbe9c9f280c8b"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:69d5856d526802cbda768d3e6246cd0d77450fa2a4bc2ea0ea14f0d972c2894b"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ccad2800dfdff34392448c4bf834be124f10a5bc102f254521d931c1c53c455a"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a880372e2e5dbb9258a4e8ff43f13888039abb9dd6d515f28611c54361bc5644"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c998d0558805860503bc3a595994895ca0f7835e00668dadc673bbf7f5fbfcbe"}, + {file = "yarl-1.15.2-cp313-cp313-win32.whl", hash = "sha256:533a28754e7f7439f217550a497bb026c54072dbe16402b183fdbca2431935a9"}, + {file = "yarl-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:5838f2b79dc8f96fdc44077c9e4e2e33d7089b10788464609df788eb97d03aad"}, + {file = "yarl-1.15.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fbbb63bed5fcd70cd3dd23a087cd78e4675fb5a2963b8af53f945cbbca79ae16"}, + {file = "yarl-1.15.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e2e93b88ecc8f74074012e18d679fb2e9c746f2a56f79cd5e2b1afcf2a8a786b"}, + {file = "yarl-1.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af8ff8d7dc07ce873f643de6dfbcd45dc3db2c87462e5c387267197f59e6d776"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66f629632220a4e7858b58e4857927dd01a850a4cef2fb4044c8662787165cf7"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:833547179c31f9bec39b49601d282d6f0ea1633620701288934c5f66d88c3e50"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2aa738e0282be54eede1e3f36b81f1e46aee7ec7602aa563e81e0e8d7b67963f"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a13a07532e8e1c4a5a3afff0ca4553da23409fad65def1b71186fb867eeae8d"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c45817e3e6972109d1a2c65091504a537e257bc3c885b4e78a95baa96df6a3f8"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:670eb11325ed3a6209339974b276811867defe52f4188fe18dc49855774fa9cf"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:d417a4f6943112fae3924bae2af7112562285848d9bcee737fc4ff7cbd450e6c"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bc8936d06cd53fddd4892677d65e98af514c8d78c79864f418bbf78a4a2edde4"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:954dde77c404084c2544e572f342aef384240b3e434e06cecc71597e95fd1ce7"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5bc0df728e4def5e15a754521e8882ba5a5121bd6b5a3a0ff7efda5d6558ab3d"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b71862a652f50babab4a43a487f157d26b464b1dedbcc0afda02fd64f3809d04"}, + {file = "yarl-1.15.2-cp38-cp38-win32.whl", hash = "sha256:63eab904f8630aed5a68f2d0aeab565dcfc595dc1bf0b91b71d9ddd43dea3aea"}, + {file = "yarl-1.15.2-cp38-cp38-win_amd64.whl", hash = "sha256:2cf441c4b6e538ba0d2591574f95d3fdd33f1efafa864faa077d9636ecc0c4e9"}, + {file = "yarl-1.15.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a32d58f4b521bb98b2c0aa9da407f8bd57ca81f34362bcb090e4a79e9924fefc"}, + {file = "yarl-1.15.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:766dcc00b943c089349d4060b935c76281f6be225e39994c2ccec3a2a36ad627"}, + {file = "yarl-1.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bed1b5dbf90bad3bfc19439258c97873eab453c71d8b6869c136346acfe497e7"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed20a4bdc635f36cb19e630bfc644181dd075839b6fc84cac51c0f381ac472e2"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d538df442c0d9665664ab6dd5fccd0110fa3b364914f9c85b3ef9b7b2e157980"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c6cf1d92edf936ceedc7afa61b07e9d78a27b15244aa46bbcd534c7458ee1b"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce44217ad99ffad8027d2fde0269ae368c86db66ea0571c62a000798d69401fb"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47a6000a7e833ebfe5886b56a31cb2ff12120b1efd4578a6fcc38df16cc77bd"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e52f77a0cd246086afde8815039f3e16f8d2be51786c0a39b57104c563c5cbb0"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:f9ca0e6ce7774dc7830dc0cc4bb6b3eec769db667f230e7c770a628c1aa5681b"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:136f9db0f53c0206db38b8cd0c985c78ded5fd596c9a86ce5c0b92afb91c3a19"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:173866d9f7409c0fb514cf6e78952e65816600cb888c68b37b41147349fe0057"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:6e840553c9c494a35e449a987ca2c4f8372668ee954a03a9a9685075228e5036"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:458c0c65802d816a6b955cf3603186de79e8fdb46d4f19abaec4ef0a906f50a7"}, + {file = "yarl-1.15.2-cp39-cp39-win32.whl", hash = "sha256:5b48388ded01f6f2429a8c55012bdbd1c2a0c3735b3e73e221649e524c34a58d"}, + {file = "yarl-1.15.2-cp39-cp39-win_amd64.whl", hash = "sha256:81dadafb3aa124f86dc267a2168f71bbd2bfb163663661ab0038f6e4b8edb810"}, + {file = "yarl-1.15.2-py3-none-any.whl", hash = "sha256:0d3105efab7c5c091609abacad33afff33bdff0035bece164c98bcf5a85ef90a"}, + {file = "yarl-1.15.2.tar.gz", hash = "sha256:a39c36f4218a5bb668b4f06874d676d35a035ee668e6e7e3538835c703634b84"}, ] [package.dependencies] @@ -9718,4 +9799,4 @@ server = ["fastapi", "pydantic-settings", "uvicorn"] [metadata] lock-version = "2.0" python-versions = "^3.10, <3.12" -content-hash = "16ba24706b3b4263bf15b895a33d33a716d64cd95003eb76f8a016734e4c7b35" +content-hash = "3e9ebca70d7ffd424d86f8bbbefe6d9fe6993f8bd9067fd4cb4e996e7bb64ac6" diff --git a/pyproject.toml b/pyproject.toml index f22670d..706e8bd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,7 @@ lxml = "^5.2.2" openai = "^1.12.0" cryptography = "^43.0.0" setuptools = "^73.0.1" +tenacity = "^9.0.0" # desktop actions pillow = "^10.2.0" @@ -118,5 +119,5 @@ lint.ignore = ["E731"] exclude = ["docs/"] [[tool.mypy.overrides]] -module = ["dill", "easyocr"] +module = ["dill", "easyocr", "google.generativeai.*"] ignore_missing_imports = true diff --git a/test/agents/backend_models/test_camel_model.py b/test/agents/backend_models/test_camel_model.py index f1239ba..6ecf1cc 100644 --- a/test/agents/backend_models/test_camel_model.py +++ b/test/agents/backend_models/test_camel_model.py @@ -14,16 +14,19 @@ import pytest from crab import action -from crab.agents.backend_models import CamelModel +from crab.agents.backend_models import BackendModelConfig, create_backend_model @pytest.fixture def camel_model(): - return CamelModel( - model_platform="openai", - model="gpt-4o", - parameters={"max_tokens": 3000}, - history_messages_len=1, + return create_backend_model( + BackendModelConfig( + model_class="camel", + model_name="gpt-4o", + model_platform="openai", + parameters={"max_tokens": 3000}, + history_messages_len=1, + ) ) diff --git a/test/agents/backend_models/test_claude_model.py b/test/agents/backend_models/test_claude_model.py index ace602a..f8e361a 100644 --- a/test/agents/backend_models/test_claude_model.py +++ b/test/agents/backend_models/test_claude_model.py @@ -14,17 +14,20 @@ import pytest from crab import MessageType, action -from crab.agents.backend_models.claude_model import ClaudeModel +from crab.agents.backend_models import BackendModelConfig, create_backend_model # TODO: Add mock data @pytest.fixture def claude_model_text(): - return ClaudeModel( - model="claude-3-opus-20240229", - parameters={"max_tokens": 3000}, - history_messages_len=1, + return create_backend_model( + BackendModelConfig( + model_class="claude", + model_name="claude-3-opus-20240229", + parameters={"max_tokens": 3000}, + history_messages_len=1, + ) ) @@ -71,8 +74,8 @@ def test_action_chat(claude_model_text): 0, ) output = claude_model_text.chat(message) - assert output.message is None assert len(output.action_list) == 1 - assert output.action_list[0].arguments == {"a": 10, "b": 15} + args = output.action_list[0].arguments + assert args["a"] + args["b"] == 25 assert output.action_list[0].name == "add" assert claude_model_text.token_usage > 0 diff --git a/test/agents/backend_models/test_gemini_model.py b/test/agents/backend_models/test_gemini_model.py index 86ece01..1ab7877 100644 --- a/test/agents/backend_models/test_gemini_model.py +++ b/test/agents/backend_models/test_gemini_model.py @@ -14,17 +14,21 @@ import pytest from crab import MessageType, action -from crab.agents.backend_models.gemini_model import GeminiModel +from crab.agents.backend_models import BackendModelConfig, create_backend_model # TODO: Add mock data @pytest.fixture def gemini_model_text(): - return GeminiModel( - model="gemini-1.5-pro-latest", - parameters={"max_tokens": 3000}, - history_messages_len=1, + return create_backend_model( + BackendModelConfig( + model_class="gemini", + model_name="gemini-1.5-pro-latest", + parameters={"max_tokens": 3000}, + history_messages_len=1, + tool_call_required=False, + ) ) diff --git a/test/agents/backend_models/test_openai_model.py b/test/agents/backend_models/test_openai_model.py index 51e56ab..57c9b72 100644 --- a/test/agents/backend_models/test_openai_model.py +++ b/test/agents/backend_models/test_openai_model.py @@ -18,10 +18,8 @@ from openai.types.chat.chat_completion_message_tool_call import Function from crab import action -from crab.agents.backend_models.openai_model import ( - MessageType, - OpenAIModel, -) +from crab.agents.backend_models import BackendModelConfig, create_backend_model +from crab.agents.backend_models.openai_model import MessageType # Mock data for the OpenAI API response openai_mock_response = MagicMock( @@ -91,10 +89,14 @@ @pytest.fixture def openai_model_text(): os.environ["OPENAI_API_KEY"] = "MOCK" - return OpenAIModel( - model="gpt-4o", - parameters={"max_tokens": 3000}, - history_messages_len=1, + return create_backend_model( + BackendModelConfig( + model_class="openai", + model_name="gpt-4o", + parameters={"max_tokens": 3000}, + history_messages_len=1, + tool_call_required=False, + ) ) diff --git a/test/agents/policies/test_multi_agent_by_func.py b/test/agents/policies/test_multi_agent_by_func.py index d319488..b7e31af 100644 --- a/test/agents/policies/test_multi_agent_by_func.py +++ b/test/agents/policies/test_multi_agent_by_func.py @@ -14,15 +14,16 @@ import pytest from crab import create_benchmark -from crab.agents.backend_models.openai_model import OpenAIModel +from crab.agents.backend_models import BackendModelConfig from crab.agents.policies.multi_agent_by_func import MultiAgentByFuncPolicy from crab.benchmarks.template import multienv_template_benchmark_config @pytest.fixture def policy_fixture(): - model = OpenAIModel( - model="gpt-4o", + model = BackendModelConfig( + model_class="openai", + model_name="gpt-4o", parameters={"max_tokens": 3000}, history_messages_len=1, ) @@ -30,9 +31,11 @@ def policy_fixture(): benchmark = create_benchmark(benchmark_config) task, action_spaces = benchmark.start_task("0") policy = MultiAgentByFuncPolicy( - task_description=task.description, main_agent_model_backend=model, tool_agent_model_backend=model, + ) + policy.reset( + task_description=task.description, action_spaces=action_spaces, env_descriptions=benchmark.get_env_descriptions(), ) diff --git a/test/agents/policies/test_mutli_agent_by_env.py b/test/agents/policies/test_mutli_agent_by_env.py index 1f1e791..318e677 100644 --- a/test/agents/policies/test_mutli_agent_by_env.py +++ b/test/agents/policies/test_mutli_agent_by_env.py @@ -14,15 +14,16 @@ import pytest from crab import create_benchmark -from crab.agents.backend_models.openai_model import OpenAIModel +from crab.agents.backend_models import BackendModelConfig from crab.agents.policies.multi_agent_by_env import MultiAgentByEnvPolicy from crab.benchmarks.template import multienv_template_benchmark_config @pytest.fixture def policy_fixture(): - model = OpenAIModel( - model="gpt-4o", + model = BackendModelConfig( + model_class="openai", + model_name="gpt-4o", parameters={"max_tokens": 3000}, history_messages_len=1, ) @@ -30,9 +31,11 @@ def policy_fixture(): benchmark = create_benchmark(benchmark_config) task, action_spaces = benchmark.start_task("0") policy = MultiAgentByEnvPolicy( - task_description=task.description, main_agent_model_backend=model, env_agent_model_backend=model, + ) + policy.reset( + task_description=task.description, action_spaces=action_spaces, env_descriptions=benchmark.get_env_descriptions(), ) diff --git a/test/agents/policies/test_single_agent.py b/test/agents/policies/test_single_agent.py index 56f0bfa..440893c 100644 --- a/test/agents/policies/test_single_agent.py +++ b/test/agents/policies/test_single_agent.py @@ -26,7 +26,7 @@ ) from crab import create_benchmark -from crab.agents.backend_models.openai_model import OpenAIModel +from crab.agents.backend_models import BackendModelConfig from crab.agents.policies.single_agent import SingleAgentPolicy from crab.benchmarks.template import multienv_template_benchmark_config @@ -75,8 +75,9 @@ @pytest.fixture def policy_fixture(): os.environ["OPENAI_API_KEY"] = "MOCK" - model = OpenAIModel( - model="gpt-4o", + model = BackendModelConfig( + model_class="openai", + model_name="gpt-4o", parameters={"max_tokens": 3000}, history_messages_len=1, )