From 8268d5e72b62024cf6aead58c0a920e7fc93b3db Mon Sep 17 00:00:00 2001 From: Hao Zhu Date: Thu, 13 Jun 2024 23:47:14 -0400 Subject: [PATCH 01/23] Update server.py (#94) (#97) * Update server.py * Update mypy.yml * Update tests.yml * Update parallel.py Co-authored-by: Armaan Khetarpaul --- .github/workflows/mypy.yml | 11 ++++++++++- .github/workflows/tests.yml | 11 ++++++++++- sotopia/envs/parallel.py | 4 ++-- sotopia/server.py | 4 ++-- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml index aea5b947b..ac47a9fc6 100644 --- a/.github/workflows/mypy.yml +++ b/.github/workflows/mypy.yml @@ -1,5 +1,14 @@ name: Mypy -on: [push] +on: + push: + branches: + - main + - release + - dev + pull_request: + branches: + - main + - release jobs: Static-Type-Checking: diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c0a430b89..c7ac3e9d2 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,5 +1,14 @@ name: Pytest -on: [push] +on: + push: + branches: + - main + - release + - dev + pull_request: + branches: + - main + - release jobs: Pytest: diff --git a/sotopia/envs/parallel.py b/sotopia/envs/parallel.py index 32120f78d..199be857d 100644 --- a/sotopia/envs/parallel.py +++ b/sotopia/envs/parallel.py @@ -127,7 +127,7 @@ def __init__( available_action_types: set[ActionType] = set( ["none", "speak", "non-verbal communication", "action", "leave"] ), - action_order: Literal["simutaneous", "round-robin", "random"] = "simutaneous", + action_order: Literal["simultaneous", "round-robin", "random"] = "simultaneous", model_name: str = "gpt-3.5-turbo", evaluators: list[Evaluator] = [], terminal_evaluators: list[Evaluator] = [], @@ -138,7 +138,7 @@ def __init__( Args: available_action_types (set[ActionType], optional): The action types that are available to the agents. Defaults to set(["none", "speak", "non-verbal communication", "action"]). - action_order (Literal["simutaneous", "round-robin", "random"], optional): The order in which the agents take actions. Defaults to "simutaneous". + action_order (Literal["simultaneous", "round-robin", "random"], optional): The order in which the agents take actions. Defaults to "simultaneous". model_name (str, optional): The name of the language model to use. Defaults to "gpt-3.5-turbo". """ super().__init__() diff --git a/sotopia/server.py b/sotopia/server.py index 4f519ec71..9a3347697 100644 --- a/sotopia/server.py +++ b/sotopia/server.py @@ -36,7 +36,7 @@ @beartype def run_sync_server( model_name_dict: dict[str, LLM_Name], - action_order: Literal["simutaneous", "round-robin", "random"], + action_order: Literal["simultaneous", "round-robin", "random"], agents_info: dict[str, dict[str, str]] | None = None, partial_background_file: str | None = None, full_background_file: str | None = None, @@ -232,7 +232,7 @@ async def arun_one_episode( async def run_async_server( model_dict: dict[str, LLM_Name], sampler: BaseSampler[Observation, AgentAction] = BaseSampler(), - action_order: Literal["simutaneous", "round-robin", "random"] = "round-robin", + action_order: Literal["simultaneous", "round-robin", "random"] = "round-robin", env_agent_combo_list: list[EnvAgentCombo[Observation, AgentAction]] = [], omniscient: bool = False, script_like: bool = False, From ac05513f1d8c1f38d4b1549f4c5261f00f43b37d Mon Sep 17 00:00:00 2001 From: Haofei Yu <1125027232@qq.com> Date: Fri, 14 Jun 2024 16:03:02 -0400 Subject: [PATCH 02/23] support concurrency control for workflow (#99) * support agentprofile and environmentprofile serialization * convert json to jsonl * pass pre-commit test * add missing attribute * support other serialization * precommit check * support testing of serialization * support testing of serialization * support testing of serialization * change the data path * fix ruff * support concurrency control * support concurrency control --- .github/workflows/deploy.yml | 1 + .github/workflows/mypy.yml | 5 +++++ .github/workflows/pre-commit.yml | 4 ++++ .github/workflows/publish-to-pypi.yml | 4 ++++ .github/workflows/tests.yml | 5 +++++ 5 files changed, 19 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 7bc94c136..0addd0b08 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -4,6 +4,7 @@ # name: Deploy Next.js site to Pages + on: # Runs on pushes targeting the default branch push: diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml index ac47a9fc6..0886b2921 100644 --- a/.github/workflows/mypy.yml +++ b/.github/workflows/mypy.yml @@ -1,4 +1,9 @@ name: Mypy + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + on: push: branches: diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 4941c638c..02e1282be 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -1,5 +1,9 @@ name: pre-commit +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + on: pull_request: push: diff --git a/.github/workflows/publish-to-pypi.yml b/.github/workflows/publish-to-pypi.yml index ce091d243..875394b32 100644 --- a/.github/workflows/publish-to-pypi.yml +++ b/.github/workflows/publish-to-pypi.yml @@ -8,6 +8,10 @@ name: Upload Python Package +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + on: release: types: [published] diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c7ac3e9d2..0dce55c49 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,4 +1,9 @@ name: Pytest + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + on: push: branches: From f2425433a99ac18dad38830e6f8a5d7b068ffe02 Mon Sep 17 00:00:00 2001 From: Haofei Yu <1125027232@qq.com> Date: Fri, 14 Jun 2024 16:04:03 -0400 Subject: [PATCH 03/23] support dependabot for auto package bump (#98) * support agentprofile and environmentprofile serialization * convert json to jsonl * pass pre-commit test * add missing attribute * support other serialization * precommit check * support testing of serialization * support testing of serialization * support testing of serialization * change the data path * fix ruff * support automatic package bump --- .github/dependabot.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..2775ad7e3 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "pip" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" From 8bff8630c0c3b9dca38b194cacb36c9956b147a3 Mon Sep 17 00:00:00 2001 From: Xuhui Zhou Date: Mon, 17 Jun 2024 08:43:15 -0700 Subject: [PATCH 04/23] Sotopia Benchmark CLI API (#69) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add benchmark social agents * add benchmark agents * Add sotopia_benchmark cli api * fix pre-commit * add evaluator model argument * finish benchmarking * benchmark done * chore: Fix formatting issue in redis_stats.ipynb and cli.py * switch back to LLM_Name * merge main * add together ai * fix naming error * roll back to llama2 * chore: Update langchain-together dependency to version 0.1.2 * use chatopenai for together models * add logging * fix pre-commit * add more logging options * probably fix the event loop closed error: following https://github.com/NVIDIA/NeMo-Guardrails/pull/336 * modify cli; fix model position bug * chore: Update benchmark tag to "benchmark_{model}_final" * Refactor _iterate_all_env_agent_combo_not_in_db function * chore: Update python version to 3.11.2 * change to dict comparison * ignore jsonl * ✨ finish benchmarking script * chore: Refactor server.py and redis_stats.ipynb * add type ignore * push for the eval * Refactor run_async_benchmark_in_batch function * Refactor run_async_benchmark_in_batch function * add doc * precommit fix * pre-commit * refactor * update w feedback * pre commit * chore: Update authors in pyproject.toml and fetch benchmark_agents.json from Hugging Face API * hotfix * chore: Remove unnecessary type hint in benchmark/cli.py --------- Co-authored-by: Hao --- .gitignore | 2 +- docs/pages/benchmark.md | 11 + notebooks/redis_stats.ipynb | 99 +++- poetry.lock | 765 +++++++++++++-------------- pyproject.toml | 5 +- sotopia-chat/chat_server.py | 6 - sotopia/agents/base_agent.py | 1 + sotopia/agents/llm_agent.py | 2 + sotopia/agents/redis_agent.py | 2 + sotopia/benchmark/__init__.py | 3 + sotopia/benchmark/cli.py | 303 +++++++++++ sotopia/envs/evaluators.py | 2 +- sotopia/envs/parallel.py | 1 - sotopia/generation_utils/generate.py | 75 ++- sotopia/server.py | 63 +-- sotopia_conf/server.py | 2 +- 16 files changed, 866 insertions(+), 476 deletions(-) create mode 100644 docs/pages/benchmark.md create mode 100644 sotopia/benchmark/__init__.py create mode 100644 sotopia/benchmark/cli.py diff --git a/.gitignore b/.gitignore index c0f8b63f7..91991f7c0 100644 --- a/.gitignore +++ b/.gitignore @@ -137,7 +137,7 @@ data/* deprecated/* *.csv - +*.jsonl #backup backup/* diff --git a/docs/pages/benchmark.md b/docs/pages/benchmark.md new file mode 100644 index 000000000..368432e18 --- /dev/null +++ b/docs/pages/benchmark.md @@ -0,0 +1,11 @@ +# Benchmark your model as a social agent in Sotopia + +``` +sotopia_benchmark --model= +``` +or + +``` +python sotopia/benchmark/cli.py --model= +``` +Currently this script would run over 100 simulations on the Sotopia Hard tasks. And the partner model is fixed to be `meta-llama/Llama-3-70b-chat-hf` diff --git a/notebooks/redis_stats.ipynb b/notebooks/redis_stats.ipynb index 5ca616e25..e4c710eb4 100644 --- a/notebooks/redis_stats.ipynb +++ b/notebooks/redis_stats.ipynb @@ -183,7 +183,8 @@ "metadata": {}, "source": [ "## EnvAgentComboStorage\n", - "\n", + "Identify the combination of environment and agent that is used in the episodes.\n", + "Once we have the combination, we can use it to start the simulation.\n", "Combo is a combination of Environment and two agents." ] }, @@ -204,9 +205,99 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Episode Log\n", + "## EnvironmentList\n", + "Store a list of special environments (e.g., sotopia hard) that can be used to start certain simulations. Agent index is used to identify the special agent in the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sotopia.database.persistent_profile import EnvironmentList\n", + "\n", + "all_list = EnvironmentList.all_pks()\n", + "all_list = list(all_list)\n", + "print(len(all_list))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sotopia.samplers import ConstraintBasedSampler\n", + "from sotopia.messages import AgentAction, Observation\n", + "from sotopia.agents import LLMAgent\n", + "import json\n", + "# In this example, we will demonstrate using the EnvironmentList class to sample a list of EnvAgentComboStorage and serialize it to a json file that can be used for sharing with others for benchmarking purposes.\n", + "\n", + "\n", + "def _sample_env_agent_combo_and_push_to_db(env_id: str) -> list[EnvAgentComboStorage]:\n", + " combo_list = []\n", + " sampler = ConstraintBasedSampler[Observation, AgentAction](env_candidates=[env_id])\n", + " env_agent_combo_list = list(\n", + " sampler.sample(agent_classes=[LLMAgent] * 2, replacement=False, size=10)\n", + " )\n", + " for env, agent in env_agent_combo_list:\n", + " combo = EnvAgentComboStorage(\n", + " env_id=env.profile.pk,\n", + " agent_ids=[agent[0].profile.pk, agent[1].profile.pk],\n", + " )\n", + " combo_list.append(combo)\n", + " return combo_list\n", + "\n", + "\n", + "# First we will extrat the hard environments from the EnvironmentList\n", + "hard_envs = EnvironmentList.get(\"01HAK34YPB1H1RWXQDASDKHSNS\").environments\n", + "print(len(hard_envs))\n", + "hard_envs_set = set(hard_envs)\n", + "\n", + "# Next we will sample 10 EnvAgentComboStorage from each hard environment\n", + "final_list_for_benchmark_agents = []\n", + "for env in hard_envs_set:\n", + " combo_list = EnvAgentComboStorage.find(EnvAgentComboStorage.env_id == env).all()\n", + " print(len(combo_list))\n", + " final_list_for_benchmark_agents.extend(combo_list)\n", + "\n", + "# Finally we will serialize the list to a json file\n", + "with open(\"../data/benchmark_agents.json\", \"w\") as f:\n", + " json.dump(\n", + " [combo.dict() for combo in final_list_for_benchmark_agents],\n", + " f,\n", + " indent=4,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "EnvironmentList.get(\"01HAK34YPB1H1RWXQDASDKHSNS\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Episode Log" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# find episode log by tag\n", + "Episodes = EpisodeLog.find(EpisodeLog.tag == \"aug20_gpt4_llama-2-70b-chat_zqi2\").all()\n", + "len(Episodes) ## Episode Log\n", "\n", - "Episodelog stores the social conversation between two agents in an environment." + "## Episodelog stores the social conversation between two agents in an environment." ] }, { @@ -289,7 +380,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.11.2" } }, "nbformat": 4, diff --git a/poetry.lock b/poetry.lock index 3fb7d9cc2..9d2d55df7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "absl-py" @@ -148,13 +148,13 @@ vertex = ["google-auth (>=2,<3)"] [[package]] name = "anyio" -version = "4.3.0" +version = "4.4.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, - {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, ] [package.dependencies] @@ -247,17 +247,17 @@ test-tox-coverage = ["coverage (>=5.5)"] [[package]] name = "boto3" -version = "1.34.113" +version = "1.34.126" description = "The AWS SDK for Python" optional = true python-versions = ">=3.8" files = [ - {file = "boto3-1.34.113-py3-none-any.whl", hash = "sha256:7e59f0a848be477a4c98a90e7a18a0e284adfb643f7879d2b303c5f493661b7a"}, - {file = "boto3-1.34.113.tar.gz", hash = "sha256:009cd143509f2ff4c37582c3f45d50f28c95eed68e8a5c36641206bdb597a9ea"}, + {file = "boto3-1.34.126-py3-none-any.whl", hash = "sha256:7f676daef674fe74f34ce4063228eccc6e60c811f574720e31f230296c4bf29a"}, + {file = "boto3-1.34.126.tar.gz", hash = "sha256:7e8418b47dd43954a9088d504541bed8a42b6d06e712d02befba134c1c4d7c6d"}, ] [package.dependencies] -botocore = ">=1.34.113,<1.35.0" +botocore = ">=1.34.126,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -266,25 +266,22 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.113" +version = "1.34.126" description = "Low-level, data-driven core of boto 3." optional = true python-versions = ">=3.8" files = [ - {file = "botocore-1.34.113-py3-none-any.whl", hash = "sha256:8ca87776450ef41dd25c327eb6e504294230a5756940d68bcfdedc4a7cdeca97"}, - {file = "botocore-1.34.113.tar.gz", hash = "sha256:449912ba3c4ded64f21d09d428146dd9c05337b2a112e15511bf2c4888faae79"}, + {file = "botocore-1.34.126-py3-none-any.whl", hash = "sha256:7eff883c638fe30e0b036789df32d851e093d12544615a3b90062b42ac85bdbc"}, + {file = "botocore-1.34.126.tar.gz", hash = "sha256:7a8ccb6a7c02456757a984a3a44331b6f51c94cb8b9b287cd045122fd177a4b0"}, ] [package.dependencies] jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" -urllib3 = [ - {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, - {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, -] +urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} [package.extras] -crt = ["awscrt (==0.20.9)"] +crt = ["awscrt (==0.20.11)"] [[package]] name = "cachetools" @@ -299,13 +296,13 @@ files = [ [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.6.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, ] [[package]] @@ -559,43 +556,43 @@ test = ["pytest"] [[package]] name = "cryptography" -version = "42.0.7" +version = "42.0.8" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, - {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, - {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, - {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, - {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, - {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, - {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, + {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, + {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, + {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, + {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, + {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, + {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, ] [package.dependencies] @@ -613,13 +610,13 @@ test-randomorder = ["pytest-randomly"] [[package]] name = "dataclasses-json" -version = "0.6.6" +version = "0.6.7" description = "Easily serialize dataclasses to and from JSON." optional = false python-versions = "<4.0,>=3.7" files = [ - {file = "dataclasses_json-0.6.6-py3-none-any.whl", hash = "sha256:e54c5c87497741ad454070ba0ed411523d46beb5da102e221efb873801b0ba85"}, - {file = "dataclasses_json-0.6.6.tar.gz", hash = "sha256:0c09827d26fffda27f1be2fed7a7a01a29c5ddcd2eb6393ad5ebf9d77e9deae8"}, + {file = "dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a"}, + {file = "dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0"}, ] [package.dependencies] @@ -628,37 +625,37 @@ typing-inspect = ">=0.4.0,<1" [[package]] name = "datasets" -version = "2.19.1" +version = "2.20.0" description = "HuggingFace community-driven open-source library of datasets" optional = true python-versions = ">=3.8.0" files = [ - {file = "datasets-2.19.1-py3-none-any.whl", hash = "sha256:f7a78d15896f45004ccac1c298f3c7121f92f91f6f2bfbd4e4f210f827e6e411"}, - {file = "datasets-2.19.1.tar.gz", hash = "sha256:0df9ef6c5e9138cdb996a07385220109ff203c204245578b69cca905eb151d3a"}, + {file = "datasets-2.20.0-py3-none-any.whl", hash = "sha256:76ac02e3bdfff824492e20678f0b6b1b6d080515957fe834b00c2ba8d6b18e5e"}, + {file = "datasets-2.20.0.tar.gz", hash = "sha256:3c4dbcd27e0f642b9d41d20ff2efa721a5e04b32b2ca4009e0fc9139e324553f"}, ] [package.dependencies] aiohttp = "*" dill = ">=0.3.0,<0.3.9" filelock = "*" -fsspec = {version = ">=2023.1.0,<=2024.3.1", extras = ["http"]} +fsspec = {version = ">=2023.1.0,<=2024.5.0", extras = ["http"]} huggingface-hub = ">=0.21.2" multiprocess = "*" numpy = ">=1.17" packaging = "*" pandas = "*" -pyarrow = ">=12.0.0" +pyarrow = ">=15.0.0" pyarrow-hotfix = "*" pyyaml = ">=5.1" -requests = ">=2.19.0" -tqdm = ">=4.62.1" +requests = ">=2.32.2" +tqdm = ">=4.66.3" xxhash = "*" [package.extras] apache-beam = ["apache-beam (>=2.26.0)"] audio = ["librosa", "soundfile (>=0.12.1)"] benchmarks = ["tensorflow (==2.12.0)", "torch (==2.0.1)", "transformers (==4.30.1)"] -dev = ["Pillow (>=6.2.1)", "absl-py", "apache-beam (>=2.26.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.6.0)", "tiktoken", "torch", "torch (>=2.0.0)", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] +dev = ["Pillow (>=9.4.0)", "absl-py", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.6.0)", "tiktoken", "torch", "torch (>=2.0.0)", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] docs = ["s3fs", "tensorflow (>=2.6.0)", "torch", "transformers"] jax = ["jax (>=0.3.14)", "jaxlib (>=0.3.14)"] metrics-tests = ["Werkzeug (>=1.0.1)", "accelerate", "bert-score (>=0.3.6)", "jiwer", "langdetect", "mauve-text", "nltk", "requests-file (>=1.5.1)", "rouge-score", "sacrebleu", "sacremoses", "scikit-learn", "scipy", "sentencepiece", "seqeval", "six (>=1.15.0,<1.16.0)", "spacy (>=3.0.0)", "texttable (>=1.6.3)", "tldextract", "tldextract (>=3.1.0)", "toml (>=0.10.1)", "typer (<0.5.0)"] @@ -666,9 +663,9 @@ quality = ["ruff (>=0.3.0)"] s3 = ["s3fs"] tensorflow = ["tensorflow (>=2.6.0)"] tensorflow-gpu = ["tensorflow (>=2.6.0)"] -tests = ["Pillow (>=6.2.1)", "absl-py", "apache-beam (>=2.26.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.6.0)", "tiktoken", "torch (>=2.0.0)", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] +tests = ["Pillow (>=9.4.0)", "absl-py", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.6.0)", "tiktoken", "torch (>=2.0.0)", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] torch = ["torch"] -vision = ["Pillow (>=6.2.1)"] +vision = ["Pillow (>=9.4.0)"] [[package]] name = "debugpy" @@ -869,18 +866,18 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.14.0" +version = "3.15.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, - {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, + {file = "filelock-3.15.1-py3-none-any.whl", hash = "sha256:71b3102950e91dfc1bb4209b64be4dc8854f40e5f534428d8684f953ac847fac"}, + {file = "filelock-3.15.1.tar.gz", hash = "sha256:58a2549afdf9e02e10720eaa4d4470f56386d7a6f72edd7d0596337af8ed7ad8"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] @@ -971,13 +968,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.3.1" +version = "2024.5.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512"}, - {file = "fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9"}, + {file = "fsspec-2024.5.0-py3-none-any.whl", hash = "sha256:e0fdbc446d67e182f49a70b82cf7889028a63588fde6b222521f10937b2b670c"}, + {file = "fsspec-2024.5.0.tar.gz", hash = "sha256:1d021b0b0f933e3b3029ed808eb400c08ba101ca2de4b3483fbc9ca23fcee94a"}, ] [package.dependencies] @@ -988,7 +985,7 @@ abfs = ["adlfs"] adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] -devel = ["pytest", "pytest-cov"] +dev = ["pre-commit", "ruff"] dropbox = ["dropbox", "dropboxdrivefs", "requests"] full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] fuse = ["fusepy"] @@ -1005,6 +1002,9 @@ s3 = ["s3fs"] sftp = ["paramiko"] smb = ["smbprotocol"] ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +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]] @@ -1058,12 +1058,12 @@ files = [ google-auth = ">=2.14.1,<3.0.dev0" googleapis-common-protos = ">=1.56.2,<2.0.dev0" grpcio = [ - {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, ] grpcio-status = [ - {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, ] proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" @@ -1076,13 +1076,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.130.0" +version = "2.133.0" description = "Google API Client Library for Python" optional = true python-versions = ">=3.7" files = [ - {file = "google-api-python-client-2.130.0.tar.gz", hash = "sha256:2bba3122b82a649c677b8a694b8e2bbf2a5fbf3420265caf3343bb88e2e9f0ae"}, - {file = "google_api_python_client-2.130.0-py2.py3-none-any.whl", hash = "sha256:7d45a28d738628715944a9c9d73e8696e7e03ac50b7de87f5e3035cefa94ed3a"}, + {file = "google-api-python-client-2.133.0.tar.gz", hash = "sha256:293092905b66a046d3187a99ac454e12b00cc2c70444f26eb2f1f9c1a82720b4"}, + {file = "google_api_python_client-2.133.0-py2.py3-none-any.whl", hash = "sha256:396fe676ea0dfed066654dcf9f8dea77a1342f9d9bb23bb88e45b7b81e773926"}, ] [package.dependencies] @@ -1094,13 +1094,13 @@ uritemplate = ">=3.0.1,<5" [[package]] name = "google-auth" -version = "2.29.0" +version = "2.30.0" description = "Google Authentication Library" optional = true python-versions = ">=3.7" files = [ - {file = "google-auth-2.29.0.tar.gz", hash = "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"}, - {file = "google_auth-2.29.0-py2.py3-none-any.whl", hash = "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415"}, + {file = "google-auth-2.30.0.tar.gz", hash = "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688"}, + {file = "google_auth-2.30.0-py2.py3-none-any.whl", hash = "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5"}, ] [package.dependencies] @@ -1155,17 +1155,17 @@ dev = ["Pillow", "absl-py", "black", "ipython", "nose2", "pandas", "pytype", "py [[package]] name = "googleapis-common-protos" -version = "1.63.0" +version = "1.63.1" description = "Common protobufs used in Google APIs" optional = true python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.63.0.tar.gz", hash = "sha256:17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e"}, - {file = "googleapis_common_protos-1.63.0-py2.py3-none-any.whl", hash = "sha256:ae45f75702f7c08b541f750854a678bd8f534a1a6bace6afe975f1d0a82d6632"}, + {file = "googleapis-common-protos-1.63.1.tar.gz", hash = "sha256:c6442f7a0a6b2a80369457d79e6672bb7dcbaab88e0848302497e3ec80780a6a"}, + {file = "googleapis_common_protos-1.63.1-py2.py3-none-any.whl", hash = "sha256:0e1c2cdfcbc354b76e4a211a35ea35d6926a835cba1377073c4861db904a1877"}, ] [package.dependencies] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" [package.extras] grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] @@ -1262,61 +1262,61 @@ typing-extensions = ">=4.7,<5" [[package]] name = "grpcio" -version = "1.64.0" +version = "1.64.1" description = "HTTP/2-based RPC framework" optional = true python-versions = ">=3.8" files = [ - {file = "grpcio-1.64.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:3b09c3d9de95461214a11d82cc0e6a46a6f4e1f91834b50782f932895215e5db"}, - {file = "grpcio-1.64.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:7e013428ab472892830287dd082b7d129f4d8afef49227a28223a77337555eaa"}, - {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:02cc9cc3f816d30f7993d0d408043b4a7d6a02346d251694d8ab1f78cc723e7e"}, - {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f5de082d936e0208ce8db9095821361dfa97af8767a6607ae71425ac8ace15c"}, - {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b7bf346391dffa182fba42506adf3a84f4a718a05e445b37824136047686a1"}, - {file = "grpcio-1.64.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b2cbdfba18408389a1371f8c2af1659119e1831e5ed24c240cae9e27b4abc38d"}, - {file = "grpcio-1.64.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca4f15427d2df592e0c8f3d38847e25135e4092d7f70f02452c0e90d6a02d6d"}, - {file = "grpcio-1.64.0-cp310-cp310-win32.whl", hash = "sha256:7c1f5b2298244472bcda49b599be04579f26425af0fd80d3f2eb5fd8bc84d106"}, - {file = "grpcio-1.64.0-cp310-cp310-win_amd64.whl", hash = "sha256:73f84f9e5985a532e47880b3924867de16fa1aa513fff9b26106220c253c70c5"}, - {file = "grpcio-1.64.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2a18090371d138a57714ee9bffd6c9c9cb2e02ce42c681aac093ae1e7189ed21"}, - {file = "grpcio-1.64.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:59c68df3a934a586c3473d15956d23a618b8f05b5e7a3a904d40300e9c69cbf0"}, - {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b52e1ec7185512103dd47d41cf34ea78e7a7361ba460187ddd2416b480e0938c"}, - {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d598b5d5e2c9115d7fb7e2cb5508d14286af506a75950762aa1372d60e41851"}, - {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01615bbcae6875eee8091e6b9414072f4e4b00d8b7e141f89635bdae7cf784e5"}, - {file = "grpcio-1.64.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0b2dfe6dcace264807d9123d483d4c43274e3f8c39f90ff51de538245d7a4145"}, - {file = "grpcio-1.64.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7f17572dc9acd5e6dfd3014d10c0b533e9f79cd9517fc10b0225746f4c24b58e"}, - {file = "grpcio-1.64.0-cp311-cp311-win32.whl", hash = "sha256:6ec5ed15b4ffe56e2c6bc76af45e6b591c9be0224b3fb090adfb205c9012367d"}, - {file = "grpcio-1.64.0-cp311-cp311-win_amd64.whl", hash = "sha256:597191370951b477b7a1441e1aaa5cacebeb46a3b0bd240ec3bb2f28298c7553"}, - {file = "grpcio-1.64.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:1ce4cd5a61d4532651079e7aae0fedf9a80e613eed895d5b9743e66b52d15812"}, - {file = "grpcio-1.64.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:650a8150a9b288f40d5b7c1d5400cc11724eae50bd1f501a66e1ea949173649b"}, - {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:8de0399b983f8676a7ccfdd45e5b2caec74a7e3cc576c6b1eecf3b3680deda5e"}, - {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46b8b43ba6a2a8f3103f103f97996cad507bcfd72359af6516363c48793d5a7b"}, - {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a54362f03d4dcfae63be455d0a7d4c1403673498b92c6bfe22157d935b57c7a9"}, - {file = "grpcio-1.64.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1f8ea18b928e539046bb5f9c124d717fbf00cc4b2d960ae0b8468562846f5aa1"}, - {file = "grpcio-1.64.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c56c91bd2923ddb6e7ed28ebb66d15633b03e0df22206f22dfcdde08047e0a48"}, - {file = "grpcio-1.64.0-cp312-cp312-win32.whl", hash = "sha256:874c741c8a66f0834f653a69e7e64b4e67fcd4a8d40296919b93bab2ccc780ba"}, - {file = "grpcio-1.64.0-cp312-cp312-win_amd64.whl", hash = "sha256:0da1d921f8e4bcee307aeef6c7095eb26e617c471f8cb1c454fd389c5c296d1e"}, - {file = "grpcio-1.64.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:c46fb6bfca17bfc49f011eb53416e61472fa96caa0979b4329176bdd38cbbf2a"}, - {file = "grpcio-1.64.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3d2004e85cf5213995d09408501f82c8534700d2babeb81dfdba2a3bff0bb396"}, - {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:6d5541eb460d73a07418524fb64dcfe0adfbcd32e2dac0f8f90ce5b9dd6c046c"}, - {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f279ad72dd7d64412e10f2443f9f34872a938c67387863c4cd2fb837f53e7d2"}, - {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85fda90b81da25993aa47fae66cae747b921f8f6777550895fb62375b776a231"}, - {file = "grpcio-1.64.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a053584079b793a54bece4a7d1d1b5c0645bdbee729215cd433703dc2532f72b"}, - {file = "grpcio-1.64.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:579dd9fb11bc73f0de061cab5f8b2def21480fd99eb3743ed041ad6a1913ee2f"}, - {file = "grpcio-1.64.0-cp38-cp38-win32.whl", hash = "sha256:23b6887bb21d77649d022fa1859e05853fdc2e60682fd86c3db652a555a282e0"}, - {file = "grpcio-1.64.0-cp38-cp38-win_amd64.whl", hash = "sha256:753cb58683ba0c545306f4e17dabf468d29cb6f6b11832e1e432160bb3f8403c"}, - {file = "grpcio-1.64.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:2186d76a7e383e1466e0ea2b0febc343ffeae13928c63c6ec6826533c2d69590"}, - {file = "grpcio-1.64.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0f30596cdcbed3c98024fb4f1d91745146385b3f9fd10c9f2270cbfe2ed7ed91"}, - {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:d9171f025a196f5bcfec7e8e7ffb7c3535f7d60aecd3503f9e250296c7cfc150"}, - {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf4c8daed18ae2be2f1fc7d613a76ee2a2e28fdf2412d5c128be23144d28283d"}, - {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3550493ac1d23198d46dc9c9b24b411cef613798dc31160c7138568ec26bc9b4"}, - {file = "grpcio-1.64.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3161a8f8bb38077a6470508c1a7301cd54301c53b8a34bb83e3c9764874ecabd"}, - {file = "grpcio-1.64.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e8fabe2cc57a369638ab1ad8e6043721014fdf9a13baa7c0e35995d3a4a7618"}, - {file = "grpcio-1.64.0-cp39-cp39-win32.whl", hash = "sha256:31890b24d47b62cc27da49a462efe3d02f3c120edb0e6c46dcc0025506acf004"}, - {file = "grpcio-1.64.0-cp39-cp39-win_amd64.whl", hash = "sha256:5a56797dea8c02e7d3a85dfea879f286175cf4d14fbd9ab3ef2477277b927baa"}, - {file = "grpcio-1.64.0.tar.gz", hash = "sha256:257baf07f53a571c215eebe9679c3058a313fd1d1f7c4eede5a8660108c52d9c"}, + {file = "grpcio-1.64.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502"}, + {file = "grpcio-1.64.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b"}, + {file = "grpcio-1.64.1-cp310-cp310-win32.whl", hash = "sha256:1262402af5a511c245c3ae918167eca57342c72320dffae5d9b51840c4b2f86d"}, + {file = "grpcio-1.64.1-cp310-cp310-win_amd64.whl", hash = "sha256:19264fc964576ddb065368cae953f8d0514ecc6cb3da8903766d9fb9d4554c33"}, + {file = "grpcio-1.64.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:58b1041e7c870bb30ee41d3090cbd6f0851f30ae4eb68228955d973d3efa2e61"}, + {file = "grpcio-1.64.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bbc5b1d78a7822b0a84c6f8917faa986c1a744e65d762ef6d8be9d75677af2ca"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5841dd1f284bd1b3d8a6eca3a7f062b06f1eec09b184397e1d1d43447e89a7ae"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8caee47e970b92b3dd948371230fcceb80d3f2277b3bf7fbd7c0564e7d39068e"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73819689c169417a4f978e562d24f2def2be75739c4bed1992435d007819da1b"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6503b64c8b2dfad299749cad1b595c650c91e5b2c8a1b775380fcf8d2cbba1e9"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1de403fc1305fd96cfa75e83be3dee8538f2413a6b1685b8452301c7ba33c294"}, + {file = "grpcio-1.64.1-cp311-cp311-win32.whl", hash = "sha256:d4d29cc612e1332237877dfa7fe687157973aab1d63bd0f84cf06692f04c0367"}, + {file = "grpcio-1.64.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e56462b05a6f860b72f0fa50dca06d5b26543a4e88d0396259a07dc30f4e5aa"}, + {file = "grpcio-1.64.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:4657d24c8063e6095f850b68f2d1ba3b39f2b287a38242dcabc166453e950c59"}, + {file = "grpcio-1.64.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:62b4e6eb7bf901719fce0ca83e3ed474ae5022bb3827b0a501e056458c51c0a1"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ee73a2f5ca4ba44fa33b4d7d2c71e2c8a9e9f78d53f6507ad68e7d2ad5f64a22"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:198908f9b22e2672a998870355e226a725aeab327ac4e6ff3a1399792ece4762"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39b9d0acaa8d835a6566c640f48b50054f422d03e77e49716d4c4e8e279665a1"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5e42634a989c3aa6049f132266faf6b949ec2a6f7d302dbb5c15395b77d757eb"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1a82e0b9b3022799c336e1fc0f6210adc019ae84efb7321d668129d28ee1efb"}, + {file = "grpcio-1.64.1-cp312-cp312-win32.whl", hash = "sha256:55260032b95c49bee69a423c2f5365baa9369d2f7d233e933564d8a47b893027"}, + {file = "grpcio-1.64.1-cp312-cp312-win_amd64.whl", hash = "sha256:c1a786ac592b47573a5bb7e35665c08064a5d77ab88a076eec11f8ae86b3e3f6"}, + {file = "grpcio-1.64.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:a011ac6c03cfe162ff2b727bcb530567826cec85eb8d4ad2bfb4bd023287a52d"}, + {file = "grpcio-1.64.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a5e771d0252e871ce194d0fdcafd13971f1aae0ddacc5f25615030d5df55c3a2"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3c1b90ab93fed424e454e93c0ed0b9d552bdf1b0929712b094f5ecfe7a23ad"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20405cb8b13fd779135df23fabadc53b86522d0f1cba8cca0e87968587f50650"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0cc79c982ccb2feec8aad0e8fb0d168bcbca85bc77b080d0d3c5f2f15c24ea8f"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a3a035c37ce7565b8f4f35ff683a4db34d24e53dc487e47438e434eb3f701b2a"}, + {file = "grpcio-1.64.1-cp38-cp38-win32.whl", hash = "sha256:1257b76748612aca0f89beec7fa0615727fd6f2a1ad580a9638816a4b2eb18fd"}, + {file = "grpcio-1.64.1-cp38-cp38-win_amd64.whl", hash = "sha256:0a12ddb1678ebc6a84ec6b0487feac020ee2b1659cbe69b80f06dbffdb249122"}, + {file = "grpcio-1.64.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:75dbbf415026d2862192fe1b28d71f209e2fd87079d98470db90bebe57b33179"}, + {file = "grpcio-1.64.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e3d9f8d1221baa0ced7ec7322a981e28deb23749c76eeeb3d33e18b72935ab62"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f8b75f64d5d324c565b263c67dbe4f0af595635bbdd93bb1a88189fc62ed2e5"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c84ad903d0d94311a2b7eea608da163dace97c5fe9412ea311e72c3684925602"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940e3ec884520155f68a3b712d045e077d61c520a195d1a5932c531f11883489"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f10193c69fc9d3d726e83bbf0f3d316f1847c3071c8c93d8090cf5f326b14309"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac15b6c2c80a4d1338b04d42a02d376a53395ddf0ec9ab157cbaf44191f3ffdd"}, + {file = "grpcio-1.64.1-cp39-cp39-win32.whl", hash = "sha256:03b43d0ccf99c557ec671c7dede64f023c7da9bb632ac65dbc57f166e4970040"}, + {file = "grpcio-1.64.1-cp39-cp39-win_amd64.whl", hash = "sha256:ed6091fa0adcc7e4ff944090cf203a52da35c37a130efa564ded02b7aff63bcd"}, + {file = "grpcio-1.64.1.tar.gz", hash = "sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.64.0)"] +protobuf = ["grpcio-tools (>=1.64.1)"] [[package]] name = "grpcio-status" @@ -1348,7 +1348,6 @@ files = [ [package.dependencies] cloudpickle = ">=1.2.0" farama-notifications = ">=0.0.1" -importlib-metadata = {version = ">=4.8.0", markers = "python_version < \"3.10\""} numpy = ">=1.21.0" typing-extensions = ">=4.3.0" @@ -1566,13 +1565,13 @@ files = [ [[package]] name = "huggingface-hub" -version = "0.23.1" +version = "0.23.3" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.23.1-py3-none-any.whl", hash = "sha256:720a5bffd2b1b449deb793da8b0df7a9390a7e238534d5a08c9fbcdecb1dd3cb"}, - {file = "huggingface_hub-0.23.1.tar.gz", hash = "sha256:4f62dbf6ae94f400c6d3419485e52bce510591432a5248a65d0cb72e4d479eb4"}, + {file = "huggingface_hub-0.23.3-py3-none-any.whl", hash = "sha256:22222c41223f1b7c209ae5511d2d82907325a0e3cdbce5f66949d43c598ff3bc"}, + {file = "huggingface_hub-0.23.3.tar.gz", hash = "sha256:1a1118a0b3dea3bab6c325d71be16f5ffe441d32f3ac7c348d6875911b694b5b"}, ] [package.dependencies] @@ -1702,13 +1701,13 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio [[package]] name = "ipython" -version = "8.18.1" +version = "8.25.0" description = "IPython: Productive Interactive Computing" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, - {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, + {file = "ipython-8.25.0-py3-none-any.whl", hash = "sha256:53eee7ad44df903a06655871cbab66d156a051fd86f3ec6750470ac9604ac1ab"}, + {file = "ipython-8.25.0.tar.gz", hash = "sha256:c6ed726a140b6e725b911528f80439c534fac915246af3efc39440a6b0f9d716"}, ] [package.dependencies] @@ -1717,25 +1716,26 @@ decorator = "*" exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" -traitlets = ">=5" -typing-extensions = {version = "*", markers = "python_version < \"3.10\""} +traitlets = ">=5.13.0" +typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} [package.extras] -all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "intersphinx-registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing-extensions"] kernel = ["ipykernel"] +matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] +test = ["pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] [[package]] name = "jedi" @@ -1775,72 +1775,72 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jiter" -version = "0.4.0" +version = "0.4.2" description = "Fast iterable JSON parser." optional = true python-versions = ">=3.8" files = [ - {file = "jiter-0.4.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4aa6226d82a4a4505078c0bd5947bad65399635fc5cd4b226512e41753624edf"}, - {file = "jiter-0.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:947111ac906740a948e7b63799481acd3d5ef666ccb178d146e25718640b7408"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69572ffb4e84ae289a7422b9af4ea123cae2ce0772228859b37d4b26b4bc92ea"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ba6046cbb5d1baa5a781b846f7e5438596a332f249a857d63f86ef5d1d9563b0"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4f346e54602782e66d07df0d1c7389384fd93680052ed6170da2c6dc758409e"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49110ce693f07e97d61089d894cea05a0b9894d5ccc6ac6fc583028726c8c8af"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e358df6fd129f3a4e087539f086355ad0107e5da16dbc8bc857d94222eaeed5"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7eb852ca39a48f3c049def56f0d1771b32e948e4f429a782d14ef4cc64cfd26e"}, - {file = "jiter-0.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:44dc045decb2545bffe2da04ea4c36d9438d3f3d49fc47ed423ea75c352b712e"}, - {file = "jiter-0.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:413adb15372ac63db04373240f40925788e4282c997eeafc2040530049a0a599"}, - {file = "jiter-0.4.0-cp310-none-win32.whl", hash = "sha256:0b48ea71673a97b897e4b94bbc871e62495a5a85f836c9f90712a4c70aa3ef7e"}, - {file = "jiter-0.4.0-cp310-none-win_amd64.whl", hash = "sha256:6a1c84b44afafaf0ba6223679cf17af664b889da14da31d8af3595fd977d96fa"}, - {file = "jiter-0.4.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b2cc498345fa37ca23fbc20271a553aa46e6eb00924600f49b7dc4b2aa8952ee"}, - {file = "jiter-0.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:69f7221ac09ab421abf04f89942026868297c568133998fb181bcf435760cbf3"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef7d01c52f3e5a56ae73af36bd13797dd1a56711eb522748e5e84d15425b3f10"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:39be97d5ce0c4d0dae28c23c03a0af0501a725589427e99763f99c42e18aa402"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eac2ed1ec1e577b92b7ea2d4e6de8aec0c1164defd8af8affdc8ec0f0ec2904a"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6258837d184c92c9cb91c983c310ad7269d41afb49d34f00ca9246e073943a03"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123c2a77b066bf17a4d021e238e8351058cfa56b90ac04f2522d120dc64ea055"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2df939f792c7a40e55f36700417db551b9f6b84d348990fa0f2c608adeb1f11b"}, - {file = "jiter-0.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cb1b09b16d40cf9ba1d11ba11e5b96ad29286a6a1c4ad5e6a2aef5e352a89f5d"}, - {file = "jiter-0.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0efb4208889ebdbf933bf08dbcbc16e64ffd34c8e2b28044ee142789a9dc3a67"}, - {file = "jiter-0.4.0-cp311-none-win32.whl", hash = "sha256:20545ac1b68e7e5b066a1e8347840c9cebdd02ace65faae2e655fc02ec5c915c"}, - {file = "jiter-0.4.0-cp311-none-win_amd64.whl", hash = "sha256:6b300f9887c8e4431cd03a974ea3e4f9958885636003c3864220a9b2d2f8462b"}, - {file = "jiter-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:923432a0563bbae404ff25bb010e348514a69bfab979f2f8119b23b625dbf6d9"}, - {file = "jiter-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab8bb0ec8b97cec4422dc8b37b525442d969244488c805b834609ab0ccd788e2"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b857adb127b9c533907226791eafa79c5038c3eb5a477984994bf7c4715ba518"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2609cc0d1d8d470e921ff9a604afeb4c701bbe13e00bd9834d5aa6e7ea732a9b"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d39e99f8b7df46a119b6f84321f6ba01f16fa46abfa765d44c05c486d8e66829"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:56de8b518ebfe76a70f856741f6de248ce396c50a87acef827b6e8388e3a502d"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:488b7e777be47f67ce1a1f8f8eb907f9bbd81af5c03784a9bab09d025c250233"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ea35e0ecbb5dadd457855eb980dcc548c14cf5341bcd22a43814cb56f2bcc79"}, - {file = "jiter-0.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e1a9e9ee69c80b63951c93226b68d0e955953f64fe758bad2afe7ef7f9016af9"}, - {file = "jiter-0.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:78e2f3cc2a32a21d43ccc5afcf66f5d17e827ccc4e6d21c0b353bdad2c7dcc9c"}, - {file = "jiter-0.4.0-cp312-none-win32.whl", hash = "sha256:eeaa7a2b47a99f4ebbb4142bb58b95617e09f24c87570f6a57d2770687c9ddbe"}, - {file = "jiter-0.4.0-cp312-none-win_amd64.whl", hash = "sha256:8d4a78b385b93ff59a67215d26000fcb4789a388fca3730d1b60fab17fc81e3c"}, - {file = "jiter-0.4.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ebf20a3fac1089ce26963bf04140da0f803d55332ec69d59c5a87cf1a87d29c4"}, - {file = "jiter-0.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d62244ffc6a168187452277adeefb7b2c30170689c6bf543a51e98e8c17ddab7"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40b2cde77446a41cec595739fd168be87edff2428eaf7c3438231224dd0ab7a5"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e51fc0a22021ec8905b9b00a2f7d25756f2ff7a653e35a790a2067ae126b51f6"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a56e6f980b89d7cfe5c43811dcf52d6f37b319428a4540511235dafda9ea7808"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0fec16adab8d3d3d6d74e3711a1f380836ebeab2a20e3f88cfe2ec5094d8b84"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19e3de515801c954e8f1dc1f575282a4a86df9e782d4993ea1ed2be9a8dedaa0"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17e0ad8abf0bb04d81810eaeaab35d2c99b5da11fcd1058e0a389607ff6503b0"}, - {file = "jiter-0.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8dc0132b728f3b3e90ff0d1874504cd49c78f3553bf3745168a7fc0b4cf674e1"}, - {file = "jiter-0.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81a883104aa96e494d3d28eaf7070780d03ecee8ccfdfaf7e4899710340c47f1"}, - {file = "jiter-0.4.0-cp38-none-win32.whl", hash = "sha256:a044c53ab1aaa4af624ac9574181b5bad8e260aea7e03104738156511433deba"}, - {file = "jiter-0.4.0-cp38-none-win_amd64.whl", hash = "sha256:d920035c869053e3d9a0b3ff94384d16a8ef5fde3dea55f97bd29916f6e27554"}, - {file = "jiter-0.4.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:091e978f4e586a2f1c69bf940d45f4e6a23455877172a0ab7d6de04a3b119299"}, - {file = "jiter-0.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:79134b2d601309bcbe3304a262d7d228ad61d53c80883231c637773000a6d683"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c471473e0b05058b5d729ff04271b6d45a575ac8bd9948563268c734b380ac7e"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb84b8930da8b32b0b1fdff9817e2c4b47e8981b5647ad11c4975403416e4112"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f2805e28941751ebfe0948596a64cde4cfb9b84bea5282affd020063e659c96"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42ef59f9e513bf081a8b5c5578933ea9c3a63e559e6e3501a3e72edcd456ff5e"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae12e3906f9e565120ab569de261b738e3a1ec50c40e30c67499e4f893e9a8c"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:264dc1324f45a793bc89af4f653225229eb17bca9ec7107dce6c8fb4fe68d20f"}, - {file = "jiter-0.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9a1c172ec47d846e25881dfbd52438ddb690da4ea04d185e477abd3db6c32f8a"}, - {file = "jiter-0.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ccde31d0bc114aedad0dbd71b7f63ba0f0eecd7ec9ae1926a0ca01c1eb2854e7"}, - {file = "jiter-0.4.0-cp39-none-win32.whl", hash = "sha256:13139b05792fbc13a0f9a5b4c89823ea0874141decae1b8f693f12bb1d28e061"}, - {file = "jiter-0.4.0-cp39-none-win_amd64.whl", hash = "sha256:3a729b2631c6d5551a41069697415fee9659c3eadc9ab87369376ba51930cd00"}, - {file = "jiter-0.4.0.tar.gz", hash = "sha256:68203e02e0419bc3eca717c580c2d8f615aeee1150e2a1fb68d6600a7e52a37c"}, + {file = "jiter-0.4.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c2b003ff58d14f5e182b875acd5177b2367245c19a03be9a2230535d296f7550"}, + {file = "jiter-0.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b48c77c25f094707731cd5bad6b776046846b60a27ee20efc8fadfb10a89415f"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f50ad6b172bde4d45f4d4ea10c49282a337b8bb735afc99763dfa55ea84a743"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95f6001e86f525fbbc9706db2078dc22be078b0950de55b92d37041930f5f940"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16646ef23b62b007de80460d303ebb2d81e355dac9389c787cec87cdd7ffef2f"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b4e847c13b0bf1255c711a92330e7a8cb8b5cdd1e37d7db309627bcdd3367ff"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c536589be60e4c5f2b20fadc4db7e9f55d4c9df3551f29ddf1c4a18dcc9dd54"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3b2763996167830889a854b4ded30bb90897f9b76be78069c50c3ec4540950e"}, + {file = "jiter-0.4.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:675e8ab98c99495091af6b6e9bf2b6353bcf81f25ab6ce27d36127e315b4505d"}, + {file = "jiter-0.4.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e48e43d9d999aaf55f53406b8846ff8cbe3e47ee4b9dc37e5a10a65ce760809f"}, + {file = "jiter-0.4.2-cp310-none-win32.whl", hash = "sha256:881b6e67c50bc36acb3570eda693763c8cd77d590940e06fa6d325d0da52ec1b"}, + {file = "jiter-0.4.2-cp310-none-win_amd64.whl", hash = "sha256:bb8f7b43259efc6add0d721ade2953e064b24e2026d26d979bc09ec080844cef"}, + {file = "jiter-0.4.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:24ad336ac47f274fa83f6fbedcabff9d3387c80f67c66b992688e6a8ba2c47e9"}, + {file = "jiter-0.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fc392a220095730afe365ce1516f2f88bb085a2fd29ea191be9c6e3c71713d9a"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1fdc408de36c81460896de0176f2f7b9f3574dcd35693a0b2c00f4ca34c98e4"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c10ad76722ee6a8c820b0db06a793c08b7d679e5201b9563015bd1e06c959a09"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbb46d1e9c82bba87f0cbda38413e49448a7df35b1e55917124bff9f38974a23"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:194e28ef4b5f3b61408cb2ee6b6dcbcdb0c9063d01b92b01345b7605692849f5"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0a447533eccd62748a727e058efa10a8d7cf1de8ffe1a4d705ecb41dad9090"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5f7704d7260bbb88cca3453951af739589132b26e896a3144fa2dae2263716d7"}, + {file = "jiter-0.4.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:01427458bc9550f2eda09d425755330e7d0eb09adce099577433bebf05d28d59"}, + {file = "jiter-0.4.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:159b8416879c0053b17c352f70b67b749ef5b2924c6154318ecf71918aab0905"}, + {file = "jiter-0.4.2-cp311-none-win32.whl", hash = "sha256:f2445234acfb79048ce1a0d5d0e181abb9afd9e4a29d8d9988fe26cc5773a81a"}, + {file = "jiter-0.4.2-cp311-none-win_amd64.whl", hash = "sha256:e15a65f233b6b0e5ac10ddf3b97ceb18aa9ffba096259961641d78b4ee321bd5"}, + {file = "jiter-0.4.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d61d59521aea9745447ce50f74d39a16ef74ec9d6477d9350d77e75a3d774ad2"}, + {file = "jiter-0.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eef607dc0acc251923427808dbd017f1998ae3c1a0430a261527aa5cbb3a942"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af6bf39954646e374fc47429c656372ac731a6a26b644158a5a84bcdbed33a47"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f509d23606e476852ee46a2b65b5c4ad3905f17424d9cc19c1dffa1c94ba3c6"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59672774daa44ee140aada0c781c82bee4d9ac5e522966186cfb6b3c217d8a51"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a0458efac5afeca254cf557b8a654e17013075a69905c78f88d557f129d871"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8860766d1c293e75c1bb4e25b74fa987e3adf199cac3f5f9e6e49c2bebf092f"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a109f3281b72bbf4921fe43db1005c004a38559ca0b6c4985add81777dfe0a44"}, + {file = "jiter-0.4.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:faa7e667454b77ad2f0ef87db39f4944de759617aadf210ea2b73f26bb24755f"}, + {file = "jiter-0.4.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3512f8b00cafb6780b427cb6282800d2bf8277161d9c917830661bd4ed1d3528"}, + {file = "jiter-0.4.2-cp312-none-win32.whl", hash = "sha256:853b35d508ee5b66d06630473c1c0b7bb5e29bf4785c9d2202437116c94f7e21"}, + {file = "jiter-0.4.2-cp312-none-win_amd64.whl", hash = "sha256:4a3a8197784278eb8b24cb02c45e1cad67c2ce5b5b758adfb19b87f74bbdff9c"}, + {file = "jiter-0.4.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ca2a4d750aed3154b89f2efb148609fc985fad8db739460797aaf9b478acedda"}, + {file = "jiter-0.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0e6c304b3cc6896256727e1fb8991c7179a345eca8224e201795e9cacf4683b0"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cc34ac708ae1750d077e490321761ec4b9a055b994cbdd1d6fbd37099e4aa7b"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8c93383875ab8d2e4f760aaff335b4a12ff32d4f9cf49c4498d657734f611466"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce197ee044add576afca0955b42142dd0312639adb6ebadbdbe4277f2855614f"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a427716813ff65480ca5b5117cfa099f49b49cd38051f8609bd0d5493013ca0"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:479990218353356234669e70fac53e5eb6f739a10db25316171aede2c97d9364"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d35a91ec5ac74cf33234c431505299fa91c0a197c2dbafd47400aca7c69489d4"}, + {file = "jiter-0.4.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b27189847193708c94ad10ca0d891309342ae882725d2187cf5d2db02bde8d1b"}, + {file = "jiter-0.4.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76c255308cd1093fb411a03756b7bb220e48d4a98c30cbc79ed448bf3978e27d"}, + {file = "jiter-0.4.2-cp38-none-win32.whl", hash = "sha256:bb77438060bad49cc251941e6701b31138365c8a0ddaf10cdded2fcc6dd30701"}, + {file = "jiter-0.4.2-cp38-none-win_amd64.whl", hash = "sha256:ce858af19f7ce0d4b51c9f6c0c9d08f1e9dcef1986c5875efd0674a7054292ca"}, + {file = "jiter-0.4.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:6128838a2f357b3921b2a3242d5dc002ae4255ecc8f9f05c20d56d7d2d79c5ad"}, + {file = "jiter-0.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f2420cebb9ba856cb57dcab1d2d8def949b464b0db09c22a4e4dbd52fff7b200"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5d13d8128e853b320e00bb18bd4bb8b136cc0936091dc87633648fc688eb705"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eba5d6e54f149c508ba88677f97d3dc7dd75e9980d234bbac8027ac6db0763a3"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fad5d64af0bc0545237419bf4150d8de56f0bd217434bdd1a59730327252bef"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d179e7bca89cf5719bd761dd37a341ff0f98199ecaa9c14af09792e47e977cc"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36353caee9f103d8ee7bda077f6400505b0f370e27eabcab33a33d21de12a2a6"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dd146c25bce576ca5db64fc7eccb8862af00f1f0e30108796953f12a53660e4c"}, + {file = "jiter-0.4.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:14b7c08cadbcd703041c66dc30e24e17de2f340281cac0e69374223ecf153aa4"}, + {file = "jiter-0.4.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a90f1a8b3d29aea198f8ea2b01148276ced8056e5103f32525266b3d880e65c9"}, + {file = "jiter-0.4.2-cp39-none-win32.whl", hash = "sha256:25b174997c780337b61ae57b1723455eecae9a17a9659044fd3c3b369190063f"}, + {file = "jiter-0.4.2-cp39-none-win_amd64.whl", hash = "sha256:bef62cea18521c5b99368147040c7e560c55098a35c93456f110678a2d34189a"}, + {file = "jiter-0.4.2.tar.gz", hash = "sha256:29b9d44f23f0c05f46d482f4ebf03213ee290d77999525d0975a17f875bf1eea"}, ] [[package]] @@ -1870,13 +1870,13 @@ jsonpointer = ">=1.9" [[package]] name = "jsonpointer" -version = "2.4" +version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +python-versions = ">=3.7" files = [ - {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, ] [[package]] @@ -1926,7 +1926,6 @@ files = [ ] [package.dependencies] -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" @@ -2081,13 +2080,13 @@ requests = ">=2,<3" [[package]] name = "litellm" -version = "1.38.8" +version = "1.23.16" description = "Library to easily interface with LLM API providers" optional = false -python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" +python-versions = ">=3.8, !=2.7.*, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*, !=3.7.*" files = [ - {file = "litellm-1.38.8-py3-none-any.whl", hash = "sha256:8155eb346dda0d766a401bcfb7b89c0e174a1c324d048b801e0cacd3579b1019"}, - {file = "litellm-1.38.8.tar.gz", hash = "sha256:7ea342b6dd4d409e9bf7642cc0fabe9f0e6fe61613505d36e7dbf9e4128baf72"}, + {file = "litellm-1.23.16-py3-none-any.whl", hash = "sha256:c1d7183edc74dad7d140cb7c9ac0c23e550d4126549eb302c75b46380724a3ad"}, + {file = "litellm-1.23.16.tar.gz", hash = "sha256:7d477c8560743cc762f1e61fc2c209ffa9d733879da198daeb5d0effbb62a1c1"}, ] [package.dependencies] @@ -2095,15 +2094,15 @@ aiohttp = "*" click = "*" importlib-metadata = ">=6.8.0" jinja2 = ">=3.1.2,<4.0.0" -openai = ">=1.27.0" +openai = ">=1.0.0" python-dotenv = ">=0.2.0" requests = ">=2.31.0,<3.0.0" tiktoken = ">=0.4.0" tokenizers = "*" [package.extras] -extra-proxy = ["azure-identity (>=1.15.0,<2.0.0)", "azure-keyvault-secrets (>=4.8.0,<5.0.0)", "google-cloud-kms (>=2.21.3,<3.0.0)", "prisma (==0.11.0)", "resend (>=0.8.0,<0.9.0)"] -proxy = ["PyJWT (>=2.8.0,<3.0.0)", "apscheduler (>=3.10.4,<4.0.0)", "backoff", "cryptography (>=42.0.5,<43.0.0)", "fastapi (>=0.111.0,<0.112.0)", "fastapi-sso (>=0.10.0,<0.11.0)", "gunicorn (>=22.0.0,<23.0.0)", "orjson (>=3.9.7,<4.0.0)", "python-multipart (>=0.0.9,<0.0.10)", "pyyaml (>=6.0.1,<7.0.0)", "rq", "uvicorn (>=0.22.0,<0.23.0)"] +extra-proxy = ["streamlit (>=1.29.0,<2.0.0)"] +proxy = ["PyJWT (>=2.8.0,<3.0.0)", "apscheduler (>=3.10.4,<4.0.0)", "backoff", "fastapi (>=0.104.1,<0.105.0)", "fastapi-sso (>=0.10.0,<0.11.0)", "gunicorn (>=21.2.0,<22.0.0)", "orjson (>=3.9.7,<4.0.0)", "python-multipart (>=0.0.6,<0.0.7)", "pyyaml (>=6.0.1,<7.0.0)", "rq", "uvicorn (>=0.22.0,<0.23.0)"] [[package]] name = "lxml" @@ -2308,13 +2307,13 @@ files = [ [[package]] name = "marshmallow" -version = "3.21.2" +version = "3.21.3" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." optional = false python-versions = ">=3.8" files = [ - {file = "marshmallow-3.21.2-py3-none-any.whl", hash = "sha256:70b54a6282f4704d12c0a41599682c5c5450e843b9ec406308653b47c59648a1"}, - {file = "marshmallow-3.21.2.tar.gz", hash = "sha256:82408deadd8b33d56338d2182d455db632c6313aa2af61916672146bb32edc56"}, + {file = "marshmallow-3.21.3-py3-none-any.whl", hash = "sha256:86ce7fb914aa865001a4b2092c4c2872d13bc347f3d42673272cabfdbad386f1"}, + {file = "marshmallow-3.21.3.tar.gz", hash = "sha256:4f57c5e050a54d66361e826f94fba213eb10b67b2fdb02c3e0343ce207ba1662"}, ] [package.dependencies] @@ -2370,13 +2369,13 @@ tbb = "==2021.*" [[package]] name = "more-itertools" -version = "9.1.0" +version = "10.3.0" description = "More routines for operating on iterables, beyond itertools" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, - {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, + {file = "more-itertools-10.3.0.tar.gz", hash = "sha256:e5d93ef411224fbcef366a6e8ddc4c5781bc6359d43412a65dd5964e46111463"}, + {file = "more_itertools-10.3.0-py3-none-any.whl", hash = "sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320"}, ] [[package]] @@ -2621,13 +2620,13 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] [[package]] name = "nbmake" -version = "1.5.3" +version = "1.5.4" description = "Pytest plugin for testing notebooks" optional = false -python-versions = ">=3.8.0,<4.0.0" +python-versions = "<4.0.0,>=3.8.0" files = [ - {file = "nbmake-1.5.3-py3-none-any.whl", hash = "sha256:6cfa2b926d335e9c6dce7e8543d01b2398b0a56c03131c5c0bce2b1722116212"}, - {file = "nbmake-1.5.3.tar.gz", hash = "sha256:0b76b829e8b128eb1895539bacf515a1ee85e5b7b492cdfe76e3a12f804e069e"}, + {file = "nbmake-1.5.4-py3-none-any.whl", hash = "sha256:8e440a61a7d4ab303064aa86b8d2c088177c89960e2b4a0f91a768dc9f68382b"}, + {file = "nbmake-1.5.4.tar.gz", hash = "sha256:56417fe80d50069671122955532df6e26369a23f68b9c6e2191ae9cfef19abb2"}, ] [package.dependencies] @@ -2650,36 +2649,33 @@ files = [ [[package]] name = "networkx" -version = "3.2.1" +version = "3.3" description = "Python package for creating and manipulating graphs and networks" optional = true -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, - {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, + {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, + {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, ] [package.extras] -default = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] -developer = ["changelist (==0.4)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] -doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] -extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"] +default = ["matplotlib (>=3.6)", "numpy (>=1.23)", "pandas (>=1.4)", "scipy (>=1.9,!=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)"] test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "nodeenv" -version = "1.8.0" +version = "1.9.1" description = "Node.js virtual environment builder" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] -[package.dependencies] -setuptools = "*" - [[package]] name = "numpy" version = "1.26.4" @@ -2869,13 +2865,13 @@ files = [ [[package]] name = "openai" -version = "1.30.3" +version = "1.34.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.30.3-py3-none-any.whl", hash = "sha256:f88119c8a848998be533c71ab8aa832446fa72b7ddbc70917c3f5886dc132051"}, - {file = "openai-1.30.3.tar.gz", hash = "sha256:8e1bcdca2b96fe3636ab522fa153d88efde1b702d12ec32f1c73e9553ff93f45"}, + {file = "openai-1.34.0-py3-none-any.whl", hash = "sha256:018623c2f795424044675c6230fa3bfbf98d9e0aab45d8fd116f2efb2cfb6b7e"}, + {file = "openai-1.34.0.tar.gz", hash = "sha256:95c8e2da4acd6958e626186957d656597613587195abd0fb2527566a93e76770"}, ] [package.dependencies] @@ -2941,8 +2937,8 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.22.4", markers = "python_version < \"3.11\""}, {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] python-dateutil = ">=2.8.2" @@ -2976,17 +2972,20 @@ xml = ["lxml (>=4.9.2)"] [[package]] name = "pandas-stubs" -version = "2.2.2.240514" +version = "2.2.2.240603" description = "Type annotations for pandas" optional = false python-versions = ">=3.9" files = [ - {file = "pandas_stubs-2.2.2.240514-py3-none-any.whl", hash = "sha256:5d6f64d45a98bc94152a0f76fa648e598cd2b9ba72302fd34602479f0c391a53"}, - {file = "pandas_stubs-2.2.2.240514.tar.gz", hash = "sha256:85b20da44a62c80eb8389bcf4cbfe31cce1cafa8cca4bf1fc75ec45892e72ce8"}, + {file = "pandas_stubs-2.2.2.240603-py3-none-any.whl", hash = "sha256:e08ce7f602a4da2bff5a67475ba881c39f2a4d4f7fccc1cba57c6f35a379c6c0"}, + {file = "pandas_stubs-2.2.2.240603.tar.gz", hash = "sha256:2dcc86e8fa6ea41535a4561c1f08b3942ba5267b464eff2e99caeee66f9e4cd1"}, ] [package.dependencies] -numpy = {version = ">=1.26.0", markers = "python_version < \"3.13\""} +numpy = [ + {version = ">=1.23.5", markers = "python_version >= \"3.9\" and python_version < \"3.12\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\" and python_version < \"3.13\""}, +] types-pytz = ">=2022.1.1" [[package]] @@ -3094,13 +3093,13 @@ virtualenv = ">=20.10.0" [[package]] name = "prompt-toolkit" -version = "3.0.43" +version = "3.0.47" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, - {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, + {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, + {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, ] [package.dependencies] @@ -3373,13 +3372,13 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "8.2.1" +version = "8.2.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.2.1-py3-none-any.whl", hash = "sha256:faccc5d332b8c3719f40283d0d44aa5cf101cec36f88cde9ed8f2bc0538612b1"}, - {file = "pytest-8.2.1.tar.gz", hash = "sha256:5046e5b46d8e4cac199c373041f26be56fdb81eb4e67dc11d4e10811fc3408fd"}, + {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, + {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, ] [package.dependencies] @@ -3646,17 +3645,17 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "redis" -version = "4.6.0" +version = "5.0.6" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.7" files = [ - {file = "redis-4.6.0-py3-none-any.whl", hash = "sha256:e2b03db868160ee4591de3cb90d40ebb50a90dd302138775937f6a42b7ed183c"}, - {file = "redis-4.6.0.tar.gz", hash = "sha256:585dc516b9eb042a619ef0a39c3d7d55fe81bdb4df09a52c9cdde0d07bf1aa7d"}, + {file = "redis-5.0.6-py3-none-any.whl", hash = "sha256:c0d6d990850c627bbf7be01c5c4cbaadf67b48593e913bb71c9819c30df37eee"}, + {file = "redis-5.0.6.tar.gz", hash = "sha256:38473cd7c6389ad3e44a91f4c3eaf6bcb8a9f746007f29bf4fb20824ff0b2197"}, ] [package.dependencies] -async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""} +async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} [package.extras] hiredis = ["hiredis (>=1.0.0)"] @@ -3664,22 +3663,23 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "redis-om" -version = "0.2.1" +version = "0.2.2" description = "Object mappings, and more, for Redis." optional = false -python-versions = ">=3.7,<4.0" +python-versions = "<4.0,>=3.8" files = [ - {file = "redis_om-0.2.1-py3-none-any.whl", hash = "sha256:31313a3027a014608b3a4d44ecd1d3000c7d0fe3a25060db19b42225e636cd53"}, - {file = "redis_om-0.2.1.tar.gz", hash = "sha256:150c9cb5238d6003f35e9b6394aab30a0df35b00e955eb7dc508f4345e0a0ccc"}, + {file = "redis_om-0.2.2-py3-none-any.whl", hash = "sha256:f395db665f1829e8beef9b23cb74ec397107c73216162900ff4c8563b0bee6a9"}, + {file = "redis_om-0.2.2.tar.gz", hash = "sha256:335eeafcec35f8db15c4ee384b22c115b3040bca93a8a218bbdd965b4c65cb5b"}, ] [package.dependencies] click = ">=8.0.1,<9.0.0" hiredis = ">=2.2.3,<3.0.0" -more-itertools = ">=8.14,<10.0" -pydantic = ">=1.10.2,<2.1.0" +more-itertools = ">=8.14,<11.0" +pydantic = ">=1.10.2,<2.5.0" python-ulid = ">=1.0.3,<2.0.0" -redis = ">=3.5.3,<5.0.0" +redis = ">=3.5.3,<6.0.0" +setuptools = {version = ">=69.2.0,<70.0.0", markers = "python_version >= \"3.12\""} types-redis = ">=3.5.9,<5.0.0" typing-extensions = ">=4.4.0,<5.0.0" @@ -3788,13 +3788,13 @@ files = [ [[package]] name = "requests" -version = "2.32.2" +version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" files = [ - {file = "requests-2.32.2-py3-none-any.whl", hash = "sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c"}, - {file = "requests-2.32.2.tar.gz", hash = "sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -3949,28 +3949,28 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.4.5" +version = "0.4.8" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8f58e615dec58b1a6b291769b559e12fdffb53cc4187160a2fc83250eaf54e96"}, - {file = "ruff-0.4.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:84dd157474e16e3a82745d2afa1016c17d27cb5d52b12e3d45d418bcc6d49264"}, - {file = "ruff-0.4.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f483ad9d50b00e7fd577f6d0305aa18494c6af139bce7319c68a17180087f4"}, - {file = "ruff-0.4.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:63fde3bf6f3ad4e990357af1d30e8ba2730860a954ea9282c95fc0846f5f64af"}, - {file = "ruff-0.4.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78e3ba4620dee27f76bbcad97067766026c918ba0f2d035c2fc25cbdd04d9c97"}, - {file = "ruff-0.4.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:441dab55c568e38d02bbda68a926a3d0b54f5510095c9de7f95e47a39e0168aa"}, - {file = "ruff-0.4.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1169e47e9c4136c997f08f9857ae889d614c5035d87d38fda9b44b4338909cdf"}, - {file = "ruff-0.4.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:755ac9ac2598a941512fc36a9070a13c88d72ff874a9781493eb237ab02d75df"}, - {file = "ruff-0.4.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4b02a65985be2b34b170025a8b92449088ce61e33e69956ce4d316c0fe7cce0"}, - {file = "ruff-0.4.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:75a426506a183d9201e7e5664de3f6b414ad3850d7625764106f7b6d0486f0a1"}, - {file = "ruff-0.4.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:6e1b139b45e2911419044237d90b60e472f57285950e1492c757dfc88259bb06"}, - {file = "ruff-0.4.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a6f29a8221d2e3d85ff0c7b4371c0e37b39c87732c969b4d90f3dad2e721c5b1"}, - {file = "ruff-0.4.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d6ef817124d72b54cc923f3444828ba24fa45c3164bc9e8f1813db2f3d3a8a11"}, - {file = "ruff-0.4.5-py3-none-win32.whl", hash = "sha256:aed8166c18b1a169a5d3ec28a49b43340949e400665555b51ee06f22813ef062"}, - {file = "ruff-0.4.5-py3-none-win_amd64.whl", hash = "sha256:b0b03c619d2b4350b4a27e34fd2ac64d0dabe1afbf43de57d0f9d8a05ecffa45"}, - {file = "ruff-0.4.5-py3-none-win_arm64.whl", hash = "sha256:9d15de3425f53161b3f5a5658d4522e4eee5ea002bf2ac7aa380743dd9ad5fba"}, - {file = "ruff-0.4.5.tar.gz", hash = "sha256:286eabd47e7d4d521d199cab84deca135557e6d1e0f0d01c29e757c3cb151b54"}, + {file = "ruff-0.4.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:7663a6d78f6adb0eab270fa9cf1ff2d28618ca3a652b60f2a234d92b9ec89066"}, + {file = "ruff-0.4.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:eeceb78da8afb6de0ddada93112869852d04f1cd0f6b80fe464fd4e35c330913"}, + {file = "ruff-0.4.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aad360893e92486662ef3be0a339c5ca3c1b109e0134fcd37d534d4be9fb8de3"}, + {file = "ruff-0.4.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:284c2e3f3396fb05f5f803c9fffb53ebbe09a3ebe7dda2929ed8d73ded736deb"}, + {file = "ruff-0.4.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7354f921e3fbe04d2a62d46707e569f9315e1a613307f7311a935743c51a764"}, + {file = "ruff-0.4.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:72584676164e15a68a15778fd1b17c28a519e7a0622161eb2debdcdabdc71883"}, + {file = "ruff-0.4.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9678d5c9b43315f323af2233a04d747409d1e3aa6789620083a82d1066a35199"}, + {file = "ruff-0.4.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704977a658131651a22b5ebeb28b717ef42ac6ee3b11e91dc87b633b5d83142b"}, + {file = "ruff-0.4.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d05f8d6f0c3cce5026cecd83b7a143dcad503045857bc49662f736437380ad45"}, + {file = "ruff-0.4.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6ea874950daca5697309d976c9afba830d3bf0ed66887481d6bca1673fc5b66a"}, + {file = "ruff-0.4.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:fc95aac2943ddf360376be9aa3107c8cf9640083940a8c5bd824be692d2216dc"}, + {file = "ruff-0.4.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:384154a1c3f4bf537bac69f33720957ee49ac8d484bfc91720cc94172026ceed"}, + {file = "ruff-0.4.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e9d5ce97cacc99878aa0d084c626a15cd21e6b3d53fd6f9112b7fc485918e1fa"}, + {file = "ruff-0.4.8-py3-none-win32.whl", hash = "sha256:6d795d7639212c2dfd01991259460101c22aabf420d9b943f153ab9d9706e6a9"}, + {file = "ruff-0.4.8-py3-none-win_amd64.whl", hash = "sha256:e14a3a095d07560a9d6769a72f781d73259655919d9b396c650fc98a8157555d"}, + {file = "ruff-0.4.8-py3-none-win_arm64.whl", hash = "sha256:14019a06dbe29b608f6b7cbcec300e3170a8d86efaddb7b23405cb7f7dcaf780"}, + {file = "ruff-0.4.8.tar.gz", hash = "sha256:16d717b1d57b2e2fd68bd0bf80fb43931b79d05a7131aa477d66fc40fbd86268"}, ] [[package]] @@ -4156,18 +4156,19 @@ test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "po [[package]] name = "setuptools" -version = "70.0.0" +version = "69.5.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-70.0.0-py3-none-any.whl", hash = "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4"}, - {file = "setuptools-70.0.0.tar.gz", hash = "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0"}, + {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, + {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -4321,24 +4322,23 @@ files = [ [package.dependencies] anyio = ">=3.4.0,<5" -typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} [package.extras] full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] [[package]] name = "sympy" -version = "1.12" +version = "1.12.1" description = "Computer algebra system (CAS) in Python" optional = true python-versions = ">=3.8" files = [ - {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, - {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, + {file = "sympy-1.12.1-py3-none-any.whl", hash = "sha256:9b2cbc7f1a640289430e13d2a56f02f867a1da0190f2f99d8968c2f74da0e515"}, + {file = "sympy-1.12.1.tar.gz", hash = "sha256:2877b03f998cd8c08f07cd0de5b767119cd3ef40d09f41c30d722f6686b0fb88"}, ] [package.dependencies] -mpmath = ">=0.19" +mpmath = ">=1.1.0,<1.4.0" [[package]] name = "tabulate" @@ -4582,31 +4582,31 @@ files = [ [[package]] name = "torch" -version = "2.3.0" +version = "2.3.1" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = true python-versions = ">=3.8.0" files = [ - {file = "torch-2.3.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:d8ea5a465dbfd8501f33c937d1f693176c9aef9d1c1b0ca1d44ed7b0a18c52ac"}, - {file = "torch-2.3.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:09c81c5859a5b819956c6925a405ef1cdda393c9d8a01ce3851453f699d3358c"}, - {file = "torch-2.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:1bf023aa20902586f614f7682fedfa463e773e26c58820b74158a72470259459"}, - {file = "torch-2.3.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:758ef938de87a2653bba74b91f703458c15569f1562bf4b6c63c62d9c5a0c1f5"}, - {file = "torch-2.3.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:493d54ee2f9df100b5ce1d18c96dbb8d14908721f76351e908c9d2622773a788"}, - {file = "torch-2.3.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:bce43af735c3da16cc14c7de2be7ad038e2fbf75654c2e274e575c6c05772ace"}, - {file = "torch-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:729804e97b7cf19ae9ab4181f91f5e612af07956f35c8b2c8e9d9f3596a8e877"}, - {file = "torch-2.3.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:d24e328226d8e2af7cf80fcb1d2f1d108e0de32777fab4aaa2b37b9765d8be73"}, - {file = "torch-2.3.0-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:b0de2bdc0486ea7b14fc47ff805172df44e421a7318b7c4d92ef589a75d27410"}, - {file = "torch-2.3.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:a306c87a3eead1ed47457822c01dfbd459fe2920f2d38cbdf90de18f23f72542"}, - {file = "torch-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:f9b98bf1a3c8af2d4c41f0bf1433920900896c446d1ddc128290ff146d1eb4bd"}, - {file = "torch-2.3.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:dca986214267b34065a79000cee54232e62b41dff1ec2cab9abc3fc8b3dee0ad"}, - {file = "torch-2.3.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:20572f426965dd8a04e92a473d7e445fa579e09943cc0354f3e6fef6130ce061"}, - {file = "torch-2.3.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e65ba85ae292909cde0dde6369826d51165a3fc8823dc1854cd9432d7f79b932"}, - {file = "torch-2.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:5515503a193781fd1b3f5c474e89c9dfa2faaa782b2795cc4a7ab7e67de923f6"}, - {file = "torch-2.3.0-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:6ae9f64b09516baa4ef890af0672dc981c20b1f0d829ce115d4420a247e88fba"}, - {file = "torch-2.3.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cd0dc498b961ab19cb3f8dbf0c6c50e244f2f37dbfa05754ab44ea057c944ef9"}, - {file = "torch-2.3.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e05f836559251e4096f3786ee99f4a8cbe67bc7fbedba8ad5e799681e47c5e80"}, - {file = "torch-2.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:4fb27b35dbb32303c2927da86e27b54a92209ddfb7234afb1949ea2b3effffea"}, - {file = "torch-2.3.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:760f8bedff506ce9e6e103498f9b1e9e15809e008368594c3a66bf74a8a51380"}, + {file = "torch-2.3.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:605a25b23944be5ab7c3467e843580e1d888b8066e5aaf17ff7bf9cc30001cc3"}, + {file = "torch-2.3.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f2357eb0965583a0954d6f9ad005bba0091f956aef879822274b1bcdb11bd308"}, + {file = "torch-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:32b05fe0d1ada7f69c9f86c14ff69b0ef1957a5a54199bacba63d22d8fab720b"}, + {file = "torch-2.3.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:7c09a94362778428484bcf995f6004b04952106aee0ef45ff0b4bab484f5498d"}, + {file = "torch-2.3.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:b2ec81b61bb094ea4a9dee1cd3f7b76a44555375719ad29f05c0ca8ef596ad39"}, + {file = "torch-2.3.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:490cc3d917d1fe0bd027057dfe9941dc1d6d8e3cae76140f5dd9a7e5bc7130ab"}, + {file = "torch-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:5802530783bd465fe66c2df99123c9a54be06da118fbd785a25ab0a88123758a"}, + {file = "torch-2.3.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:a7dd4ed388ad1f3d502bf09453d5fe596c7b121de7e0cfaca1e2017782e9bbac"}, + {file = "torch-2.3.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:a486c0b1976a118805fc7c9641d02df7afbb0c21e6b555d3bb985c9f9601b61a"}, + {file = "torch-2.3.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:224259821fe3e4c6f7edf1528e4fe4ac779c77addaa74215eb0b63a5c474d66c"}, + {file = "torch-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:e5fdccbf6f1334b2203a61a0e03821d5845f1421defe311dabeae2fc8fbeac2d"}, + {file = "torch-2.3.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:3c333dc2ebc189561514eda06e81df22bf8fb64e2384746b2cb9f04f96d1d4c8"}, + {file = "torch-2.3.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:07e9ba746832b8d069cacb45f312cadd8ad02b81ea527ec9766c0e7404bb3feb"}, + {file = "torch-2.3.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:462d1c07dbf6bb5d9d2f3316fee73a24f3d12cd8dacf681ad46ef6418f7f6626"}, + {file = "torch-2.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff60bf7ce3de1d43ad3f6969983f321a31f0a45df3690921720bcad6a8596cc4"}, + {file = "torch-2.3.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:bee0bd33dc58aa8fc8a7527876e9b9a0e812ad08122054a5bff2ce5abf005b10"}, + {file = "torch-2.3.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:aaa872abde9a3d4f91580f6396d54888620f4a0b92e3976a6034759df4b961ad"}, + {file = "torch-2.3.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:3d7a7f7ef21a7520510553dc3938b0c57c116a7daee20736a9e25cbc0e832bdc"}, + {file = "torch-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:4777f6cefa0c2b5fa87223c213e7b6f417cf254a45e5829be4ccd1b2a4ee1011"}, + {file = "torch-2.3.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:2bb5af780c55be68fe100feb0528d2edebace1d55cb2e351de735809ba7391eb"}, ] [package.dependencies] @@ -4627,7 +4627,7 @@ nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \" nvidia-nccl-cu12 = {version = "2.20.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} sympy = "*" -triton = {version = "2.3.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} +triton = {version = "2.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} typing-extensions = ">=4.8.0" [package.extras] @@ -4636,22 +4636,22 @@ optree = ["optree (>=0.9.1)"] [[package]] name = "tornado" -version = "6.4" +version = "6.4.1" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false -python-versions = ">= 3.8" +python-versions = ">=3.8" files = [ - {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, - {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, - {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, - {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, - {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, + {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, + {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, + {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, ] [[package]] @@ -4691,13 +4691,13 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "transformers" -version = "4.41.1" +version = "4.41.2" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = true python-versions = ">=3.8.0" files = [ - {file = "transformers-4.41.1-py3-none-any.whl", hash = "sha256:f0680e0b1a01067eccd11f62f0522409422c7d6f91d532fe0f50b136a406129d"}, - {file = "transformers-4.41.1.tar.gz", hash = "sha256:fa859e4c66f0896633a3bf534e0d9a29a9a88478a49f94c5d8270537dc61cc42"}, + {file = "transformers-4.41.2-py3-none-any.whl", hash = "sha256:05555d20e43f808de1ef211ab64803cdb513170cef70d29a888b589caebefc67"}, + {file = "transformers-4.41.2.tar.gz", hash = "sha256:80a4db216533d573e9cc7388646c31ed9480918feb7c55eb211249cb23567f87"}, ] [package.dependencies] @@ -4757,17 +4757,17 @@ vision = ["Pillow (>=10.0.1,<=15.0)"] [[package]] name = "triton" -version = "2.3.0" +version = "2.3.1" description = "A language and compiler for custom Deep Learning operations" optional = true python-versions = "*" files = [ - {file = "triton-2.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ce4b8ff70c48e47274c66f269cce8861cf1dc347ceeb7a67414ca151b1822d8"}, - {file = "triton-2.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c3d9607f85103afdb279938fc1dd2a66e4f5999a58eb48a346bd42738f986dd"}, - {file = "triton-2.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:218d742e67480d9581bafb73ed598416cc8a56f6316152e5562ee65e33de01c0"}, - {file = "triton-2.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381ec6b3dac06922d3e4099cfc943ef032893b25415de295e82b1a82b0359d2c"}, - {file = "triton-2.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038e06a09c06a164fef9c48de3af1e13a63dc1ba3c792871e61a8e79720ea440"}, - {file = "triton-2.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8f636e0341ac348899a47a057c3daea99ea7db31528a225a3ba4ded28ccc65"}, + {file = "triton-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c84595cbe5e546b1b290d2a58b1494df5a2ef066dd890655e5b8a8a92205c33"}, + {file = "triton-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d64ae33bcb3a7a18081e3a746e8cf87ca8623ca13d2c362413ce7a486f893e"}, + {file = "triton-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf80e8761a9e3498aa92e7bf83a085b31959c61f5e8ac14eedd018df6fccd10"}, + {file = "triton-2.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b13bf35a2b659af7159bf78e92798dc62d877aa991de723937329e2d382f1991"}, + {file = "triton-2.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63381e35ded3304704ea867ffde3b7cfc42c16a55b3062d41e017ef510433d66"}, + {file = "triton-2.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d968264523c7a07911c8fb51b4e0d1b920204dae71491b1fe7b01b62a31e124"}, ] [package.dependencies] @@ -4856,27 +4856,13 @@ types-pyOpenSSL = "*" [[package]] name = "types-requests" -version = "2.31.0.6" -description = "Typing stubs for requests" -optional = true -python-versions = ">=3.7" -files = [ - {file = "types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0"}, - {file = "types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9"}, -] - -[package.dependencies] -types-urllib3 = "*" - -[[package]] -name = "types-requests" -version = "2.32.0.20240523" +version = "2.32.0.20240602" description = "Typing stubs for requests" optional = true python-versions = ">=3.8" files = [ - {file = "types-requests-2.32.0.20240523.tar.gz", hash = "sha256:26b8a6de32d9f561192b9942b41c0ab2d8010df5677ca8aa146289d11d505f57"}, - {file = "types_requests-2.32.0.20240523-py3-none-any.whl", hash = "sha256:f19ed0e2daa74302069bbbbf9e82902854ffa780bc790742a810a9aaa52f65ec"}, + {file = "types-requests-2.32.0.20240602.tar.gz", hash = "sha256:3f98d7bbd0dd94ebd10ff43a7fbe20c3b8528acace6d8efafef0b6a184793f06"}, + {file = "types_requests-2.32.0.20240602-py3-none-any.whl", hash = "sha256:ed3946063ea9fbc6b5fc0c44fa279188bae42d582cb63760be6cb4b9d06c3de8"}, ] [package.dependencies] @@ -4904,26 +4890,15 @@ files = [ {file = "types_tqdm-4.66.0.20240417-py3-none-any.whl", hash = "sha256:248aef1f9986b7b8c2c12b3cb4399fc17dba0a29e7e3f3f9cd704babb879383d"}, ] -[[package]] -name = "types-urllib3" -version = "1.26.25.14" -description = "Typing stubs for urllib3" -optional = true -python-versions = "*" -files = [ - {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, - {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, -] - [[package]] name = "typing-extensions" -version = "4.12.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"}, - {file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -4963,22 +4938,6 @@ files = [ {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, ] -[[package]] -name = "urllib3" -version = "1.26.18" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, - {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, -] - -[package.extras] -brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - [[package]] name = "urllib3" version = "2.2.1" @@ -5260,18 +5219,18 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.19.0" +version = "3.19.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.19.0-py3-none-any.whl", hash = "sha256:96dc6ad62f1441bcaccef23b274ec471518daf4fbbc580341204936a5a3dddec"}, - {file = "zipp-3.19.0.tar.gz", hash = "sha256:952df858fb3164426c976d9338d3961e8e8b3758e2e059e0f754b8c4262625ee"}, + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] anthropic = ["anthropic"] @@ -5283,5 +5242,5 @@ groq = ["groq"] [metadata] lock-version = "2.0" -python-versions = ">=3.9, <=3.12" -content-hash = "8ce0edb923a09683941fc9f9869e3322b21de89259e2615d28ba1f62dfbb9277" +python-versions = ">=3.10, <3.13" +content-hash = "2c250773027d5bb43355369d8e5afc371f7366f2440d066e99ba838db63e345a" diff --git a/pyproject.toml b/pyproject.toml index 102a4161c..5732e4748 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ name = "sotopia" version = "0.0.8" description = "A platform for simulating and evaluating social interaction." -authors = ["Hao Zhu "] +authors = ["Hao Zhu , Xuhui Zhou "] license = "MIT License" readme = "README.md" packages = [{include = "sotopia"}] @@ -77,3 +77,6 @@ ignore_missing_imports = true [tool.pytest.ini_options] testpaths = ["tests"] python_files = "test_*.py" + +[tool.poetry.scripts] +sotopia_benchmark = "sotopia.benchmark:app" diff --git a/sotopia-chat/chat_server.py b/sotopia-chat/chat_server.py index a352ee067..0b3388b5a 100644 --- a/sotopia-chat/chat_server.py +++ b/sotopia-chat/chat_server.py @@ -76,7 +76,6 @@ async def _start_server_with_two_session_ids_and_agent_env_combo( await arun_one_episode( env, agents, - {"env": "gpt-4", "agent1": "redis", "agent2": "redis"}, tag="human_human_v0.0.3_dryrun", push_to_db=True, ) @@ -126,11 +125,6 @@ async def _start_server_with_one_session_id_and_agent_env_combo( await arun_one_episode( env, agents, - { - "env": "gpt-4", - "agent1": "redis" if left_or_right == "left" else "gpt-4", - "agent2": "redis" if left_or_right == "right" else "gpt-4", - }, tag="human_human_v0.0.3_dryrun", push_to_db=True, ) diff --git a/sotopia/agents/base_agent.py b/sotopia/agents/base_agent.py index 8033ca34b..1454104e5 100644 --- a/sotopia/agents/base_agent.py +++ b/sotopia/agents/base_agent.py @@ -34,6 +34,7 @@ def __init__( self.agent_name = agent_name self._goal: str | None = None + self.model_name: str = "" @property def goal(self) -> str: diff --git a/sotopia/agents/llm_agent.py b/sotopia/agents/llm_agent.py index 88dba7873..045336ee6 100644 --- a/sotopia/agents/llm_agent.py +++ b/sotopia/agents/llm_agent.py @@ -5,6 +5,7 @@ from sotopia.agents import BaseAgent from sotopia.database import AgentProfile from sotopia.generation_utils.generate import ( + LLM_Name, agenerate_action, agenerate_script, generate_action, @@ -171,6 +172,7 @@ def __init__( uuid_str=uuid_str, agent_profile=agent_profile, ) + self.model_name: LLM_Name = "human" @property def goal(self) -> str: diff --git a/sotopia/agents/redis_agent.py b/sotopia/agents/redis_agent.py index a072f805f..7288fe282 100644 --- a/sotopia/agents/redis_agent.py +++ b/sotopia/agents/redis_agent.py @@ -9,6 +9,7 @@ from sotopia.agents import BaseAgent from sotopia.database import AgentProfile, MessageTransaction +from sotopia.generation_utils.generate import LLM_Name from sotopia.messages import AgentAction, Observation @@ -30,6 +31,7 @@ def __init__( # super().__init__(agent_name=agent_name, uuid_str=uuid_str) self.session_id = session_id or str(uuid4()) self.sender_id = str(uuid4()) + self.model_name: LLM_Name = "redis" print(f"session id: {self.session_id}") print("step 1: connect to the server") assert ( diff --git a/sotopia/benchmark/__init__.py b/sotopia/benchmark/__init__.py new file mode 100644 index 000000000..72727355b --- /dev/null +++ b/sotopia/benchmark/__init__.py @@ -0,0 +1,3 @@ +from .cli import app + +__all__ = ["app"] diff --git a/sotopia/benchmark/cli.py b/sotopia/benchmark/cli.py new file mode 100644 index 000000000..9f519ac5b --- /dev/null +++ b/sotopia/benchmark/cli.py @@ -0,0 +1,303 @@ +from datetime import datetime +import requests +import rich +from sotopia.database.persistent_profile import EnvironmentList +import asyncio +import logging +from typing import cast + +from logging import FileHandler +from rich.logging import RichHandler + +from tqdm import tqdm + +from sotopia.agents import LLMAgent +from sotopia.database import ( + AgentProfile, + EnvAgentComboStorage, + EnvironmentProfile, + EpisodeLog, +) +from sotopia.database.serialization import get_rewards_from_episode +from sotopia.envs.evaluators import ( + ReachGoalLLMEvaluator, + RuleBasedTerminatedEvaluator, +) +from sotopia.envs.parallel import ParallelSotopiaEnv +from sotopia.generation_utils.generate import LLM_Name +from sotopia.messages import AgentAction, Observation +from sotopia.samplers import ( + BaseSampler, + EnvAgentCombo, +) +from sotopia.server import run_async_server + +import typer +from pathlib import Path + +app = typer.Typer() + + +def check_existing_episodes( + env_id: str, + agent_ids: list[str], + models: dict[str, LLM_Name], + index: str, + tag: str | None = None, +) -> bool: + if tag: + existing_episode = EpisodeLog.find( + (EpisodeLog.environment == env_id) & (EpisodeLog.tag == tag) + ).all() + else: + existing_episode = EpisodeLog.find(EpisodeLog.environment == env_id).all() + if existing_episode: + for episode in existing_episode: + assert isinstance(episode, EpisodeLog), "episode should be an EpisodeLog" + models_list = ( + [models["env"], models["test_model"], models["partner_model"]] + if index == "0" + else [models["env"], models["partner_model"], models["test_model"]] + ) + if episode.agents == agent_ids and episode.models == models_list: + return True + return False + else: + return False + + +def initilize_benchmark_combo(data: list[dict[str, str]]) -> list[EnvAgentComboStorage]: + list_of_env_agent_combo_storage = [] + for combo in data: + env_agent_combo_storage = EnvAgentComboStorage( + env_id=combo["env_id"], agent_ids=combo["agent_ids"] + ) + list_of_env_agent_combo_storage.append(env_agent_combo_storage) + return list_of_env_agent_combo_storage + + +def get_avg_reward(episodes: list[EpisodeLog], model_name: str) -> dict[str, float]: + rewards_list = [] + avg_reward_dict = {} + for episode in episodes: + assert episode.models is not None, "episode.models should not be None" + if episode.models[1] == model_name: + reward = get_rewards_from_episode(episode)[0][1] + else: + reward = get_rewards_from_episode(episode)[1][1] + rewards_list.append(reward) + for dimension in rewards_list[0].keys(): + rewards = [reward[dimension] for reward in rewards_list] + avg_reward = sum(rewards) / len(rewards) + avg_reward_dict[dimension] = avg_reward + return avg_reward_dict + + +def _list_all_env_agent_combo_not_in_db( + model_names: dict[str, LLM_Name], + env_agent_combo_storage_list: list[EnvAgentComboStorage], + tag: str | None = None, +) -> list[EnvAgentCombo[Observation, AgentAction]]: + """We iterate over each environment and return the **first** env-agent combo that is not in the database.""" + hard_envs = EnvironmentList.get("01HAK34YPB1H1RWXQDASDKHSNS").environments + agent_index = EnvironmentList.get("01HAK34YPB1H1RWXQDASDKHSNS").agent_index + assert isinstance(agent_index, list), "agent_index should be a list" + + env_agent_combo_storage_index_list = [] + for env_id, index in zip(hard_envs, agent_index): + for env_agent_combo_storage in env_agent_combo_storage_list: + if env_agent_combo_storage.env_id == env_id: + env_agent_combo_storage_index_list.append( + (env_agent_combo_storage, index) + ) + + list_of_env_agent_combo_storage = [] + for env_agent_combo_storage, index in env_agent_combo_storage_index_list: + agent_ids = env_agent_combo_storage.agent_ids + env_id = env_agent_combo_storage.env_id + if check_existing_episodes( + env_id=env_id, agent_ids=agent_ids, models=model_names, index=index, tag=tag + ): + logging.info( + f"Episode for {env_id} with agents {agent_ids} using {list(model_names.values())} already exists" + ) + continue + env_profile = EnvironmentProfile.get(env_id) + env = ParallelSotopiaEnv( + env_profile=env_profile, + model_name=model_names["env"], + action_order="round-robin", + evaluators=[ + RuleBasedTerminatedEvaluator(max_turn_number=20, max_stale_turn=2), + ], + terminal_evaluators=[ + ReachGoalLLMEvaluator(model_names["env"]), + ], + ) + agent_profiles = [AgentProfile.get(id) for id in agent_ids] + # make sure the second agent (i.e., the agent being benchmarked) is always the indexed agent + agents = [ + LLMAgent(agent_profile=agent_profile, model_name=agent_model) + for agent_profile, agent_model in zip( + agent_profiles, + [model_names["test_model"], model_names["partner_model"]] + if index == "0" + else [model_names["partner_model"], model_names["test_model"]], + ) + ] + list_of_env_agent_combo_storage.append((env, agents)) + return list_of_env_agent_combo_storage # type: ignore + + +def run_async_benchmark_in_batch( + *, + batch_size: int = 1, + model_names: dict[str, LLM_Name] = { + "env": "gpt-4", + "test_model": "gpt-3.5-turbo", + "partner_model": "gpt-3.5-turbo", + }, + tag: str | None = None, + push_to_db: bool = False, + verbose: bool = False, +) -> None: + url = "https://huggingface.co/datasets/cmu-lti/sotopia/resolve/main/benchmark_agents.json?raw=true" + response = requests.get(url) + # Check if the request was successful + if response.status_code == 200: + data = response.json() + print("Data fetched successfully") + else: + print(f"Failed to fetch data. Status code: {response.status_code}") + raise ValueError("Failed to fetch data") + benchmark_combo = initilize_benchmark_combo(data) + env_agent_combo_list = _list_all_env_agent_combo_not_in_db( + model_names=model_names, tag=tag, env_agent_combo_storage_list=benchmark_combo + ) + env_agent_combo_batch: list[EnvAgentCombo[Observation, AgentAction]] = [] + number_of_fix_turns = 0 + loop = asyncio.get_event_loop() + while True: + for env_agent_combo in tqdm( + env_agent_combo_list, + desc="Running all envs in batch", + ): + env_agent_combo_batch.append(env_agent_combo) + if len(env_agent_combo_batch) == batch_size: + logging.info( + f"Running batch of {batch_size} episodes: {env_agent_combo_batch}" + ) + loop.run_until_complete( + run_async_server( + sampler=BaseSampler[Observation, AgentAction](), + env_agent_combo_list=env_agent_combo_batch, + push_to_db=push_to_db, + tag=tag, + ) + ) + env_agent_combo_batch = [] + else: + if env_agent_combo_batch: + logging.info( + f"Running batch of {batch_size} episodes: {env_agent_combo_batch}" + ) + loop.run_until_complete( + run_async_server( + model_dict=model_names, + sampler=BaseSampler[Observation, AgentAction](), + env_agent_combo_list=env_agent_combo_batch, + push_to_db=push_to_db, + tag=tag, + ) + ) + # remove episodes that has bad rewards + simulated_episodes = EpisodeLog.find(EpisodeLog.tag == tag).all() + valid_episodes = [ + not isinstance(relevant_episode.rewards[0], float) # type: ignore + for relevant_episode in simulated_episodes + ] + for valid, episode in zip(valid_episodes, simulated_episodes): + if not valid: + pk = episode.pk + assert isinstance(pk, str) + EpisodeLog.delete(pk) + + env_agent_combo_list = _list_all_env_agent_combo_not_in_db( + model_names=model_names, + tag=tag, + env_agent_combo_storage_list=benchmark_combo, + ) + env_agent_combo_batch = [] + number_of_fix_turns += 1 + if len(env_agent_combo_list) == 0 or number_of_fix_turns >= 5: + rewards_dict = get_avg_reward( + simulated_episodes, # type: ignore + model_names["test_model"], + ) + rewards_dict["model_name"] = model_names["test_model"] # type: ignore + rewards_dict["episode_count"] = len(simulated_episodes) + rich.print(rewards_dict) + return + + +def _set_up_logs( + *, + log_file_level: int = logging.DEBUG, + log_rich_level: int = logging.INFO, + log_format: str = "%(asctime)s - %(levelname)s - %(name)s - %(message)s", + log_file: str = datetime.now().strftime("./logs/%H_%M_%d_%m_%Y.log"), + print_logs: bool = False, +) -> None: + # date and message only + logging_path = Path(log_file) + logging_path.parent.mkdir(parents=True, exist_ok=True) + + logging.basicConfig( + level=log_file_level, + format=log_format, + datefmt="[%X]", + handlers=[ + FileHandler(logging_path), + RichHandler(level=log_rich_level) if print_logs else RichHandler(level=100), + ], + ) + + +@app.command() +def cli( + model: str = typer.Option(..., help="The language model you want to benchmark."), + partner_model: str = typer.Option( + "together_ai/meta-llama/Llama-3-70b-chat-hf", + help="The partner model you want to use.", + ), + evaluator_model: str = typer.Option( + "gpt-4o", help="The evaluator model you want to use." + ), + batch_size: int = typer.Option(10, help="The batch size you want to use."), + task: str = typer.Option("hard", help="The task id you want to benchmark."), + print_logs: bool = typer.Option(False, help="Print logs."), +) -> None: + """A simple command-line interface example.""" + _set_up_logs(print_logs=print_logs) + typer.echo( + f"Running benchmark for {model} chatting with {partner_model} on task {task} with {evaluator_model} as the evaluator." + ) + model = cast(LLM_Name, model) + partner_model = cast(LLM_Name, partner_model) + evaluator_model = cast(LLM_Name, evaluator_model) + tag = f"benchmark_{model}_{partner_model}_{evaluator_model}_{task}_trial0" + run_async_benchmark_in_batch( + batch_size=batch_size, + model_names={ + "env": evaluator_model, + "test_model": model, + "partner_model": partner_model, + }, + tag=tag, + verbose=False, + push_to_db=True, + ) + + +if __name__ == "__main__": + app() diff --git a/sotopia/envs/evaluators.py b/sotopia/envs/evaluators.py index b61679385..d3a9b5ab3 100644 --- a/sotopia/envs/evaluators.py +++ b/sotopia/envs/evaluators.py @@ -246,7 +246,7 @@ async def __acall__( turn_number: int, messages: list[tuple[str, Message]] | None, history: str = "", - temperature: float = 0.7, + temperature: float = 0.0, ) -> list[tuple[str, tuple[tuple[str, int | float | bool], str]]]: # filter did nothing if not history and messages: diff --git a/sotopia/envs/parallel.py b/sotopia/envs/parallel.py index 199be857d..4821d8c70 100644 --- a/sotopia/envs/parallel.py +++ b/sotopia/envs/parallel.py @@ -266,7 +266,6 @@ def reset( background_for_a = agent_backgrounds[0] background_for_b = agent_backgrounds[1] - print("Is the agent omniscient?", omniscient) if not omniscient: background_for_a.p2_goal = "Unknown" background_for_b.p1_goal = "Unknown" diff --git a/sotopia/generation_utils/generate.py b/sotopia/generation_utils/generate.py index 7e8ec5e0c..c256a86c2 100644 --- a/sotopia/generation_utils/generate.py +++ b/sotopia/generation_utils/generate.py @@ -1,11 +1,12 @@ import logging +import os import re from typing import Any, TypeVar import gin from beartype import beartype from beartype.typing import Type -from langchain.chains import LLMChain +from langchain.chains.llm import LLMChain from langchain.output_parsers import PydanticOutputParser from langchain.prompts import ( ChatPromptTemplate, @@ -14,6 +15,7 @@ ) from langchain.schema import BaseOutputParser, OutputParserException from langchain_community.chat_models import ChatLiteLLM +from langchain_openai import ChatOpenAI from pydantic import BaseModel, Field from rich import print from typing_extensions import Literal @@ -32,20 +34,18 @@ logging_handler = LoggingCallbackHandler("langchain") LLM_Name = Literal[ - "togethercomputer/llama-2-7b-chat", - "togethercomputer/llama-2-70b-chat", - "togethercomputer/mpt-30b-chat", + "together_ai/meta-llama/Llama-2-7b-chat-hf", + "together_ai/meta-llama/Llama-2-70b-chat-hf", + "together_ai/mistralai/Mixtral-8x22B-Instruct-v0.1", + "together_ai/meta-llama/Llama-3-8b-chat-hf", + "together_ai/meta-llama/Llama-3-70b-chat-hf", "gpt-3.5-turbo", "gpt-3.5-turbo-finetuned", "gpt-3.5-turbo-ft-MF", - "text-davinci-003", "gpt-4", "gpt-4-turbo", "human", "redis", - "mistralai/Mixtral-8x7B-Instruct-v0.1", - "together_ai/togethercomputer/llama-2-7b-chat", - "together_ai/togethercomputer/falcon-7b-instruct", "groq/llama3-70b-8192", ] @@ -326,17 +326,54 @@ def obtain_chain( Using langchain to sample profiles for participants """ model_name = _return_fixed_model_version(model_name) - chat = PatchedChatLiteLLM( - model=model_name, - temperature=temperature, - max_retries=max_retries, - ) - human_message_prompt = HumanMessagePromptTemplate( - prompt=PromptTemplate(template=template, input_variables=input_variables) - ) - chat_prompt_template = ChatPromptTemplate.from_messages([human_message_prompt]) - chain = LLMChain(llm=chat, prompt=chat_prompt_template) - return chain + if "together_ai" in model_name: + model_name = "/".join(model_name.split("/")[1:]) + human_message_prompt = HumanMessagePromptTemplate( + prompt=PromptTemplate( + template=template, + input_variables=input_variables, + ) + ) + chat_prompt_template = ChatPromptTemplate.from_messages([human_message_prompt]) + chat_openai = ChatOpenAI( + model_name=model_name, + temperature=temperature, + max_retries=max_retries, + openai_api_base="https://api.together.xyz/v1", + openai_api_key=os.environ.get("TOGETHER_API_KEY"), + ) + chain = LLMChain(llm=chat_openai, prompt=chat_prompt_template) + return chain + elif "groq" in model_name: + model_name = "/".join(model_name.split("/")[1:]) + human_message_prompt = HumanMessagePromptTemplate( + prompt=PromptTemplate( + template=template, + input_variables=input_variables, + ) + ) + chat_prompt_template = ChatPromptTemplate.from_messages([human_message_prompt]) + chat_openai = ChatOpenAI( + model_name=model_name, + temperature=temperature, + max_retries=max_retries, + openai_api_base="https://api.groq.com/openai/v1", + openai_api_key=os.environ.get("GROQ_API_KEY"), + ) + chain = LLMChain(llm=chat_openai, prompt=chat_prompt_template) + return chain + else: + chat = ChatOpenAI( + model=model_name, + temperature=temperature, + max_retries=max_retries, + ) + human_message_prompt = HumanMessagePromptTemplate( + prompt=PromptTemplate(template=template, input_variables=input_variables) + ) + chat_prompt_template = ChatPromptTemplate.from_messages([human_message_prompt]) + chain = LLMChain(llm=chat, prompt=chat_prompt_template) + return chain @beartype diff --git a/sotopia/server.py b/sotopia/server.py index 9a3347697..01421f520 100644 --- a/sotopia/server.py +++ b/sotopia/server.py @@ -6,7 +6,6 @@ import gin import rich from beartype import beartype -from tqdm.asyncio import tqdm_asyncio from sotopia.agents import ( Agents, @@ -106,7 +105,6 @@ def run_sync_server( async def arun_one_episode( env: ParallelSotopiaEnv, agent_list: Sequence[BaseAgent[Observation, AgentAction]], - model_dict: dict[str, LLM_Name], omniscient: bool = False, script_like: bool = False, json_in_script: bool = False, @@ -115,23 +113,6 @@ async def arun_one_episode( ) -> list[tuple[str, str, Message]]: agents = Agents({agent.agent_name: agent for agent in agent_list}) environment_messages = env.reset(agents=agents, omniscient=omniscient) - agents_model_names = [model_dict["agent1"], model_dict["agent2"]] - for agent_name, agent_model in zip(env.agents, agents_model_names): - if agent_model == "human": - agents[agent_name] = HumanAgent(agent_name) - elif agent_model == "redis": - agents[agent_name] = RedisAgent(agent_name) - elif script_like and not json_in_script: - agents[agent_name] = ScriptWritingAgent( - agent_name, - model_name=agent_model, - background=env.background, - agent_names=env.agents, - ) - else: - agents[agent_name] = LLMAgent( - agent_name, model_name=agent_model, script_like=script_like - ) agents.reset() messages: list[list[tuple[str, str, Message]]] = [] @@ -202,7 +183,7 @@ async def arun_one_episode( environment=env.profile.pk, agents=[agent.profile.pk for agent in agent_list], tag=tag, - models=[model_dict["env"], model_dict["agent1"], model_dict["agent2"]], + models=[env.model_name, agent_list[0].model_name, agent_list[1].model_name], messages=[ [(m[0], m[1], m[2].to_natural_language()) for m in messages_in_turn] for messages_in_turn in messages @@ -230,9 +211,9 @@ async def arun_one_episode( @gin.configurable @beartype async def run_async_server( - model_dict: dict[str, LLM_Name], sampler: BaseSampler[Observation, AgentAction] = BaseSampler(), - action_order: Literal["simultaneous", "round-robin", "random"] = "round-robin", + action_order: Literal["simutaneous", "round-robin", "random"] = "round-robin", + model_dict: dict[str, LLM_Name] = {}, env_agent_combo_list: list[EnvAgentCombo[Observation, AgentAction]] = [], omniscient: bool = False, script_like: bool = False, @@ -254,30 +235,20 @@ async def run_async_server( """ assert not (push_to_db and tag is None), "please provide a tag when push to db" + assert ( + model_dict or env_agent_combo_list + ), "please provide model_dict or env_agent_combo_list" # Create Environment and agents # This step will be moved to outside this function - env_params = { - "model_name": model_dict["env"], - "action_order": action_order, - "evaluators": [ - RuleBasedTerminatedEvaluator(max_turn_number=20, max_stale_turn=2), - ], - "terminal_evaluators": [ - ReachGoalLLMEvaluator(model_dict["env"]), - ], - } - agents_model_dict = { - "agent1": model_dict["agent1"], - "agent2": model_dict["agent2"], - } - def get_agent_class( model_name: str, ) -> Type[BaseAgent[Observation, AgentAction]]: if model_name == "human": return HumanAgent + elif model_name == "redis": + return RedisAgent elif script_like and not json_in_script: return ScriptWritingAgent else: @@ -289,6 +260,20 @@ def get_agent_class( ), "No sampler should be used when `env_agent_combo_list` is not empty" env_agent_combo_iter = iter(env_agent_combo_list) else: + env_params = { + "model_name": model_dict["env"], + "action_order": action_order, + "evaluators": [ + RuleBasedTerminatedEvaluator(max_turn_number=20, max_stale_turn=2), + ], + "terminal_evaluators": [ + ReachGoalLLMEvaluator(model_dict["env"]), + ], + } + agents_model_dict = { + "agent1": model_dict["agent1"], + "agent2": model_dict["agent2"], + } env_agent_combo_iter = sampler.sample( agent_classes=[ get_agent_class(model_name) for model_name in agents_model_dict.values() @@ -304,7 +289,6 @@ def get_agent_class( arun_one_episode( env=env_agent_combo[0], agent_list=env_agent_combo[1], - model_dict=model_dict, omniscient=omniscient, script_like=script_like, json_in_script=json_in_script, @@ -315,7 +299,7 @@ def get_agent_class( ] batch_results = ( - await tqdm_asyncio.gather(*episode_futures, desc="Running one batch") + await asyncio.gather(*episode_futures) if using_async else [await i for i in episode_futures] ) @@ -432,6 +416,7 @@ async def aevaluate_one_episode( turn_number=-1, history=history, messages=None, + temperature=0.0, ) for sing_evaluator in [evaluator] ] diff --git a/sotopia_conf/server.py b/sotopia_conf/server.py index 2f502a0ca..d8d9fe263 100644 --- a/sotopia_conf/server.py +++ b/sotopia_conf/server.py @@ -22,7 +22,7 @@ def main(_: Any) -> None: FLAGS.gin_bindings, ) - asyncio.run(run_async_server()) # type: ignore[call-arg] + asyncio.run(run_async_server()) if __name__ == "__main__": From cfc4da2a8793a056f97c9f40e2f2c642025d3678 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 14:02:18 -0400 Subject: [PATCH 05/23] Bump google-generativeai from 0.5.4 to 0.6.0 (#108) Bumps [google-generativeai](https://github.com/google/generative-ai-python) from 0.5.4 to 0.6.0. - [Release notes](https://github.com/google/generative-ai-python/releases) - [Changelog](https://github.com/google-gemini/generative-ai-python/blob/main/RELEASE.md) - [Commits](https://github.com/google/generative-ai-python/compare/v0.5.4...v0.6.0) --- updated-dependencies: - dependency-name: google-generativeai dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 14 +++++++------- pyproject.toml | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/poetry.lock b/poetry.lock index 9d2d55df7..48f470c91 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "absl-py" @@ -1058,12 +1058,12 @@ files = [ google-auth = ">=2.14.1,<3.0.dev0" googleapis-common-protos = ">=1.56.2,<2.0.dev0" grpcio = [ - {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, + {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] grpcio-status = [ - {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, + {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" @@ -1132,12 +1132,12 @@ httplib2 = ">=0.19.0" [[package]] name = "google-generativeai" -version = "0.5.4" +version = "0.6.0" description = "Google Generative AI High level API client library and tools." optional = true python-versions = ">=3.9" files = [ - {file = "google_generativeai-0.5.4-py3-none-any.whl", hash = "sha256:036d63ee35e7c8aedceda4f81c390a5102808af09ff3a6e57e27ed0be0708f3c"}, + {file = "google_generativeai-0.6.0-py3-none-any.whl", hash = "sha256:ba1d3b826b872bffe330aaac0dc6de2f0e4610df861c8ce7ec6433771611b676"}, ] [package.dependencies] @@ -2937,8 +2937,8 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.23.2", markers = "python_version == \"3.11\""}, {version = ">=1.22.4", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] python-dateutil = ">=2.8.2" @@ -5243,4 +5243,4 @@ groq = ["groq"] [metadata] lock-version = "2.0" python-versions = ">=3.10, <3.13" -content-hash = "2c250773027d5bb43355369d8e5afc371f7366f2440d066e99ba838db63e345a" +content-hash = "600053405f0536f699d97b3f5e3a7a8327cfc0e1ef69649bab85217acc63fe3a" diff --git a/pyproject.toml b/pyproject.toml index 5732e4748..05d6d0b67 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,7 @@ anthropic = { version = "^0.26.0", optional = true } xmltodict = { version = "^0.13.0", optional = true } groq = { version = "^0.4.2", optional = true } cohere = { version = "^5.1.8", optional = true } -google-generativeai = { version = "^0.5.4", optional = true } +google-generativeai = { version = ">=0.5.4,<0.7.0", optional = true } transformers = { version = "^4.41.0", optional = true } datasets = { version = "^2.19.0", optional = true } scipy = { version = "^1.13.1", optional = true } From 9c1256c788587353b3b279633281e8b579bd625c Mon Sep 17 00:00:00 2001 From: Hao Zhu Date: Mon, 17 Jun 2024 14:14:26 -0400 Subject: [PATCH 06/23] Sync main branch with release (#106) * bump the version, test release to PyPi * Update README.md * Update README.md * Update README.md * bumpy version to 0.0.9 * Update Sotopia presentation information in README.md --- README.md | 27 +++++++++++++++++---------- pyproject.toml | 2 +- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index fb27cfc0a..3058fe27b 100644 --- a/README.md +++ b/README.md @@ -2,23 +2,27 @@ sotopia -# Sotopia: an Open-ended Social Learning Environment +

Sotopia: an Open-ended Social Learning Environment

+ +
+ +[![pypi](https://img.shields.io/pypi/v/sotopia.svg)](https://pypi.python.org/pypi/sotopia) +[![versions](https://img.shields.io/pypi/pyversions/sotopia.svg)](https://github.com/sotopia/sotopia) +[![CI](https://img.shields.io/github/actions/workflow/status/sotopia-lab/sotopia/tests.yml?branch=main&logo=github&label=CI)](https://github.com/sotopia-lab/sotopia/actions?query=branch%3Amain) +[![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/14hJOfzpA37PRUzdlFgiqVzUGIhhngqnz?usp=sharing) + [![Project Page](https://img.shields.io/badge/Project-Page-green.svg)](https://www.sotopia.world/projects/sotopia) [![Paper PDF](https://img.shields.io/badge/Paper-PDF-red.svg)](https://arxiv.org/abs/2310.11667) -[![Python 3.11](https://img.shields.io/badge/python-3.11-blue.svg)](https://www.python.org/downloads/release/python-3109/) -[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://pre-commit.com/) -Code style: black -[![Checked with mypy](https://www.mypy-lang.org/static/mypy_badge.svg)](https://mypy-lang.org/) -[![bear-ified](https://raw.githubusercontent.com/beartype/beartype-assets/main/badge/bear-ified.svg)](https://beartype.readthedocs.io) -[![Github Action](https://github.com/XuhuiZhou/sotopia/actions/workflows/tests.yml/badge.svg?branch=main)]() -[![Github Action](https://github.com/XuhuiZhou/sotopia/actions/workflows/pre-commit.yml/badge.svg?branch=main)]() [![Dataset](https://img.shields.io/badge/%F0%9F%A4%97-Sotopia%20Dataset-yellow)](https://huggingface.co/datasets/cmu-lti/sotopia) [![Demo](https://img.shields.io/badge/%F0%9F%A4%97-Sotopia%20Demo-orange)](https://huggingface.co/spaces/cmu-lti/sotopia-space/) + + +
+ ## News -* [05/2024] Sotopia will be presented at ICLR 2024 as a spotlight ⭐! -* [05/2024] We release [a simple tutorial](https://colab.research.google.com/drive/14hJOfzpA37PRUzdlFgiqVzUGIhhngqnz?usp=sharing) for you to run sotopia end-to-end on google colab. +* [05/2024] Sotopia was presented at ICLR 2024 as a spotlight ⭐! ## Introduction @@ -37,6 +41,9 @@ Sotopia is an open-ended social learning environment that allows agents to inter } ``` +## Help +See [documentation](https://docs.sotopia.world) for more details. + ## Get started ### Use on Google Colab diff --git a/pyproject.toml b/pyproject.toml index 05d6d0b67..738f2afc8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "sotopia" -version = "0.0.8" +version = "0.0.9" description = "A platform for simulating and evaluating social interaction." authors = ["Hao Zhu , Xuhui Zhou "] license = "MIT License" From a7a8458c7f56f56065b9f04b0b58b31a41772eec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 18:53:08 +0000 Subject: [PATCH 07/23] Bump groq from 0.4.2 to 0.9.0 (#105) --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 48f470c91..3fdfcd166 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1243,13 +1243,13 @@ test = ["objgraph", "psutil"] [[package]] name = "groq" -version = "0.4.2" +version = "0.9.0" description = "The official Python library for the groq API" optional = true python-versions = ">=3.7" files = [ - {file = "groq-0.4.2-py3-none-any.whl", hash = "sha256:5b2b472c64d9f35210e0487db465415d47162da3a114031ecbfc8843d26302a5"}, - {file = "groq-0.4.2.tar.gz", hash = "sha256:42e8b0abd0f2b2da024b9a747d28960d62951a5364f078e1537c9fceeca8259d"}, + {file = "groq-0.9.0-py3-none-any.whl", hash = "sha256:d0e46f4ad645504672bb09c8100af3ced3a7db0d5119dc13e4aca535fc455874"}, + {file = "groq-0.9.0.tar.gz", hash = "sha256:130ed5e35d3acfaab46b9e7a078eeaebf91052f4a9d71f86f87fb319b5fec332"}, ] [package.dependencies] @@ -5243,4 +5243,4 @@ groq = ["groq"] [metadata] lock-version = "2.0" python-versions = ">=3.10, <3.13" -content-hash = "600053405f0536f699d97b3f5e3a7a8327cfc0e1ef69649bab85217acc63fe3a" +content-hash = "8a0b1ec0ff4d152b0cfbf03bd7009de8ff553ae8a52aa93c1d639f0ad733b0b8" diff --git a/pyproject.toml b/pyproject.toml index 738f2afc8..19d0dab3a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ fastapi = { version = "^0.109.2", optional = true } tabulate = { version = "^0.9.0", optional = true } anthropic = { version = "^0.26.0", optional = true } xmltodict = { version = "^0.13.0", optional = true } -groq = { version = "^0.4.2", optional = true } +groq = { version = ">=0.4.2,<0.10.0", optional = true } cohere = { version = "^5.1.8", optional = true } google-generativeai = { version = ">=0.5.4,<0.7.0", optional = true } transformers = { version = "^4.41.0", optional = true } From b2ae2f5c9a45d5d7ec707d002575cfc1df60c614 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 20:59:10 +0000 Subject: [PATCH 08/23] Bump langchain-openai from 0.0.5 to 0.0.6 (#103) --- poetry.lock | 10 +++++----- pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3fdfcd166..f3d313fe8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2048,20 +2048,20 @@ extended-testing = ["jinja2 (>=3,<4)"] [[package]] name = "langchain-openai" -version = "0.0.5" +version = "0.0.6" description = "An integration package connecting OpenAI and LangChain" optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langchain_openai-0.0.5-py3-none-any.whl", hash = "sha256:93b37dfac274adad65e46d5d6e71411e00c6984bcc5e10f1d6bb58e7944dc01b"}, - {file = "langchain_openai-0.0.5.tar.gz", hash = "sha256:f317fee5b652949ad96ad7edf8ef7a044a6a3f0cc71d1e12f9d5261789fd68c4"}, + {file = "langchain_openai-0.0.6-py3-none-any.whl", hash = "sha256:2ef040e4447a26a9d3bd45dfac9cefa00797ea58555a3d91ab4f88699eb3a005"}, + {file = "langchain_openai-0.0.6.tar.gz", hash = "sha256:f5c4ebe46f2c8635c8f0c26cc8df27700aacafea025410e418d5a080039974dd"}, ] [package.dependencies] langchain-core = ">=0.1.16,<0.2" numpy = ">=1,<2" openai = ">=1.10.0,<2.0.0" -tiktoken = ">=0.5.2,<0.6.0" +tiktoken = ">=0.5.2,<1" [[package]] name = "langsmith" @@ -5243,4 +5243,4 @@ groq = ["groq"] [metadata] lock-version = "2.0" python-versions = ">=3.10, <3.13" -content-hash = "8a0b1ec0ff4d152b0cfbf03bd7009de8ff553ae8a52aa93c1d639f0ad733b0b8" +content-hash = "587166b04c86852909c7551891ec503ffca5acf30a7881253795aa0fdd4d85da" diff --git a/pyproject.toml b/pyproject.toml index 19d0dab3a..d3323c485 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,7 @@ absl-py = "^2.0.0" together = "^0.2.4" pydantic = "1.10.12" beartype = "^0.14.0" -langchain-openai = "^0.0.5" +langchain-openai = ">=0.0.5,<0.0.7" litellm = "~1.23.12" # dependency versions for extras From 09fc8aefa065ebfae5346b8d5c7db65e4513512f Mon Sep 17 00:00:00 2001 From: Hao Zhu Date: Mon, 17 Jun 2024 23:27:55 -0400 Subject: [PATCH 09/23] Remove pandas dependency (#109) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * remove pandas #82 * ✅ add tests to verify the serialization without pandas works --- poetry.lock | 200 +++++++++++++-------------- pyproject.toml | 5 +- sotopia/database/serialization.py | 57 +++++--- tests/database/test_serialization.py | 90 ++++++++++-- 4 files changed, 211 insertions(+), 141 deletions(-) diff --git a/poetry.lock b/poetry.lock index f3d313fe8..57edce3e8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -247,17 +247,17 @@ test-tox-coverage = ["coverage (>=5.5)"] [[package]] name = "boto3" -version = "1.34.126" +version = "1.34.128" description = "The AWS SDK for Python" optional = true python-versions = ">=3.8" files = [ - {file = "boto3-1.34.126-py3-none-any.whl", hash = "sha256:7f676daef674fe74f34ce4063228eccc6e60c811f574720e31f230296c4bf29a"}, - {file = "boto3-1.34.126.tar.gz", hash = "sha256:7e8418b47dd43954a9088d504541bed8a42b6d06e712d02befba134c1c4d7c6d"}, + {file = "boto3-1.34.128-py3-none-any.whl", hash = "sha256:a048ff980a81cd652724a73bc496c519b336fabe19cc8bfc6c53b2ff6eb22c7b"}, + {file = "boto3-1.34.128.tar.gz", hash = "sha256:43a6e99f53a8d34b3b4dbe424dbcc6b894350dc41a85b0af7c7bc24a7ec2cead"}, ] [package.dependencies] -botocore = ">=1.34.126,<1.35.0" +botocore = ">=1.34.128,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -266,13 +266,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.126" +version = "1.34.128" description = "Low-level, data-driven core of boto 3." optional = true python-versions = ">=3.8" files = [ - {file = "botocore-1.34.126-py3-none-any.whl", hash = "sha256:7eff883c638fe30e0b036789df32d851e093d12544615a3b90062b42ac85bdbc"}, - {file = "botocore-1.34.126.tar.gz", hash = "sha256:7a8ccb6a7c02456757a984a3a44331b6f51c94cb8b9b287cd045122fd177a4b0"}, + {file = "botocore-1.34.128-py3-none-any.whl", hash = "sha256:db67fda136c372ab3fa432580c819c89ba18d28a6152a4d2a7ea40d44082892e"}, + {file = "botocore-1.34.128.tar.gz", hash = "sha256:8d8e03f7c8c080ecafda72036eb3b482d649f8417c90b5dca33b7c2c47adb0c9"}, ] [package.dependencies] @@ -506,13 +506,13 @@ files = [ [[package]] name = "cohere" -version = "5.5.3" +version = "5.5.8" description = "" optional = true python-versions = "<4.0,>=3.8" files = [ - {file = "cohere-5.5.3-py3-none-any.whl", hash = "sha256:99d20129713a6dae052368b4839773a214592a76bee345b94a4846d00f702da3"}, - {file = "cohere-5.5.3.tar.gz", hash = "sha256:8c7ebe2f5bf83fee8e55a24a0acdd4b0e94de274fd0ef32b285978289a03e930"}, + {file = "cohere-5.5.8-py3-none-any.whl", hash = "sha256:e1ed84b90eadd13c6a68ee28e378a0bb955f8945eadc6eb7ee126b3399cafd54"}, + {file = "cohere-5.5.8.tar.gz", hash = "sha256:84ce7666ff8fbdf4f41fb5f6ca452ab2639a514bc88967a2854a9b1b820d6ea0"}, ] [package.dependencies] @@ -520,9 +520,10 @@ boto3 = ">=1.34.0,<2.0.0" fastavro = ">=1.9.4,<2.0.0" httpx = ">=0.21.2" httpx-sse = ">=0.4.0,<0.5.0" +parameterized = ">=0.9.0,<0.10.0" pydantic = ">=1.9.2" requests = ">=2.0.0,<3.0.0" -tokenizers = ">=0.19,<0.20" +tokenizers = ">=0.15,<1" types-requests = ">=2.0.0,<3.0.0" typing_extensions = ">=4.0.0" @@ -852,13 +853,13 @@ zstandard = ["zstandard"] [[package]] name = "fastjsonschema" -version = "2.19.1" +version = "2.20.0" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, - {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, + {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, + {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, ] [package.extras] @@ -1565,13 +1566,13 @@ files = [ [[package]] name = "huggingface-hub" -version = "0.23.3" +version = "0.23.4" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.23.3-py3-none-any.whl", hash = "sha256:22222c41223f1b7c209ae5511d2d82907325a0e3cdbce5f66949d43c598ff3bc"}, - {file = "huggingface_hub-0.23.3.tar.gz", hash = "sha256:1a1118a0b3dea3bab6c325d71be16f5ffe441d32f3ac7c348d6875911b694b5b"}, + {file = "huggingface_hub-0.23.4-py3-none-any.whl", hash = "sha256:3a0b957aa87150addf0cc7bd71b4d954b78e749850e1e7fb29ebbd2db64ca037"}, + {file = "huggingface_hub-0.23.4.tar.gz", hash = "sha256:35d99016433900e44ae7efe1c209164a5a81dbbcd53a52f99c281dcd7ce22431"}, ] [package.dependencies] @@ -2901,7 +2902,7 @@ files = [ name = "pandas" version = "2.2.2" description = "Powerful data structures for data analysis, time series, and statistics" -optional = false +optional = true python-versions = ">=3.9" files = [ {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, @@ -2971,22 +2972,18 @@ test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] xml = ["lxml (>=4.9.2)"] [[package]] -name = "pandas-stubs" -version = "2.2.2.240603" -description = "Type annotations for pandas" -optional = false -python-versions = ">=3.9" +name = "parameterized" +version = "0.9.0" +description = "Parameterized testing with any Python test framework" +optional = true +python-versions = ">=3.7" files = [ - {file = "pandas_stubs-2.2.2.240603-py3-none-any.whl", hash = "sha256:e08ce7f602a4da2bff5a67475ba881c39f2a4d4f7fccc1cba57c6f35a379c6c0"}, - {file = "pandas_stubs-2.2.2.240603.tar.gz", hash = "sha256:2dcc86e8fa6ea41535a4561c1f08b3942ba5267b464eff2e99caeee66f9e4cd1"}, + {file = "parameterized-0.9.0-py2.py3-none-any.whl", hash = "sha256:4e0758e3d41bea3bbd05ec14fc2c24736723f243b28d702081aef438c9372b1b"}, + {file = "parameterized-0.9.0.tar.gz", hash = "sha256:7fc905272cefa4f364c1a3429cbbe9c0f98b793988efb5bf90aac80f08db09b1"}, ] -[package.dependencies] -numpy = [ - {version = ">=1.23.5", markers = "python_version >= \"3.9\" and python_version < \"3.12\""}, - {version = ">=1.26.0", markers = "python_version >= \"3.12\" and python_version < \"3.13\""}, -] -types-pytz = ">=2022.1.1" +[package.extras] +dev = ["jinja2"] [[package]] name = "parso" @@ -3453,7 +3450,7 @@ files = [ name = "pytz" version = "2024.1" description = "World timezone definitions, modern and historical" -optional = false +optional = true python-versions = "*" files = [ {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, @@ -3949,28 +3946,28 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.4.8" +version = "0.4.9" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:7663a6d78f6adb0eab270fa9cf1ff2d28618ca3a652b60f2a234d92b9ec89066"}, - {file = "ruff-0.4.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:eeceb78da8afb6de0ddada93112869852d04f1cd0f6b80fe464fd4e35c330913"}, - {file = "ruff-0.4.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aad360893e92486662ef3be0a339c5ca3c1b109e0134fcd37d534d4be9fb8de3"}, - {file = "ruff-0.4.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:284c2e3f3396fb05f5f803c9fffb53ebbe09a3ebe7dda2929ed8d73ded736deb"}, - {file = "ruff-0.4.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7354f921e3fbe04d2a62d46707e569f9315e1a613307f7311a935743c51a764"}, - {file = "ruff-0.4.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:72584676164e15a68a15778fd1b17c28a519e7a0622161eb2debdcdabdc71883"}, - {file = "ruff-0.4.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9678d5c9b43315f323af2233a04d747409d1e3aa6789620083a82d1066a35199"}, - {file = "ruff-0.4.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704977a658131651a22b5ebeb28b717ef42ac6ee3b11e91dc87b633b5d83142b"}, - {file = "ruff-0.4.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d05f8d6f0c3cce5026cecd83b7a143dcad503045857bc49662f736437380ad45"}, - {file = "ruff-0.4.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6ea874950daca5697309d976c9afba830d3bf0ed66887481d6bca1673fc5b66a"}, - {file = "ruff-0.4.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:fc95aac2943ddf360376be9aa3107c8cf9640083940a8c5bd824be692d2216dc"}, - {file = "ruff-0.4.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:384154a1c3f4bf537bac69f33720957ee49ac8d484bfc91720cc94172026ceed"}, - {file = "ruff-0.4.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e9d5ce97cacc99878aa0d084c626a15cd21e6b3d53fd6f9112b7fc485918e1fa"}, - {file = "ruff-0.4.8-py3-none-win32.whl", hash = "sha256:6d795d7639212c2dfd01991259460101c22aabf420d9b943f153ab9d9706e6a9"}, - {file = "ruff-0.4.8-py3-none-win_amd64.whl", hash = "sha256:e14a3a095d07560a9d6769a72f781d73259655919d9b396c650fc98a8157555d"}, - {file = "ruff-0.4.8-py3-none-win_arm64.whl", hash = "sha256:14019a06dbe29b608f6b7cbcec300e3170a8d86efaddb7b23405cb7f7dcaf780"}, - {file = "ruff-0.4.8.tar.gz", hash = "sha256:16d717b1d57b2e2fd68bd0bf80fb43931b79d05a7131aa477d66fc40fbd86268"}, + {file = "ruff-0.4.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b262ed08d036ebe162123170b35703aaf9daffecb698cd367a8d585157732991"}, + {file = "ruff-0.4.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:98ec2775fd2d856dc405635e5ee4ff177920f2141b8e2d9eb5bd6efd50e80317"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4555056049d46d8a381f746680db1c46e67ac3b00d714606304077682832998e"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e91175fbe48f8a2174c9aad70438fe9cb0a5732c4159b2a10a3565fea2d94cde"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e8e7b95673f22e0efd3571fb5b0cf71a5eaaa3cc8a776584f3b2cc878e46bff"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2d45ddc6d82e1190ea737341326ecbc9a61447ba331b0a8962869fcada758505"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:78de3fdb95c4af084087628132336772b1c5044f6e710739d440fc0bccf4d321"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06b60f91bfa5514bb689b500a25ba48e897d18fea14dce14b48a0c40d1635893"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88bffe9c6a454bf8529f9ab9091c99490578a593cc9f9822b7fc065ee0712a06"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:673bddb893f21ab47a8334c8e0ea7fd6598ecc8e698da75bcd12a7b9d0a3206e"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8c1aff58c31948cc66d0b22951aa19edb5af0a3af40c936340cd32a8b1ab7438"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:784d3ec9bd6493c3b720a0b76f741e6c2d7d44f6b2be87f5eef1ae8cc1d54c84"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:732dd550bfa5d85af8c3c6cbc47ba5b67c6aed8a89e2f011b908fc88f87649db"}, + {file = "ruff-0.4.9-py3-none-win32.whl", hash = "sha256:8064590fd1a50dcf4909c268b0e7c2498253273309ad3d97e4a752bb9df4f521"}, + {file = "ruff-0.4.9-py3-none-win_amd64.whl", hash = "sha256:e0a22c4157e53d006530c902107c7f550b9233e9706313ab57b892d7197d8e52"}, + {file = "ruff-0.4.9-py3-none-win_arm64.whl", hash = "sha256:5d5460f789ccf4efd43f265a58538a2c24dbce15dbf560676e430375f20a8198"}, + {file = "ruff-0.4.9.tar.gz", hash = "sha256:f1cb0828ac9533ba0135d148d214e284711ede33640465e706772645483427e3"}, ] [[package]] @@ -4369,13 +4366,13 @@ files = [ [[package]] name = "tenacity" -version = "8.3.0" +version = "8.4.1" description = "Retry code until it succeeds" optional = false python-versions = ">=3.8" files = [ - {file = "tenacity-8.3.0-py3-none-any.whl", hash = "sha256:3649f6443dbc0d9b01b9d8020a9c4ec7a1ff5f6f3c6c8a036ef371f573fe9185"}, - {file = "tenacity-8.3.0.tar.gz", hash = "sha256:953d4e6ad24357bceffbc9707bc74349aca9d245f68eb65419cf0c249a1949a2"}, + {file = "tenacity-8.4.1-py3-none-any.whl", hash = "sha256:28522e692eda3e1b8f5e99c51464efcc0b9fc86933da92415168bc1c4e2308fa"}, + {file = "tenacity-8.4.1.tar.gz", hash = "sha256:54b1412b878ddf7e1f1577cd49527bad8cdef32421bd599beac0c6c3f10582fd"}, ] [package.extras] @@ -4384,47 +4381,47 @@ test = ["pytest", "tornado (>=4.5)", "typeguard"] [[package]] name = "tiktoken" -version = "0.5.2" +version = "0.7.0" description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" optional = false python-versions = ">=3.8" files = [ - {file = "tiktoken-0.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c4e654282ef05ec1bd06ead22141a9a1687991cef2c6a81bdd1284301abc71d"}, - {file = "tiktoken-0.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7b3134aa24319f42c27718c6967f3c1916a38a715a0fa73d33717ba121231307"}, - {file = "tiktoken-0.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6092e6e77730929c8c6a51bb0d7cfdf1b72b63c4d033d6258d1f2ee81052e9e5"}, - {file = "tiktoken-0.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ad8ae2a747622efae75837abba59be6c15a8f31b4ac3c6156bc56ec7a8e631"}, - {file = "tiktoken-0.5.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51cba7c8711afa0b885445f0637f0fcc366740798c40b981f08c5f984e02c9d1"}, - {file = "tiktoken-0.5.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3d8c7d2c9313f8e92e987d585ee2ba0f7c40a0de84f4805b093b634f792124f5"}, - {file = "tiktoken-0.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:692eca18c5fd8d1e0dde767f895c17686faaa102f37640e884eecb6854e7cca7"}, - {file = "tiktoken-0.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:138d173abbf1ec75863ad68ca289d4da30caa3245f3c8d4bfb274c4d629a2f77"}, - {file = "tiktoken-0.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7388fdd684690973fdc450b47dfd24d7f0cbe658f58a576169baef5ae4658607"}, - {file = "tiktoken-0.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a114391790113bcff670c70c24e166a841f7ea8f47ee2fe0e71e08b49d0bf2d4"}, - {file = "tiktoken-0.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca96f001e69f6859dd52926d950cfcc610480e920e576183497ab954e645e6ac"}, - {file = "tiktoken-0.5.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:15fed1dd88e30dfadcdd8e53a8927f04e1f6f81ad08a5ca824858a593ab476c7"}, - {file = "tiktoken-0.5.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:93f8e692db5756f7ea8cb0cfca34638316dcf0841fb8469de8ed7f6a015ba0b0"}, - {file = "tiktoken-0.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:bcae1c4c92df2ffc4fe9f475bf8148dbb0ee2404743168bbeb9dcc4b79dc1fdd"}, - {file = "tiktoken-0.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b76a1e17d4eb4357d00f0622d9a48ffbb23401dcf36f9716d9bd9c8e79d421aa"}, - {file = "tiktoken-0.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:01d8b171bb5df4035580bc26d4f5339a6fd58d06f069091899d4a798ea279d3e"}, - {file = "tiktoken-0.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42adf7d4fb1ed8de6e0ff2e794a6a15005f056a0d83d22d1d6755a39bffd9e7f"}, - {file = "tiktoken-0.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3f894dbe0adb44609f3d532b8ea10820d61fdcb288b325a458dfc60fefb7db"}, - {file = "tiktoken-0.5.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:58ccfddb4e62f0df974e8f7e34a667981d9bb553a811256e617731bf1d007d19"}, - {file = "tiktoken-0.5.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58902a8bad2de4268c2a701f1c844d22bfa3cbcc485b10e8e3e28a050179330b"}, - {file = "tiktoken-0.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:5e39257826d0647fcac403d8fa0a474b30d02ec8ffc012cfaf13083e9b5e82c5"}, - {file = "tiktoken-0.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8bde3b0fbf09a23072d39c1ede0e0821f759b4fa254a5f00078909158e90ae1f"}, - {file = "tiktoken-0.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2ddee082dcf1231ccf3a591d234935e6acf3e82ee28521fe99af9630bc8d2a60"}, - {file = "tiktoken-0.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35c057a6a4e777b5966a7540481a75a31429fc1cb4c9da87b71c8b75b5143037"}, - {file = "tiktoken-0.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c4a049b87e28f1dc60509f8eb7790bc8d11f9a70d99b9dd18dfdd81a084ffe6"}, - {file = "tiktoken-0.5.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5bf5ce759089f4f6521ea6ed89d8f988f7b396e9f4afb503b945f5c949c6bec2"}, - {file = "tiktoken-0.5.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0c964f554af1a96884e01188f480dad3fc224c4bbcf7af75d4b74c4b74ae0125"}, - {file = "tiktoken-0.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:368dd5726d2e8788e47ea04f32e20f72a2012a8a67af5b0b003d1e059f1d30a3"}, - {file = "tiktoken-0.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2deef9115b8cd55536c0a02c0203512f8deb2447f41585e6d929a0b878a0dd2"}, - {file = "tiktoken-0.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2ed7d380195affbf886e2f8b92b14edfe13f4768ff5fc8de315adba5b773815e"}, - {file = "tiktoken-0.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c76fce01309c8140ffe15eb34ded2bb94789614b7d1d09e206838fc173776a18"}, - {file = "tiktoken-0.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60a5654d6a2e2d152637dd9a880b4482267dfc8a86ccf3ab1cec31a8c76bfae8"}, - {file = "tiktoken-0.5.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:41d4d3228e051b779245a8ddd21d4336f8975563e92375662f42d05a19bdff41"}, - {file = "tiktoken-0.5.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c1cdec2c92fcde8c17a50814b525ae6a88e8e5b02030dc120b76e11db93f13"}, - {file = "tiktoken-0.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:84ddb36faedb448a50b246e13d1b6ee3437f60b7169b723a4b2abad75e914f3e"}, - {file = "tiktoken-0.5.2.tar.gz", hash = "sha256:f54c581f134a8ea96ce2023ab221d4d4d81ab614efa0b2fbce926387deb56c80"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, + {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, + {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, + {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, + {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, + {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, + {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, ] [package.dependencies] @@ -4828,17 +4825,6 @@ files = [ cryptography = ">=35.0.0" types-cffi = "*" -[[package]] -name = "types-pytz" -version = "2024.1.0.20240417" -description = "Typing stubs for pytz" -optional = false -python-versions = ">=3.8" -files = [ - {file = "types-pytz-2024.1.0.20240417.tar.gz", hash = "sha256:6810c8a1f68f21fdf0f4f374a432487c77645a0ac0b31de4bf4690cf21ad3981"}, - {file = "types_pytz-2024.1.0.20240417-py3-none-any.whl", hash = "sha256:8335d443310e2db7b74e007414e74c4f53b67452c0cb0d228ca359ccfba59659"}, -] - [[package]] name = "types-redis" version = "4.6.0.20240425" @@ -4920,7 +4906,7 @@ typing-extensions = ">=3.7.4" name = "tzdata" version = "2024.1" description = "Provider of IANA time zone data" -optional = false +optional = true python-versions = ">=2" files = [ {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, @@ -4940,13 +4926,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] @@ -5236,11 +5222,11 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", anthropic = ["anthropic"] chat = ["fastapi"] cohere = ["cohere"] -examples = ["datasets", "scipy", "torch", "transformers"] +examples = ["datasets", "pandas", "scipy", "torch", "transformers"] google-generativeai = ["google-generativeai"] groq = ["groq"] [metadata] lock-version = "2.0" python-versions = ">=3.10, <3.13" -content-hash = "587166b04c86852909c7551891ec503ffca5acf30a7881253795aa0fdd4d85da" +content-hash = "096a882b6e14ad14a42bbda97a856641da4c8d5c078618cb8474b9f1d91dc0ef" diff --git a/pyproject.toml b/pyproject.toml index d3323c485..16618ff00 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,14 +9,12 @@ packages = [{include = "sotopia"}] [tool.poetry.dependencies] python = ">=3.10, <3.13" -pandas = "^2.1.1" lxml = "^4.9.3" openai = "^1.11.0" langchain = "0.1.5" rich = "^13.6.0" PettingZoo = "1.24.0" redis-om = "^0.2.1" -pandas-stubs = "*" types-tqdm = "*" gin-config = "^0.5.0" absl-py = "^2.0.0" @@ -38,6 +36,7 @@ transformers = { version = "^4.41.0", optional = true } datasets = { version = "^2.19.0", optional = true } scipy = { version = "^1.13.1", optional = true } torch = { version = "^2.3.0", optional = true } +pandas = { version = "^2.1.1", optional = true } [tool.poetry.group.dev.dependencies] pre-commit = "*" @@ -55,7 +54,7 @@ anthropic = ["anthropic"] groq = ["groq"] cohere = ["cohere"] google-generativeai = ["google-generativeai"] -examples = ["transformers", "datasets", "scipy", "torch"] +examples = ["transformers", "datasets", "scipy", "torch", "pandas"] chat = ["fastapi"] [build-system] diff --git a/sotopia/database/serialization.py b/sotopia/database/serialization.py index af60c31fe..cd10ef384 100644 --- a/sotopia/database/serialization.py +++ b/sotopia/database/serialization.py @@ -1,6 +1,7 @@ +import csv import json +from typing import Any -import pandas as pd from pydantic import BaseModel, Field from .env_agent_combo_storage import EnvAgentComboStorage @@ -175,6 +176,25 @@ def get_social_interactions_from_episode( return "\n\n".join(overall_social_interaction) +def _serialize_data_to_csv(data: dict[str, list[Any]], csv_file_path: str) -> None: + """ + Serialize data to a csv file without pandas + """ + max_length = max(len(lst) for lst in data.values()) + + # Create and write to the csv file + with open(csv_file_path, "w", newline="") as file: + writer = csv.writer(file) + # Write the header + writer.writerow(data.keys()) + + # Write the data rows + for i in range(max_length): + # Create a row for each index in the longest list + row = [data[key][i] if i < len(data[key]) else "" for key in data.keys()] + writer.writerow(row) + + def episodes_to_csv( episodes: list[EpisodeLog], csv_file_path: str = "episodes.csv" ) -> None: @@ -184,7 +204,7 @@ def episodes_to_csv( episodes (list[EpisodeLog]): List of episodes. filepath (str, optional): The file path. Defaults to "episodes.csv". """ - data = { + data: dict[str, list[Any]] = { "episode_id": [episode.pk for episode in episodes], "environment_id": [episode.environment for episode in episodes], "agent_ids": [episode.agents for episode in episodes], @@ -207,8 +227,9 @@ def episodes_to_csv( "reasoning": [episode.reasoning for episode in episodes], "rewards": [get_rewards_from_episode(episode) for episode in episodes], } - df = pd.DataFrame(data) - df.to_csv(csv_file_path, index=False) + + # Serialize data to a csv file without pandas + _serialize_data_to_csv(data, csv_file_path) def episodes_to_jsonl( @@ -253,15 +274,16 @@ def agentprofiles_to_csv( agent_profiles (list[AgentProfile]): List of agent profiles. filepath (str, optional): The file path. Defaults to "agent_profiles.csv". """ - data = { + data: dict[str, list[Any]] = { "agent_id": [profile.pk for profile in agent_profiles], "first_name": [profile.first_name for profile in agent_profiles], "last_name": [profile.last_name for profile in agent_profiles], "age": [profile.age for profile in agent_profiles], "occupation": [profile.occupation for profile in agent_profiles], } - df = pd.DataFrame(data) - df.to_csv(csv_file_path, index=False) + + # Serialize data to a csv file without pandas + _serialize_data_to_csv(data, csv_file_path) def agentprofiles_to_jsonl( @@ -308,7 +330,7 @@ def environmentprofiles_to_csv( environment_profiles (list[EnvironmentProfile]): List of environment profiles. filepath (str, optional): The file path. Defaults to "environment_profiles.csv". """ - data = { + data: dict[str, list[Any]] = { "env_id": [profile.pk for profile in environment_profiles], "codename": [profile.codename for profile in environment_profiles], "source": [profile.source for profile in environment_profiles], @@ -323,8 +345,9 @@ def environmentprofiles_to_csv( profile.agent_constraint for profile in environment_profiles ], } - df = pd.DataFrame(data) - df.to_csv(csv_file_path, index=False) + + # Serialize data to a csv file without pandas + _serialize_data_to_csv(data, csv_file_path) def environmentprofiles_to_jsonl( @@ -366,7 +389,7 @@ def relationshipprofiles_to_csv( relationship_profiles (list[RelationshipProfile]): List of relationship profiles. filepath (str, optional): The file path. Defaults to "relationship_profiles.csv". """ - data = { + data: dict[str, list[Any]] = { "relationship_id": [profile.pk for profile in relationship_profiles], "agent1_id": [profile.agent_1_id for profile in relationship_profiles], "agent2_id": [profile.agent_2_id for profile in relationship_profiles], @@ -375,8 +398,9 @@ def relationshipprofiles_to_csv( profile.background_story for profile in relationship_profiles ], } - df = pd.DataFrame(data) - df.to_csv(csv_file_path, index=False) + + # Serialize data to a csv file without pandas + _serialize_data_to_csv(data, csv_file_path) def envagnetcombostorage_to_csv( @@ -389,13 +413,14 @@ def envagnetcombostorage_to_csv( env_agent_combo_storages (list[EnvAgentComboStorage]): List of environment-agent combo storages. filepath (str, optional): The file path. Defaults to "env_agent_combo_storages.csv". """ - data = { + data: dict[str, list[Any]] = { "combo_id": [storage.pk for storage in env_agent_combo_storages], "env_id": [storage.env_id for storage in env_agent_combo_storages], "agent_ids": [storage.agent_ids for storage in env_agent_combo_storages], } - df = pd.DataFrame(data) - df.to_csv(csv_file_path, index=False) + + # Serialize data to a csv file without pandas + _serialize_data_to_csv(data, csv_file_path) def relationshipprofiles_to_jsonl( diff --git a/tests/database/test_serialization.py b/tests/database/test_serialization.py index a5655e95a..897c932b4 100644 --- a/tests/database/test_serialization.py +++ b/tests/database/test_serialization.py @@ -21,6 +21,8 @@ jsonl_to_agentprofiles, ) +import csv + def test_episode_log_serialization() -> None: episode_log = EpisodeLog( @@ -175,11 +177,24 @@ def test_episode_log_serialization() -> None: rewards_prompt='Prompt after formatting:\n\n Given the string that can not be parsed by json parser, reformat it to a string that can be parsed by json parser.\n Original string: \n\n Turn #9: You decide to speak.\n\n "I understand your concerns, Noah, but I believe that supporting children in conflict zones is a cause worth investing in. While we may not be able to solve the problem on our own, every little bit helps. I plan to donate, and I hope you will consider doing the same."\n\n You wait for Noah Davis\'s response.\n\n Turn #10: Noah Davis said: "I understand your perspective, Finnegan. However, I still have my own financial commitments to consider. Is there a way we can support\n\n Format instructions: The output should be formatted as a JSON instance that conforms to the JSON schema below.\n\nAs an example, for the schema {"properties": {"foo": {"title": "Foo", "description": "a list of strings", "type": "array", "items": {"type": "string"}}}, "required": ["foo"]}}\nthe object {"foo": ["bar", "baz"]} is a well-formatted instance of the schema. The object {"properties": {"foo": ["bar", "baz"]}} is not well-formatted.\n\nHere is the output schema:\n```\n{"description": "An interface for messages.\\nThere is only one required method: to_natural_language", "properties": {"action_type": {"title": "Action Type", "description": "whether to speak at this turn or choose to not do anything", "enum": ["none", "speak", "non-verbal communication", "action", "leave"], "type": "string"}, "argument": {"title": "Argument", "description": "the utterance if choose to speak, the expression or gesture if choose non-verbal communication, or the physical action if choose action", "type": "string"}}, "required": ["action_type", "argument"]}\n```\n\n Please only generate the JSON:\n \x1b[0m', ) - episodes_to_jsonl([episode_log], "./test_episode_log.jsonl") - rebuild_episode_log = jsonl_to_episodes("./test_episode_log.jsonl")[0] + episodes_to_jsonl([episode_log], "/tmp/test_episode_log.jsonl") + rebuild_episode_log = jsonl_to_episodes("/tmp/test_episode_log.jsonl")[0] assert episode_log.dict() == rebuild_episode_log.dict() - episodes_to_csv([episode_log], "./test_episode_log.csv") + episodes_to_csv([episode_log], "/tmp/test_episode_log.csv") + with open("/tmp/test_episode_log.csv") as f: + reader = csv.DictReader(f) + for row in reader: + print(row.keys()) + assert row["episode_id"] == episode_log.pk + assert row["environment_id"] == episode_log.environment + assert row["agent_ids"] == str(episode_log.agents) + assert row["experiment_tag"] == episode_log.tag + assert row["experiment_model_name_pairs"] == str(episode_log.models) + assert row["raw_messages"] == str(episode_log.messages) + assert row["reasoning"] == episode_log.reasoning + assert row["raw_rewards"] == str(episode_log.rewards) + assert row["raw_rewards_prompt"] == episode_log.rewards_prompt def test_relationship_profile_serialization() -> None: @@ -192,17 +207,26 @@ def test_relationship_profile_serialization() -> None: ) relationshipprofiles_to_jsonl( - [relationship_profile], "./test_relationship_profile.jsonl" + [relationship_profile], "/tmp/test_relationship_profile.jsonl" ) rebuild_relationship_profile = jsonl_to_relationshipprofiles( - "./test_relationship_profile.jsonl" + "/tmp/test_relationship_profile.jsonl" )[0] assert relationship_profile.dict() == rebuild_relationship_profile.dict() relationshipprofiles_to_csv( - [relationship_profile], "./test_relationship_profile.csv" + [relationship_profile], "/tmp/test_relationship_profile.csv" ) + with open("/tmp/test_relationship_profile.csv") as f: + reader = csv.DictReader(f) + for row in reader: + assert row["relationship_id"] == relationship_profile.pk + assert row["agent1_id"] == relationship_profile.agent_1_id + assert row["agent2_id"] == relationship_profile.agent_2_id + assert row["relationship"] == str(relationship_profile.relationship) + assert row["background_story"] == relationship_profile.background_story + def test_environment_profile_serialization() -> None: environment_profile = EnvironmentProfile( @@ -221,14 +245,34 @@ def test_environment_profile_serialization() -> None: ) environmentprofiles_to_jsonl( - [environment_profile], "./test_environment_profile.jsonl" + [environment_profile], "/tmp/test_environment_profile.jsonl" ) rebuild_environment_profile = jsonl_to_environmentprofiles( - "./test_environment_profile.jsonl" + "/tmp/test_environment_profile.jsonl" )[0] assert environment_profile.dict() == rebuild_environment_profile.dict() - environmentprofiles_to_csv([environment_profile], "./test_environment_profile.csv") + environmentprofiles_to_csv( + [environment_profile], "/tmp/test_environment_profile.csv" + ) + + with open("/tmp/test_environment_profile.csv") as f: + reader = csv.DictReader(f) + for row in reader: + assert row["env_id"] == environment_profile.pk + assert row["codename"] == environment_profile.codename + assert row["source"] == environment_profile.source + assert row["scenario"] == environment_profile.scenario + assert row["agent_goals"] == str(environment_profile.agent_goals) + assert row["relationship"] == str(environment_profile.relationship) + assert row["age_constraint"] == environment_profile.age_constraint or "" + assert ( + row["occupation_constraint"] + == environment_profile.occupation_constraint + ) + assert row["agent_constraint"] == str( + environment_profile.agent_constraint or "" + ) def test_envagentcombostorage_serialization() -> None: @@ -239,17 +283,24 @@ def test_envagentcombostorage_serialization() -> None: ) envagnetcombostorage_to_jsonl( - [envagentcombo_storage], "./test_envagentcombo_storage.jsonl" + [envagentcombo_storage], "/tmp/test_envagentcombo_storage.jsonl" ) rebuild_envagentcombo_storage = jsonl_to_envagnetcombostorage( - "./test_envagentcombo_storage.jsonl" + "/tmp/test_envagentcombo_storage.jsonl" )[0] assert envagentcombo_storage.dict() == rebuild_envagentcombo_storage.dict() envagnetcombostorage_to_csv( - [envagentcombo_storage], "./test_envagentcombo_storage.csv" + [envagentcombo_storage], "/tmp/test_envagentcombo_storage.csv" ) + with open("/tmp/test_envagentcombo_storage.csv") as f: + reader = csv.DictReader(f) + for row in reader: + assert row["combo_id"] == envagentcombo_storage.pk + assert row["env_id"] == envagentcombo_storage.env_id + assert row["agent_ids"] == str(envagentcombo_storage.agent_ids) + def test_agentprofile_serialization() -> None: agent_profile = AgentProfile( @@ -271,8 +322,17 @@ def test_agentprofile_serialization() -> None: mbti="ENTP", ) - agentprofiles_to_jsonl([agent_profile], "./test_agent_profile.jsonl") - rebuild_agent_profile = jsonl_to_agentprofiles("./test_agent_profile.jsonl")[0] + agentprofiles_to_jsonl([agent_profile], "/tmp/test_agent_profile.jsonl") + rebuild_agent_profile = jsonl_to_agentprofiles("/tmp/test_agent_profile.jsonl")[0] assert agent_profile.dict() == rebuild_agent_profile.dict() - agentprofiles_to_csv([agent_profile], "./test_agent_profile.csv") + agentprofiles_to_csv([agent_profile], "/tmp/test_agent_profile.csv") + + with open("/tmp/test_agent_profile.csv") as f: + reader = csv.DictReader(f) + for row in reader: + assert row["agent_id"] == agent_profile.pk + assert row["first_name"] == agent_profile.first_name + assert row["last_name"] == agent_profile.last_name + assert row["age"] == str(agent_profile.age) + assert row["occupation"] == agent_profile.occupation From a22be451322e9d3aff368786ec43daa7b3315113 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:45:12 -0400 Subject: [PATCH 10/23] Bump pettingzoo from 1.24.0 to 1.24.3 (#112) Bumps [pettingzoo](https://github.com/Farama-Foundation/PettingZoo) from 1.24.0 to 1.24.3. - [Release notes](https://github.com/Farama-Foundation/PettingZoo/releases) - [Commits](https://github.com/Farama-Foundation/PettingZoo/compare/1.24.0...1.24.3) --- updated-dependencies: - dependency-name: pettingzoo dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 10 +++++----- pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 57edce3e8..26f050e2d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3002,13 +3002,13 @@ testing = ["docopt", "pytest"] [[package]] name = "pettingzoo" -version = "1.24.0" +version = "1.24.3" description = "Gymnasium for multi-agent reinforcement learning." optional = false python-versions = ">=3.8" files = [ - {file = "pettingzoo-1.24.0-py3-none-any.whl", hash = "sha256:c9ad75739869dff19ee41a58a948e39cde6c6e3f34af6de6639f7e2438bc3829"}, - {file = "pettingzoo-1.24.0.tar.gz", hash = "sha256:7d28d847964680ae554eb3fcc639f733174f1901883bf18cc9715607c4675418"}, + {file = "pettingzoo-1.24.3-py3-none-any.whl", hash = "sha256:23ed90517d2e8a7098bdaf5e31234b3a7f7b73ca578d70d1ca7b9d0cb0e37982"}, + {file = "pettingzoo-1.24.3.tar.gz", hash = "sha256:91f9094f18e06fb74b98f4099cd22e8ae4396125e51719d50b30c9f1c7ab07e6"}, ] [package.dependencies] @@ -3023,7 +3023,7 @@ classic = ["chess (==1.9.4)", "pygame (==2.3.0)", "rlcard (==1.0.5)", "shimmy[op mpe = ["pygame (==2.3.0)"] other = ["pillow (>=8.0.1)"] sisl = ["box2d-py (==2.3.5)", "pygame (==2.3.0)", "pymunk (==6.2.0)", "scipy (>=1.4.1)"] -testing = ["AutoROM", "pre-commit", "pynput", "pytest", "pytest-cov"] +testing = ["AutoROM", "pre-commit", "pynput", "pytest", "pytest-cov", "pytest-markdown-docs", "pytest-xdist"] [[package]] name = "pexpect" @@ -5229,4 +5229,4 @@ groq = ["groq"] [metadata] lock-version = "2.0" python-versions = ">=3.10, <3.13" -content-hash = "096a882b6e14ad14a42bbda97a856641da4c8d5c078618cb8474b9f1d91dc0ef" +content-hash = "9c928912f5807959ae5c4697654fc742d977d34d4944ccb1794990e45dac6687" diff --git a/pyproject.toml b/pyproject.toml index 16618ff00..5f1f73d27 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ lxml = "^4.9.3" openai = "^1.11.0" langchain = "0.1.5" rich = "^13.6.0" -PettingZoo = "1.24.0" +PettingZoo = "1.24.3" redis-om = "^0.2.1" types-tqdm = "*" gin-config = "^0.5.0" From d03dae80688f25cfe7921086d22b402d6ce102b4 Mon Sep 17 00:00:00 2001 From: Haofei Yu <1125027232@qq.com> Date: Tue, 18 Jun 2024 16:01:19 -0400 Subject: [PATCH 11/23] support codecov (#100) * support agentprofile and environmentprofile serialization * convert json to jsonl * pass pre-commit test * add missing attribute * support other serialization * precommit check * support testing of serialization * support testing of serialization * support testing of serialization * change the data path * fix ruff * support codecov * support codecov * support codecov * fix pre-commit * update poetry lock * add codecov badge * add codecov comment --------- Co-authored-by: Hao --- .github/.codecov.yml | 23 ++++++++ .github/workflows/tests.yml | 6 ++- README.md | 1 + poetry.lock | 101 +++++++++++++++++++++++++++++++++--- pyproject.toml | 1 + 5 files changed, 123 insertions(+), 9 deletions(-) create mode 100644 .github/.codecov.yml diff --git a/.github/.codecov.yml b/.github/.codecov.yml new file mode 100644 index 000000000..28bbfa668 --- /dev/null +++ b/.github/.codecov.yml @@ -0,0 +1,23 @@ +codecov: + notify: + wait_for_ci: true + +coverage: + status: + patch: + default: + threshold: 100% # allow patch coverage to be lower than project coverage by any amount + project: + default: + threshold: 5% # allow project coverage to drop at most 5% + +comment: # this is a top-level key + layout: " diff, flags, files" + behavior: default + require_changes: false # if true: only post the comment if coverage changes + require_base: false # [true :: must have a base report to post] + require_head: true # [true :: must have a head report to post] + hide_project_coverage: false # [true :: only show coverage on the git diff] + +github_checks: + annotations: false diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0dce55c49..46eb36c8f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -38,4 +38,8 @@ jobs: REDIS_OM_URL: ${{ secrets.REDIS_OM_URL }} TOGETHER_API_KEY: ${{ secrets.TOGETHER_API_KEY }} run: | - poetry run pytest + poetry run pytest --cov=. --cov-report=xml + - name: Upload coverage report to Codecov + uses: codecov/codecov-action@v4.0.1 + with: + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/README.md b/README.md index 3058fe27b..a115d1d8a 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ [![pypi](https://img.shields.io/pypi/v/sotopia.svg)](https://pypi.python.org/pypi/sotopia) [![versions](https://img.shields.io/pypi/pyversions/sotopia.svg)](https://github.com/sotopia/sotopia) [![CI](https://img.shields.io/github/actions/workflow/status/sotopia-lab/sotopia/tests.yml?branch=main&logo=github&label=CI)](https://github.com/sotopia-lab/sotopia/actions?query=branch%3Amain) +[![codecov](https://codecov.io/github/sotopia-lab/sotopia/graph/badge.svg?token=00LRQFX0QR)](https://codecov.io/github/sotopia-lab/sotopia) [![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/14hJOfzpA37PRUzdlFgiqVzUGIhhngqnz?usp=sharing) [![Project Page](https://img.shields.io/badge/Project-Page-green.svg)](https://www.sotopia.world/projects/sotopia) diff --git a/poetry.lock b/poetry.lock index 26f050e2d..e847a6e6d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -247,17 +247,17 @@ test-tox-coverage = ["coverage (>=5.5)"] [[package]] name = "boto3" -version = "1.34.128" +version = "1.34.129" description = "The AWS SDK for Python" optional = true python-versions = ">=3.8" files = [ - {file = "boto3-1.34.128-py3-none-any.whl", hash = "sha256:a048ff980a81cd652724a73bc496c519b336fabe19cc8bfc6c53b2ff6eb22c7b"}, - {file = "boto3-1.34.128.tar.gz", hash = "sha256:43a6e99f53a8d34b3b4dbe424dbcc6b894350dc41a85b0af7c7bc24a7ec2cead"}, + {file = "boto3-1.34.129-py3-none-any.whl", hash = "sha256:cc73de1c9d953b1f9da6ee2404af717e93d888f790f3e0291b22d1b8489eb401"}, + {file = "boto3-1.34.129.tar.gz", hash = "sha256:a7a696fd3e7f5f43a81450b441f3eb6c5a89d28efe867cd97d8fc73ea5d8c139"}, ] [package.dependencies] -botocore = ">=1.34.128,<1.35.0" +botocore = ">=1.34.129,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -266,13 +266,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.128" +version = "1.34.129" description = "Low-level, data-driven core of boto 3." optional = true python-versions = ">=3.8" files = [ - {file = "botocore-1.34.128-py3-none-any.whl", hash = "sha256:db67fda136c372ab3fa432580c819c89ba18d28a6152a4d2a7ea40d44082892e"}, - {file = "botocore-1.34.128.tar.gz", hash = "sha256:8d8e03f7c8c080ecafda72036eb3b482d649f8417c90b5dca33b7c2c47adb0c9"}, + {file = "botocore-1.34.129-py3-none-any.whl", hash = "sha256:86d3dd30996aa459e9c3321edac12aebe47c73cb4acc7556941f9b4c39726088"}, + {file = "botocore-1.34.129.tar.gz", hash = "sha256:7c56e25af6112d69c5d14a15b42f76ba7687687abc463a96ac5edca19c0a9c2d"}, ] [package.dependencies] @@ -555,6 +555,73 @@ traitlets = ">=4" [package.extras] test = ["pytest"] +[[package]] +name = "coverage" +version = "7.5.3" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "coverage-7.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a6519d917abb15e12380406d721e37613e2a67d166f9fb7e5a8ce0375744cd45"}, + {file = "coverage-7.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aea7da970f1feccf48be7335f8b2ca64baf9b589d79e05b9397a06696ce1a1ec"}, + {file = "coverage-7.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:923b7b1c717bd0f0f92d862d1ff51d9b2b55dbbd133e05680204465f454bb286"}, + {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62bda40da1e68898186f274f832ef3e759ce929da9a9fd9fcf265956de269dbc"}, + {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8b7339180d00de83e930358223c617cc343dd08e1aa5ec7b06c3a121aec4e1d"}, + {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:25a5caf742c6195e08002d3b6c2dd6947e50efc5fc2c2205f61ecb47592d2d83"}, + {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:05ac5f60faa0c704c0f7e6a5cbfd6f02101ed05e0aee4d2822637a9e672c998d"}, + {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:239a4e75e09c2b12ea478d28815acf83334d32e722e7433471fbf641c606344c"}, + {file = "coverage-7.5.3-cp310-cp310-win32.whl", hash = "sha256:a5812840d1d00eafae6585aba38021f90a705a25b8216ec7f66aebe5b619fb84"}, + {file = "coverage-7.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:33ca90a0eb29225f195e30684ba4a6db05dbef03c2ccd50b9077714c48153cac"}, + {file = "coverage-7.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f81bc26d609bf0fbc622c7122ba6307993c83c795d2d6f6f6fd8c000a770d974"}, + {file = "coverage-7.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7cec2af81f9e7569280822be68bd57e51b86d42e59ea30d10ebdbb22d2cb7232"}, + {file = "coverage-7.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55f689f846661e3f26efa535071775d0483388a1ccfab899df72924805e9e7cd"}, + {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50084d3516aa263791198913a17354bd1dc627d3c1639209640b9cac3fef5807"}, + {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:341dd8f61c26337c37988345ca5c8ccabeff33093a26953a1ac72e7d0103c4fb"}, + {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ab0b028165eea880af12f66086694768f2c3139b2c31ad5e032c8edbafca6ffc"}, + {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5bc5a8c87714b0c67cfeb4c7caa82b2d71e8864d1a46aa990b5588fa953673b8"}, + {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38a3b98dae8a7c9057bd91fbf3415c05e700a5114c5f1b5b0ea5f8f429ba6614"}, + {file = "coverage-7.5.3-cp311-cp311-win32.whl", hash = "sha256:fcf7d1d6f5da887ca04302db8e0e0cf56ce9a5e05f202720e49b3e8157ddb9a9"}, + {file = "coverage-7.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:8c836309931839cca658a78a888dab9676b5c988d0dd34ca247f5f3e679f4e7a"}, + {file = "coverage-7.5.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:296a7d9bbc598e8744c00f7a6cecf1da9b30ae9ad51c566291ff1314e6cbbed8"}, + {file = "coverage-7.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:34d6d21d8795a97b14d503dcaf74226ae51eb1f2bd41015d3ef332a24d0a17b3"}, + {file = "coverage-7.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e317953bb4c074c06c798a11dbdd2cf9979dbcaa8ccc0fa4701d80042d4ebf1"}, + {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:705f3d7c2b098c40f5b81790a5fedb274113373d4d1a69e65f8b68b0cc26f6db"}, + {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1196e13c45e327d6cd0b6e471530a1882f1017eb83c6229fc613cd1a11b53cd"}, + {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:015eddc5ccd5364dcb902eaecf9515636806fa1e0d5bef5769d06d0f31b54523"}, + {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fd27d8b49e574e50caa65196d908f80e4dff64d7e592d0c59788b45aad7e8b35"}, + {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:33fc65740267222fc02975c061eb7167185fef4cc8f2770267ee8bf7d6a42f84"}, + {file = "coverage-7.5.3-cp312-cp312-win32.whl", hash = "sha256:7b2a19e13dfb5c8e145c7a6ea959485ee8e2204699903c88c7d25283584bfc08"}, + {file = "coverage-7.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:0bbddc54bbacfc09b3edaec644d4ac90c08ee8ed4844b0f86227dcda2d428fcb"}, + {file = "coverage-7.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f78300789a708ac1f17e134593f577407d52d0417305435b134805c4fb135adb"}, + {file = "coverage-7.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b368e1aee1b9b75757942d44d7598dcd22a9dbb126affcbba82d15917f0cc155"}, + {file = "coverage-7.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f836c174c3a7f639bded48ec913f348c4761cbf49de4a20a956d3431a7c9cb24"}, + {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:244f509f126dc71369393ce5fea17c0592c40ee44e607b6d855e9c4ac57aac98"}, + {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4c2872b3c91f9baa836147ca33650dc5c172e9273c808c3c3199c75490e709d"}, + {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dd4b3355b01273a56b20c219e74e7549e14370b31a4ffe42706a8cda91f19f6d"}, + {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f542287b1489c7a860d43a7d8883e27ca62ab84ca53c965d11dac1d3a1fab7ce"}, + {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:75e3f4e86804023e991096b29e147e635f5e2568f77883a1e6eed74512659ab0"}, + {file = "coverage-7.5.3-cp38-cp38-win32.whl", hash = "sha256:c59d2ad092dc0551d9f79d9d44d005c945ba95832a6798f98f9216ede3d5f485"}, + {file = "coverage-7.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:fa21a04112c59ad54f69d80e376f7f9d0f5f9123ab87ecd18fbb9ec3a2beed56"}, + {file = "coverage-7.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5102a92855d518b0996eb197772f5ac2a527c0ec617124ad5242a3af5e25f85"}, + {file = "coverage-7.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d1da0a2e3b37b745a2b2a678a4c796462cf753aebf94edcc87dcc6b8641eae31"}, + {file = "coverage-7.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8383a6c8cefba1b7cecc0149415046b6fc38836295bc4c84e820872eb5478b3d"}, + {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aad68c3f2566dfae84bf46295a79e79d904e1c21ccfc66de88cd446f8686341"}, + {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e079c9ec772fedbade9d7ebc36202a1d9ef7291bc9b3a024ca395c4d52853d7"}, + {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bde997cac85fcac227b27d4fb2c7608a2c5f6558469b0eb704c5726ae49e1c52"}, + {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:990fb20b32990b2ce2c5f974c3e738c9358b2735bc05075d50a6f36721b8f303"}, + {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3d5a67f0da401e105753d474369ab034c7bae51a4c31c77d94030d59e41df5bd"}, + {file = "coverage-7.5.3-cp39-cp39-win32.whl", hash = "sha256:e08c470c2eb01977d221fd87495b44867a56d4d594f43739a8028f8646a51e0d"}, + {file = "coverage-7.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:1d2a830ade66d3563bb61d1e3c77c8def97b30ed91e166c67d0632c018f380f0"}, + {file = "coverage-7.5.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:3538d8fb1ee9bdd2e2692b3b18c22bb1c19ffbefd06880f5ac496e42d7bb3884"}, + {file = "coverage-7.5.3.tar.gz", hash = "sha256:04aefca5190d1dc7a53a4c1a5a7f8568811306d7a8ee231c42fb69215571944f"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + [[package]] name = "cryptography" version = "42.0.8" @@ -3407,6 +3474,24 @@ pytest = ">=7.0.0,<9" docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] +[[package]] +name = "pytest-cov" +version = "5.0.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, + {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -5229,4 +5314,4 @@ groq = ["groq"] [metadata] lock-version = "2.0" python-versions = ">=3.10, <3.13" -content-hash = "9c928912f5807959ae5c4697654fc742d977d34d4944ccb1794990e45dac6687" +content-hash = "ec049682e297d6891d13ba66949d7404d0e07efec7692e80e77bdbad38c62cb1" diff --git a/pyproject.toml b/pyproject.toml index 5f1f73d27..745d554fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,6 +46,7 @@ ruff = "*" [tool.poetry.group.test.dependencies] pytest = "*" +pytest-cov = "*" pytest-asyncio = "*" mypy = "^1.8.0" From d7c63137861c78eac3a675c9789e833ad6bdeaed Mon Sep 17 00:00:00 2001 From: Hao Zhu Date: Tue, 18 Jun 2024 19:39:00 -0400 Subject: [PATCH 12/23] Add platform selection button in redis installation section (#114) * git ignore * add nextra site * change path to docs * Add installation instruction (#76) * fix an accordion bug * Add tabs for choosing platform in Redis Instructions * add platform tab * updated open in colab instruction --- docs/bun.lockb | Bin 325450 -> 326212 bytes docs/components/ui/tabs.tsx | 53 ++++++++++++++++++++++++++++++++++++ docs/package.json | 1 + docs/pages/index.mdx | 48 ++++++++++++++++++++++++++------ docs/tailwind.config.ts | 1 + 5 files changed, 95 insertions(+), 8 deletions(-) create mode 100644 docs/components/ui/tabs.tsx diff --git a/docs/bun.lockb b/docs/bun.lockb index 5cda3bd6603abf531a396fc0a2cb0bfb12315db9..3f68561b7a428ccc36b2f33f5f913c2126879de6 100755 GIT binary patch delta 54596 zcmeFacVJb;*8hD92eRo%Cm_W}?~rH$hYq2mf}o&;5FkhoAVo|-Q9w{|tAhnpEZDdT z7O-#yE1_J(iUkELim0H{6nQ`2J#zxw%j5I>e(&@C^}1!9HS0TTX4b4(Q}#Y*$IU;M zfBo0;iyPN_^P!72XEl6p&Gf9D-!HCGcFPstU6EA(9B=%*%$|!1NIcXXl2-&Is~ChrvsLPac&$E@#B_ z(C1G69$pH(7`z;Ow5o#Fz=87n&?WIs$m-p0KGci%;W9AE@d65~d=+Y!{(o1GEuR<4?~7To zC{fWZSSEue@}UMsIDXBjoUBpwG$%KES~mO$xO%h&H>lwWnUhB~x;lIMpE28kZ{aeu zX!%g6DtzBrp-?h>9J25akSpeqn3SD6e$3SD(5s9?P2_cO_26;13>%f1JN}w+q0k={ zZ9|h>#Vab={H)yE?A$Ek16=wO#^+833$3CR8P)_`^^MCMH$G>0DAW%b8}g@TjvYh$ zp->b+F7KL9#9S4;5Lp#gs%9&gpg`b?AS-6hC0`z@k8Dp%c> zzYMPW9)l~NcH0Jt(K(ZIRB=vjqadD^*02SRFb~wgPjD3&n>}e{c5__s@Dct4(aQBM zz-j8wUbrHpWi2}}1J1SsIeg4iRUZ1<-xIBwIl8trqG25yz?tKwkIkH%H7aw`$Uy6T z>elez&g_!0lg_dHpK!G@DOg(q(&6*0-d?!m?e(nuk&|DC69oAW)wlW2JN=a|KmS~-Kgsf8 z`G*?V&Wr$%Yo2Oo9UCkejdF7DLMDpxZ)jv4P1sDHJ|R1l==3e*YXHWKAD)>@@DHLM zMMl<`+-dUG41ad4a^7r)qzdRLxFWqboDj)x?eLm#MSRTRKQyy?JK>6>SK+c^9bAFB zyOnJ<5y($AwepkXs~5wjuuIivovi#hGLtF46!j<^rm!XCWDgHb z9g#C8I~1xDx}}SC-qCK>sITA(=B;o= z&vS4^$<^#b({OuY9eoU3o!Qyhc5-G<8!a=g$zj@tLjT^WlD$G97MT1+y+ff|@QQsx zp|jwFk+DB7{|FVxD_f~h6@QH^?~H|O#z)c8_+|C820d_bC{!D{;U%`=naE7o{L3BQ z2Chz5fin^FbNbux?*>=7Bh({9_79L(*>Of(W_!LFfK?@bHC*$i${<_tkAb!ayB#lp z%QI^nzXPrY-=^Za@cwWae&=9|&w&TS4zB{fWr!V(;n~BcjP%!gCGtvNX}i7#u5rpn zLp6+`M0I!{xLRxqXI0JbGt>q|A`G*##!neHITSj|%#^EKApA!h_?b2?8fV%1li|49 z?^?WEo=5sD%HG7>R2|kmq5MQ#B)pV}k3`%I&z?GF{De?w9Wz}vCWdhyZ7DbpgR9=J z;2PG(#E4dxYH)d_h?Vp5x1*o{T$*Ezy9F*o&L3^v_AQ-LMPDMTBIe?#M&pN#o_n=* z+O>|eYk`JB2?IW%oZ@Qh7`wxyjkWDu0G9#(06$xCFms$8?;N-q8UR;A6B>=l8JjaX zv~j%c(N-$dcF>nztK!kQjkI@%*s>;MPRh-G3|ynv3q37ocp=dHX`(gYakx6xfqZ$W zTP~xTM;cwVvqR&h;@e1JOeYv78<%&hT~a7O6R6x*|>XIg`n!{w=j=f+)Y z<#w~IL3QDZ_@UtP$lU8Jp9z=Yqv0}eNFM%|OZx!GkhxT>DVXef_(;CBcrQIs50b#k z!+%2-KQY^_xO1$$4_RaTHeB_6=sd9MdfRYj?&L{1<3@&F1y{_y+O&zySnI~5^jy1i zhv2gO>YQ=I8;u_kdfds){n@2zW?p)eEw!9d(n{>ZbCG5KmGkTfk42UrI53UP$qe0qthgE8LS;EM}|H{J`4O^xLVuf^8X3fXsq#Pmu}K5f3cM!OKdHP zb^l(c{U*4yOWtP3?lyl<>6+o0ez;7{yiKgbsyQ1AE5QfDCBJaHcdu>m7kDM)@4+<#o?2!HXnfcjI4*nI6utw*y>&tay1Dt~eZ- zGr7@}3FzFf4zh;yAtCSF5ddsHxs7slQhUl3co?qy>*0!+QyUC%&2DZD`M)~5X$?sn z-V%qi#F=aC__5jABC_bAdXzPG_|@|zenPI65?ISs0{yv3KWIU!L>~fdeW{j%aAoE&Rb>2@Frvp$rQMv z^m4eSZdTl|JGF*@PBg>HbFIW$7>I-7#0=PVr&9PcT`O(W3-|qOly!F(QnTS2`>AjZ zY0k)T<0oZ@LSvCN_3AD6u7v(5lJ&xcXIFV5sBlsN=IZR}P_|JT~by+u)>} zv6C`KghGj@7#FzN><)}j|%%PX;Al&8KTWwT3@~zB(`lxvZA9D@c@sU+ffiQ$P*Q zqXPBhWeUh66OlE6FL%6~%Wn+V&{cxV17WxtJV-eiz*;>idt~;sJ;-V&CpUA_q|E7| z_mK0{)6FC_w#(p^;EUiIt7k(J>AFNa{Zzv%kJ1%j&JzV8mz}4~d9X?^N9lH16<-u>?Zu6t$OWyRI zEqDI+*1pAX)ze^~ZFdn|_FwO~HnHr8)`1w*<8uv*ah+q1|xlUk8_g6X5Dl=Co{{&`io67Rbp2ISEmRg= z&-gnkSI%3Bq;aV3P!F!^f*UR7v!Rsy`NILb@UB7Dma_CWTkb1(S>$<+PtKf>IgC5% z>(HwTe&u0%`&9=nb1#CQ3!ii(C|^83H+$^V>`9@}F@Iu}nsq)tY6IB7OQ04(y%xL+ z)m4T!e$ii3<@`v>AJ2STrER%d>&%p29{lXSsT+!f-`qWA#LgN0M-*FfRk?-VE=V36 zzUusnewF$|pIKc0NYU_f{`_X~@P5CbSv=Mz5(>5Ow>3)(Pw+FE$GrmNi>SPaU#@LR zBpUTMH*Xtm>w7KY-p$caXaHGZe@C;F@Spzt7V&UHzkpBUdoAPPr~M2*8~XEG#=TiZ zL!s6|HA`BggrD)fR`E!rnBTos+i*{ReyezRj$gp%2H$H9QPT0DHEpOF^#mJ)4hpqSq;Eya7!Ni;VqHC)Cop59h^>2dGgGNDi>^g`;8 zw;M?f74?@OolWR;L&AvGDc-e6%A;9oe9=k8{3UdtHglypc@e+dLs-!^9-9l&#V^%1 z&D%*z7TT^HfAB>3&B0xVH(ZC3#qc^F8LKY(O(TCEUaJI>aMS zSMrOew)OrbON!RK=7h1_5sXWCs_%7-doP07!gA3cNOEk@Xt;}C&@mpH!QAQXZ(Bms zo#NgRB#pauTXW`_^owYuV>6LD_}fy_y!E6ygO>^1S*zM9wR(e*nvxgsceG0J79#bv zHPHU2NE!y`PG-OC4J3xNpiA6)5bUC$^paL7v0X?l{a*dkld9V$iUlE;jiiFHKw5*O zA~raGa1t?*t%0 zTxj-8@m@h{jAkqdp#4bg14%K^m|Hbl3*!^c_X~Q*!#jMhPdr@9&*&5PUO3mT5@-30 zfcGm>3(5vk_yXVS8xIfjGy2B8I_D=^RBT+1)Y{*6ae7iA+z;>WKyt&0=Sy&Awnoa3 zj!0V6qCpT%cX_Oo#QaxCGLre4m6}x73dBiXAUHQMlOG~W_1ii=L$Wo>qzd(LxnJs` z^du5(0;MI4)nebfH16#x#1tmg{P|#m>W4x-0zJmmdj?4(Myq)AAd;;^<~3=M$YVl# z!cr#)d zgW|DL0ImF9gVMY~&4TB=`K5!Hdx>@L5=vUBGy~ngP|8BOtWbIp>7-^U7M*^Dc~>Hx z)O-%T)7O8MDhky1n zGUMJQ*rKtv8jFzB!Kklc+HzW6jH2pNu;Rx$Bc%ol?JQEZ2JKsGk@%;O#Q0xG+E7ql zI?<_Jj6J4RY7#=1K+r^c7D@fGW*kCNm2{;?igzJ3D9C6yJta0Ci7oAu^du5)5vPKW zkW_cD)P$@0^RwfzAJ)53H0!_?gR)o*-=Z}cTvguX2U#e%C_W&ua zN!E((NUAdEN+jIgUof(*m&+<8vpICozZZ}+R1{z#3ey95D5%_PkECsdyw)kPB}i;x zY)t2NOzisd$rvOJZxMgVs?;O|^z7t{6z$}1&S~qlW8SJ(yq293%SXD>-$sai@9@C9 zSbg@o;r_ONr6-Y44{gMrKqBBcPvJW+j^*kRn^MOV?;a$zMgyJVu66`) zXO|RjIucVx&c)TMkYtcOsO)!n)WWJ$8*jLojnofGoeM@TQYypWJhrWumSI&`idavs zMzStnGA1<%LH5~k-{KUpmR5g9vNp)RCPcb*uAG>MbTQ@FrI21z*>A^@EbBx5L49EQYJ^$vwb`K40RybD-Ss8Wu=ExAYw5?bDIBz1*3M@aVa=jX<~n*b;*j27QV zVz80ay{fEgc7`c$29o+03C@YH;)T&j))5_84Q($}?oOo1K^{XID^A8}*%q5jY8dCb zwAcrvCh3Hi)ISs&9H^FCo+{yFof$MX%4X5~q|1m#TPH&_6Y1nIY(p9sVWFD5+R)$`lTt_fVm<)>2tpEa+>+AzBCMtCvg428oUk?;%};J|6DP`FdvD>q)oR25sna)R{jsxKSbJCvxm) zC=gp*l`tMD<|7RVM*KTcBLaJ*HJbj(PaKQz+9o88I5ESyx=N-t4Xq44Noi#5De-3ehIu|r_2(X6eVuD1JT zkQ=)N=_0>Z^E7XhQbC1U{Uc*+R|Av7t^N5o#=UW1?a;7exC^PfZG}Mv_`pJ9~6kW?;Mykoy31-p2-g`cq??oF6z`)7C2XZ?Z&@d!&o@tfO*JNp?o$Gw@8 z5_>UAr#CV;5#(A5w;^?;>f(VBWhdLfDjD2k-Grp^#Gy=+_mP-}DQU6urZBR)bMdB= zY9Ex|k(!!>ps@<<@M=s=tQ{KEUy+D-g%mS=_BHs;O5DOkSOVnl;4aqdi6n!hnVN*a zdBzpnjN~GbgHCjM;c`R+S0QP#+6HzZ*#)oPf)uawj8KR%RRfo%c&m|YI4sFXiIkq{ zZ(iIs)_!JU2EI7+Dm;TU5KY#yCsUKI zvk`6Yc6~{KA3r3;%{d+|pN9+lQhDiYcAHb$#?~NnU>KF2l%Mb-#(JZX(y7(%DQl2y zjA(T^h}0p-)0ApC+YX&Q$IOxBZ|j*BDLu#Ed`DYv&hOP)^7 zSx9zZw8^dYJrn17Qih3pEpM=sB3K$ZDHnjf3f4Aojtn?^Zs8$|NjCzi6M6QGwhpN^ z5^Di*^`r8F#V>xN?LuIcHybG>=uo*nDc;veDiiq7OTNiQ0;8Ri;$4X(w=llccQ;a} zU{ZcYswsGIUmGhuPrY2!EX~UyB}-WZ*}GOEDayG&;12pXzu=yD?Ctr%$grqXU100* zg0(3FNwH(kRM#W5L}FzmRMsL54e}U{Smm2l!=iy{-X)}@W$&(ULed5i@|TR@D2k-| zf&mTx;%6-9P_xk91M*0MzKuX?hz8O-+{;TkX$(6@mG-4N4tO= zKdoGgTN0}_%TO#2iG?yhJ&DB0B8QP|tf}%Aw-#2;qLGWFE@5^~Y7#+ch5?e77g^GJ4$shEVk(q}igSc;^^xH@>$UdB@ahr`z zJVEe}L{grem=7XZi`42Tg_7(m@1Np9?gld+j(azNNgum7VZZD&*b5h=gb(`OBXO_6 z?ba?ds4*Mq(x5f`7kx! znF$V@kEX@CEDg33Qje1w=a(W?<*r0-eqm}asS!bL@4JIT5_(UQ8X90_?@3^jNDU6K ze~}vQ_j)wl_nwG*EAK5F|K>afT$b=;Kcq{L1_$?hSf*I|Yd?_) z_$61R7C{)`_u{r=HL13KuhwbaPozd$6EJo9lZCr4(uYXBgS;huQFUDi7R)<1e{Y5XPdDoJ1Zl;dINVaWRGIC8~Kve%)BsnbD zXFTtjL>`vJ1|jtfZpdCD#a_;niE+;+oT$=|B3Z8>#STgG7wt(;daiIxP+Ex8l_nSy zjw)XwrP;2pNQt$7Ue6twezAN~ZTwzrPwPqb3^dA7y2jeX{V-qWcv(o@thpDZCLzch zR7_U2bqQNk>;@#;XW98Nk_|!yQ0EsCBeR6Ohmo|-a@C4u6827$> z*=pFYPHL`CNZRd|BFP|Y!)~OeNF0AT@Rt2&LQ|_yPbURO!tgx5;MKVI4p{3zzZ|<( z(kpZ|SQdJdQsA-^@HGayuf@HOz+`9e%+IU1!LCmnpP3;2ktUHx-ApS41(02yOKeQ6 zBQ)V1+Mm+qJ@4XrK>c47@LWg@g1T91CLQLjoon)W-9YjhE zDpOwl*Q_V(ZQ`{^vNm{_;H^Vavvz0u0ZCqBM`Za*c|9?tj8rTSsi}Mrdx})cV88j2 zl-gl2KqL7LB!3aN&XdkhL1Mo@XOBBFX6t z8N>gwlW-k3aepA$U|`jaq`u`Z*wQvO<}Jl_sg`Npi=^5GmiHr$qMPg}aeiZoZiA#4 zvz}UnB%5gx-@Jj;+~#QkL+TXNq7y+{fz=Gk@r75xwz&5;nEYjLoQiBt^q)cV(vj4T zjj@GDgOTh>Y%h|wf?&0XwAtc!-`>`He2ZQ6gZ@T--{KeF*w$;hweXBWSlo)Fd5pCz zl)GFWKBT?Y+Y*tca6sr_8^{d=8>KA7;otrFJK|oaf7$f}%Zd5bNSC9IggZNL_q)H- zmak;zzY~u=xPxkgVLU*pb5JKw`D3l$(fX<7cs40Jyh~Q5CLyS;V4aE`m82WwSc`Xq z6wz=SDfNLf4i6SezQ@`SM9*+iZaLv0$J0nn{cVfVi;&~ov@zi7Tbx$qj20_cF(ECU5?b6 zqTGeBBQ8c#m@y}Mq{QAq;<-4@mHr|z96L6rCLweSifA4`j-;t+H_Gpkg2=8J$B-@#@-(@7ew~nZ(81+M z-TYFYrYDiOGEkCvoxVx9MrR#_mSl0%v$G@oGFEhnkj?^J& zNq03z`~o!k{hU|@6p;5JX%OufAzvb?U80J0E%|`W<4lj{RY>YB2XThv9zSEBzPp{j zFYdj3&`z6RC666KO7(knPm4AFg*Dw@G$q}i|3lon8_9-?M*A})twlsLXNrcu+SMN` zcBb&%{rvs$*vnu%3jQw5JNq|#>LhndO86l^<43+72UBPV^FNY)$lv^9TW{{6#1zr$ z^Ab{5RP1f#ti#snR(cyrlNf1yYSNKVXh=dab{$f?;L+kgNht{V;RxP1h@{2A?(7YZ z+NSJYHVmm1c_s8bEw%!QM|Jn7Cy`JQt5oBdT~F*rbOloXpmMgj*waWHBwMG&{vdUU z-|O=9q~EPiiu+4$iAOsA;TQk)qP#kx;3u@9BJlH} zC{zy$L-ieR0M{ihydfn0rcQ1K*Cnp}=1?UFhlh$meIQ+@a<#*Z&kG6=-2uN;T3l!1 zG4Mf91iAv!bt+fG#ClK(!a`z0WV5A8hJoka-OQW)}d$Osurt*e$94zXX4Vk!R4RI zRsUQ_{6?2AE_3GDs)Iz31rTH`fUCkq0eWVxh*;wCPvxrEceuFp3?u`VLb^_J7i%X0 zYrx%BFC?yl_lWzA4p){dLd*2QC9d4%61c=A-v=pv9)fg<3x61rc`Kd#C|sAg@W&zP zJpt)D0}t8{GLleuCQ!3n1)qh)pL4jlDqid4Q@QlkLEAS5^a3h5G8`QH-pNg}w;#LJOW6zv-DbKn)>sVe=y z!WnN_c9E-4Tm#d_$)|EbZ5=MIa_yY_S6uaVbo!m)D$>Q3>vAp$DP+Klz*qov!?;T;042Tx-h%E?->uLvWRUBwXHF^f-WY zp3sLs>kqq^{KKg|EtE@K_CE_(wJ*E;f5Q0}dW8?o&DWj$hLbnLH8)UFDU<6|F1?OUzYAO{-S|-b8Sql@0RkNt zep#MV80a#@Ju)(#EUt=&JNZ;DXoSPXRpCe{i%TBmc#gxx<*5ly?wm-R$~9KgP>{|H zJ~Y+|L-Ud4i5ryZIH!_7?W#WyRL#zZtC_`4`*t}0LU;0^eB;aRxyo_7kTaz(;h;A&tKT;16USGV7D`1^2O;;L__ z!!r|f?f~%Y?E(0^2EUx;7Iayr!!<{TneqJcs0cYYWFw*6V zD><5v3h?V3{{N0M{-;);2J@--Z1{4xT>BtgQT&)|@Ki4SC&0y5x%|K4^2k5Xlj>?d z!W!!}0?e#P*v`i1mB}S8{k4v-bGW$h7aV^PE<0aw`Qox?qsxEQ;o>Uynv=z)_lA?< zc3pqd0cYYRD6qrj|L^lG8&mJofZEvU8WNY~A30fE$xj{s9Il@15%_Oh<-TzFU%|s> ze-uXx{?@6ViL1Kr$k!S3Pp9|4$nCOsYK1cB1Py6UMfp&~d2q?4_>c`{;T#D<=fJg2 z*N5{j)L0*mORpKSBBC{1^`^LdaV67=(7rO#9ncQ0f*s+ixVw{k!DYxLaQ=lZ<3ka9 z6k0c@CHc*A6=uUK;K@g*)L|pznjrfQR9l z^e@1*jBSFep#nJnLfahQ0hj)Va5eNXTtoROT$i}Y?6|61=;XiR z(p%*8#MRtlCyT4z+u+jk9WE~U_83l-!krEs;c(^BOup zTn#jZt6(dq(Ax17$5Y|*%tcO4gX(WbbxoQJkEBIS* z1>3uDRrn!X27Cn9btbNgKPF%N6URSwd>35xe*ss0-@t=KTz{L8f1#iG&=EaM>#86k zEB=iOk2?HRF1!f%S@245HBimzoyw(`>~MHq;KH*3lu^_1T5!4c9Jmat2iH7q?($o} zb&1O(t(+__{WOQSak#jKurplkbaA|EF*pCaIYn_*(Az2WarmiR4fb=mxGKCDF4tb> zzQ$iYtp};1`i?h%>k=2<5K@8vg{S&KeV4d;^DZT!>r7ld z8U(2)r#{U`3}hMhfBsb8b|^=cXcJXJ9vCB$>r}1=#zNxbAYJ0pp9l&6KYprD8C};v z(UAYyZkM2&VKX$Rp9!SDpXxg|e0d6&AHQ<4xaRYBkmB?QNSC-)yuY97|NT_|%uo5X z?fm^zKbSOsKh?J<(pv0Xe?Qe{UWERBs&6CV@2C2wKFwETNY;iMhik*_z=t;Ezn|(~ zCwFlDHRqIfs)EkS`4s&7sXmVQ`>FolPxbAw{qLvxwOC~J^z84a`hP#wCk(j$eyacX zQ~kf6>WBV+{8WFWJ!=1d{#1YM(R0H$tZz4?=vA4w{<*PyhwJ)pt66i|wBNtozT=9! zw?um`9y`18Ygubw?$&!$okiQXjGR;KvU9`hrgU6e_QaF(vr{vE-&bpVm3vm0^}!C%0`B-4pq1GpVClC2oz-lLx$9eiZhHZatJw=p#$JFU z0#@w>NHa$TJo+8LknaH6n8&^Y82CLvsqX>eX3+NlN&5iS3ute=eE{nOjNJ#&(YzpF z)DHkPegNofa()1)vL9fZfUc(Met=B^X6*;aFa-jp{Rq(LM}Qt?`i}s0e*)MgpqHul z6TnUZi+%#=V?Giv?`MEEKLhkL^M3|NJpiy@z$NCw0|0vkEIRNkL^%%I-@k`9GS zn}7Zm?jFuG-XVZ>htL>%2#qZBf`Czn0csou$Tm5L0jeAU*d}14sd@xplYm)A0CG%$ zfN4ho8XX0=+DtzRQ1=+XE&*dry<-471uQxSFy4G5VBYTlZGH!sXy*S8kopI}egV1W z!ao4^3Rw0Bz!dYHfThO)dL0M2#@uxrpxd7S#|2C`8GiyC5wPk{fSKl~fJaXN3^@TX z%RF`>eAyiXBc<*r73mSqyJJuUXM_>gBhEHn7$`0J{V%GWB8rI|VF?0o-an z5-_hQK%1ffOU(SD0I9_Q_6zXMg~b5&3RqSQ;12VhfTc+Qy^;Woxhn~vn+I@Qz+EQ8 z12`gJl?QN-IV#}M;s8U611vL-6$cnt0-#h0fcwm#5&%gh0oDt6z<4DA)(IF}65v7e zf`Cz_0BXpA51X7)098r@Y!k53R4om#Nx-bq0FRjh0n^F=G%5q|gqdCjpl(@!T>@5_ zdSwB23RqMY;3@NwfO+Kr+LQxWZRVE)NIeT+zkp}Vg=Ycm6|n3qfalD20+yBs=v5wI zt+}f_K(`72#|6A#GAaNZ5wNNPz)R++fJZ9=45eY$*BTRr7FNS0dJYARRJ~$m{k>^z!V6WRt=z0 zHGnNdq0IV0V$9Q!B)(IF}2jENdf`C!y0Ms}K;A@j}4nUQ20k#SF)>J(g zV3UAZ=K_3Z3It3$51`R`0Q=1J^8o6e53ozXepBy!fSm#soe%Jn`AERL3jo?&0C2#} zzW^Y$F2H^PznBZ_0_+vAtS-QB<~spP>jCtt2XNTjRS%$BeSqTvj+%`607nF@st@qH zIV#}M1^`1E030`uH2@gc5TH~;fD>j=Lx7}40P6*Wjn@cZoq(~80HWpv0izlN)MyM4 zGdYa`sx$%ECZL$9+5}*efLTodJX0WGT2p{VO#w=n=}jY-g-e<;~_Y|oy#u=FKZsSII_jhZ&t)h{ErDo znFFmN_l18oOIk;=VyRWQQ8nfIMJh{aZH1J`;Bff-wG&gxi}Y-^cKOATcfzJ!N+dm~ zWOB}A{XfD&EzN;=zRl_e zl_dW6Ilq`v{UXmWRX6sFd=e?SK#kQeTG;B^-2)?oqe1`7-XW2uk*t^g&78Fjhen1c zh3_>>Mn%epgO2$sH82viGdg$txKB-=hkghFG zPv5_!1c?0&y~^sxHys_e&FQIQU4x%5kocDa^*hYku958y)6ZnjaoF1q(~F|#I&6o- z^i#|89QKaG?YhYr&_W0f7I zw*pjFkAtf?>?4QOG_{K|;fg@xj=g7K%T4iGl!iE z_Knl~++pW|t#a6Ihn){rEUcH|x%N2l0@6vUnd=LO)g@iVVP86|9#~n2edRFyCa8kL z^wxut4NSRW^synyN-pbLm(>WYs>Aj=tT9-1hkXaezfcqCIHYTz)6>t362EQw!C}q7 zQrz#C_Pesp!5Zk-Te^O7iY-WYhZJ!?J4{jA+Bx!o!?aMeaZWqvu-0HB9rlaE6x}a5 z>{o}Sf^BrzZxOnnPF)DS=0Lp#BJ3jQWzxD1!<9@k{gQB6I!R4cU5S@M+K_(DVR}JC zRkVd(ci0~ei-T!OYmkq_HQn1mn$f`ppt9{Dy09->j0Q9Us4^X)d=d@d zS{qfk6ExdZ7;{)>u=Wls3dTSE$%jw}Fhzj}pzN-Y-Xhag!j%upqYRqT8PL@v z6fSxNMipxGx`QcP$~vqE>8~MOCa;V3!gm3ZcZSG`&f808YME7nAPguxbvw1gxLK^sbH?(XZLG9O$aPdA z$mXSysNq00y4fk74W{H}&}`MhRm^xWY3a~z4 z8p8ASf`;-3Lzg(Pt}8qQtduKU-(gxt^m3<$MsFU;uB)J-4r}DFpp2(#qx1yIV?L18JOf4RF{r z(nFzP&}Cq1WIB}Tut835267gp>vE?zleC6382`Zz)Q=l4Ag$|4xEh`X)g!I3zRF?O zkuK--hB{2csGV73oe3sm@}cP@?y30%SSnEE@{0kjVnVr4!e=`K!@q&GLoU2APs>$d9}mlkscsR2!qCkxfT5oyc?o(}_zbES;z-6tTxA9hY=G zssWu1=~$#=kd8fi7wEev$Jp=j!anE+XusJ}HhMvgBP8{vKS!b960hs=<2(aNR%#7a5zP1x&ZcDZPB-UgC&pmU&yXmll{7eF3Hegs-d`Yz~hh&M?> zcR(6z%@WOuW(<|yKv@Fm&6Hapy%?jnXJ$Zp3uhU6dZSgZ_T)l(lV>b6PH(16B%xJH z2O|BlyfvhQP%2a#st<7p3N?cC)Atxu6e=(38+Vpw-YC=ssu#bQk19w?j*yTc8`Eo1i(+ z^^nd2+WLDy+QzkQYnxsN>7b^AnGRxUdI3!@shta*4_yGg2?NMhC|uV2xuh4|5h^86Ve}J=nCzL@@H;#)0o~otWWR0g1&~n z98$yrL>BmH*S3-K{Xbk*LxK;$M6nc+JZ|dmGqj#;QLf1h0+5aU_e`o;I z4(bH8gqjyKXIG3?%R8TRU1%=#=*5W2P!*^u6opnZ+RsAILC-^Lp>@y;(2LOhkY336 zp7L+e=4NOMv=zD=>{-Y_TFbRsX|3)9X)kYHgc;O=fzn%sdY?{jW$OKC?I_wow9RFh zWfh|}n`txBcB@+@-5Tlmq?6G!d^sJO0nLQ2g>*U^ZT44;o|8A3B2%Gjpy|*IXeM+m zGz-!;plw9&kL$2>7j!pt8{|VbKyx7-ntDOKp}x?iP!i-p#i0^VNl53TXKDU9=z0AW zgS8~qK`%frLN7rEx(S*G&4+G=^fx$kK>7k>zJzoz`U2VweF%LHeGKh_c0zhb>~Xk` z6gQLBCOrhY5*h^Q%cYEBEXW^_`7xwdvkpLqpu^A+=os`n^am7XAR|x_lUbSNtvtyJ zP(`R3lnhmeYCva0HKAHiZKw`(4y2c{{s|3(zN5-}utVGF#gJZ;`~=e5;X0$~7IinY z2l@i41XYHrKvg5$z*HlV4C$bzX8^kA*FFAg6rK&ufvz{Uug>Hj< z=yvE%$Uyf(%b?*B2y_Cfg-4Pg57K*H&ro(fw2Hh3phZx3NU#6u&D~Ov zUIEtIym|VSQ54d<#vLKOQLEQ>_3rRhklrco1?f#(y#}mTe07(+2D$=c^jB24^9^ov zb;Ei!at72L`kZ{-H|jo7w}pBaO!pFcf4LpRd&zkry%W3*(mTUlD9{zsy`27jjDC80 z1N;GK1@s`Kzb7*colfL+hUP&xLb?s>2kFi$k+%xnNsxZyJ{B4W>5l6vXeji9rr2zH zd<9mC^!Avz?rf?<`pXp+AvLlU(p}CR3hE|i1N0E`!;o%520^;VNHl&odb)4WeL^Or zTZ2oXgVaA1%7li|erPzP21K=~^c+aXbjcq;I*Om_fi>j43T=ecSXU^~=ycMV&@dBVt^?JBszX&F?KX9x%BEklX!(j-W2IIf z(gqZ$oA;YU`F^5Fw1U~tB${M4H09&j#?i8TJ?}M&HZgBEj24M$GB-2F8%Ha9O-VL^ z8k>!cqLoccN`@Poj3&`@+Oz;xH(|kFy=h58bjF6kWoHT$*l8YU8m(FCblX-pj+QUi z2o0_7g*`HvO`~by6tk>pG$ocsP7|3@vueT(3WC$?Dc3A|NnSBbD+(PY`yliyq$h}b zpt;ZukUX!^xE`7VT?@^GrbE*p#coH2IhXVVs2TDF$m2JQ|(|p9HDr*Ff4dC(9D88#5reOpVBmO3PjHiac^1Bu^-R7L*U=L9-z>sNoT9 zhjyE0E!foGCaLzfLMpZe+6)yyo1i}tso@iCGQK=(ii+m?}5d-pk#kRtP2X zR7TE`Uc$KfntQVNS(l;8B+FS+6eSwcXeeKpDwC|VFg2vGkf&aOWMFLc*9tug@eaPjhq|l&6r`1fANbPU{Ja zPpv?`(Kw%~D+3j?9WX@sid9X5M4T!{cR&g`)g>Ky_#KEzllLE$B`SFr1x*6E?-NLF z{TTWP(l|a3Y1kBq??DRSozRES2hjVF3{`!J@fIKHaN9A)Up-KdPwmxzC##IyC_U|= zd*O2F=g_y%H_+G6SCAe6ybYH}x5B@Gx^tZX^c3*l_#Ve9?-h!2-|8dDz+sH|6+^luurlB5Ye_FH` zzo|=0hmAM$)1xiIGt7Fio6P}O^6eBZP2qoJo6^S@y;GaQ%^UL{fokGyqO;N4*d|&v zT-OX~3u|e9YeQixC2yb~9)-3Wz?aj453*fiAD)t3BN z-sk`L_PLO&jgwbDvyEz!hr6PKo;c_GQgf%ii~?S4jKU-nZjZ&^nm+Am?oX4`KH4Hu ztf*PuKH8I?sqPc{xf$C5_PwbocGz6lA=O|ce5lbO9D}G>K{Vo-XM8c~;6pTqUNix58lUG+%-TYbw=TfZeWUinn zKa!mIMzm59fIj9{)%CtB@x$=T`|nEM(1{YMwm-YckyTHQZ}#k%AG4N|LrkcrK_yj_ z3$Q_E44Zgvn|3A2q@vK=4o?+Rj*diD3GS(M^-fVsG_uY^FKu%Mp14g`WR?!9>lFz~;%pS3c=J(Ew;1ScL3*oWF%<6(a zKRC;JZ_l6G{!zDOsioAxKq!p%nbjynik3H9yI|)yCWCrBG$X4-o%#JWW-Wq9wThLa zEklo+6F)^O*Jv7Ahr4C+^-pJSuYX~m7lKNgHcsJGW_oqShCj?~Sn`TWwgW3#e9-&8 zhmWQ>J>npU;i_hD*Jw*OVXCj9b$PVG`wvdqarK(P&Qf~I47|8obVPWZd7&Gj9;s%2 z>=vyOu4Ia3L}$0Uo0|g7`~E|JIB{%o<{`>8Z;a_YG^%dRZ1c;8)tk$<8bwZu9iz+4 z`V5@&7z!#{ze%@0j$BdUpi`j9rRG2e9T;%74cD88-@f|gj|)Bz>SheM2{7^Q`22_& z)E$#b#>_3{Qy&@2i5PbX{W(W#p*5Z_28P7l-BZjA-9jFV-NI>m?h|i zN1G>l;IvBSbAfl8Mm;Iqunrx-w&4q(ACU9u@*iE(*yfg-yUk4W!jnwD2U)S2x1`7a zG*9)UqCw`%o>Vl#H0u>8^nfMjpKHfrbGY2ceV*8REHEZ;(=8^iSG2)7_o7gP2K6jf zPMKLH?O4uDmyReKPUI9WyWjSr6(>2i()8)gjC%e&+sgUh4s6^qeGY$bF)?pmCr8ux zlL~X*|K`DOes(zw(?@0*MU(fUK)~nkz4n_A>X;|b3KX?j~ z5`NwE>B|?xMgC^%sHi&PKku;2b&(5zW7f6}n=TuMEoxR?9IY7+!b1_WM>Sk;ey1ou zux>V)UO(K#y78US*LH4w;?Mw0XF@k_(Jb^7IhvPOEnIMD#L9ZV1)U03p_k39OXzh0 z3L4oNuin_d@>?@I21T1`+y2a~z69&W6H!{2vz}k>$HVE7Kp|LzzBeZ>iC$G*OR~o9 zKf6(+shM$Uw3f3uxdV!-sr=xIX%E!E6S7{GE?#mpZN9m)G72UING+TNy; zNFGHA)irX_ly?^{8I^ys#B9^#0o&|drqLkEK4H2JVodCL&piD=v|4z#d1_F!0l$g< zWKguW+cc8TxM>6n^hKuGSvy05Z(N)V`>h@TMg6fczn>i%gTMX?rDjFR(ztN6*(G{sh2gc zvFO^~o5|66ft>bcEJc$iy1M^)an5UzKi^&K0tAKb=7GVC>aiqS_s_4-nsD!jTi-=N z=TFAxi1}$S>(>_3W(d7%YAzeXmc;pE;gD#R>PwiNIvw5ez?%NYXKn8vm=wf)iMZJ? zB-;E;M;SILnO4P=x)Re`wzpM`+YlfARNXD-1yuyS>So%b5Wdu0A-&<~m7%H5k2kt^ zXZMZ^&~wMB&&}$aaL@4$!6Ur`ZEW&V)yyvemS|8updhA?c`THj-wl4~yP=I+W0}3Y_q3X9b02eR!-{FKMRfH=c*v zx8_D;s0TT&Nvn|jbx*qzRysPTLd|xiOPqAW5p#eVA|-p7lEYbd(oJ{{X0#p79CK9^ zdU?@snmQe{eMlbMJ9tc-zq!t*hwgp-_OpWl3*y=JZjos)24`376a4BqzftwMS1!GE zL)Vkec6x=zFUdaHNoRl?u>Sq*2HtAlohxR%{)JA+Zoslk`4LQww^67|;B72AXTdoY zzQ5Qimod z6&^69=2DRxl7?pE#FLWi$$vA*)e?pOTRm5MH?xc|NzUnS*V)%oGkTvL{^s11HvLB& z6*h6EK;zY+E7XP4o8N5KYhLX)KjpyAP@}7Agqb+{q=M7C!@L5Ryk?-ib;!KvMAtSS zex`eVcU$P%Dlnyp`{do|apKN@VRZd6`Jp+d+&;QSPU|=~5w~i#SPTEc4OPsp(`HpU z;*K}V2)`C#SK}G_b-Ei)Q}{O*ot}3l*J=(|OU&9cs-MZfL}jyEFtw@KK90q)&tU7t z^k3fT^!@$Kx${kUaRfQ?Tk)bJR`vPrj}0et=9n7eaqOKa=sa0E|GF!m`us{gD{uo4 zEE8IIf)(OF7meiXA$D$gcl>r%+Fd=~p{QFeopt|NCb1yc8O}`%%SnZz!G5sCj3=6^ z|JRE{V$pG7ce=0a(rMnjF1>4oN+_of2brjoa^ zf9ojq?46g~@%r;ywMaYDZR;kT^2z%N9G(p1kG*=vfvL}2rpI;8i#M5xYV1GTY_*ji z-{~G<#m0%{P1Yadr#(kWlBw>Hph;d_R|8ZZx#5B37EAz zQe>3rduz0c`E(k6sb*HsK%=oKH$7lMXHWB`8F*c^Vo^6FtE6SinBCJUztsF*STHeI zrrV4{FC|(_K7X|BQ-jB{zCJYN!3R%z>vR)b+w;tc8Fb)F(_$v)oomhPnKV4t+#?no zg49^BRl5Sg38!lKAEw5&sBASU*HYXbu+1aa721=Crwhi~v*fPaX&auZ*Ote3iS;JU z>{kt^pT7&O3PN~*8BZj)${A^u9GRqEA$!Zh6mBt>QXm1!J9gaS=t>eLkbj8K* ztLCYE3fnVv@`sb`bE4~RIfwUAB1D z(wd!5=A3@A9AMh(kmk;6Zo$tow+cLcx9nzi&Bgcb?&E7Si#sfyJO;&W|B??}V`F34 z>dTkcySLAYlZ~EMl|8<=ifs5L{58NdvDF65oqkVm%f=zEjBkAUiO-HbEzuRExy zGS%lZ9?m#d>Wpoj$w@)aOsxgcv%GyX?9kXzPM$l{o-6L@x#@{Tt1_pZbj@-zegPeM z+U#H&+Pzxip-K5~VSDNc>Az6117RMynLbo88*fh3Xz$#ThhA$>U-S3Ys@7@nuZeql zRoeYbx`3{0o>1X-vuq#V%75bhrK=y-M(NIW)~r_l_08FTU9^vB zw1{4~!{2C=DQTve2}_=Po$XGIDVd8ljz7Gf2Hl!9#5{FU?|ixCZC{MJ^b+QpE~Zuy>s+@n=eH5cqZ9gxR{B0sTsQ%R~4H00ATW}>+K5r)ekRL z+feKHj-V6|5cLz2AmW@&)(<9qNwj5k{Zd_Dk-ho!;>Dlb_+t`f+$vOhu35N*Tl&Y% z!%Jwfx%p^Gv{&+_H`zA)0V~7Z9u9MNaGms<^R=;Q&qKzZx+lE_xtT(g7-ZZPlmYT0` z=i&ctX7(Lad#|}iY^8bb4#1a8zdP~inuRu4p5LCdBvSm#Q^6u)=kZ7bVH!p+^+5XVfe^aAzjCU$4Ej92&#MNroKx|9L< z(UiF>=n}OSwmtYRa%>A`@m;KDD{r+P3~H;&cOh@w#Yq1dv*-tX~i;2-tHd&3cS#GMSK=K3t=| z50AXFzs>R|=D2OtX>gp0U;*5;&@d1L90!35dh)3V3ajjKbY=s=Rg}1*q~$z)T5YfN zM;c065^Y$I`^+Z^Ph&t)Z6D*fGcJ321I19vV@!lmIb-5;(BY~rQh(mxZPB_#A2rY& zBZ*x>!Zs?7eRP|-+hom=EcpZg#wL5$wwjMdu1h?L zYc+QM4}2;1+&-X0y?rp^XM&o(dhpP6rSqF`=MY9gI{^e8Hp3Xzn+Zod zw(C$Q!$?y%D-*jEZRPw}3sjbHYQ*`vCNk&d--?I5MbQAuPa}T7F-;W0otPNR1yz15p1(naixrS zrJbM@S*C(7xngx*TT(jrkYiZ`id-PicUA_usKiJ)Us9R1M-%C{ zWN3@fUkk-G6({o3&m%g`x23bE76O6by*!O&P1WY+=&xn3Lz5_h^=4^NjhWz+%V&XY zYhXCd?#gN&EW5hjBq?(9gJ{oRQaKAPkV5|>1kuLrq4m2VqW?LP@R`usB~wKL;Me|3>r!gt?z~&{>Q}rrR+AQkk|{M& z>7bpMOofTc_~zP=P-i0th9-?vH0j%<0pB+}U8QYX+kz~~|C&noD86QE3T`c4Pj%i) zUeHv3@4fuM>)b=pKfdx&^fq9n2n4fH0vY@Toj2L<<12BBXH8H*%&{eKUSVqR$6D}_ z{oifz4_3K9)KP75BDFh+gBx`W*lgphn|OcFE58zy!-0!j>ohb{UKVOrug<5iITRc8iy1ih>^2W zM(^0AeY6TqFz*{Xsbiw<#U;hziNUAXA;8m!_d??(bdU9Z9RzHXYp{E@Q*fsb;J62R z`Ku=jKa&_R|*Y3rc5;jgMuA@7&BJcpI@A?0~9QL6tWygdB@;2s?pR&>YNTY zbUO7+M^*$)XGs)oV#x|BKw?T3U4`E1SvU0UktQ)PbQMn%D&PSgp+3hkz8ui8@wr62 zkTBEX1$HU=6rxtpA&=0-uR1OTon|ZreXAHL^*HW?rhLN%zQ6y*>>({uZlewhhGi2@ zHOJBU5)kOo=-dOhd)PfQn2kapAa6$V9*sq7qETE;ufUhT?Xc*a!<@;J(F@u*X$x@5 zhz$dqq!x?mJgS-|9_0~5FOSF!o}^D^@n!6s1rz*FYI_2cF_R{oP@=Tvbh>mx-Isf3 zAh_p=bef!jh}bmB%m6#p6m=58Aa^npXY-s0?pJ^QY5(*y`^R)Zi~dmR`l)i%q5Hcu z^rWmOs{5InjGuhJfeGNHN9 zxz?u@w=Qe4IWkR|H7z7G9M8C3ik!b&zpYNMc{oS?fw9O>Dd+~IycwU&QJ^mUJc>g5 z7||k|cleM8Df%=B@<7lL1be4!ADTLD8NWbR1J=ta?KBia$>m%-zMOU0qf7dDwFS&% zj}~0^E;#%`=m@A-nB7ao^SZm60})?hK#m?cTz9p8ximfteo0U+1y^FIqeO-4KR#>U zW$-+v5T5gj^kvVA6DUUi| zLE1f!axWwG%cIIXq`mVfAsgwCJPN&l+s8}UxLqHELVVyc#<(BR%M9|#LGmFDL1Lyn zF8@aib+1(}D`hdf%;N^+$-ZRUqD|Zu=6sKN5!pQY+o+jKrd;HTz9^wUabl5-(`mvP zD`Lr>W+COF5`z88SzXH(C6PJ?{Ay>|cc2u_304?M3WhDSc>}(U+nYyYOHr3Mq2A+Ayq6u&GeCg0mgaL`sla@sWK?qc7O4?(IAf>_ zzUS86#UV9j^wg`* zqlL8VjM5>%wUFcdjmcNaeqJ*FMYTWm4)iIMFo$V;aOtSB5#4d}sSXxG6?0=62nquz z9@TBQG{M&#DR>1mjU(>@K!ljmx%96BOU3CZHT6wOyo6CiP*ouddS_1#qG-ZJWJQzT z_b}8L(MN~H8EaF=Y`@$fk3AFxB?Ux%fy8tQbZq%J=R{uZBBx$y;Dsx*zwNm@gR0ER z174ix?zQoz7pmg)n#E=dJGw}#m{nENh_e_57NTiq5r}Cx$LDZH{{=gaEbP@r^caXY z=jSLE6#j!i(GCsgUz<~Sx#O_i4LrSu5++-RApd7)AI&KiC7Ay(x`9qiOGH(>cH#SD zzj$7%0ffJfTnoX>cG6r!gsqSNeR?sYP5=ct_@ke>JgPib@iA=Y3IO!Du07B#IyjU z>`XCsZL0w11IuoT(LiU>w!R3xf~ntrx-S)6$b8O?s@rS~KpLhnVrnJp^+SHT(U2RF zqwOXd5oS}5KwNF4HPxf7L{~{J@xxX=M`!j1$&x|^9|;P&3oHPN3tkSnzGn$^5>{gc z@sS@OFWJ2)G}~5U*}Py}%1&mZmt|3tO}@ew=NF^mwftE!km2Yh>-e98co&|@1q0ezFYAO|iKmh>07l(72UFFm-E3=it% zCHS+OTa6VxVw+cb`oTUytst3QBb?1!TogCXkD< z#l(hx9H0VObDvZ-j7Ksd^+$fobzkPAqbB_VTje5Oqq7Ui4pP_fI!e#w4e#G>0n6MshgW*Vp6DyMNHl+R` zmIO&9B6~Qv~Nv&v(_xM8p_6@yWWn38OZtp-LCN!tVQnd^m_v@ z%hd&%Y}-+2df_!vU~@K>SU{>U5>o~0wng3fwbhu$fbe^K1o;3jn@LT8rfB7IqXE$ z9(CQ3P1w{iRcZcM4Q=U_mAfqZWe;K010V+%U$%!DbCVBzP+aJ)Lg$tbVc=|Y1@ZEo zhKBDaG;h%C8;YO*43M*nLUUc@!^wwtMuD7NgaYo~LrHs-l(oz*cWS?Y9Ud@;4$c67 z+No7?sqTj2tL>Ic9u>fsRj9!5WvP2!$1VQDd_{$xa$DSZYe73JaKRuq38i$R0{b$- zi03`YCh23-M0DYpIy00 zaEF1a7~!XNtERn`ikp2P2;DG@cq*#|Lwl%4RnyoITZQc{M@Q;ht(a}%hlB%(UtD1* zzgp?UBKoSqC3tUL16`_r+zq}yr+zhn3AG1D3awEBP5C&laR6^EuU5AotvE#JHQ-eJ zyFzJc+6ZyP=-WZImN(8&YGe%GzSJ@JWX8eE4rhS3y)#PwrD zBCv;g#iQqMd1Z%-k^TN>YkWsJjc)V1!_yaHX*(m^{~-sQj8Bq&JvMyA)(m_zV7VOr zeu#eZ;NtJ7j5X>)_IHqY(~~?I%n}z0VM!nQm?ztLa*`$9RK^n2yQ}njV(kIm`JzDo z)0(+$e(QdZ4`t^aojRmey=MpZb@5sAjAGok z-k7!T%U_hR1PuF)S>B%a<~@1YK(ym7sf>)+FilYZ7#=DCDZnM3I|x ldODM!+f32FDE9lh?$nhiy6ICwXVa=go%_CsMBSMI{{@5@NVot1 delta 53835 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%0DA;6a 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, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsList.displayName = TabsPrimitive.List.displayName + +const TabsTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName + +const TabsContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsContent.displayName = TabsPrimitive.Content.displayName + +export { Tabs, TabsList, TabsTrigger, TabsContent } diff --git a/docs/package.json b/docs/package.json index bca31d540..75cfa080a 100644 --- a/docs/package.json +++ b/docs/package.json @@ -18,6 +18,7 @@ "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-tabs": "^1.0.4", "@tanstack/react-table": "^8.16.0", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", diff --git a/docs/pages/index.mdx b/docs/pages/index.mdx index 7da796513..94c082c06 100644 --- a/docs/pages/index.mdx +++ b/docs/pages/index.mdx @@ -4,6 +4,8 @@ import { Button } from "../components/ui/button" import { MoveRight } from "lucide-react" import { Accordion, AccordionItem, AccordionContent, AccordionTrigger } from "../components/ui/accordion" import { Steps, Callout } from 'nextra/components' +import { Tabs, TabsContent, TabsList, TabsTrigger } from "../components/ui/tabs" + # Sotopia - Getting Started @@ -34,17 +36,14 @@ https://github.com/sotopia-lab/sotopia
Check out - + Open in Colab for a quick tutorial
+This package supports Python 3.10 and above. -### Basic Usage - -This package supports Python 3.10 and above. Tested on Ubuntu 22.04 with python 3.11. - #### Install the package @@ -119,6 +118,14 @@ Redis stack is a required dependency for using Sotopia. There are two ways to se No, I don't want to use Docker. + + + Linux + MacOS + Windows + + + ### Download the Redis stack ```bash @@ -129,24 +136,49 @@ Redis stack is a required dependency for using Sotopia. There are two ways to se # if you are using Ubunutu 22.04, please do an extra step wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.22_amd64.deb sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2.22_amd64.deb - # if you are using macOs + ``` + + ### Start the server + ```bash + ./redis-stack-server-7.2.0-v10/bin/redis-stack-server --daemonize yes + ``` + + + + ### The `REDIS_OM_URL` need to be set before loading and saving agents: + ```bash + conda env config vars set REDIS_OM_URL="redis://user:password@host:port" + ``` + If you are using the default settings, you can set the `REDIS_OM_URL` to `redis://localhost:6379`. + + + + + ### Download the Redis stack + ```bash brew tap redis-stack/redis-stack brew install redis-stack ``` ### Start the server ```bash - ./redis-stack-server-7.2.0-v10/bin/redis-stack-server --daemonize yes + redis-stack-server --daemonize yes ``` For other platforms, please check the [instruction](https://redis.io/docs/latest/operate/oss_and_stack/install/install-stack/). - ### The `REDIS_OM_URL` need to be set before loading and saving agents: + ### Set the environment variable: + The `REDIS_OM_URL` need to be set before loading and saving agents ```bash conda env config vars set REDIS_OM_URL="redis://user:password@host:port" ``` If you are using the default settings, you can set the `REDIS_OM_URL` to `redis://localhost:6379`. + + + For Windows, unfortunately only docker is supported. Check the [official documentation](https://redis.io/docs/latest/operate/oss_and_stack/install/install-stack/windows/). + + diff --git a/docs/tailwind.config.ts b/docs/tailwind.config.ts index 479a527ee..8449b5f8e 100644 --- a/docs/tailwind.config.ts +++ b/docs/tailwind.config.ts @@ -8,6 +8,7 @@ const config = { './app/**/*.{ts,tsx}', './src/**/*.{ts,tsx}', ], + safelist: ['dark'], prefix: "", theme: { container: { From b6d564444e9f671ef69a8dd89e6a228faaed1444 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 21:43:54 -0400 Subject: [PATCH 13/23] Bump google-generativeai from 0.6.0 to 0.7.0 (#111) Bumps [google-generativeai](https://github.com/google/generative-ai-python) from 0.6.0 to 0.7.0. - [Release notes](https://github.com/google/generative-ai-python/releases) - [Changelog](https://github.com/google-gemini/generative-ai-python/blob/main/RELEASE.md) - [Commits](https://github.com/google/generative-ai-python/compare/v0.6.0...v0.7.0) --- updated-dependencies: - dependency-name: google-generativeai dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 14 +++++++------- pyproject.toml | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/poetry.lock b/poetry.lock index e847a6e6d..ddebbebf6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1096,13 +1096,13 @@ torch = ["torch (>=1.3.0)"] [[package]] name = "google-ai-generativelanguage" -version = "0.6.4" +version = "0.6.5" description = "Google Ai Generativelanguage API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-ai-generativelanguage-0.6.4.tar.gz", hash = "sha256:1750848c12af96cb24ae1c3dd05e4bfe24867dc4577009ed03e1042d8421e874"}, - {file = "google_ai_generativelanguage-0.6.4-py3-none-any.whl", hash = "sha256:730e471aa549797118fb1c88421ba1957741433ada575cf5dd08d3aebf903ab1"}, + {file = "google-ai-generativelanguage-0.6.5.tar.gz", hash = "sha256:c4089c277fa4e26722f76ab03ee3039f28be8bf1c9be282948b9583a154c6d79"}, + {file = "google_ai_generativelanguage-0.6.5-py3-none-any.whl", hash = "sha256:236875bb4a6d6ebdba2f12bd9d5e776100fd913402157a47b5e9fb80a13f25a7"}, ] [package.dependencies] @@ -1200,16 +1200,16 @@ httplib2 = ">=0.19.0" [[package]] name = "google-generativeai" -version = "0.6.0" +version = "0.7.0" description = "Google Generative AI High level API client library and tools." optional = true python-versions = ">=3.9" files = [ - {file = "google_generativeai-0.6.0-py3-none-any.whl", hash = "sha256:ba1d3b826b872bffe330aaac0dc6de2f0e4610df861c8ce7ec6433771611b676"}, + {file = "google_generativeai-0.7.0-py3-none-any.whl", hash = "sha256:7be4b634afeb8b6bebde1af7271e94d2af84d2d28b5988c7ed9921733c40fe63"}, ] [package.dependencies] -google-ai-generativelanguage = "0.6.4" +google-ai-generativelanguage = "0.6.5" google-api-core = "*" google-api-python-client = "*" google-auth = ">=2.15.0" @@ -5314,4 +5314,4 @@ groq = ["groq"] [metadata] lock-version = "2.0" python-versions = ">=3.10, <3.13" -content-hash = "ec049682e297d6891d13ba66949d7404d0e07efec7692e80e77bdbad38c62cb1" +content-hash = "209fa8900f964311a88f604474af3734f29017abcbb57cc4504b0615c721c03b" diff --git a/pyproject.toml b/pyproject.toml index 745d554fb..2a27b09a8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ anthropic = { version = "^0.26.0", optional = true } xmltodict = { version = "^0.13.0", optional = true } groq = { version = ">=0.4.2,<0.10.0", optional = true } cohere = { version = "^5.1.8", optional = true } -google-generativeai = { version = ">=0.5.4,<0.7.0", optional = true } +google-generativeai = { version = ">=0.5.4,<0.8.0", optional = true } transformers = { version = "^4.41.0", optional = true } datasets = { version = "^2.19.0", optional = true } scipy = { version = "^1.13.1", optional = true } From 7de34af7b52aadf85c5c4302e660f745032caff8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jun 2024 14:37:27 -0400 Subject: [PATCH 14/23] Bump lxml from 4.9.4 to 5.2.2 (#118) Bumps [lxml](https://github.com/lxml/lxml) from 4.9.4 to 5.2.2. - [Release notes](https://github.com/lxml/lxml/releases) - [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt) - [Commits](https://github.com/lxml/lxml/compare/lxml-4.9.4...lxml-5.2.2) --- updated-dependencies: - dependency-name: lxml dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 246 +++++++++++++++++++++++++++++-------------------- pyproject.toml | 2 +- 2 files changed, 149 insertions(+), 99 deletions(-) diff --git a/poetry.lock b/poetry.lock index ddebbebf6..4fa848ce3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2174,111 +2174,161 @@ proxy = ["PyJWT (>=2.8.0,<3.0.0)", "apscheduler (>=3.10.4,<4.0.0)", "backoff", " [[package]] name = "lxml" -version = "4.9.4" +version = "5.2.2" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" -files = [ - {file = "lxml-4.9.4-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e214025e23db238805a600f1f37bf9f9a15413c7bf5f9d6ae194f84980c78722"}, - {file = "lxml-4.9.4-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ec53a09aee61d45e7dbe7e91252ff0491b6b5fee3d85b2d45b173d8ab453efc1"}, - {file = "lxml-4.9.4-cp27-cp27m-win32.whl", hash = "sha256:7d1d6c9e74c70ddf524e3c09d9dc0522aba9370708c2cb58680ea40174800013"}, - {file = "lxml-4.9.4-cp27-cp27m-win_amd64.whl", hash = "sha256:cb53669442895763e61df5c995f0e8361b61662f26c1b04ee82899c2789c8f69"}, - {file = "lxml-4.9.4-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:647bfe88b1997d7ae8d45dabc7c868d8cb0c8412a6e730a7651050b8c7289cf2"}, - {file = "lxml-4.9.4-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4d973729ce04784906a19108054e1fd476bc85279a403ea1a72fdb051c76fa48"}, - {file = "lxml-4.9.4-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:056a17eaaf3da87a05523472ae84246f87ac2f29a53306466c22e60282e54ff8"}, - {file = "lxml-4.9.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:aaa5c173a26960fe67daa69aa93d6d6a1cd714a6eb13802d4e4bd1d24a530644"}, - {file = "lxml-4.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:647459b23594f370c1c01768edaa0ba0959afc39caeeb793b43158bb9bb6a663"}, - {file = "lxml-4.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:bdd9abccd0927673cffe601d2c6cdad1c9321bf3437a2f507d6b037ef91ea307"}, - {file = "lxml-4.9.4-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:00e91573183ad273e242db5585b52670eddf92bacad095ce25c1e682da14ed91"}, - {file = "lxml-4.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a602ed9bd2c7d85bd58592c28e101bd9ff9c718fbde06545a70945ffd5d11868"}, - {file = "lxml-4.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:de362ac8bc962408ad8fae28f3967ce1a262b5d63ab8cefb42662566737f1dc7"}, - {file = "lxml-4.9.4-cp310-cp310-win32.whl", hash = "sha256:33714fcf5af4ff7e70a49731a7cc8fd9ce910b9ac194f66eaa18c3cc0a4c02be"}, - {file = "lxml-4.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:d3caa09e613ece43ac292fbed513a4bce170681a447d25ffcbc1b647d45a39c5"}, - {file = "lxml-4.9.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:359a8b09d712df27849e0bcb62c6a3404e780b274b0b7e4c39a88826d1926c28"}, - {file = "lxml-4.9.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:43498ea734ccdfb92e1886dfedaebeb81178a241d39a79d5351ba2b671bff2b2"}, - {file = "lxml-4.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4855161013dfb2b762e02b3f4d4a21cc7c6aec13c69e3bffbf5022b3e708dd97"}, - {file = "lxml-4.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c71b5b860c5215fdbaa56f715bc218e45a98477f816b46cfde4a84d25b13274e"}, - {file = "lxml-4.9.4-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9a2b5915c333e4364367140443b59f09feae42184459b913f0f41b9fed55794a"}, - {file = "lxml-4.9.4-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d82411dbf4d3127b6cde7da0f9373e37ad3a43e89ef374965465928f01c2b979"}, - {file = "lxml-4.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:273473d34462ae6e97c0f4e517bd1bf9588aa67a1d47d93f760a1282640e24ac"}, - {file = "lxml-4.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:389d2b2e543b27962990ab529ac6720c3dded588cc6d0f6557eec153305a3622"}, - {file = "lxml-4.9.4-cp311-cp311-win32.whl", hash = "sha256:8aecb5a7f6f7f8fe9cac0bcadd39efaca8bbf8d1bf242e9f175cbe4c925116c3"}, - {file = "lxml-4.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:c7721a3ef41591341388bb2265395ce522aba52f969d33dacd822da8f018aff8"}, - {file = "lxml-4.9.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:dbcb2dc07308453db428a95a4d03259bd8caea97d7f0776842299f2d00c72fc8"}, - {file = "lxml-4.9.4-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:01bf1df1db327e748dcb152d17389cf6d0a8c5d533ef9bab781e9d5037619229"}, - {file = "lxml-4.9.4-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e8f9f93a23634cfafbad6e46ad7d09e0f4a25a2400e4a64b1b7b7c0fbaa06d9d"}, - {file = "lxml-4.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3f3f00a9061605725df1816f5713d10cd94636347ed651abdbc75828df302b20"}, - {file = "lxml-4.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:953dd5481bd6252bd480d6ec431f61d7d87fdcbbb71b0d2bdcfc6ae00bb6fb10"}, - {file = "lxml-4.9.4-cp312-cp312-win32.whl", hash = "sha256:266f655d1baff9c47b52f529b5f6bec33f66042f65f7c56adde3fcf2ed62ae8b"}, - {file = "lxml-4.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:f1faee2a831fe249e1bae9cbc68d3cd8a30f7e37851deee4d7962b17c410dd56"}, - {file = "lxml-4.9.4-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:23d891e5bdc12e2e506e7d225d6aa929e0a0368c9916c1fddefab88166e98b20"}, - {file = "lxml-4.9.4-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e96a1788f24d03e8d61679f9881a883ecdf9c445a38f9ae3f3f193ab6c591c66"}, - {file = "lxml-4.9.4-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:5557461f83bb7cc718bc9ee1f7156d50e31747e5b38d79cf40f79ab1447afd2d"}, - {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:fdb325b7fba1e2c40b9b1db407f85642e32404131c08480dd652110fc908561b"}, - {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d74d4a3c4b8f7a1f676cedf8e84bcc57705a6d7925e6daef7a1e54ae543a197"}, - {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ac7674d1638df129d9cb4503d20ffc3922bd463c865ef3cb412f2c926108e9a4"}, - {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:ddd92e18b783aeb86ad2132d84a4b795fc5ec612e3545c1b687e7747e66e2b53"}, - {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bd9ac6e44f2db368ef8986f3989a4cad3de4cd55dbdda536e253000c801bcc7"}, - {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bc354b1393dce46026ab13075f77b30e40b61b1a53e852e99d3cc5dd1af4bc85"}, - {file = "lxml-4.9.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f836f39678cb47c9541f04d8ed4545719dc31ad850bf1832d6b4171e30d65d23"}, - {file = "lxml-4.9.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:9c131447768ed7bc05a02553d939e7f0e807e533441901dd504e217b76307745"}, - {file = "lxml-4.9.4-cp36-cp36m-win32.whl", hash = "sha256:bafa65e3acae612a7799ada439bd202403414ebe23f52e5b17f6ffc2eb98c2be"}, - {file = "lxml-4.9.4-cp36-cp36m-win_amd64.whl", hash = "sha256:6197c3f3c0b960ad033b9b7d611db11285bb461fc6b802c1dd50d04ad715c225"}, - {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:7b378847a09d6bd46047f5f3599cdc64fcb4cc5a5a2dd0a2af610361fbe77b16"}, - {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:1343df4e2e6e51182aad12162b23b0a4b3fd77f17527a78c53f0f23573663545"}, - {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:6dbdacf5752fbd78ccdb434698230c4f0f95df7dd956d5f205b5ed6911a1367c"}, - {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:506becdf2ecaebaf7f7995f776394fcc8bd8a78022772de66677c84fb02dd33d"}, - {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca8e44b5ba3edb682ea4e6185b49661fc22b230cf811b9c13963c9f982d1d964"}, - {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9d9d5726474cbbef279fd709008f91a49c4f758bec9c062dfbba88eab00e3ff9"}, - {file = "lxml-4.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bbdd69e20fe2943b51e2841fc1e6a3c1de460d630f65bde12452d8c97209464d"}, - {file = "lxml-4.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8671622256a0859f5089cbe0ce4693c2af407bc053dcc99aadff7f5310b4aa02"}, - {file = "lxml-4.9.4-cp37-cp37m-win32.whl", hash = "sha256:dd4fda67f5faaef4f9ee5383435048ee3e11ad996901225ad7615bc92245bc8e"}, - {file = "lxml-4.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6bee9c2e501d835f91460b2c904bc359f8433e96799f5c2ff20feebd9bb1e590"}, - {file = "lxml-4.9.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:1f10f250430a4caf84115b1e0f23f3615566ca2369d1962f82bef40dd99cd81a"}, - {file = "lxml-4.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3b505f2bbff50d261176e67be24e8909e54b5d9d08b12d4946344066d66b3e43"}, - {file = "lxml-4.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1449f9451cd53e0fd0a7ec2ff5ede4686add13ac7a7bfa6988ff6d75cff3ebe2"}, - {file = "lxml-4.9.4-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:4ece9cca4cd1c8ba889bfa67eae7f21d0d1a2e715b4d5045395113361e8c533d"}, - {file = "lxml-4.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59bb5979f9941c61e907ee571732219fa4774d5a18f3fa5ff2df963f5dfaa6bc"}, - {file = "lxml-4.9.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b1980dbcaad634fe78e710c8587383e6e3f61dbe146bcbfd13a9c8ab2d7b1192"}, - {file = "lxml-4.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9ae6c3363261021144121427b1552b29e7b59de9d6a75bf51e03bc072efb3c37"}, - {file = "lxml-4.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bcee502c649fa6351b44bb014b98c09cb00982a475a1912a9881ca28ab4f9cd9"}, - {file = "lxml-4.9.4-cp38-cp38-win32.whl", hash = "sha256:a8edae5253efa75c2fc79a90068fe540b197d1c7ab5803b800fccfe240eed33c"}, - {file = "lxml-4.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:701847a7aaefef121c5c0d855b2affa5f9bd45196ef00266724a80e439220e46"}, - {file = "lxml-4.9.4-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:f610d980e3fccf4394ab3806de6065682982f3d27c12d4ce3ee46a8183d64a6a"}, - {file = "lxml-4.9.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:aa9b5abd07f71b081a33115d9758ef6077924082055005808f68feccb27616bd"}, - {file = "lxml-4.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:365005e8b0718ea6d64b374423e870648ab47c3a905356ab6e5a5ff03962b9a9"}, - {file = "lxml-4.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:16b9ec51cc2feab009e800f2c6327338d6ee4e752c76e95a35c4465e80390ccd"}, - {file = "lxml-4.9.4-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:a905affe76f1802edcac554e3ccf68188bea16546071d7583fb1b693f9cf756b"}, - {file = "lxml-4.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fd814847901df6e8de13ce69b84c31fc9b3fb591224d6762d0b256d510cbf382"}, - {file = "lxml-4.9.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:91bbf398ac8bb7d65a5a52127407c05f75a18d7015a270fdd94bbcb04e65d573"}, - {file = "lxml-4.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f99768232f036b4776ce419d3244a04fe83784bce871b16d2c2e984c7fcea847"}, - {file = "lxml-4.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bb5bd6212eb0edfd1e8f254585290ea1dadc3687dd8fd5e2fd9a87c31915cdab"}, - {file = "lxml-4.9.4-cp39-cp39-win32.whl", hash = "sha256:88f7c383071981c74ec1998ba9b437659e4fd02a3c4a4d3efc16774eb108d0ec"}, - {file = "lxml-4.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:936e8880cc00f839aa4173f94466a8406a96ddce814651075f95837316369899"}, - {file = "lxml-4.9.4-pp310-pypy310_pp73-macosx_11_0_x86_64.whl", hash = "sha256:f6c35b2f87c004270fa2e703b872fcc984d714d430b305145c39d53074e1ffe0"}, - {file = "lxml-4.9.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:606d445feeb0856c2b424405236a01c71af7c97e5fe42fbc778634faef2b47e4"}, - {file = "lxml-4.9.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a1bdcbebd4e13446a14de4dd1825f1e778e099f17f79718b4aeaf2403624b0f7"}, - {file = "lxml-4.9.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0a08c89b23117049ba171bf51d2f9c5f3abf507d65d016d6e0fa2f37e18c0fc5"}, - {file = "lxml-4.9.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:232fd30903d3123be4c435fb5159938c6225ee8607b635a4d3fca847003134ba"}, - {file = "lxml-4.9.4-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:231142459d32779b209aa4b4d460b175cadd604fed856f25c1571a9d78114771"}, - {file = "lxml-4.9.4-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:520486f27f1d4ce9654154b4494cf9307b495527f3a2908ad4cb48e4f7ed7ef7"}, - {file = "lxml-4.9.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:562778586949be7e0d7435fcb24aca4810913771f845d99145a6cee64d5b67ca"}, - {file = "lxml-4.9.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a9e7c6d89c77bb2770c9491d988f26a4b161d05c8ca58f63fb1f1b6b9a74be45"}, - {file = "lxml-4.9.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:786d6b57026e7e04d184313c1359ac3d68002c33e4b1042ca58c362f1d09ff58"}, - {file = "lxml-4.9.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95ae6c5a196e2f239150aa4a479967351df7f44800c93e5a975ec726fef005e2"}, - {file = "lxml-4.9.4-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:9b556596c49fa1232b0fff4b0e69b9d4083a502e60e404b44341e2f8fb7187f5"}, - {file = "lxml-4.9.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:cc02c06e9e320869d7d1bd323df6dd4281e78ac2e7f8526835d3d48c69060683"}, - {file = "lxml-4.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:857d6565f9aa3464764c2cb6a2e3c2e75e1970e877c188f4aeae45954a314e0c"}, - {file = "lxml-4.9.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c42ae7e010d7d6bc51875d768110c10e8a59494855c3d4c348b068f5fb81fdcd"}, - {file = "lxml-4.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f10250bb190fb0742e3e1958dd5c100524c2cc5096c67c8da51233f7448dc137"}, - {file = "lxml-4.9.4.tar.gz", hash = "sha256:b1541e50b78e15fa06a2670157a1962ef06591d4c998b998047fff5e3236880e"}, +python-versions = ">=3.6" +files = [ + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632"}, + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526"}, + {file = "lxml-5.2.2-cp310-cp310-win32.whl", hash = "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30"}, + {file = "lxml-5.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b"}, + {file = "lxml-5.2.2-cp311-cp311-win32.whl", hash = "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438"}, + {file = "lxml-5.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836"}, + {file = "lxml-5.2.2-cp312-cp312-win32.whl", hash = "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a"}, + {file = "lxml-5.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48"}, + {file = "lxml-5.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264"}, + {file = "lxml-5.2.2-cp36-cp36m-win32.whl", hash = "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3"}, + {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, + {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, + {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, + {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, + {file = "lxml-5.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1"}, + {file = "lxml-5.2.2-cp38-cp38-win32.whl", hash = "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30"}, + {file = "lxml-5.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9"}, + {file = "lxml-5.2.2-cp39-cp39-win32.whl", hash = "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf"}, + {file = "lxml-5.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324"}, + {file = "lxml-5.2.2.tar.gz", hash = "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml-html-clean"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (==0.29.37)"] +source = ["Cython (>=3.0.10)"] [[package]] name = "markdown-it-py" @@ -5314,4 +5364,4 @@ groq = ["groq"] [metadata] lock-version = "2.0" python-versions = ">=3.10, <3.13" -content-hash = "209fa8900f964311a88f604474af3734f29017abcbb57cc4504b0615c721c03b" +content-hash = "da168286ac2df04d66e32eab84713b269b2bbbfed0b9402a05247c4ff615e907" diff --git a/pyproject.toml b/pyproject.toml index 2a27b09a8..2bff7e1b3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ packages = [{include = "sotopia"}] [tool.poetry.dependencies] python = ">=3.10, <3.13" -lxml = "^4.9.3" +lxml = ">=4.9.3,<6.0.0" openai = "^1.11.0" langchain = "0.1.5" rich = "^13.6.0" From bf0321b002ad93982e0eb19588c3cfe4a0a61bb9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jun 2024 14:43:19 -0400 Subject: [PATCH 15/23] Bump anthropic from 0.26.1 to 0.28.1 (#117) Bumps [anthropic](https://github.com/anthropics/anthropic-sdk-python) from 0.26.1 to 0.28.1. - [Release notes](https://github.com/anthropics/anthropic-sdk-python/releases) - [Changelog](https://github.com/anthropics/anthropic-sdk-python/blob/main/CHANGELOG.md) - [Commits](https://github.com/anthropics/anthropic-sdk-python/compare/v0.26.1...v0.28.1) --- updated-dependencies: - dependency-name: anthropic dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 10 +++++----- pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4fa848ce3..8ac1beb4d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -123,20 +123,20 @@ frozenlist = ">=1.1.0" [[package]] name = "anthropic" -version = "0.26.1" +version = "0.28.1" description = "The official Python library for the anthropic API" optional = true python-versions = ">=3.7" files = [ - {file = "anthropic-0.26.1-py3-none-any.whl", hash = "sha256:2812b9b250b551ed8a1f0a7e6ae3f005654098994f45ebca5b5808bd154c9628"}, - {file = "anthropic-0.26.1.tar.gz", hash = "sha256:26680ff781a6f678a30a1dccd0743631e602b23a47719439ffdef5335fa167d8"}, + {file = "anthropic-0.28.1-py3-none-any.whl", hash = "sha256:c4773ae2b42951a6b747bed328b0d03fa412938c95c3a8b9dce70d69badb710b"}, + {file = "anthropic-0.28.1.tar.gz", hash = "sha256:e3a6d595bde241141bdc685edc393903ec95c7fa378013a71186cfb8f32b1793"}, ] [package.dependencies] anyio = ">=3.5.0,<5" distro = ">=1.7.0,<2" httpx = ">=0.23.0,<1" -jiter = ">=0.1.0,<1" +jiter = ">=0.4.0,<1" pydantic = ">=1.9.0,<3" sniffio = "*" tokenizers = ">=0.13.0" @@ -5364,4 +5364,4 @@ groq = ["groq"] [metadata] lock-version = "2.0" python-versions = ">=3.10, <3.13" -content-hash = "da168286ac2df04d66e32eab84713b269b2bbbfed0b9402a05247c4ff615e907" +content-hash = "4bee5fd118db71b39719ae0267f7fa3a0211b2d4ae3f18ab3d0ed40f5158ce64" diff --git a/pyproject.toml b/pyproject.toml index 2bff7e1b3..cf0191927 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ litellm = "~1.23.12" # dependency versions for extras fastapi = { version = "^0.109.2", optional = true } tabulate = { version = "^0.9.0", optional = true } -anthropic = { version = "^0.26.0", optional = true } +anthropic = { version = ">=0.26,<0.29", optional = true } xmltodict = { version = "^0.13.0", optional = true } groq = { version = ">=0.4.2,<0.10.0", optional = true } cohere = { version = "^5.1.8", optional = true } From 8d9b9be6155e8d6343591867373968c1184a8035 Mon Sep 17 00:00:00 2001 From: Hao Zhu Date: Thu, 20 Jun 2024 12:53:17 -0400 Subject: [PATCH 16/23] Langchain V0.2 and Sync API deprecated (#116) * upgrade langchain and remove sync apis * remove return prompt from agenerate * remove prompt from agenerate * add sync apis --- examples/generate_specific_envs.py | 6 +- poetry.lock | 435 ++++++++++---------- pyproject.toml | 4 +- sotopia/agents/__init__.py | 2 - sotopia/agents/generate_agent_background.py | 9 +- sotopia/agents/llm_agent.py | 53 +-- sotopia/envs/evaluators.py | 3 +- sotopia/generation_utils/__init__.py | 15 +- sotopia/generation_utils/generate.py | 233 +---------- sotopia/generation_utils/sync.py | 29 ++ sotopia/server.py | 5 +- tests/generation_utils/test_generation.py | 22 +- 12 files changed, 299 insertions(+), 517 deletions(-) create mode 100644 sotopia/generation_utils/sync.py diff --git a/examples/generate_specific_envs.py b/examples/generate_specific_envs.py index bfcd27355..ef83bea59 100644 --- a/examples/generate_specific_envs.py +++ b/examples/generate_specific_envs.py @@ -12,7 +12,7 @@ import numpy as np from datasets import DatasetDict, load_dataset -from sotopia.generation_utils.generate import StrOutputParser, generate +from sotopia.generation_utils.generate import StrOutputParser, agenerate async def generate_mutual_friend_envs() -> tuple[str, list[str]]: @@ -78,7 +78,7 @@ async def generate_craigslist_bargains_envs() -> tuple[str, list[str]]: all_data = craigslist_bargains_dataset["train"] # sample one datum from all data datum = np.random.choice(all_data) - scenario = generate( + scenario = await agenerate( model_name="gpt-4", template="The following sentence is automatically generated with the following" 'template: "One person is selling for , another person is' @@ -100,7 +100,7 @@ async def generate_craigslist_bargains_envs() -> tuple[str, list[str]]: datum["agent_info"]["Target"][i] = datum["items"]["Price"][0] / ( 1 + markup_ratio ) - goal = generate( + goal = await agenerate( model_name="gpt-4", template="The following sentence is automatically generated with the following" 'template: "You want to this item. Your target price ' diff --git a/poetry.lock b/poetry.lock index 8ac1beb4d..d0b2492a5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -247,17 +247,17 @@ test-tox-coverage = ["coverage (>=5.5)"] [[package]] name = "boto3" -version = "1.34.129" +version = "1.34.130" description = "The AWS SDK for Python" optional = true python-versions = ">=3.8" files = [ - {file = "boto3-1.34.129-py3-none-any.whl", hash = "sha256:cc73de1c9d953b1f9da6ee2404af717e93d888f790f3e0291b22d1b8489eb401"}, - {file = "boto3-1.34.129.tar.gz", hash = "sha256:a7a696fd3e7f5f43a81450b441f3eb6c5a89d28efe867cd97d8fc73ea5d8c139"}, + {file = "boto3-1.34.130-py3-none-any.whl", hash = "sha256:c163fb7135a94e7b8c8c478a44071c843f05e212fa4bec3105f8a437ecbf1bcb"}, + {file = "boto3-1.34.130.tar.gz", hash = "sha256:b781d267dd5e7583966e05697f6bd45e2f46c01dc619ba0860b042963ee69296"}, ] [package.dependencies] -botocore = ">=1.34.129,<1.35.0" +botocore = ">=1.34.130,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -266,13 +266,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.129" +version = "1.34.130" description = "Low-level, data-driven core of boto 3." optional = true python-versions = ">=3.8" files = [ - {file = "botocore-1.34.129-py3-none-any.whl", hash = "sha256:86d3dd30996aa459e9c3321edac12aebe47c73cb4acc7556941f9b4c39726088"}, - {file = "botocore-1.34.129.tar.gz", hash = "sha256:7c56e25af6112d69c5d14a15b42f76ba7687687abc463a96ac5edca19c0a9c2d"}, + {file = "botocore-1.34.130-py3-none-any.whl", hash = "sha256:a3b36e9dac1ed31c4cb3a5c5e540a7d8a9b90ff1d17f87734e674154b41776d8"}, + {file = "botocore-1.34.130.tar.gz", hash = "sha256:a242b3b0a836b14f308a309565cd63e88654cec238f9b73abbbd3c0526db4c81"}, ] [package.dependencies] @@ -676,21 +676,6 @@ ssh = ["bcrypt (>=3.1.5)"] test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] -[[package]] -name = "dataclasses-json" -version = "0.6.7" -description = "Easily serialize dataclasses to and from JSON." -optional = false -python-versions = "<4.0,>=3.7" -files = [ - {file = "dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a"}, - {file = "dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0"}, -] - -[package.dependencies] -marshmallow = ">=3.18.0,<4.0.0" -typing-inspect = ">=0.4.0,<1" - [[package]] name = "datasets" version = "2.20.0" @@ -934,18 +919,18 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.15.1" +version = "3.15.3" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.15.1-py3-none-any.whl", hash = "sha256:71b3102950e91dfc1bb4209b64be4dc8854f40e5f534428d8684f953ac847fac"}, - {file = "filelock-3.15.1.tar.gz", hash = "sha256:58a2549afdf9e02e10720eaa4d4470f56386d7a6f72edd7d0596337af8ed7ad8"}, + {file = "filelock-3.15.3-py3-none-any.whl", hash = "sha256:0151273e5b5d6cf753a61ec83b3a9b7d8821c39ae9af9d7ecf2f9e2f17404103"}, + {file = "filelock-3.15.3.tar.gz", hash = "sha256:e1199bf5194a2277273dacd50269f0d87d0682088a3c561c15674ea9005d8635"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] @@ -1144,13 +1129,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.133.0" +version = "2.134.0" description = "Google API Client Library for Python" optional = true python-versions = ">=3.7" files = [ - {file = "google-api-python-client-2.133.0.tar.gz", hash = "sha256:293092905b66a046d3187a99ac454e12b00cc2c70444f26eb2f1f9c1a82720b4"}, - {file = "google_api_python_client-2.133.0-py2.py3-none-any.whl", hash = "sha256:396fe676ea0dfed066654dcf9f8dea77a1342f9d9bb23bb88e45b7b81e773926"}, + {file = "google-api-python-client-2.134.0.tar.gz", hash = "sha256:4a8f0bea651a212997cc83c0f271fc86f80ef93d1cee9d84de7dfaeef2a858b6"}, + {file = "google_api_python_client-2.134.0-py2.py3-none-any.whl", hash = "sha256:ba05d60f6239990b7994f6328f17bb154c602d31860fb553016dc9f8ce886945"}, ] [package.dependencies] @@ -2026,123 +2011,115 @@ test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout" [[package]] name = "langchain" -version = "0.1.5" +version = "0.2.5" description = "Building applications with LLMs through composability" optional = false -python-versions = ">=3.8.1,<4.0" +python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain-0.1.5-py3-none-any.whl", hash = "sha256:4614118d4a95b2e7ba3611a0b6b21707a259a21652a04fbe3c31205bcf3fcd50"}, - {file = "langchain-0.1.5.tar.gz", hash = "sha256:69603a5bb21b044ddea69d38131dbbf47475afdf79728644faa67d1ad325d652"}, + {file = "langchain-0.2.5-py3-none-any.whl", hash = "sha256:9aded9a65348254e1c93dcdaacffe4d1b6a5e7f74ef80c160c88ff78ad299228"}, + {file = "langchain-0.2.5.tar.gz", hash = "sha256:ffdbf4fcea46a10d461bcbda2402220fcfd72a0c70e9f4161ae0510067b9b3bd"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -dataclasses-json = ">=0.5.7,<0.7" -jsonpatch = ">=1.33,<2.0" -langchain-community = ">=0.0.17,<0.1" -langchain-core = ">=0.1.16,<0.2" -langsmith = ">=0.0.83,<0.1" -numpy = ">=1,<2" +langchain-core = ">=0.2.7,<0.3.0" +langchain-text-splitters = ">=0.2.0,<0.3.0" +langsmith = ">=0.1.17,<0.2.0" +numpy = [ + {version = ">=1,<2", markers = "python_version < \"3.12\""}, + {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, +] pydantic = ">=1,<3" PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" -[package.extras] -azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-textanalytics (>=5.3.0,<6.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0b8)", "openai (<2)"] -clarifai = ["clarifai (>=9.1.0)"] -cli = ["typer (>=0.9.0,<0.10.0)"] -cohere = ["cohere (>=4,<5)"] -docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"] -embeddings = ["sentence-transformers (>=2,<3)"] -extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<5)", "couchbase (>=4.1.9,<5.0.0)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "langchain-openai (>=0.0.2,<0.1)", "lxml (>=4.9.2,<5.0.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] -javascript = ["esprima (>=4.0.1,<5.0.0)"] -llms = ["clarifai (>=9.1.0)", "cohere (>=4,<5)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (<2)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] -openai = ["openai (<2)", "tiktoken (>=0.3.2,<0.6.0)"] -qdrant = ["qdrant-client (>=1.3.1,<2.0.0)"] -text-helpers = ["chardet (>=5.1.0,<6.0.0)"] - [[package]] -name = "langchain-community" -version = "0.0.18" -description = "Community contributed LangChain integrations." +name = "langchain-core" +version = "0.2.8" +description = "Building applications with LLMs through composability" optional = false -python-versions = ">=3.8.1,<4.0" +python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_community-0.0.18-py3-none-any.whl", hash = "sha256:b87e20c1fa3f37e9608d7ccc08b4d8ed86f875b8c1e735d0464ae986e41c5a71"}, - {file = "langchain_community-0.0.18.tar.gz", hash = "sha256:f044f331b418f16148b76929f27cc2107fce2d190ea3fae0cdaf155ceda9892f"}, + {file = "langchain_core-0.2.8-py3-none-any.whl", hash = "sha256:172c81c858dc1f3123cc72b7e44e10f44c92f8a761cae18c364081f6c208e9f6"}, + {file = "langchain_core-0.2.8.tar.gz", hash = "sha256:2db866a4514672c4875b69d5590aa2ed50aa0d144874268bef68d74b5e7f33f9"}, ] [package.dependencies] -aiohttp = ">=3.8.3,<4.0.0" -dataclasses-json = ">=0.5.7,<0.7" -langchain-core = ">=0.1.19,<0.2" -langsmith = ">=0.0.83,<0.1" -numpy = ">=1,<2" +jsonpatch = ">=1.33,<2.0" +langsmith = ">=0.1.75,<0.2.0" +packaging = ">=23.2,<25" +pydantic = ">=1,<3" PyYAML = ">=5.3" -requests = ">=2,<3" -SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" -[package.extras] -cli = ["typer (>=0.9.0,<0.10.0)"] -extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-ai-documentintelligence (>=1.0.0b1,<2.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<5)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "elasticsearch (>=8.12.0,<9.0.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "gradientai (>=1.4.0,<2.0.0)", "hdbcli (>=2.19.21,<3.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "httpx (>=0.24.1,<0.25.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.2,<5.0.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "nvidia-riva-client (>=2.14.0,<3.0.0)", "oci (>=2.119.1,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "oracle-ads (>=2.9.1,<3.0.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)", "zhipuai (>=1.0.7,<2.0.0)"] - [[package]] name = "langchain-core" -version = "0.1.19" +version = "0.2.9" description = "Building applications with LLMs through composability" optional = false -python-versions = ">=3.8.1,<4.0" +python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.1.19-py3-none-any.whl", hash = "sha256:46b5fd54181df5aa6d3041d61beb2b91e5437b6742274e7924a97734ed62cf43"}, - {file = "langchain_core-0.1.19.tar.gz", hash = "sha256:30539190a63dff53e995f10aefb943b4f7e01aba4bf28fd1e13016b040c0e9da"}, + {file = "langchain_core-0.2.9-py3-none-any.whl", hash = "sha256:426a5a4fea95a5db995ba5ab560b76edd4998fb6fe52ccc28ac987092a4cbfcd"}, + {file = "langchain_core-0.2.9.tar.gz", hash = "sha256:f1c59082642921727844e1cd0eb36d451edd1872c20e193aa3142aac03495986"}, ] [package.dependencies] -anyio = ">=3,<5" jsonpatch = ">=1.33,<2.0" -langsmith = ">=0.0.83,<0.1" -packaging = ">=23.2,<24.0" -pydantic = ">=1,<3" +langsmith = ">=0.1.75,<0.2.0" +packaging = ">=23.2,<25" +pydantic = {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""} PyYAML = ">=5.3" -requests = ">=2,<3" -tenacity = ">=8.1.0,<9.0.0" - -[package.extras] -extended-testing = ["jinja2 (>=3,<4)"] +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-openai" -version = "0.0.6" +version = "0.1.8" description = "An integration package connecting OpenAI and LangChain" optional = false -python-versions = ">=3.8.1,<4.0" +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_openai-0.1.8-py3-none-any.whl", hash = "sha256:8125c84223e9f43b05defbca64eedbcf362fd78a680de6c25e64f973b34a8063"}, + {file = "langchain_openai-0.1.8.tar.gz", hash = "sha256:a11fcce15def7917c44232abda6baaa63dfc79fe44be1531eea650d39a44cd95"}, +] + +[package.dependencies] +langchain-core = ">=0.2.2,<0.3" +openai = ">=1.26.0,<2.0.0" +tiktoken = ">=0.7,<1" + +[[package]] +name = "langchain-text-splitters" +version = "0.2.1" +description = "LangChain text splitting utilities" +optional = false +python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_openai-0.0.6-py3-none-any.whl", hash = "sha256:2ef040e4447a26a9d3bd45dfac9cefa00797ea58555a3d91ab4f88699eb3a005"}, - {file = "langchain_openai-0.0.6.tar.gz", hash = "sha256:f5c4ebe46f2c8635c8f0c26cc8df27700aacafea025410e418d5a080039974dd"}, + {file = "langchain_text_splitters-0.2.1-py3-none-any.whl", hash = "sha256:c2774a85f17189eaca50339629d2316d13130d4a8d9f1a1a96f3a03670c4a138"}, + {file = "langchain_text_splitters-0.2.1.tar.gz", hash = "sha256:06853d17d7241ecf5c97c7b6ef01f600f9b0fb953dd997838142a527a4f32ea4"}, ] [package.dependencies] -langchain-core = ">=0.1.16,<0.2" -numpy = ">=1,<2" -openai = ">=1.10.0,<2.0.0" -tiktoken = ">=0.5.2,<1" +langchain-core = ">=0.2.0,<0.3.0" + +[package.extras] +extended-testing = ["beautifulsoup4 (>=4.12.3,<5.0.0)", "lxml (>=4.9.3,<6.0)"] [[package]] name = "langsmith" -version = "0.0.92" +version = "0.1.81" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false -python-versions = ">=3.8.1,<4.0" +python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.0.92-py3-none-any.whl", hash = "sha256:ddcf65e3b5ca11893ae8ef9816ce2a11a089d051be491886e43a2c4556b88fd0"}, - {file = "langsmith-0.0.92.tar.gz", hash = "sha256:61a3a502222bdd221b7f592b6fc14756d74c4fc088aa6bd8834b92adfe9ee583"}, + {file = "langsmith-0.1.81-py3-none-any.whl", hash = "sha256:3251d823225eef23ee541980b9d9e506367eabbb7f985a086b5d09e8f78ba7e9"}, + {file = "langsmith-0.1.81.tar.gz", hash = "sha256:585ef3a2251380bd2843a664c9a28da4a7d28432e3ee8bcebf291ffb8e1f0af0"}, ] [package.dependencies] +orjson = ">=3.9.14,<4.0.0" pydantic = ">=1,<3" requests = ">=2,<3" @@ -2423,25 +2400,6 @@ files = [ {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] -[[package]] -name = "marshmallow" -version = "3.21.3" -description = "A lightweight library for converting complex datatypes to and from native Python datatypes." -optional = false -python-versions = ">=3.8" -files = [ - {file = "marshmallow-3.21.3-py3-none-any.whl", hash = "sha256:86ce7fb914aa865001a4b2092c4c2872d13bc347f3d42673272cabfdbad386f1"}, - {file = "marshmallow-3.21.3.tar.gz", hash = "sha256:4f57c5e050a54d66361e826f94fba213eb10b67b2fdb02c3e0343ce207ba1662"}, -] - -[package.dependencies] -packaging = ">=17.0" - -[package.extras] -dev = ["marshmallow[tests]", "pre-commit (>=3.5,<4.0)", "tox"] -docs = ["alabaster (==0.7.16)", "autodocsumm (==0.2.12)", "sphinx (==7.3.7)", "sphinx-issues (==4.1.0)", "sphinx-version-warning (==1.1.2)"] -tests = ["pytest", "pytz", "simplejson"] - [[package]] name = "matplotlib-inline" version = "0.1.7" @@ -2983,13 +2941,13 @@ files = [ [[package]] name = "openai" -version = "1.34.0" +version = "1.35.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.34.0-py3-none-any.whl", hash = "sha256:018623c2f795424044675c6230fa3bfbf98d9e0aab45d8fd116f2efb2cfb6b7e"}, - {file = "openai-1.34.0.tar.gz", hash = "sha256:95c8e2da4acd6958e626186957d656597613587195abd0fb2527566a93e76770"}, + {file = "openai-1.35.1-py3-none-any.whl", hash = "sha256:53ef8935cf916dc7ece67fee5a8a09fc4db5aadf4d6e95b5b7f767f3c4432e4d"}, + {file = "openai-1.35.1.tar.gz", hash = "sha256:d85973adc2f4fbb11ba20bfd948e3340b8352f6b8a02f1fa1c387c8eefac8d9d"}, ] [package.dependencies] @@ -3004,15 +2962,70 @@ typing-extensions = ">=4.7,<5" [package.extras] datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] +[[package]] +name = "orjson" +version = "3.10.5" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.8" +files = [ + {file = "orjson-3.10.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b"}, + {file = "orjson-3.10.5-cp310-none-win32.whl", hash = "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2"}, + {file = "orjson-3.10.5-cp310-none-win_amd64.whl", hash = "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228"}, + {file = "orjson-3.10.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa"}, + {file = "orjson-3.10.5-cp311-none-win32.whl", hash = "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04"}, + {file = "orjson-3.10.5-cp311-none-win_amd64.whl", hash = "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c"}, + {file = "orjson-3.10.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3"}, + {file = "orjson-3.10.5-cp312-none-win32.whl", hash = "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2"}, + {file = "orjson-3.10.5-cp312-none-win_amd64.whl", hash = "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5"}, + {file = "orjson-3.10.5-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b"}, + {file = "orjson-3.10.5-cp38-none-win32.whl", hash = "sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4"}, + {file = "orjson-3.10.5-cp38-none-win_amd64.whl", hash = "sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09"}, + {file = "orjson-3.10.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86"}, + {file = "orjson-3.10.5-cp39-none-win32.whl", hash = "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47"}, + {file = "orjson-3.10.5-cp39-none-win_amd64.whl", hash = "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7"}, + {file = "orjson-3.10.5.tar.gz", hash = "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d"}, +] + [[package]] name = "packaging" -version = "23.2" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -3221,20 +3234,20 @@ wcwidth = "*" [[package]] name = "proto-plus" -version = "1.23.0" +version = "1.24.0" description = "Beautiful, Pythonic protocol buffers." optional = true -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "proto-plus-1.23.0.tar.gz", hash = "sha256:89075171ef11988b3fa157f5dbd8b9cf09d65fffee97e29ce403cd8defba19d2"}, - {file = "proto_plus-1.23.0-py3-none-any.whl", hash = "sha256:a829c79e619e1cf632de091013a4173deed13a55f326ef84f05af6f50ff4c82c"}, + {file = "proto-plus-1.24.0.tar.gz", hash = "sha256:30b72a5ecafe4406b0d339db35b56c4059064e69227b8c3bda7462397f966445"}, + {file = "proto_plus-1.24.0-py3-none-any.whl", hash = "sha256:402576830425e5f6ce4c2a6702400ac79897dab0b4343821aa5188b0fab81a12"}, ] [package.dependencies] -protobuf = ">=3.19.0,<5.0.0dev" +protobuf = ">=3.19.0,<6.0.0dev" [package.extras] -testing = ["google-api-core[grpc] (>=1.31.5)"] +testing = ["google-api-core (>=1.31.5)"] [[package]] name = "protobuf" @@ -3258,27 +3271,28 @@ files = [ [[package]] name = "psutil" -version = "5.9.8" +version = "6.0.0" description = "Cross-platform lib for process and system monitoring in Python." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, - {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, - {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, - {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, - {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, - {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, - {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, - {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, - {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, - {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, + {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, + {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, + {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, + {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, + {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, + {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, + {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, + {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, + {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, ] [package.extras] @@ -4326,64 +4340,64 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.30" +version = "2.0.31" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b48154678e76445c7ded1896715ce05319f74b1e73cf82d4f8b59b46e9c0ddc"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753743c2afd061bb95a61a51bbb6a1a11ac1c44292fad898f10c9839a7f75b2"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7bfc726d167f425d4c16269a9a10fe8630ff6d14b683d588044dcef2d0f6be7"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f61ada6979223013d9ab83a3ed003ded6959eae37d0d685db2c147e9143797"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a365eda439b7a00732638f11072907c1bc8e351c7665e7e5da91b169af794af"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bba002a9447b291548e8d66fd8c96a6a7ed4f2def0bb155f4f0a1309fd2735d5"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-win32.whl", hash = "sha256:0138c5c16be3600923fa2169532205d18891b28afa817cb49b50e08f62198bb8"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-win_amd64.whl", hash = "sha256:99650e9f4cf3ad0d409fed3eec4f071fadd032e9a5edc7270cd646a26446feeb"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:955991a09f0992c68a499791a753523f50f71a6885531568404fa0f231832aa0"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f69e4c756ee2686767eb80f94c0125c8b0a0b87ede03eacc5c8ae3b54b99dc46"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c9db1ce00e59e8dd09d7bae852a9add716efdc070a3e2068377e6ff0d6fdaa"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1429a4b0f709f19ff3b0cf13675b2b9bfa8a7e79990003207a011c0db880a13"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:efedba7e13aa9a6c8407c48facfdfa108a5a4128e35f4c68f20c3407e4376aa9"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16863e2b132b761891d6c49f0a0f70030e0bcac4fd208117f6b7e053e68668d0"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-win32.whl", hash = "sha256:2ecabd9ccaa6e914e3dbb2aa46b76dede7eadc8cbf1b8083c94d936bcd5ffb49"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-win_amd64.whl", hash = "sha256:0b3f4c438e37d22b83e640f825ef0f37b95db9aa2d68203f2c9549375d0b2260"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5a79d65395ac5e6b0c2890935bad892eabb911c4aa8e8015067ddb37eea3d56c"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a5baf9267b752390252889f0c802ea13b52dfee5e369527da229189b8bd592e"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cb5a646930c5123f8461f6468901573f334c2c63c795b9af350063a736d0134"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296230899df0b77dec4eb799bcea6fbe39a43707ce7bb166519c97b583cfcab3"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c62d401223f468eb4da32627bffc0c78ed516b03bb8a34a58be54d618b74d472"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3b69e934f0f2b677ec111b4d83f92dc1a3210a779f69bf905273192cf4ed433e"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-win32.whl", hash = "sha256:77d2edb1f54aff37e3318f611637171e8ec71472f1fdc7348b41dcb226f93d90"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-win_amd64.whl", hash = "sha256:b6c7ec2b1f4969fc19b65b7059ed00497e25f54069407a8701091beb69e591a5"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a8e3b0a7e09e94be7510d1661339d6b52daf202ed2f5b1f9f48ea34ee6f2d57"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60203c63e8f984df92035610c5fb76d941254cf5d19751faab7d33b21e5ddc0"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1dc3eabd8c0232ee8387fbe03e0a62220a6f089e278b1f0aaf5e2d6210741ad"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:40ad017c672c00b9b663fcfcd5f0864a0a97828e2ee7ab0c140dc84058d194cf"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e42203d8d20dc704604862977b1470a122e4892791fe3ed165f041e4bf447a1b"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-win32.whl", hash = "sha256:2a4f4da89c74435f2bc61878cd08f3646b699e7d2eba97144030d1be44e27584"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-win_amd64.whl", hash = "sha256:b6bf767d14b77f6a18b6982cbbf29d71bede087edae495d11ab358280f304d8e"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc0c53579650a891f9b83fa3cecd4e00218e071d0ba00c4890f5be0c34887ed3"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:311710f9a2ee235f1403537b10c7687214bb1f2b9ebb52702c5aa4a77f0b3af7"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:408f8b0e2c04677e9c93f40eef3ab22f550fecb3011b187f66a096395ff3d9fd"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37a4b4fb0dd4d2669070fb05b8b8824afd0af57587393015baee1cf9890242d9"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a943d297126c9230719c27fcbbeab57ecd5d15b0bd6bfd26e91bfcfe64220621"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a089e218654e740a41388893e090d2e2c22c29028c9d1353feb38638820bbeb"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-win32.whl", hash = "sha256:fa561138a64f949f3e889eb9ab8c58e1504ab351d6cf55259dc4c248eaa19da6"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-win_amd64.whl", hash = "sha256:7d74336c65705b986d12a7e337ba27ab2b9d819993851b140efdf029248e818e"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8c62fe2480dd61c532ccafdbce9b29dacc126fe8be0d9a927ca3e699b9491a"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2383146973a15435e4717f94c7509982770e3e54974c71f76500a0136f22810b"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8409de825f2c3b62ab15788635ccaec0c881c3f12a8af2b12ae4910a0a9aeef6"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0094c5dc698a5f78d3d1539853e8ecec02516b62b8223c970c86d44e7a80f6c7"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:edc16a50f5e1b7a06a2dcc1f2205b0b961074c123ed17ebda726f376a5ab0953"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f7703c2010355dd28f53deb644a05fc30f796bd8598b43f0ba678878780b6e4c"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-win32.whl", hash = "sha256:1f9a727312ff6ad5248a4367358e2cf7e625e98b1028b1d7ab7b806b7d757513"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-win_amd64.whl", hash = "sha256:a0ef36b28534f2a5771191be6edb44cc2673c7b2edf6deac6562400288664221"}, - {file = "SQLAlchemy-2.0.30-py3-none-any.whl", hash = "sha256:7108d569d3990c71e26a42f60474b4c02c8586c4681af5fd67e51a044fdea86a"}, - {file = "SQLAlchemy-2.0.30.tar.gz", hash = "sha256:2b1708916730f4830bc69d6f49d37f7698b5bd7530aca7f04f785f8849e95255"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2a213c1b699d3f5768a7272de720387ae0122f1becf0901ed6eaa1abd1baf6c"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9fea3d0884e82d1e33226935dac990b967bef21315cbcc894605db3441347443"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ad7f221d8a69d32d197e5968d798217a4feebe30144986af71ada8c548e9fa"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2bee229715b6366f86a95d497c347c22ddffa2c7c96143b59a2aa5cc9eebbc"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cd5b94d4819c0c89280b7c6109c7b788a576084bf0a480ae17c227b0bc41e109"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:750900a471d39a7eeba57580b11983030517a1f512c2cb287d5ad0fcf3aebd58"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-win32.whl", hash = "sha256:7bd112be780928c7f493c1a192cd8c5fc2a2a7b52b790bc5a84203fb4381c6be"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-win_amd64.whl", hash = "sha256:5a48ac4d359f058474fadc2115f78a5cdac9988d4f99eae44917f36aa1476327"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f68470edd70c3ac3b6cd5c2a22a8daf18415203ca1b036aaeb9b0fb6f54e8298"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e2c38c2a4c5c634fe6c3c58a789712719fa1bf9b9d6ff5ebfce9a9e5b89c1ca"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd15026f77420eb2b324dcb93551ad9c5f22fab2c150c286ef1dc1160f110203"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2196208432deebdfe3b22185d46b08f00ac9d7b01284e168c212919891289396"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:352b2770097f41bff6029b280c0e03b217c2dcaddc40726f8f53ed58d8a85da4"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56d51ae825d20d604583f82c9527d285e9e6d14f9a5516463d9705dab20c3740"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-win32.whl", hash = "sha256:6e2622844551945db81c26a02f27d94145b561f9d4b0c39ce7bfd2fda5776dac"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-win_amd64.whl", hash = "sha256:ccaf1b0c90435b6e430f5dd30a5aede4764942a695552eb3a4ab74ed63c5b8d3"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3b74570d99126992d4b0f91fb87c586a574a5872651185de8297c6f90055ae42"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f77c4f042ad493cb8595e2f503c7a4fe44cd7bd59c7582fd6d78d7e7b8ec52c"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd1591329333daf94467e699e11015d9c944f44c94d2091f4ac493ced0119449"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74afabeeff415e35525bf7a4ecdab015f00e06456166a2eba7590e49f8db940e"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b9c01990d9015df2c6f818aa8f4297d42ee71c9502026bb074e713d496e26b67"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66f63278db425838b3c2b1c596654b31939427016ba030e951b292e32b99553e"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-win32.whl", hash = "sha256:0b0f658414ee4e4b8cbcd4a9bb0fd743c5eeb81fc858ca517217a8013d282c96"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-win_amd64.whl", hash = "sha256:fa4b1af3e619b5b0b435e333f3967612db06351217c58bfb50cee5f003db2a5a"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f43e93057cf52a227eda401251c72b6fbe4756f35fa6bfebb5d73b86881e59b0"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d337bf94052856d1b330d5fcad44582a30c532a2463776e1651bd3294ee7e58b"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c06fb43a51ccdff3b4006aafee9fcf15f63f23c580675f7734245ceb6b6a9e05"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:b6e22630e89f0e8c12332b2b4c282cb01cf4da0d26795b7eae16702a608e7ca1"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:79a40771363c5e9f3a77f0e28b3302801db08040928146e6808b5b7a40749c88"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-win32.whl", hash = "sha256:501ff052229cb79dd4c49c402f6cb03b5a40ae4771efc8bb2bfac9f6c3d3508f"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-win_amd64.whl", hash = "sha256:597fec37c382a5442ffd471f66ce12d07d91b281fd474289356b1a0041bdf31d"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dc6d69f8829712a4fd799d2ac8d79bdeff651c2301b081fd5d3fe697bd5b4ab9"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23b9fbb2f5dd9e630db70fbe47d963c7779e9c81830869bd7d137c2dc1ad05fb"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21c97efcbb9f255d5c12a96ae14da873233597dfd00a3a0c4ce5b3e5e79704"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a6a9837589c42b16693cf7bf836f5d42218f44d198f9343dd71d3164ceeeac"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc251477eae03c20fae8db9c1c23ea2ebc47331bcd73927cdcaecd02af98d3c3"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2fd17e3bb8058359fa61248c52c7b09a97cf3c820e54207a50af529876451808"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-win32.whl", hash = "sha256:c76c81c52e1e08f12f4b6a07af2b96b9b15ea67ccdd40ae17019f1c373faa227"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-win_amd64.whl", hash = "sha256:4b600e9a212ed59355813becbcf282cfda5c93678e15c25a0ef896b354423238"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b6cf796d9fcc9b37011d3f9936189b3c8074a02a4ed0c0fbbc126772c31a6d4"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78fe11dbe37d92667c2c6e74379f75746dc947ee505555a0197cfba9a6d4f1a4"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc47dc6185a83c8100b37acda27658fe4dbd33b7d5e7324111f6521008ab4fe"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a41514c1a779e2aa9a19f67aaadeb5cbddf0b2b508843fcd7bafdf4c6864005"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:afb6dde6c11ea4525318e279cd93c8734b795ac8bb5dda0eedd9ebaca7fa23f1"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3f9faef422cfbb8fd53716cd14ba95e2ef655400235c3dfad1b5f467ba179c8c"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-win32.whl", hash = "sha256:fc6b14e8602f59c6ba893980bea96571dd0ed83d8ebb9c4479d9ed5425d562e9"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-win_amd64.whl", hash = "sha256:3cb8a66b167b033ec72c3812ffc8441d4e9f5f78f5e31e54dcd4c90a4ca5bebc"}, + {file = "SQLAlchemy-2.0.31-py3-none-any.whl", hash = "sha256:69f3e3c08867a8e4856e92d7afb618b95cdee18e0bc1647b77599722c9a28911"}, + {file = "SQLAlchemy-2.0.31.tar.gz", hash = "sha256:b607489dd4a54de56984a0c7656247504bd5523d9d0ba799aef59d4add009484"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} typing-extensions = ">=4.6.0" [package.extras] @@ -4488,15 +4502,15 @@ widechars = ["wcwidth"] [[package]] name = "tbb" -version = "2021.12.0" +version = "2021.13.0" description = "Intel® oneAPI Threading Building Blocks (oneTBB)" optional = true python-versions = "*" files = [ - {file = "tbb-2021.12.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:f2cc9a7f8ababaa506cbff796ce97c3bf91062ba521e15054394f773375d81d8"}, - {file = "tbb-2021.12.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:a925e9a7c77d3a46ae31c34b0bb7f801c4118e857d137b68f68a8e458fcf2bd7"}, - {file = "tbb-2021.12.0-py3-none-win32.whl", hash = "sha256:b1725b30c174048edc8be70bd43bb95473f396ce895d91151a474d0fa9f450a8"}, - {file = "tbb-2021.12.0-py3-none-win_amd64.whl", hash = "sha256:fc2772d850229f2f3df85f1109c4844c495a2db7433d38200959ee9265b34789"}, + {file = "tbb-2021.13.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:a2567725329639519d46d92a2634cf61e76601dac2f777a05686fea546c4fe4f"}, + {file = "tbb-2021.13.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:aaf667e92849adb012b8874d6393282afc318aca4407fc62f912ee30a22da46a"}, + {file = "tbb-2021.13.0-py3-none-win32.whl", hash = "sha256:6669d26703e9943f6164c6407bd4a237a45007e79b8d3832fe6999576eaaa9ef"}, + {file = "tbb-2021.13.0-py3-none-win_amd64.whl", hash = "sha256:3528a53e4bbe64b07a6112b4c5a00ff3c61924ee46c9c68e004a1ac7ad1f09c3"}, ] [[package]] @@ -5022,21 +5036,6 @@ files = [ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] -[[package]] -name = "typing-inspect" -version = "0.9.0" -description = "Runtime inspection utilities for typing module." -optional = false -python-versions = "*" -files = [ - {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, - {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, -] - -[package.dependencies] -mypy-extensions = ">=0.3.0" -typing-extensions = ">=3.7.4" - [[package]] name = "tzdata" version = "2024.1" @@ -5364,4 +5363,4 @@ groq = ["groq"] [metadata] lock-version = "2.0" python-versions = ">=3.10, <3.13" -content-hash = "4bee5fd118db71b39719ae0267f7fa3a0211b2d4ae3f18ab3d0ed40f5158ce64" +content-hash = "e6f81f1f5bef19b559e0620be9840eb7a57e0ffad86c9c5aeead2ff2a3c84e39" diff --git a/pyproject.toml b/pyproject.toml index cf0191927..87e36a34e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ packages = [{include = "sotopia"}] python = ">=3.10, <3.13" lxml = ">=4.9.3,<6.0.0" openai = "^1.11.0" -langchain = "0.1.5" +langchain = "~0.2.5" rich = "^13.6.0" PettingZoo = "1.24.3" redis-om = "^0.2.1" @@ -21,7 +21,7 @@ absl-py = "^2.0.0" together = "^0.2.4" pydantic = "1.10.12" beartype = "^0.14.0" -langchain-openai = ">=0.0.5,<0.0.7" +langchain-openai = "~0.1.8" litellm = "~1.23.12" # dependency versions for extras diff --git a/sotopia/agents/__init__.py b/sotopia/agents/__init__.py index 53794cad8..0abc3038e 100644 --- a/sotopia/agents/__init__.py +++ b/sotopia/agents/__init__.py @@ -8,7 +8,6 @@ HumanAgent, LLMAgent, ScriptWritingAgent, - SpeakAgent, ) from .redis_agent import RedisAgent @@ -17,7 +16,6 @@ "LLMAgent", "Agents", "HumanAgent", - "SpeakAgent", "generate_background", "generate_background_conversation", "RedisAgent", diff --git a/sotopia/agents/generate_agent_background.py b/sotopia/agents/generate_agent_background.py index 231639d23..ede46a0ec 100644 --- a/sotopia/agents/generate_agent_background.py +++ b/sotopia/agents/generate_agent_background.py @@ -2,14 +2,11 @@ import os from typing import Callable -from sotopia.generation_utils.generate import ( - convert_narratives, - generate_init_profile, -) +from sotopia.generation_utils.generate import convert_narratives, agenerate_init_profile from sotopia.messages import Message, ScriptBackground -def generate_background( +async def generate_background( info_json_file: str, basic_info: dict[str, str] ) -> tuple[str, str, str, str, list[dict[str, str]]]: if os.path.isfile(info_json_file): @@ -22,7 +19,7 @@ def generate_background( previous_messages = info_dict["messages"] else: initial_profile = str(basic_info) - profile = generate_init_profile( + profile = await agenerate_init_profile( model_name="gpt-3.5-turbo", basic_info=basic_info ) first_narrative = convert_narratives( diff --git a/sotopia/agents/llm_agent.py b/sotopia/agents/llm_agent.py index 045336ee6..7779ab97a 100644 --- a/sotopia/agents/llm_agent.py +++ b/sotopia/agents/llm_agent.py @@ -1,16 +1,14 @@ import asyncio from concurrent.futures import ThreadPoolExecutor -from typing import Callable, cast +from typing import cast from sotopia.agents import BaseAgent from sotopia.database import AgentProfile from sotopia.generation_utils.generate import ( LLM_Name, agenerate_action, + agenerate_goal, agenerate_script, - generate_action, - generate_action_speak, - generate_goal, ) from sotopia.messages import AgentAction, Observation from sotopia.messages.message_classes import ScriptBackground @@ -44,16 +42,8 @@ def __init__( def goal(self) -> str: if self._goal is not None: return self._goal - assert ( - len(self.inbox) > 0 - ), "attribute goal has to be called after at least one step" - goal = generate_goal( - self.model_name, - background=self.inbox[0][ - 1 - ].to_natural_language(), # Only consider the first message for now - ) - return goal + else: + raise Exception("Goal is not set.") @goal.setter def goal(self, goal: str) -> None: @@ -61,31 +51,25 @@ def goal(self, goal: str) -> None: def act( self, - obs: Observation, - gen_func: Callable[..., AgentAction] = generate_action, + _obs: Observation, ) -> AgentAction: + raise Exception("Sync act method is deprecated. Use aact instead.") + + async def aact(self, obs: Observation) -> AgentAction: self.recv_message("Environment", obs) - if len(obs.available_actions) == 1 and "none" in obs.available_actions: - return AgentAction(action_type="none", argument="") - else: - action = gen_func( + if self._goal is None: + self._goal = await agenerate_goal( self.model_name, - history="\n".join(f"{y.to_natural_language()}" for x, y in self.inbox), - turn_number=obs.turn_number, - action_types=obs.available_actions, - agent=self.agent_name, - goal=self.goal, + background=self.inbox[0][ + 1 + ].to_natural_language(), # Only consider the first message for now ) - return action - - async def aact(self, obs: Observation) -> AgentAction: - self.recv_message("Environment", obs) if len(obs.available_actions) == 1 and "none" in obs.available_actions: return AgentAction(action_type="none", argument="") else: - action, prompt = await agenerate_action( + action = await agenerate_action( self.model_name, history="\n".join(f"{y.to_natural_language()}" for x, y in self.inbox), turn_number=obs.turn_number, @@ -147,15 +131,6 @@ async def aact(self, obs: Observation) -> AgentAction: return returned_action -class SpeakAgent(LLMAgent): - def act( - self, - obs: Observation, - gen_func: Callable[..., AgentAction] = generate_action_speak, - ) -> AgentAction: - return super().act(obs, gen_func=gen_func) - - class HumanAgent(BaseAgent[Observation, AgentAction]): """ A human agent that takes input from the command line. diff --git a/sotopia/envs/evaluators.py b/sotopia/envs/evaluators.py index d3a9b5ab3..01d1cc4a8 100644 --- a/sotopia/envs/evaluators.py +++ b/sotopia/envs/evaluators.py @@ -273,7 +273,7 @@ async def __acall__( response: ( EnvResponsePlus | EnvResponse ) # fix type error from langchain 0.0.264. we don't need this line for langchain 0.0.263 - response, prompt = await agenerate( + response = await agenerate( model_name=self.model_name, template="""{history}, Based on previous interactions, evaluate how well participants achieve their goals. @@ -286,7 +286,6 @@ async def __acall__( ), temperature=temperature, ) - self.prompt = prompt response_list = [] # TODO: multiple agents for dimension in response.agent_1_evaluation.dict().keys(): diff --git a/sotopia/generation_utils/__init__.py b/sotopia/generation_utils/__init__.py index c5fb65099..91ccaccc9 100644 --- a/sotopia/generation_utils/__init__.py +++ b/sotopia/generation_utils/__init__.py @@ -2,14 +2,21 @@ EnvResponse, LLM_Name, agenerate_env_profile, - fill_in_background, - generate_goal, + agenerate, + agenerate_action, +) + +from .sync import ( + generate, + generate_action, ) __all__ = [ "EnvResponse", "agenerate_env_profile", "LLM_Name", - "fill_in_background", - "generate_goal", + "agenerate", + "agenerate_action", + "generate", + "generate_action", ] diff --git a/sotopia/generation_utils/generate.py b/sotopia/generation_utils/generate.py index c256a86c2..39a0d1548 100644 --- a/sotopia/generation_utils/generate.py +++ b/sotopia/generation_utils/generate.py @@ -1,7 +1,7 @@ import logging import os import re -from typing import Any, TypeVar +from typing import TypeVar import gin from beartype import beartype @@ -14,7 +14,6 @@ PromptTemplate, ) from langchain.schema import BaseOutputParser, OutputParserException -from langchain_community.chat_models import ChatLiteLLM from langchain_openai import ChatOpenAI from pydantic import BaseModel, Field from rich import print @@ -52,31 +51,6 @@ OutputType = TypeVar("OutputType", bound=object) -class PatchedChatLiteLLM(ChatLiteLLM): - max_tokens: int | None = None # type: ignore - - @property - def _default_params(self) -> dict[str, Any]: - """Get the default parameters for calling OpenAI API.""" - set_model_value = self.model - if self.model_name is not None: - set_model_value = self.model_name - - params = { - "model": set_model_value, - "force_timeout": self.request_timeout, - "stream": self.streaming, - "n": self.n, - "temperature": self.temperature, - "custom_llm_provider": self.custom_llm_provider, - **self.model_kwargs, - } - if self.max_tokens is not None: - params["max_tokens"] = self.max_tokens - - return params - - class EnvResponse(BaseModel): reasoning: str = Field( description="first reiterate agents' social goals and then reason about what agents say/do and whether that aligns with their goals." @@ -439,47 +413,6 @@ def format_bad_output( return reformat -@beartype -def generate( - model_name: str, - template: str, - input_values: dict[str, str], - output_parser: BaseOutputParser[OutputType], - temperature: float = 0.7, -) -> OutputType: - input_variables = re.findall(r"{(.*?)}", template) - assert ( - set(input_variables) == set(list(input_values.keys()) + ["format_instructions"]) - or set(input_variables) == set(list(input_values.keys())) - ), f"The variables in the template must match input_values except for format_instructions. Got {sorted(input_values.keys())}, expect {sorted(input_variables)}" - # process template - template = format_docstring(template) - chain = obtain_chain( - model_name=model_name, - template=template, - input_variables=input_variables, - temperature=temperature, - ) - if "format_instructions" not in input_values: - input_values["format_instructions"] = output_parser.get_format_instructions() - result = chain.predict([logging_handler], **input_values) - try: - parsed_result = output_parser.parse(result) - except KeyboardInterrupt: - raise KeyboardInterrupt - except Exception as e: - log.debug( - f"[red] Failed to parse result: {result}\nEncounter Exception {e}\nstart to reparse", - extra={"markup": True}, - ) - reformat_parsed_result = format_bad_output( - result, format_instructions=output_parser.get_format_instructions() - ) - parsed_result = output_parser.parse(reformat_parsed_result) - log.info(f"Generated result: {parsed_result}") - return parsed_result - - @gin.configurable @beartype async def agenerate( @@ -488,7 +421,7 @@ async def agenerate( input_values: dict[str, str], output_parser: BaseOutputParser[OutputType], temperature: float = 0.7, -) -> tuple[OutputType, str]: +) -> OutputType: input_variables = re.findall(r"{(.*?)}", template) assert ( set(input_variables) == set(list(input_values.keys()) + ["format_instructions"]) @@ -505,7 +438,6 @@ async def agenerate( if "format_instructions" not in input_values: input_values["format_instructions"] = output_parser.get_format_instructions() result = await chain.apredict([logging_handler], **input_values) - prompt = logging_handler.retrive_prompt() try: parsed_result = output_parser.parse(result) except Exception as e: @@ -520,36 +452,7 @@ async def agenerate( ) parsed_result = output_parser.parse(reformat_parsed_result) log.info(f"Generated result: {parsed_result}") - return parsed_result, prompt - - -# deprecated function -@beartype -def generate_episode( - model_name: str, - participants: str = "Jack (a greedy person), Rose", - topic: str = "lawsuit", - extra_info: str = "", -) -> EnvResponse: - """ - Using langchain to generate an example episode - """ - return generate( - model_name=model_name, - template=""" - Please generate a episode for the interaction between {participants} regarding {topic}. - You should generate the personal backgrounds and goals in this interaction. - Use the following extra info if given: {extra_info} - Please use the following format: - {format_instructions} - """, - input_values=dict( - participants=participants, - topic=topic, - extra_info=extra_info, - ), - output_parser=EnvResponsePydanticOutputParser(), - ) + return parsed_result @gin.configurable @@ -630,114 +533,6 @@ async def agenerate_enviroment_profile( ) -@beartype -def fill_in_background( - model_name: str, - partial_background: ScriptBackground, -) -> ScriptBackground: - """ - Fill in the missing information of the background - """ - return generate( - model_name=model_name, - template="""Please fill in all missing information of the given background, don't leave any tag: - {partial_background} - Please use the following format: - {format_instructions} - """, - input_values=dict( - partial_background=partial_background.to_natural_language(), - ), - output_parser=PydanticOutputParser(pydantic_object=ScriptBackground), - ) - - -@beartype -def generate_action( - model_name: str, - history: str, - turn_number: int, - action_types: list[ActionType], - agent: str, - goal: str, -) -> AgentAction: - """ - Using langchain to generate an example episode - """ - try: - return generate( - model_name=model_name, - template=""" - Imagine you are {agent}, your task is to act/speak like {agent} with {agent}'s social goal in mind. - You can find {agent}'s background and goal in the following history: - {history} - You are at Turn #{turn_number}. Your available action types are - {action_list}. - Note: You can "leave" this conversation if 1. this conversation makes you uncomfortable, 2. you find it uninteresting/you lose your patience, 3. you have achieved your social goals, 4. or for other reasons you want to leave. - - Please only generate a JSON string including the action type and the argument. - Your action should follow the given format: - {format_instructions} - """, - input_values=dict( - agent=agent, - turn_number=str(turn_number), - history=history, - action_list=" ".join(action_types), - ), - output_parser=PydanticOutputParser(pydantic_object=AgentAction), - ) - except KeyboardInterrupt: - raise KeyboardInterrupt - except Exception: - return AgentAction(action_type="none", argument="") - - -@beartype -def generate_action_speak( - model_name: str, - history: str, - turn_number: int, - action_types: list[ActionType], - agent: str, - goal: str, -) -> AgentAction: - """ - Using langchain to generate the action but only speak action is allowed - """ - try: - utterance = generate( - model_name=model_name, - template=""" - You are {agent}. - {history} - - You are at Turn #{turn_number}. Your available action type is speak. - Your goal is: {goal} - Follow the given format: - {agent} said: - should not include any quotation marks, "Turn #", or etc. - """, - input_values=dict( - agent=agent, - turn_number=str(turn_number), - history=history, - goal=goal, - ), - output_parser=StrOutputParser(), - ) - # delete the first line - utterance = utterance.replace(f"{agent} said:", "") - utterance = utterance.replace(f"Turn #{turn_number}:", "") - utterance = utterance.strip() - utterance = utterance.replace('"', "") - return AgentAction(action_type="speak", argument=utterance) - except KeyboardInterrupt: - raise KeyboardInterrupt - except Exception: - return AgentAction(action_type="none", argument="") - - @gin.configurable @beartype async def agenerate_action( @@ -749,7 +544,7 @@ async def agenerate_action( goal: str, temperature: float = 0.7, script_like: bool = False, -) -> tuple[AgentAction, str]: +) -> AgentAction: """ Using langchain to generate an example episode """ @@ -800,7 +595,7 @@ async def agenerate_action( temperature=temperature, ) except Exception: - return AgentAction(action_type="none", argument=""), "" + return AgentAction(action_type="none", argument="") @gin.configurable @@ -840,7 +635,7 @@ async def agenerate_script( history=history, agent=agent_name, ), - output_parser=ScriptOutputParser( + output_parser=ScriptOutputParser( # type: ignore[arg-type] agent_names=agent_names, background=background.to_natural_language(), single_turn=True, @@ -862,7 +657,7 @@ async def agenerate_script( input_values=dict( background=background.to_natural_language(), ), - output_parser=ScriptOutputParser( + output_parser=ScriptOutputParser( # type: ignore[arg-type] agent_names=agent_names, background=background.to_natural_language(), single_turn=False, @@ -896,11 +691,11 @@ def process_history( @beartype -def generate_init_profile(model_name: str, basic_info: dict[str, str]) -> str: +async def agenerate_init_profile(model_name: str, basic_info: dict[str, str]) -> str: """ Using langchain to generate the background """ - return generate( + return await agenerate( model_name=model_name, template="""Please expand a fictional background for {name}. Here is the basic information: {name}'s age: {age} @@ -934,9 +729,9 @@ def generate_init_profile(model_name: str, basic_info: dict[str, str]) -> str: @beartype -def convert_narratives(model_name: str, narrative: str, text: str) -> str: +async def convert_narratives(model_name: str, narrative: str, text: str) -> str: if narrative == "first": - return generate( + return await agenerate( model_name=model_name, template="""Please convert the following text into a first-person narrative. e.g, replace name, he, she, him, her, his, and hers with I, me, my, and mine. @@ -945,7 +740,7 @@ def convert_narratives(model_name: str, narrative: str, text: str) -> str: output_parser=StrOutputParser(), ) elif narrative == "second": - return generate( + return await agenerate( model_name=model_name, template="""Please convert the following text into a second-person narrative. e.g, replace name, he, she, him, her, his, and hers with you, your, and yours. @@ -958,11 +753,11 @@ def convert_narratives(model_name: str, narrative: str, text: str) -> str: @beartype -def generate_goal(model_name: str, background: str) -> str: +async def agenerate_goal(model_name: str, background: str) -> str: """ Using langchain to generate the background """ - return generate( + return await agenerate( model_name=model_name, template="""Please generate your goal based on the background: {background} diff --git a/sotopia/generation_utils/sync.py b/sotopia/generation_utils/sync.py new file mode 100644 index 000000000..a2ca63379 --- /dev/null +++ b/sotopia/generation_utils/sync.py @@ -0,0 +1,29 @@ +import asyncio +from concurrent.futures import ThreadPoolExecutor +from functools import wraps +from .generate import agenerate, agenerate_action + +from typing import Awaitable, Callable, ParamSpec, TypeVar + +P = ParamSpec("P") +T = TypeVar("T") + + +def async_to_sync(async_func: Callable[P, Awaitable[T]]) -> Callable[P, T]: + @wraps(async_func) + def wrapper(*args: P.args, **kwargs: P.kwargs) -> T: + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + with ThreadPoolExecutor() as executor: + future = executor.submit( + loop.run_until_complete, async_func(*args, **kwargs) + ) + result = future.result() + loop.close() + return result + + return wrapper + + +generate = async_to_sync(agenerate) +generate_action = async_to_sync(agenerate_action) diff --git a/sotopia/server.py b/sotopia/server.py index 01421f520..732cf16a2 100644 --- a/sotopia/server.py +++ b/sotopia/server.py @@ -13,7 +13,6 @@ LLMAgent, RedisAgent, ScriptWritingAgent, - SpeakAgent, ) from sotopia.agents.base_agent import BaseAgent from sotopia.database import EpisodeLog @@ -67,7 +66,9 @@ def run_sync_server( if agent_model == "human": agents[agent_name] = HumanAgent(agent_name) elif mode == "speak": - agents[agent_name] = SpeakAgent(agent_name, model_name=agent_model) + raise NotImplementedError( + "Deprecated. The original Speaker Agent is not implemented in the async context." + ) else: agents[agent_name] = LLMAgent(agent_name, model_name=agent_model) agents.reset() diff --git a/tests/generation_utils/test_generation.py b/tests/generation_utils/test_generation.py index 511b743fc..b0212a07d 100644 --- a/tests/generation_utils/test_generation.py +++ b/tests/generation_utils/test_generation.py @@ -3,34 +3,16 @@ from sotopia.generation_utils.generate import ( ListOfIntOutputParser, agenerate, - generate, ) -def test_generate_list_integer() -> None: - """ - Test that the integer generator works - """ - length, lower, upper = 5, -10, 10 - list_of_int = generate( - "gpt-3.5-turbo", - "{format_instructions}", - {}, - ListOfIntOutputParser(length, (lower, upper)), - ) - assert isinstance(list_of_int, list) - assert len(list_of_int) == length - assert all(isinstance(i, int) for i in list_of_int) - assert all(lower <= i <= upper for i in list_of_int) - - @pytest.mark.asyncio async def test_agenerate_list_integer() -> None: """ async version of test_generate_list_integer """ length, lower, upper = 5, -10, 10 - list_of_int, _ = await agenerate( + list_of_int = await agenerate( "gpt-3.5-turbo", "{format_instructions}", {}, @@ -49,7 +31,7 @@ async def test_agenerate_list_integer_together() -> None: async version of test_generate_list_integer """ length, lower, upper = 5, -10, 10 - list_of_int, _ = await agenerate( + list_of_int = await agenerate( "togethercomputer/llama-2-70b-chat", "{format_instructions}", {}, From 5818a890f9098fe18a13b3c05e214acdf8c536b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 18:01:45 -0400 Subject: [PATCH 17/23] Bump fastapi from 0.109.2 to 0.110.3 (#121) Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.109.2 to 0.110.3. - [Release notes](https://github.com/tiangolo/fastapi/releases) - [Commits](https://github.com/tiangolo/fastapi/compare/0.109.2...0.110.3) --- updated-dependencies: - dependency-name: fastapi dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 19 ++++++++++--------- pyproject.toml | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/poetry.lock b/poetry.lock index d0b2492a5..164acad5d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -840,22 +840,22 @@ files = [ [[package]] name = "fastapi" -version = "0.109.2" +version = "0.110.3" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = true python-versions = ">=3.8" files = [ - {file = "fastapi-0.109.2-py3-none-any.whl", hash = "sha256:2c9bab24667293b501cad8dd388c05240c850b58ec5876ee3283c47d6e1e3a4d"}, - {file = "fastapi-0.109.2.tar.gz", hash = "sha256:f3817eac96fe4f65a2ebb4baa000f394e55f5fccdaf7f75250804bc58f354f73"}, + {file = "fastapi-0.110.3-py3-none-any.whl", hash = "sha256:fd7600612f755e4050beb74001310b5a7e1796d149c2ee363124abdfa0289d32"}, + {file = "fastapi-0.110.3.tar.gz", hash = "sha256:555700b0159379e94fdbfc6bb66a0f1c43f4cf7060f25239af3d84b63a656626"}, ] [package.dependencies] pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" -starlette = ">=0.36.3,<0.37.0" +starlette = ">=0.37.2,<0.38.0" typing-extensions = ">=4.8.0" [package.extras] -all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +all = ["email_validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] [[package]] name = "fastavro" @@ -2924,6 +2924,7 @@ description = "Nvidia JIT LTO Library" optional = true python-versions = ">=3" files = [ + {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_aarch64.whl", hash = "sha256:004186d5ea6a57758fd6d57052a123c73a4815adf365eb8dd6a85c9eaa7535ff"}, {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d9714f27c1d0f0895cd8915c07a87a1d0029a0aa36acaf9156952ec2a8a12189"}, {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-win_amd64.whl", hash = "sha256:c3401dc8543b52d3a8158007a0c1ab4e9c768fcbd24153a48c86972102197ddd"}, ] @@ -4457,13 +4458,13 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "starlette" -version = "0.36.3" +version = "0.37.2" description = "The little ASGI library that shines." optional = true python-versions = ">=3.8" files = [ - {file = "starlette-0.36.3-py3-none-any.whl", hash = "sha256:13d429aa93a61dc40bf503e8c801db1f1bca3dc706b10ef2434a36123568f044"}, - {file = "starlette-0.36.3.tar.gz", hash = "sha256:90a671733cfb35771d8cc605e0b679d23b992f8dcfad48cc60b38cb29aeb7080"}, + {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, + {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, ] [package.dependencies] @@ -5363,4 +5364,4 @@ groq = ["groq"] [metadata] lock-version = "2.0" python-versions = ">=3.10, <3.13" -content-hash = "e6f81f1f5bef19b559e0620be9840eb7a57e0ffad86c9c5aeead2ff2a3c84e39" +content-hash = "2e9659e693e36195206a24d640372e1c8593259337195e6025788f322e21eec6" diff --git a/pyproject.toml b/pyproject.toml index 87e36a34e..45ca72440 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ langchain-openai = "~0.1.8" litellm = "~1.23.12" # dependency versions for extras -fastapi = { version = "^0.109.2", optional = true } +fastapi = { version = ">=0.109.2,<0.111.0", optional = true } tabulate = { version = "^0.9.0", optional = true } anthropic = { version = ">=0.26,<0.29", optional = true } xmltodict = { version = "^0.13.0", optional = true } From 701f2a8120123829f4390a9a5ff5fa3f43a7ad06 Mon Sep 17 00:00:00 2001 From: Hao Zhu Date: Wed, 26 Jun 2024 13:36:26 -0400 Subject: [PATCH 18/23] Setup everything for sotopia in one script (#122) * git ignore * add nextra site * change path to docs * Add installation instruction (#76) * fix an accordion bug * Add tabs for choosing platform in Redis Instructions * add platform tab * updated open in colab instruction * add agents.md/environments.md rename all_the_issues to troubleshooting * add auto set script * add more dataset choices * adding download data menu and protection when the path exists * Unify benchmark and install into `sotopia` cli command * move install and benchmark in to folders * make flow more rigorious and add tests * update linux direction * add restart directions * remove _renderer * add use docker test * call -> run * add shell=True * mkdir when the dirctory doesn't exist * remove docker test due to memory limit * add prompt mocking * add install cli * add a sleep to make sure that the redis is launched before stopping * add matrix os in pytest * add poetry to path on macos * Use install poetry action * make redis directory on mac * avoid permission issue on mac * update macos test * test docker * install docker with brew * set up docker * give up testing docker on mac * check if docker daemon is up and brew update * improve prompts * update prompt tests --------- Co-authored-by: XuhuiZhou Co-authored-by: Ruiyi Wang --- .github/workflows/tests.yml | 14 +- .gitignore | 2 + README.md | 4 +- docs/pages/_meta.json | 8 + docs/pages/agents.md | 0 docs/pages/environments.md | 0 docs/pages/index.mdx | 2 +- .../{all_the_issues.md => troubleshooting.md} | 2 +- poetry.lock | 573 ++++++++++-------- pyproject.toml | 5 +- sotopia/benchmark/__init__.py | 3 - sotopia/cli/__init__.py | 5 + sotopia/cli/app.py | 3 + sotopia/cli/benchmark/__init__.py | 3 + .../cli.py => cli/benchmark/benchmark.py} | 9 +- sotopia/cli/install/__init__.py | 3 + sotopia/cli/install/install.py | 407 +++++++++++++ sotopia/cli/install/menu.py | 115 ++++ sotopia/cli/install/published_datasets.json | 28 + sotopia/cli/rich_pixels/__init__.py | 9 + sotopia/cli/rich_pixels/_pixel.py | 52 ++ tests/cli/test_install.py | 56 ++ 22 files changed, 1017 insertions(+), 286 deletions(-) create mode 100644 docs/pages/agents.md create mode 100644 docs/pages/environments.md rename docs/pages/{all_the_issues.md => troubleshooting.md} (99%) delete mode 100644 sotopia/benchmark/__init__.py create mode 100644 sotopia/cli/__init__.py create mode 100644 sotopia/cli/app.py create mode 100644 sotopia/cli/benchmark/__init__.py rename sotopia/{benchmark/cli.py => cli/benchmark/benchmark.py} (99%) create mode 100644 sotopia/cli/install/__init__.py create mode 100644 sotopia/cli/install/install.py create mode 100644 sotopia/cli/install/menu.py create mode 100644 sotopia/cli/install/published_datasets.json create mode 100644 sotopia/cli/rich_pixels/__init__.py create mode 100644 sotopia/cli/rich_pixels/_pixel.py create mode 100644 tests/cli/test_install.py diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 46eb36c8f..36d4c2e51 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -17,19 +17,27 @@ on: jobs: Pytest: - runs-on: ubuntu-latest strategy: max-parallel: 5 + matrix: + os: [ubuntu-latest, macos-13] + + runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python 3.11 uses: actions/setup-python@v4 with: python-version: 3.11.2 + - name: Set up Docker + if: runner.os == 'ubuntu-latest' + uses: docker-practice/actions-setup-docker@master + timeout-minutes: 12 + - name: Install Poetry + uses: abatilo/actions-poetry@v2 - name: Install dependencies run: | - curl -sSL https://install.python-poetry.org | python3 poetry lock poetry install --with test -E chat - name: Test with pytest diff --git a/.gitignore b/.gitignore index 91991f7c0..757851f77 100644 --- a/.gitignore +++ b/.gitignore @@ -161,3 +161,5 @@ backup/* node_modules/* docs/.next/* docs/node_modules/* + +redis-data/* diff --git a/README.md b/README.md index a115d1d8a..511bd2a0e 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ For some experiments, TogetherAI key is required to run the code. Please set the conda env config vars set TOGETHER_API_KEY=your_key ``` -A redis-stack server is required to run the code. Please follow the [instruction](https://redis.io/docs/stack/get-started/install/docker/) to start a redis-stack server or use an existing server. You can also check [Q&A](/docs/all_the_issues.md) to initiate the redis server with the Sotopia data. +A redis-stack server is required to run the code. Please follow the [instruction](https://redis.io/docs/stack/get-started/install/docker/) to start a redis-stack server or use an existing server. You can also check [Q&A](/docs/troubleshooting.md) to initiate the redis server with the Sotopia data. The `REDIS_OM_URL` need to be set before loading and saving agents: ```bash @@ -156,7 +156,7 @@ To run a large batch of environments, you can change the `ENV_IDS` parameter in ## Getting access to your simulation After running experiments, you can go to the `examples/redis_stats.ipynb` notebook to check the existing episodes (Episode Log section), as well as calculate the performance. -For the original Sotopia simulation in our paper's experiments, you can find how to get them in the [Q&A](/docs/all_the_issues.md) section in the `./docs` folder. +For the original Sotopia simulation in our paper's experiments, you can find how to get them in the [Q&A](/docs/troubleshooting.md) section in the `./docs` folder. ## Adding new characters and environments You can use the following function with the `**kwargs` being the properties of the `AgentProfile` class. This is the same for the scenarios/environments. diff --git a/docs/pages/_meta.json b/docs/pages/_meta.json index 0d5395957..f96af59dc 100644 --- a/docs/pages/_meta.json +++ b/docs/pages/_meta.json @@ -7,6 +7,14 @@ "title": "Documentation", "type": "menu", "items": { + "agents": { + "title": "Agents", + "href": "/agents" + }, + "environments": { + "title": "Environments", + "href": "/environments" + }, "examples": { "title": "Examples", "href": "/examples" diff --git a/docs/pages/agents.md b/docs/pages/agents.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/pages/environments.md b/docs/pages/environments.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/pages/index.mdx b/docs/pages/index.mdx index 94c082c06..159b837b7 100644 --- a/docs/pages/index.mdx +++ b/docs/pages/index.mdx @@ -107,7 +107,7 @@ Redis stack is a required dependency for using Sotopia. There are two ways to se Docker is my thing. - Please follow the [instruction](https://redis.io/docs/stack/get-started/install/docker/) to start a redis-stack server or use an existing server. You can also check [Q&A](/docs/all_the_issues.md) to initiate the redis server with the Sotopia data. + Please follow the [instruction](https://redis.io/docs/stack/get-started/install/docker/) to start a redis-stack server or use an existing server. You can also check [Q&A](/docs/troubleshooting.md) to initiate the redis server with the Sotopia data. The `REDIS_OM_URL` need to be set before loading and saving agents: ```bash diff --git a/docs/pages/all_the_issues.md b/docs/pages/troubleshooting.md similarity index 99% rename from docs/pages/all_the_issues.md rename to docs/pages/troubleshooting.md index 9937dab19..db3fecc5c 100644 --- a/docs/pages/all_the_issues.md +++ b/docs/pages/troubleshooting.md @@ -1,4 +1,4 @@ -# Q&A +# Troubleshooting ## Missing episodes Large batch size may cause some episodes to be skipped. This is due to the fact that the server may not be able to handle the load. Try reducing the batch size. But you can also use the script in `examples/fix_missing_episodes.py` to fix the missing episodes. diff --git a/poetry.lock b/poetry.lock index 164acad5d..6f23f1e1d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -247,17 +247,17 @@ test-tox-coverage = ["coverage (>=5.5)"] [[package]] name = "boto3" -version = "1.34.130" +version = "1.34.133" description = "The AWS SDK for Python" optional = true python-versions = ">=3.8" files = [ - {file = "boto3-1.34.130-py3-none-any.whl", hash = "sha256:c163fb7135a94e7b8c8c478a44071c843f05e212fa4bec3105f8a437ecbf1bcb"}, - {file = "boto3-1.34.130.tar.gz", hash = "sha256:b781d267dd5e7583966e05697f6bd45e2f46c01dc619ba0860b042963ee69296"}, + {file = "boto3-1.34.133-py3-none-any.whl", hash = "sha256:da7e78c03270be872ad78301892396ffea56647efcb2c3a8621ef46a905541ab"}, + {file = "boto3-1.34.133.tar.gz", hash = "sha256:7071f8ce1f09113ca5630860fd590464e6325a4df55faae83c956225941016fc"}, ] [package.dependencies] -botocore = ">=1.34.130,<1.35.0" +botocore = ">=1.34.133,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -266,13 +266,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.130" +version = "1.34.133" description = "Low-level, data-driven core of boto 3." optional = true python-versions = ">=3.8" files = [ - {file = "botocore-1.34.130-py3-none-any.whl", hash = "sha256:a3b36e9dac1ed31c4cb3a5c5e540a7d8a9b90ff1d17f87734e674154b41776d8"}, - {file = "botocore-1.34.130.tar.gz", hash = "sha256:a242b3b0a836b14f308a309565cd63e88654cec238f9b73abbbd3c0526db4c81"}, + {file = "botocore-1.34.133-py3-none-any.whl", hash = "sha256:f269dad8e17432d2527b97ed9f1fd30ec8dc705f8b818957170d1af484680ef2"}, + {file = "botocore-1.34.133.tar.gz", hash = "sha256:5ea609aa4831a6589e32eef052a359ad8d7311733b4d86a9d35dab4bd3ec80ff"}, ] [package.dependencies] @@ -557,63 +557,63 @@ test = ["pytest"] [[package]] name = "coverage" -version = "7.5.3" +version = "7.5.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a6519d917abb15e12380406d721e37613e2a67d166f9fb7e5a8ce0375744cd45"}, - {file = "coverage-7.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aea7da970f1feccf48be7335f8b2ca64baf9b589d79e05b9397a06696ce1a1ec"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:923b7b1c717bd0f0f92d862d1ff51d9b2b55dbbd133e05680204465f454bb286"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62bda40da1e68898186f274f832ef3e759ce929da9a9fd9fcf265956de269dbc"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8b7339180d00de83e930358223c617cc343dd08e1aa5ec7b06c3a121aec4e1d"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:25a5caf742c6195e08002d3b6c2dd6947e50efc5fc2c2205f61ecb47592d2d83"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:05ac5f60faa0c704c0f7e6a5cbfd6f02101ed05e0aee4d2822637a9e672c998d"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:239a4e75e09c2b12ea478d28815acf83334d32e722e7433471fbf641c606344c"}, - {file = "coverage-7.5.3-cp310-cp310-win32.whl", hash = "sha256:a5812840d1d00eafae6585aba38021f90a705a25b8216ec7f66aebe5b619fb84"}, - {file = "coverage-7.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:33ca90a0eb29225f195e30684ba4a6db05dbef03c2ccd50b9077714c48153cac"}, - {file = "coverage-7.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f81bc26d609bf0fbc622c7122ba6307993c83c795d2d6f6f6fd8c000a770d974"}, - {file = "coverage-7.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7cec2af81f9e7569280822be68bd57e51b86d42e59ea30d10ebdbb22d2cb7232"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55f689f846661e3f26efa535071775d0483388a1ccfab899df72924805e9e7cd"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50084d3516aa263791198913a17354bd1dc627d3c1639209640b9cac3fef5807"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:341dd8f61c26337c37988345ca5c8ccabeff33093a26953a1ac72e7d0103c4fb"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ab0b028165eea880af12f66086694768f2c3139b2c31ad5e032c8edbafca6ffc"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5bc5a8c87714b0c67cfeb4c7caa82b2d71e8864d1a46aa990b5588fa953673b8"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38a3b98dae8a7c9057bd91fbf3415c05e700a5114c5f1b5b0ea5f8f429ba6614"}, - {file = "coverage-7.5.3-cp311-cp311-win32.whl", hash = "sha256:fcf7d1d6f5da887ca04302db8e0e0cf56ce9a5e05f202720e49b3e8157ddb9a9"}, - {file = "coverage-7.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:8c836309931839cca658a78a888dab9676b5c988d0dd34ca247f5f3e679f4e7a"}, - {file = "coverage-7.5.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:296a7d9bbc598e8744c00f7a6cecf1da9b30ae9ad51c566291ff1314e6cbbed8"}, - {file = "coverage-7.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:34d6d21d8795a97b14d503dcaf74226ae51eb1f2bd41015d3ef332a24d0a17b3"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e317953bb4c074c06c798a11dbdd2cf9979dbcaa8ccc0fa4701d80042d4ebf1"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:705f3d7c2b098c40f5b81790a5fedb274113373d4d1a69e65f8b68b0cc26f6db"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1196e13c45e327d6cd0b6e471530a1882f1017eb83c6229fc613cd1a11b53cd"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:015eddc5ccd5364dcb902eaecf9515636806fa1e0d5bef5769d06d0f31b54523"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fd27d8b49e574e50caa65196d908f80e4dff64d7e592d0c59788b45aad7e8b35"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:33fc65740267222fc02975c061eb7167185fef4cc8f2770267ee8bf7d6a42f84"}, - {file = "coverage-7.5.3-cp312-cp312-win32.whl", hash = "sha256:7b2a19e13dfb5c8e145c7a6ea959485ee8e2204699903c88c7d25283584bfc08"}, - {file = "coverage-7.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:0bbddc54bbacfc09b3edaec644d4ac90c08ee8ed4844b0f86227dcda2d428fcb"}, - {file = "coverage-7.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f78300789a708ac1f17e134593f577407d52d0417305435b134805c4fb135adb"}, - {file = "coverage-7.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b368e1aee1b9b75757942d44d7598dcd22a9dbb126affcbba82d15917f0cc155"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f836c174c3a7f639bded48ec913f348c4761cbf49de4a20a956d3431a7c9cb24"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:244f509f126dc71369393ce5fea17c0592c40ee44e607b6d855e9c4ac57aac98"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4c2872b3c91f9baa836147ca33650dc5c172e9273c808c3c3199c75490e709d"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dd4b3355b01273a56b20c219e74e7549e14370b31a4ffe42706a8cda91f19f6d"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f542287b1489c7a860d43a7d8883e27ca62ab84ca53c965d11dac1d3a1fab7ce"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:75e3f4e86804023e991096b29e147e635f5e2568f77883a1e6eed74512659ab0"}, - {file = "coverage-7.5.3-cp38-cp38-win32.whl", hash = "sha256:c59d2ad092dc0551d9f79d9d44d005c945ba95832a6798f98f9216ede3d5f485"}, - {file = "coverage-7.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:fa21a04112c59ad54f69d80e376f7f9d0f5f9123ab87ecd18fbb9ec3a2beed56"}, - {file = "coverage-7.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5102a92855d518b0996eb197772f5ac2a527c0ec617124ad5242a3af5e25f85"}, - {file = "coverage-7.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d1da0a2e3b37b745a2b2a678a4c796462cf753aebf94edcc87dcc6b8641eae31"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8383a6c8cefba1b7cecc0149415046b6fc38836295bc4c84e820872eb5478b3d"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aad68c3f2566dfae84bf46295a79e79d904e1c21ccfc66de88cd446f8686341"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e079c9ec772fedbade9d7ebc36202a1d9ef7291bc9b3a024ca395c4d52853d7"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bde997cac85fcac227b27d4fb2c7608a2c5f6558469b0eb704c5726ae49e1c52"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:990fb20b32990b2ce2c5f974c3e738c9358b2735bc05075d50a6f36721b8f303"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3d5a67f0da401e105753d474369ab034c7bae51a4c31c77d94030d59e41df5bd"}, - {file = "coverage-7.5.3-cp39-cp39-win32.whl", hash = "sha256:e08c470c2eb01977d221fd87495b44867a56d4d594f43739a8028f8646a51e0d"}, - {file = "coverage-7.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:1d2a830ade66d3563bb61d1e3c77c8def97b30ed91e166c67d0632c018f380f0"}, - {file = "coverage-7.5.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:3538d8fb1ee9bdd2e2692b3b18c22bb1c19ffbefd06880f5ac496e42d7bb3884"}, - {file = "coverage-7.5.3.tar.gz", hash = "sha256:04aefca5190d1dc7a53a4c1a5a7f8568811306d7a8ee231c42fb69215571944f"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, + {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, + {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, + {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, + {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, + {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, + {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, + {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, + {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, + {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, + {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, + {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, + {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, ] [package.dependencies] @@ -722,33 +722,33 @@ vision = ["Pillow (>=9.4.0)"] [[package]] name = "debugpy" -version = "1.8.1" +version = "1.8.2" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"}, - {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"}, - {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"}, - {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"}, - {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"}, - {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"}, - {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"}, - {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"}, - {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, - {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, - {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, - {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, - {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"}, - {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"}, - {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"}, - {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"}, - {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"}, - {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"}, - {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"}, - {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"}, - {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, - {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, + {file = "debugpy-1.8.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7ee2e1afbf44b138c005e4380097d92532e1001580853a7cb40ed84e0ef1c3d2"}, + {file = "debugpy-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f8c3f7c53130a070f0fc845a0f2cee8ed88d220d6b04595897b66605df1edd6"}, + {file = "debugpy-1.8.2-cp310-cp310-win32.whl", hash = "sha256:f179af1e1bd4c88b0b9f0fa153569b24f6b6f3de33f94703336363ae62f4bf47"}, + {file = "debugpy-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:0600faef1d0b8d0e85c816b8bb0cb90ed94fc611f308d5fde28cb8b3d2ff0fe3"}, + {file = "debugpy-1.8.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a"}, + {file = "debugpy-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634"}, + {file = "debugpy-1.8.2-cp311-cp311-win32.whl", hash = "sha256:2cbd4d9a2fc5e7f583ff9bf11f3b7d78dfda8401e8bb6856ad1ed190be4281ad"}, + {file = "debugpy-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:d3408fddd76414034c02880e891ea434e9a9cf3a69842098ef92f6e809d09afa"}, + {file = "debugpy-1.8.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835"}, + {file = "debugpy-1.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3"}, + {file = "debugpy-1.8.2-cp312-cp312-win32.whl", hash = "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e"}, + {file = "debugpy-1.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859"}, + {file = "debugpy-1.8.2-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:5a019d4574afedc6ead1daa22736c530712465c0c4cd44f820d803d937531b2d"}, + {file = "debugpy-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40f062d6877d2e45b112c0bbade9a17aac507445fd638922b1a5434df34aed02"}, + {file = "debugpy-1.8.2-cp38-cp38-win32.whl", hash = "sha256:c78ba1680f1015c0ca7115671fe347b28b446081dada3fedf54138f44e4ba031"}, + {file = "debugpy-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:cf327316ae0c0e7dd81eb92d24ba8b5e88bb4d1b585b5c0d32929274a66a5210"}, + {file = "debugpy-1.8.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:1523bc551e28e15147815d1397afc150ac99dbd3a8e64641d53425dba57b0ff9"}, + {file = "debugpy-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e24ccb0cd6f8bfaec68d577cb49e9c680621c336f347479b3fce060ba7c09ec1"}, + {file = "debugpy-1.8.2-cp39-cp39-win32.whl", hash = "sha256:7f8d57a98c5a486c5c7824bc0b9f2f11189d08d73635c326abef268f83950326"}, + {file = "debugpy-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:16c8dcab02617b75697a0a925a62943e26a0330da076e2a10437edd9f0bf3755"}, + {file = "debugpy-1.8.2-py2.py3-none-any.whl", hash = "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca"}, + {file = "debugpy-1.8.2.zip", hash = "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00"}, ] [[package]] @@ -919,13 +919,13 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.15.3" +version = "3.15.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.15.3-py3-none-any.whl", hash = "sha256:0151273e5b5d6cf753a61ec83b3a9b7d8821c39ae9af9d7ecf2f9e2f17404103"}, - {file = "filelock-3.15.3.tar.gz", hash = "sha256:e1199bf5194a2277273dacd50269f0d87d0682088a3c561c15674ea9005d8635"}, + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, ] [package.extras] @@ -1098,13 +1098,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.19.0" +version = "2.19.1" description = "Google API client core library" optional = true python-versions = ">=3.7" files = [ - {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, - {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, + {file = "google-api-core-2.19.1.tar.gz", hash = "sha256:f4695f1e3650b316a795108a76a1c416e6afb036199d1c1f1f110916df479ffd"}, + {file = "google_api_core-2.19.1-py3-none-any.whl", hash = "sha256:f12a9b8309b5e21d92483bbd47ce2c445861ec7d269ef6784ecc0ea8c1fa6125"}, ] [package.dependencies] @@ -1119,7 +1119,7 @@ grpcio-status = [ {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" requests = ">=2.18.0,<3.0.0.dev0" [package.extras] @@ -1208,17 +1208,17 @@ dev = ["Pillow", "absl-py", "black", "ipython", "nose2", "pandas", "pytype", "py [[package]] name = "googleapis-common-protos" -version = "1.63.1" +version = "1.63.2" description = "Common protobufs used in Google APIs" optional = true python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.63.1.tar.gz", hash = "sha256:c6442f7a0a6b2a80369457d79e6672bb7dcbaab88e0848302497e3ec80780a6a"}, - {file = "googleapis_common_protos-1.63.1-py2.py3-none-any.whl", hash = "sha256:0e1c2cdfcbc354b76e4a211a35ea35d6926a835cba1377073c4861db904a1877"}, + {file = "googleapis-common-protos-1.63.2.tar.gz", hash = "sha256:27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87"}, + {file = "googleapis_common_protos-1.63.2-py2.py3-none-any.whl", hash = "sha256:27a2499c7e8aff199665b22741997e485eccc8645aa9176c7c988e6fae507945"}, ] [package.dependencies] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" +protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" [package.extras] grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] @@ -1677,22 +1677,22 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.1.0" +version = "8.0.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, + {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, + {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "iniconfig" @@ -1828,72 +1828,72 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jiter" -version = "0.4.2" +version = "0.5.0" description = "Fast iterable JSON parser." optional = true python-versions = ">=3.8" files = [ - {file = "jiter-0.4.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c2b003ff58d14f5e182b875acd5177b2367245c19a03be9a2230535d296f7550"}, - {file = "jiter-0.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b48c77c25f094707731cd5bad6b776046846b60a27ee20efc8fadfb10a89415f"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f50ad6b172bde4d45f4d4ea10c49282a337b8bb735afc99763dfa55ea84a743"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95f6001e86f525fbbc9706db2078dc22be078b0950de55b92d37041930f5f940"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16646ef23b62b007de80460d303ebb2d81e355dac9389c787cec87cdd7ffef2f"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b4e847c13b0bf1255c711a92330e7a8cb8b5cdd1e37d7db309627bcdd3367ff"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c536589be60e4c5f2b20fadc4db7e9f55d4c9df3551f29ddf1c4a18dcc9dd54"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3b2763996167830889a854b4ded30bb90897f9b76be78069c50c3ec4540950e"}, - {file = "jiter-0.4.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:675e8ab98c99495091af6b6e9bf2b6353bcf81f25ab6ce27d36127e315b4505d"}, - {file = "jiter-0.4.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e48e43d9d999aaf55f53406b8846ff8cbe3e47ee4b9dc37e5a10a65ce760809f"}, - {file = "jiter-0.4.2-cp310-none-win32.whl", hash = "sha256:881b6e67c50bc36acb3570eda693763c8cd77d590940e06fa6d325d0da52ec1b"}, - {file = "jiter-0.4.2-cp310-none-win_amd64.whl", hash = "sha256:bb8f7b43259efc6add0d721ade2953e064b24e2026d26d979bc09ec080844cef"}, - {file = "jiter-0.4.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:24ad336ac47f274fa83f6fbedcabff9d3387c80f67c66b992688e6a8ba2c47e9"}, - {file = "jiter-0.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fc392a220095730afe365ce1516f2f88bb085a2fd29ea191be9c6e3c71713d9a"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1fdc408de36c81460896de0176f2f7b9f3574dcd35693a0b2c00f4ca34c98e4"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c10ad76722ee6a8c820b0db06a793c08b7d679e5201b9563015bd1e06c959a09"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbb46d1e9c82bba87f0cbda38413e49448a7df35b1e55917124bff9f38974a23"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:194e28ef4b5f3b61408cb2ee6b6dcbcdb0c9063d01b92b01345b7605692849f5"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0a447533eccd62748a727e058efa10a8d7cf1de8ffe1a4d705ecb41dad9090"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5f7704d7260bbb88cca3453951af739589132b26e896a3144fa2dae2263716d7"}, - {file = "jiter-0.4.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:01427458bc9550f2eda09d425755330e7d0eb09adce099577433bebf05d28d59"}, - {file = "jiter-0.4.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:159b8416879c0053b17c352f70b67b749ef5b2924c6154318ecf71918aab0905"}, - {file = "jiter-0.4.2-cp311-none-win32.whl", hash = "sha256:f2445234acfb79048ce1a0d5d0e181abb9afd9e4a29d8d9988fe26cc5773a81a"}, - {file = "jiter-0.4.2-cp311-none-win_amd64.whl", hash = "sha256:e15a65f233b6b0e5ac10ddf3b97ceb18aa9ffba096259961641d78b4ee321bd5"}, - {file = "jiter-0.4.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d61d59521aea9745447ce50f74d39a16ef74ec9d6477d9350d77e75a3d774ad2"}, - {file = "jiter-0.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eef607dc0acc251923427808dbd017f1998ae3c1a0430a261527aa5cbb3a942"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af6bf39954646e374fc47429c656372ac731a6a26b644158a5a84bcdbed33a47"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f509d23606e476852ee46a2b65b5c4ad3905f17424d9cc19c1dffa1c94ba3c6"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59672774daa44ee140aada0c781c82bee4d9ac5e522966186cfb6b3c217d8a51"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a0458efac5afeca254cf557b8a654e17013075a69905c78f88d557f129d871"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8860766d1c293e75c1bb4e25b74fa987e3adf199cac3f5f9e6e49c2bebf092f"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a109f3281b72bbf4921fe43db1005c004a38559ca0b6c4985add81777dfe0a44"}, - {file = "jiter-0.4.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:faa7e667454b77ad2f0ef87db39f4944de759617aadf210ea2b73f26bb24755f"}, - {file = "jiter-0.4.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3512f8b00cafb6780b427cb6282800d2bf8277161d9c917830661bd4ed1d3528"}, - {file = "jiter-0.4.2-cp312-none-win32.whl", hash = "sha256:853b35d508ee5b66d06630473c1c0b7bb5e29bf4785c9d2202437116c94f7e21"}, - {file = "jiter-0.4.2-cp312-none-win_amd64.whl", hash = "sha256:4a3a8197784278eb8b24cb02c45e1cad67c2ce5b5b758adfb19b87f74bbdff9c"}, - {file = "jiter-0.4.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ca2a4d750aed3154b89f2efb148609fc985fad8db739460797aaf9b478acedda"}, - {file = "jiter-0.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0e6c304b3cc6896256727e1fb8991c7179a345eca8224e201795e9cacf4683b0"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cc34ac708ae1750d077e490321761ec4b9a055b994cbdd1d6fbd37099e4aa7b"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8c93383875ab8d2e4f760aaff335b4a12ff32d4f9cf49c4498d657734f611466"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce197ee044add576afca0955b42142dd0312639adb6ebadbdbe4277f2855614f"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a427716813ff65480ca5b5117cfa099f49b49cd38051f8609bd0d5493013ca0"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:479990218353356234669e70fac53e5eb6f739a10db25316171aede2c97d9364"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d35a91ec5ac74cf33234c431505299fa91c0a197c2dbafd47400aca7c69489d4"}, - {file = "jiter-0.4.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b27189847193708c94ad10ca0d891309342ae882725d2187cf5d2db02bde8d1b"}, - {file = "jiter-0.4.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76c255308cd1093fb411a03756b7bb220e48d4a98c30cbc79ed448bf3978e27d"}, - {file = "jiter-0.4.2-cp38-none-win32.whl", hash = "sha256:bb77438060bad49cc251941e6701b31138365c8a0ddaf10cdded2fcc6dd30701"}, - {file = "jiter-0.4.2-cp38-none-win_amd64.whl", hash = "sha256:ce858af19f7ce0d4b51c9f6c0c9d08f1e9dcef1986c5875efd0674a7054292ca"}, - {file = "jiter-0.4.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:6128838a2f357b3921b2a3242d5dc002ae4255ecc8f9f05c20d56d7d2d79c5ad"}, - {file = "jiter-0.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f2420cebb9ba856cb57dcab1d2d8def949b464b0db09c22a4e4dbd52fff7b200"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5d13d8128e853b320e00bb18bd4bb8b136cc0936091dc87633648fc688eb705"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eba5d6e54f149c508ba88677f97d3dc7dd75e9980d234bbac8027ac6db0763a3"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fad5d64af0bc0545237419bf4150d8de56f0bd217434bdd1a59730327252bef"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d179e7bca89cf5719bd761dd37a341ff0f98199ecaa9c14af09792e47e977cc"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36353caee9f103d8ee7bda077f6400505b0f370e27eabcab33a33d21de12a2a6"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dd146c25bce576ca5db64fc7eccb8862af00f1f0e30108796953f12a53660e4c"}, - {file = "jiter-0.4.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:14b7c08cadbcd703041c66dc30e24e17de2f340281cac0e69374223ecf153aa4"}, - {file = "jiter-0.4.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a90f1a8b3d29aea198f8ea2b01148276ced8056e5103f32525266b3d880e65c9"}, - {file = "jiter-0.4.2-cp39-none-win32.whl", hash = "sha256:25b174997c780337b61ae57b1723455eecae9a17a9659044fd3c3b369190063f"}, - {file = "jiter-0.4.2-cp39-none-win_amd64.whl", hash = "sha256:bef62cea18521c5b99368147040c7e560c55098a35c93456f110678a2d34189a"}, - {file = "jiter-0.4.2.tar.gz", hash = "sha256:29b9d44f23f0c05f46d482f4ebf03213ee290d77999525d0975a17f875bf1eea"}, + {file = "jiter-0.5.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b599f4e89b3def9a94091e6ee52e1d7ad7bc33e238ebb9c4c63f211d74822c3f"}, + {file = "jiter-0.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a063f71c4b06225543dddadbe09d203dc0c95ba352d8b85f1221173480a71d5"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc0d5b8b3dd12e91dd184b87273f864b363dfabc90ef29a1092d269f18c7e28"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c22541f0b672f4d741382a97c65609332a783501551445ab2df137ada01e019e"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63314832e302cc10d8dfbda0333a384bf4bcfce80d65fe99b0f3c0da8945a91a"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a25fbd8a5a58061e433d6fae6d5298777c0814a8bcefa1e5ecfff20c594bd749"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:503b2c27d87dfff5ab717a8200fbbcf4714516c9d85558048b1fc14d2de7d8dc"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d1f3d27cce923713933a844872d213d244e09b53ec99b7a7fdf73d543529d6d"}, + {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c95980207b3998f2c3b3098f357994d3fd7661121f30669ca7cb945f09510a87"}, + {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:afa66939d834b0ce063f57d9895e8036ffc41c4bd90e4a99631e5f261d9b518e"}, + {file = "jiter-0.5.0-cp310-none-win32.whl", hash = "sha256:f16ca8f10e62f25fd81d5310e852df6649af17824146ca74647a018424ddeccf"}, + {file = "jiter-0.5.0-cp310-none-win_amd64.whl", hash = "sha256:b2950e4798e82dd9176935ef6a55cf6a448b5c71515a556da3f6b811a7844f1e"}, + {file = "jiter-0.5.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4c8e1ed0ef31ad29cae5ea16b9e41529eb50a7fba70600008e9f8de6376d553"}, + {file = "jiter-0.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6f16e21276074a12d8421692515b3fd6d2ea9c94fd0734c39a12960a20e85f3"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5280e68e7740c8c128d3ae5ab63335ce6d1fb6603d3b809637b11713487af9e6"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:583c57fc30cc1fec360e66323aadd7fc3edeec01289bfafc35d3b9dcb29495e4"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26351cc14507bdf466b5f99aba3df3143a59da75799bf64a53a3ad3155ecded9"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829df14d656b3fb87e50ae8b48253a8851c707da9f30d45aacab2aa2ba2d614"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42a4bdcf7307b86cb863b2fb9bb55029b422d8f86276a50487982d99eed7c6e"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04d461ad0aebf696f8da13c99bc1b3e06f66ecf6cfd56254cc402f6385231c06"}, + {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e6375923c5f19888c9226582a124b77b622f8fd0018b843c45eeb19d9701c403"}, + {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2cec323a853c24fd0472517113768c92ae0be8f8c384ef4441d3632da8baa646"}, + {file = "jiter-0.5.0-cp311-none-win32.whl", hash = "sha256:aa1db0967130b5cab63dfe4d6ff547c88b2a394c3410db64744d491df7f069bb"}, + {file = "jiter-0.5.0-cp311-none-win_amd64.whl", hash = "sha256:aa9d2b85b2ed7dc7697597dcfaac66e63c1b3028652f751c81c65a9f220899ae"}, + {file = "jiter-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9f664e7351604f91dcdd557603c57fc0d551bc65cc0a732fdacbf73ad335049a"}, + {file = "jiter-0.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:044f2f1148b5248ad2c8c3afb43430dccf676c5a5834d2f5089a4e6c5bbd64df"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:702e3520384c88b6e270c55c772d4bd6d7b150608dcc94dea87ceba1b6391248"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:528d742dcde73fad9d63e8242c036ab4a84389a56e04efd854062b660f559544"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cf80e5fe6ab582c82f0c3331df27a7e1565e2dcf06265afd5173d809cdbf9ba"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44dfc9ddfb9b51a5626568ef4e55ada462b7328996294fe4d36de02fce42721f"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c451f7922992751a936b96c5f5b9bb9312243d9b754c34b33d0cb72c84669f4e"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:308fce789a2f093dca1ff91ac391f11a9f99c35369117ad5a5c6c4903e1b3e3a"}, + {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7f5ad4a7c6b0d90776fdefa294f662e8a86871e601309643de30bf94bb93a64e"}, + {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ea189db75f8eca08807d02ae27929e890c7d47599ce3d0a6a5d41f2419ecf338"}, + {file = "jiter-0.5.0-cp312-none-win32.whl", hash = "sha256:e3bbe3910c724b877846186c25fe3c802e105a2c1fc2b57d6688b9f8772026e4"}, + {file = "jiter-0.5.0-cp312-none-win_amd64.whl", hash = "sha256:a586832f70c3f1481732919215f36d41c59ca080fa27a65cf23d9490e75b2ef5"}, + {file = "jiter-0.5.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f04bc2fc50dc77be9d10f73fcc4e39346402ffe21726ff41028f36e179b587e6"}, + {file = "jiter-0.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6f433a4169ad22fcb550b11179bb2b4fd405de9b982601914ef448390b2954f3"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad4a6398c85d3a20067e6c69890ca01f68659da94d74c800298581724e426c7e"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6baa88334e7af3f4d7a5c66c3a63808e5efbc3698a1c57626541ddd22f8e4fbf"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ece0a115c05efca597c6d938f88c9357c843f8c245dbbb53361a1c01afd7148"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:335942557162ad372cc367ffaf93217117401bf930483b4b3ebdb1223dbddfa7"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649b0ee97a6e6da174bffcb3c8c051a5935d7d4f2f52ea1583b5b3e7822fbf14"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f4be354c5de82157886ca7f5925dbda369b77344b4b4adf2723079715f823989"}, + {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5206144578831a6de278a38896864ded4ed96af66e1e63ec5dd7f4a1fce38a3a"}, + {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8120c60f8121ac3d6f072b97ef0e71770cc72b3c23084c72c4189428b1b1d3b6"}, + {file = "jiter-0.5.0-cp38-none-win32.whl", hash = "sha256:6f1223f88b6d76b519cb033a4d3687ca157c272ec5d6015c322fc5b3074d8a5e"}, + {file = "jiter-0.5.0-cp38-none-win_amd64.whl", hash = "sha256:c59614b225d9f434ea8fc0d0bec51ef5fa8c83679afedc0433905994fb36d631"}, + {file = "jiter-0.5.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0af3838cfb7e6afee3f00dc66fa24695199e20ba87df26e942820345b0afc566"}, + {file = "jiter-0.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:550b11d669600dbc342364fd4adbe987f14d0bbedaf06feb1b983383dcc4b961"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:489875bf1a0ffb3cb38a727b01e6673f0f2e395b2aad3c9387f94187cb214bbf"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b250ca2594f5599ca82ba7e68785a669b352156260c5362ea1b4e04a0f3e2389"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ea18e01f785c6667ca15407cd6dabbe029d77474d53595a189bdc813347218e"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:462a52be85b53cd9bffd94e2d788a09984274fe6cebb893d6287e1c296d50653"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92cc68b48d50fa472c79c93965e19bd48f40f207cb557a8346daa020d6ba973b"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c834133e59a8521bc87ebcad773608c6fa6ab5c7a022df24a45030826cf10bc"}, + {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab3a71ff31cf2d45cb216dc37af522d335211f3a972d2fe14ea99073de6cb104"}, + {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cccd3af9c48ac500c95e1bcbc498020c87e1781ff0345dd371462d67b76643eb"}, + {file = "jiter-0.5.0-cp39-none-win32.whl", hash = "sha256:368084d8d5c4fc40ff7c3cc513c4f73e02c85f6009217922d0823a48ee7adf61"}, + {file = "jiter-0.5.0-cp39-none-win_amd64.whl", hash = "sha256:ce03f7b4129eb72f1687fa11300fbf677b02990618428934662406d2a76742a1"}, + {file = "jiter-0.5.0.tar.gz", hash = "sha256:1d916ba875bcab5c5f7d927df998c4cb694d27dceddf3392e58beaf10563368a"}, ] [[package]] @@ -2026,6 +2026,30 @@ async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\ langchain-core = ">=0.2.7,<0.3.0" langchain-text-splitters = ">=0.2.0,<0.3.0" langsmith = ">=0.1.17,<0.2.0" +numpy = {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""} +pydantic = ">=1,<3" +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<9.0.0" + +[[package]] +name = "langchain" +version = "0.2.6" +description = "Building applications with LLMs through composability" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain-0.2.6-py3-none-any.whl", hash = "sha256:f86e8a7afd3e56f8eb5ba47f01dd00144fb9fc2f1db9873bd197347be2857aa4"}, + {file = "langchain-0.2.6.tar.gz", hash = "sha256:867f6add370c1e3911b0e87d3dd0e36aec1e8f513bf06131340fe8f151d89dc5"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} +langchain-core = ">=0.2.10,<0.3.0" +langchain-text-splitters = ">=0.2.0,<0.3.0" +langsmith = ">=0.1.17,<0.2.0" numpy = [ {version = ">=1,<2", markers = "python_version < \"3.12\""}, {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, @@ -2034,7 +2058,7 @@ pydantic = ">=1,<3" PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" -tenacity = ">=8.1.0,<9.0.0" +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-core" @@ -2057,13 +2081,13 @@ tenacity = ">=8.1.0,<9.0.0" [[package]] name = "langchain-core" -version = "0.2.9" +version = "0.2.10" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.2.9-py3-none-any.whl", hash = "sha256:426a5a4fea95a5db995ba5ab560b76edd4998fb6fe52ccc28ac987092a4cbfcd"}, - {file = "langchain_core-0.2.9.tar.gz", hash = "sha256:f1c59082642921727844e1cd0eb36d451edd1872c20e193aa3142aac03495986"}, + {file = "langchain_core-0.2.10-py3-none-any.whl", hash = "sha256:6eb72086b6bc86db9812da98f79e507c2209a15c0112aefd214a04182ada8586"}, + {file = "langchain_core-0.2.10.tar.gz", hash = "sha256:33d1fc234ab58c80476eb5bbde2107ef522a2ce8f46bdf47d9e1bd21e054208f"}, ] [package.dependencies] @@ -2076,13 +2100,13 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-openai" -version = "0.1.8" +version = "0.1.10" description = "An integration package connecting OpenAI and LangChain" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_openai-0.1.8-py3-none-any.whl", hash = "sha256:8125c84223e9f43b05defbca64eedbcf362fd78a680de6c25e64f973b34a8063"}, - {file = "langchain_openai-0.1.8.tar.gz", hash = "sha256:a11fcce15def7917c44232abda6baaa63dfc79fe44be1531eea650d39a44cd95"}, + {file = "langchain_openai-0.1.10-py3-none-any.whl", hash = "sha256:62eb000980eb45e4f16c88acdbaeccf3d59266554b0dd3ce6bebea1bbe8143dd"}, + {file = "langchain_openai-0.1.10.tar.gz", hash = "sha256:30f881f8ccaec28c054759837c41fd2a2264fcc5564728ce12e1715891a9ce3c"}, ] [package.dependencies] @@ -2123,6 +2147,22 @@ orjson = ">=3.9.14,<4.0.0" pydantic = ">=1,<3" requests = ">=2,<3" +[[package]] +name = "langsmith" +version = "0.1.82" +description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langsmith-0.1.82-py3-none-any.whl", hash = "sha256:9b3653e7d316036b0c60bf0bc3e280662d660f485a4ebd8e5c9d84f9831ae79c"}, + {file = "langsmith-0.1.82.tar.gz", hash = "sha256:c02e2bbc488c10c13b52c69d271eb40bd38da078d37b6ae7ae04a18bd48140be"}, +] + +[package.dependencies] +orjson = ">=3.9.14,<4.0.0" +pydantic = {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""} +requests = ">=2,<3" + [[package]] name = "litellm" version = "1.23.16" @@ -2596,38 +2636,38 @@ dill = ">=0.3.8" [[package]] name = "mypy" -version = "1.10.0" +version = "1.10.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da1cbf08fb3b851ab3b9523a884c232774008267b1f83371ace57f412fe308c2"}, - {file = "mypy-1.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12b6bfc1b1a66095ab413160a6e520e1dc076a28f3e22f7fb25ba3b000b4ef99"}, - {file = "mypy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e36fb078cce9904c7989b9693e41cb9711e0600139ce3970c6ef814b6ebc2b2"}, - {file = "mypy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b0695d605ddcd3eb2f736cd8b4e388288c21e7de85001e9f85df9187f2b50f9"}, - {file = "mypy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:cd777b780312ddb135bceb9bc8722a73ec95e042f911cc279e2ec3c667076051"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3be66771aa5c97602f382230165b856c231d1277c511c9a8dd058be4784472e1"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b2cbaca148d0754a54d44121b5825ae71868c7592a53b7292eeb0f3fdae95ee"}, - {file = "mypy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ec404a7cbe9fc0e92cb0e67f55ce0c025014e26d33e54d9e506a0f2d07fe5de"}, - {file = "mypy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e22e1527dc3d4aa94311d246b59e47f6455b8729f4968765ac1eacf9a4760bc7"}, - {file = "mypy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:a87dbfa85971e8d59c9cc1fcf534efe664d8949e4c0b6b44e8ca548e746a8d53"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a781f6ad4bab20eef8b65174a57e5203f4be627b46291f4589879bf4e257b97b"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b808e12113505b97d9023b0b5e0c0705a90571c6feefc6f215c1df9381256e30"}, - {file = "mypy-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f55583b12156c399dce2df7d16f8a5095291354f1e839c252ec6c0611e86e2e"}, - {file = "mypy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cf18f9d0efa1b16478c4c129eabec36148032575391095f73cae2e722fcf9d5"}, - {file = "mypy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc6ac273b23c6b82da3bb25f4136c4fd42665f17f2cd850771cb600bdd2ebeda"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9fd50226364cd2737351c79807775136b0abe084433b55b2e29181a4c3c878c0"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f90cff89eea89273727d8783fef5d4a934be2fdca11b47def50cf5d311aff727"}, - {file = "mypy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcfc70599efde5c67862a07a1aaf50e55bce629ace26bb19dc17cece5dd31ca4"}, - {file = "mypy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:075cbf81f3e134eadaf247de187bd604748171d6b79736fa9b6c9685b4083061"}, - {file = "mypy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:3f298531bca95ff615b6e9f2fc0333aae27fa48052903a0ac90215021cdcfa4f"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa7ef5244615a2523b56c034becde4e9e3f9b034854c93639adb667ec9ec2976"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3236a4c8f535a0631f85f5fcdffba71c7feeef76a6002fcba7c1a8e57c8be1ec"}, - {file = "mypy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2b5cdbb5dd35aa08ea9114436e0d79aceb2f38e32c21684dcf8e24e1e92821"}, - {file = "mypy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92f93b21c0fe73dc00abf91022234c79d793318b8a96faac147cd579c1671746"}, - {file = "mypy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:28d0e038361b45f099cc086d9dd99c15ff14d0188f44ac883010e172ce86c38a"}, - {file = "mypy-1.10.0-py3-none-any.whl", hash = "sha256:f8c083976eb530019175aabadb60921e73b4f45736760826aa1689dda8208aee"}, - {file = "mypy-1.10.0.tar.gz", hash = "sha256:3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131"}, + {file = "mypy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02"}, + {file = "mypy-1.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7"}, + {file = "mypy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a"}, + {file = "mypy-1.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9"}, + {file = "mypy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d"}, + {file = "mypy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a"}, + {file = "mypy-1.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84"}, + {file = "mypy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f"}, + {file = "mypy-1.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b"}, + {file = "mypy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e"}, + {file = "mypy-1.10.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7"}, + {file = "mypy-1.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3"}, + {file = "mypy-1.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e"}, + {file = "mypy-1.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04"}, + {file = "mypy-1.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31"}, + {file = "mypy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c"}, + {file = "mypy-1.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade"}, + {file = "mypy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37"}, + {file = "mypy-1.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7"}, + {file = "mypy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d"}, + {file = "mypy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3"}, + {file = "mypy-1.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf"}, + {file = "mypy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531"}, + {file = "mypy-1.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3"}, + {file = "mypy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f"}, + {file = "mypy-1.10.1-py3-none-any.whl", hash = "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a"}, + {file = "mypy-1.10.1.tar.gz", hash = "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0"}, ] [package.dependencies] @@ -2924,7 +2964,6 @@ description = "Nvidia JIT LTO Library" optional = true python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_aarch64.whl", hash = "sha256:004186d5ea6a57758fd6d57052a123c73a4815adf365eb8dd6a85c9eaa7535ff"}, {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d9714f27c1d0f0895cd8915c07a87a1d0029a0aa36acaf9156952ec2a8a12189"}, {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-win_amd64.whl", hash = "sha256:c3401dc8543b52d3a8158007a0c1ab4e9c768fcbd24153a48c86972102197ddd"}, ] @@ -2942,13 +2981,13 @@ files = [ [[package]] name = "openai" -version = "1.35.1" +version = "1.35.3" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.35.1-py3-none-any.whl", hash = "sha256:53ef8935cf916dc7ece67fee5a8a09fc4db5aadf4d6e95b5b7f767f3c4432e4d"}, - {file = "openai-1.35.1.tar.gz", hash = "sha256:d85973adc2f4fbb11ba20bfd948e3340b8352f6b8a02f1fa1c387c8eefac8d9d"}, + {file = "openai-1.35.3-py3-none-any.whl", hash = "sha256:7b26544cef80f125431c073ffab3811d2421fbb9e30d3bd5c2436aba00b042d5"}, + {file = "openai-1.35.3.tar.gz", hash = "sha256:d6177087f150b381d49499be782d764213fdf638d391b29ca692b84dd675a389"}, ] [package.dependencies] @@ -4096,39 +4135,39 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.4.9" +version = "0.4.10" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b262ed08d036ebe162123170b35703aaf9daffecb698cd367a8d585157732991"}, - {file = "ruff-0.4.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:98ec2775fd2d856dc405635e5ee4ff177920f2141b8e2d9eb5bd6efd50e80317"}, - {file = "ruff-0.4.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4555056049d46d8a381f746680db1c46e67ac3b00d714606304077682832998e"}, - {file = "ruff-0.4.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e91175fbe48f8a2174c9aad70438fe9cb0a5732c4159b2a10a3565fea2d94cde"}, - {file = "ruff-0.4.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e8e7b95673f22e0efd3571fb5b0cf71a5eaaa3cc8a776584f3b2cc878e46bff"}, - {file = "ruff-0.4.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2d45ddc6d82e1190ea737341326ecbc9a61447ba331b0a8962869fcada758505"}, - {file = "ruff-0.4.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:78de3fdb95c4af084087628132336772b1c5044f6e710739d440fc0bccf4d321"}, - {file = "ruff-0.4.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06b60f91bfa5514bb689b500a25ba48e897d18fea14dce14b48a0c40d1635893"}, - {file = "ruff-0.4.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88bffe9c6a454bf8529f9ab9091c99490578a593cc9f9822b7fc065ee0712a06"}, - {file = "ruff-0.4.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:673bddb893f21ab47a8334c8e0ea7fd6598ecc8e698da75bcd12a7b9d0a3206e"}, - {file = "ruff-0.4.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8c1aff58c31948cc66d0b22951aa19edb5af0a3af40c936340cd32a8b1ab7438"}, - {file = "ruff-0.4.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:784d3ec9bd6493c3b720a0b76f741e6c2d7d44f6b2be87f5eef1ae8cc1d54c84"}, - {file = "ruff-0.4.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:732dd550bfa5d85af8c3c6cbc47ba5b67c6aed8a89e2f011b908fc88f87649db"}, - {file = "ruff-0.4.9-py3-none-win32.whl", hash = "sha256:8064590fd1a50dcf4909c268b0e7c2498253273309ad3d97e4a752bb9df4f521"}, - {file = "ruff-0.4.9-py3-none-win_amd64.whl", hash = "sha256:e0a22c4157e53d006530c902107c7f550b9233e9706313ab57b892d7197d8e52"}, - {file = "ruff-0.4.9-py3-none-win_arm64.whl", hash = "sha256:5d5460f789ccf4efd43f265a58538a2c24dbce15dbf560676e430375f20a8198"}, - {file = "ruff-0.4.9.tar.gz", hash = "sha256:f1cb0828ac9533ba0135d148d214e284711ede33640465e706772645483427e3"}, + {file = "ruff-0.4.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5c2c4d0859305ac5a16310eec40e4e9a9dec5dcdfbe92697acd99624e8638dac"}, + {file = "ruff-0.4.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a79489607d1495685cdd911a323a35871abfb7a95d4f98fc6f85e799227ac46e"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1dd1681dfa90a41b8376a61af05cc4dc5ff32c8f14f5fe20dba9ff5deb80cd6"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c75c53bb79d71310dc79fb69eb4902fba804a81f374bc86a9b117a8d077a1784"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18238c80ee3d9100d3535d8eb15a59c4a0753b45cc55f8bf38f38d6a597b9739"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d8f71885bce242da344989cae08e263de29752f094233f932d4f5cfb4ef36a81"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:330421543bd3222cdfec481e8ff3460e8702ed1e58b494cf9d9e4bf90db52b9d"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e9b6fb3a37b772628415b00c4fc892f97954275394ed611056a4b8a2631365e"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f54c481b39a762d48f64d97351048e842861c6662d63ec599f67d515cb417f6"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:67fe086b433b965c22de0b4259ddfe6fa541c95bf418499bedb9ad5fb8d1c631"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:acfaaab59543382085f9eb51f8e87bac26bf96b164839955f244d07125a982ef"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3cea07079962b2941244191569cf3a05541477286f5cafea638cd3aa94b56815"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:338a64ef0748f8c3a80d7f05785930f7965d71ca260904a9321d13be24b79695"}, + {file = "ruff-0.4.10-py3-none-win32.whl", hash = "sha256:ffe3cd2f89cb54561c62e5fa20e8f182c0a444934bf430515a4b422f1ab7b7ca"}, + {file = "ruff-0.4.10-py3-none-win_amd64.whl", hash = "sha256:67f67cef43c55ffc8cc59e8e0b97e9e60b4837c8f21e8ab5ffd5d66e196e25f7"}, + {file = "ruff-0.4.10-py3-none-win_arm64.whl", hash = "sha256:dd1fcee327c20addac7916ca4e2653fbbf2e8388d8a6477ce5b4e986b68ae6c0"}, + {file = "ruff-0.4.10.tar.gz", hash = "sha256:3aa4f2bc388a30d346c56524f7cacca85945ba124945fe489952aadb6b5cd804"}, ] [[package]] name = "s3transfer" -version = "0.10.1" +version = "0.10.2" description = "An Amazon S3 Transfer Manager" optional = true -python-versions = ">= 3.8" +python-versions = ">=3.8" files = [ - {file = "s3transfer-0.10.1-py3-none-any.whl", hash = "sha256:ceb252b11bcf87080fb7850a224fb6e05c8a776bab8f2b64b7f25b969464839d"}, - {file = "s3transfer-0.10.1.tar.gz", hash = "sha256:5683916b4c724f799e600f41dd9e10a9ff19871bf87623cc8f491cb4f5fa0a19"}, + {file = "s3transfer-0.10.2-py3-none-any.whl", hash = "sha256:eca1c20de70a39daee580aef4986996620f365c4e0fda6a86100231d62f1bf69"}, + {file = "s3transfer-0.10.2.tar.gz", hash = "sha256:0711534e9356d3cc692fdde846b4a1e4b0cb6519971860796e6bc4c7aea00ef6"}, ] [package.dependencies] @@ -4261,45 +4300,45 @@ torch = ["safetensors[numpy]", "torch (>=1.10)"] [[package]] name = "scipy" -version = "1.13.1" +version = "1.14.0" description = "Fundamental algorithms for scientific computing in Python" optional = true -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca"}, - {file = "scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f"}, - {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989"}, - {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f"}, - {file = "scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94"}, - {file = "scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54"}, - {file = "scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9"}, - {file = "scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326"}, - {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299"}, - {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa"}, - {file = "scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59"}, - {file = "scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b"}, - {file = "scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1"}, - {file = "scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d"}, - {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627"}, - {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884"}, - {file = "scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16"}, - {file = "scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949"}, - {file = "scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5"}, - {file = "scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24"}, - {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004"}, - {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d"}, - {file = "scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c"}, - {file = "scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2"}, - {file = "scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c"}, + {file = "scipy-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7e911933d54ead4d557c02402710c2396529540b81dd554fc1ba270eb7308484"}, + {file = "scipy-1.14.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:687af0a35462402dd851726295c1a5ae5f987bd6e9026f52e9505994e2f84ef6"}, + {file = "scipy-1.14.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:07e179dc0205a50721022344fb85074f772eadbda1e1b3eecdc483f8033709b7"}, + {file = "scipy-1.14.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:6a9c9a9b226d9a21e0a208bdb024c3982932e43811b62d202aaf1bb59af264b1"}, + {file = "scipy-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076c27284c768b84a45dcf2e914d4000aac537da74236a0d45d82c6fa4b7b3c0"}, + {file = "scipy-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42470ea0195336df319741e230626b6225a740fd9dce9642ca13e98f667047c0"}, + {file = "scipy-1.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:176c6f0d0470a32f1b2efaf40c3d37a24876cebf447498a4cefb947a79c21e9d"}, + {file = "scipy-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:ad36af9626d27a4326c8e884917b7ec321d8a1841cd6dacc67d2a9e90c2f0359"}, + {file = "scipy-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e"}, + {file = "scipy-1.14.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb"}, + {file = "scipy-1.14.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:94c164a9e2498e68308e6e148646e486d979f7fcdb8b4cf34b5441894bdb9caf"}, + {file = "scipy-1.14.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a7d46c3e0aea5c064e734c3eac5cf9eb1f8c4ceee756262f2c7327c4c2691c86"}, + {file = "scipy-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8"}, + {file = "scipy-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3154691b9f7ed73778d746da2df67a19d046a6c8087c8b385bc4cdb2cfca74"}, + {file = "scipy-1.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c40003d880f39c11c1edbae8144e3813904b10514cd3d3d00c277ae996488cdb"}, + {file = "scipy-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff2438ea1330e06e53c424893ec0072640dac00f29c6a43a575cbae4c99b2b9"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:bbc0471b5f22c11c389075d091d3885693fd3f5e9a54ce051b46308bc787e5d4"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:64b2ff514a98cf2bb734a9f90d32dc89dc6ad4a4a36a312cd0d6327170339eb0"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:7d3da42fbbbb860211a811782504f38ae7aaec9de8764a9bef6b262de7a2b50f"}, + {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d91db2c41dd6c20646af280355d41dfa1ec7eead235642178bd57635a3f82209"}, + {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a01cc03bcdc777c9da3cfdcc74b5a75caffb48a6c39c8450a9a05f82c4250a14"}, + {file = "scipy-1.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:65df4da3c12a2bb9ad52b86b4dcf46813e869afb006e58be0f516bc370165159"}, + {file = "scipy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:4c4161597c75043f7154238ef419c29a64ac4a7c889d588ea77690ac4d0d9b20"}, + {file = "scipy-1.14.0.tar.gz", hash = "sha256:b5923f48cb840380f9854339176ef21763118a7300a88203ccd0bdd26e58527b"}, ] [package.dependencies] -numpy = ">=1.22.4,<2.3" +numpy = ">=1.23.5,<2.3" [package.extras] -dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] -doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.12.0)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] -test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] +doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.13.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] +test = ["Cython", "array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "setuptools" @@ -4516,13 +4555,13 @@ files = [ [[package]] name = "tenacity" -version = "8.4.1" +version = "8.4.2" description = "Retry code until it succeeds" optional = false python-versions = ">=3.8" files = [ - {file = "tenacity-8.4.1-py3-none-any.whl", hash = "sha256:28522e692eda3e1b8f5e99c51464efcc0b9fc86933da92415168bc1c4e2308fa"}, - {file = "tenacity-8.4.1.tar.gz", hash = "sha256:54b1412b878ddf7e1f1577cd49527bad8cdef32421bd599beac0c6c3f10582fd"}, + {file = "tenacity-8.4.2-py3-none-any.whl", hash = "sha256:9e6f7cf7da729125c7437222f8a522279751cdfbe6b67bfe64f75d3a348661b2"}, + {file = "tenacity-8.4.2.tar.gz", hash = "sha256:cd80a53a79336edba8489e767f729e4f391c896956b57140b5d7511a64bbd3ef"}, ] [package.extras] @@ -4992,13 +5031,13 @@ types-pyOpenSSL = "*" [[package]] name = "types-requests" -version = "2.32.0.20240602" +version = "2.32.0.20240622" description = "Typing stubs for requests" -optional = true +optional = false python-versions = ">=3.8" files = [ - {file = "types-requests-2.32.0.20240602.tar.gz", hash = "sha256:3f98d7bbd0dd94ebd10ff43a7fbe20c3b8528acace6d8efafef0b6a184793f06"}, - {file = "types_requests-2.32.0.20240602-py3-none-any.whl", hash = "sha256:ed3946063ea9fbc6b5fc0c44fa279188bae42d582cb63760be6cb4b9d06c3de8"}, + {file = "types-requests-2.32.0.20240622.tar.gz", hash = "sha256:ed5e8a412fcc39159d6319385c009d642845f250c63902718f605cd90faade31"}, + {file = "types_requests-2.32.0.20240622-py3-none-any.whl", hash = "sha256:97bac6b54b5bd4cf91d407e62f0932a74821bc2211f22116d9ee1dd643826caf"}, ] [package.dependencies] @@ -5006,13 +5045,13 @@ urllib3 = ">=2" [[package]] name = "types-setuptools" -version = "70.0.0.20240524" +version = "70.1.0.20240625" description = "Typing stubs for setuptools" optional = false python-versions = ">=3.8" files = [ - {file = "types-setuptools-70.0.0.20240524.tar.gz", hash = "sha256:e31fee7b9d15ef53980526579ac6089b3ae51a005a281acf97178e90ac71aff6"}, - {file = "types_setuptools-70.0.0.20240524-py3-none-any.whl", hash = "sha256:8f5379b9948682d72a9ab531fbe52932e84c4f38deda570255f9bae3edd766bc"}, + {file = "types-setuptools-70.1.0.20240625.tar.gz", hash = "sha256:eb7175c9a304de4de9f4dfd0f299c754ac94cd9e30a262fbb5ff3047a0a6c517"}, + {file = "types_setuptools-70.1.0.20240625-py3-none-any.whl", hash = "sha256:181986729bdae9fa7efc7d37f1578361739e35dd6ec456d37de8e8f3bd2be1ef"}, ] [[package]] @@ -5078,13 +5117,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.26.2" +version = "20.26.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.26.2-py3-none-any.whl", hash = "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b"}, - {file = "virtualenv-20.26.2.tar.gz", hash = "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c"}, + {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, + {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, ] [package.dependencies] @@ -5364,4 +5403,4 @@ groq = ["groq"] [metadata] lock-version = "2.0" python-versions = ">=3.10, <3.13" -content-hash = "2e9659e693e36195206a24d640372e1c8593259337195e6025788f322e21eec6" +content-hash = "bf350a60e7a47dd53d3024fad30e62b8a8eb9a2c3678b523202aafb6d3930928" diff --git a/pyproject.toml b/pyproject.toml index 45ca72440..c0a3e5765 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,6 @@ langchain = "~0.2.5" rich = "^13.6.0" PettingZoo = "1.24.3" redis-om = "^0.2.1" -types-tqdm = "*" gin-config = "^0.5.0" absl-py = "^2.0.0" together = "^0.2.4" @@ -42,6 +41,8 @@ pandas = { version = "^2.1.1", optional = true } pre-commit = "*" nbmake = "*" types-setuptools = "*" +types-requests = "*" +types-tqdm = "*" ruff = "*" [tool.poetry.group.test.dependencies] @@ -79,4 +80,4 @@ testpaths = ["tests"] python_files = "test_*.py" [tool.poetry.scripts] -sotopia_benchmark = "sotopia.benchmark:app" +sotopia = "sotopia.cli:app" diff --git a/sotopia/benchmark/__init__.py b/sotopia/benchmark/__init__.py deleted file mode 100644 index 72727355b..000000000 --- a/sotopia/benchmark/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .cli import app - -__all__ = ["app"] diff --git a/sotopia/cli/__init__.py b/sotopia/cli/__init__.py new file mode 100644 index 000000000..9eb681331 --- /dev/null +++ b/sotopia/cli/__init__.py @@ -0,0 +1,5 @@ +from .app import app +from .install import install +from .benchmark import benchmark + +__all__ = ["app", "install", "benchmark"] diff --git a/sotopia/cli/app.py b/sotopia/cli/app.py new file mode 100644 index 000000000..b0e7b8606 --- /dev/null +++ b/sotopia/cli/app.py @@ -0,0 +1,3 @@ +from typer import Typer + +app = Typer() diff --git a/sotopia/cli/benchmark/__init__.py b/sotopia/cli/benchmark/__init__.py new file mode 100644 index 000000000..4804e25ff --- /dev/null +++ b/sotopia/cli/benchmark/__init__.py @@ -0,0 +1,3 @@ +from .benchmark import benchmark + +__all__ = ["benchmark"] diff --git a/sotopia/benchmark/cli.py b/sotopia/cli/benchmark/benchmark.py similarity index 99% rename from sotopia/benchmark/cli.py rename to sotopia/cli/benchmark/benchmark.py index 9f519ac5b..18455f02c 100644 --- a/sotopia/benchmark/cli.py +++ b/sotopia/cli/benchmark/benchmark.py @@ -34,8 +34,7 @@ import typer from pathlib import Path - -app = typer.Typer() +from ..app import app def check_existing_episodes( @@ -264,7 +263,7 @@ def _set_up_logs( @app.command() -def cli( +def benchmark( model: str = typer.Option(..., help="The language model you want to benchmark."), partner_model: str = typer.Option( "together_ai/meta-llama/Llama-3-70b-chat-hf", @@ -297,7 +296,3 @@ def cli( verbose=False, push_to_db=True, ) - - -if __name__ == "__main__": - app() diff --git a/sotopia/cli/install/__init__.py b/sotopia/cli/install/__init__.py new file mode 100644 index 000000000..b4bb91e92 --- /dev/null +++ b/sotopia/cli/install/__init__.py @@ -0,0 +1,3 @@ +from .install import install + +__all__ = ["install"] diff --git a/sotopia/cli/install/install.py b/sotopia/cli/install/install.py new file mode 100644 index 000000000..746230cd5 --- /dev/null +++ b/sotopia/cli/install/install.py @@ -0,0 +1,407 @@ +import subprocess +from typing import Literal, Optional +from pydantic import BaseModel +import rich +import rich.errors +from ..rich_pixels import Pixels + +from rich.prompt import Prompt +from rich.segment import Segment +from rich.style import Style + +from pathlib import Path + +import typer +from .menu import Menu +import tempfile + +from ..app import app + + +def _get_system() -> Literal["Linux", "Darwin", "Windows"]: + import platform + + system = platform.system() + if system == "Linux": + return "Linux" + elif system == "Darwin": + return "Darwin" + elif system == "Windows": + return "Windows" + else: + raise ValueError( + f"You are using {system} which is not supported. Please use Linux, MacOS or Windows." + ) + + +class Dataset(BaseModel): + id: str + display_name: str + url: str + venue: str + license: str + citation: str + + +class Datasets(BaseModel): + datasets: list[Dataset] + + +def _get_dataset_to_be_loaded( + published_datasets: Datasets, console: rich.console.Console +) -> str: + menu = Menu( + *( + f"{dataset.display_name} ({dataset.venue}, {dataset.license})" + for dataset in published_datasets.datasets + ), + "None of the above, I want only an empty database.", + "No, I have a custom URL.", + start_index=0, + align="left", + rule_title="Select the dataset to be loaded", + ) + + dataset = menu.ask(return_index=True) + assert isinstance(dataset, int) + + if dataset < len(published_datasets.datasets): + console.log( + f"""Loading the database with data from {published_datasets.datasets[dataset].url}. +This data is from the {published_datasets.datasets[dataset].display_name}. +Licensed under {published_datasets.datasets[dataset].license}. +Please cite the following paper(s) if you use this data: +{published_datasets.datasets[dataset].citation}""" + ) + return published_datasets.datasets[dataset].url + elif dataset == len(published_datasets.datasets): + console.log("Starting redis with an empty database.") + return "" + else: + custom_load_database_url = Prompt.ask( + "Enter the URL to load the database with initial data from.", + ) + if custom_load_database_url == "": + console.log("Starting redis with an empty database.") + return "" + else: + console.log( + f"Loading the database with initial data from {custom_load_database_url}." + ) + return custom_load_database_url + + +_pixel_art = """\ + + +███████ ███████ ██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ +█████ ██ ██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ +█████ ███ ████████ ██████████████ ███████████████████████████ ████████████████xx████████████████████████x███████████████xxx█xxx███ +█████ ██████ ███████ █████ ███ ███ ████ ████ ██ ██████████ ███████xx██x██xxxxx████xxxxx███xxxxxxx███xxxxx███xxx█xxx███ +█████ ███ ████████ ████ ██ ███ █████ ██ ██ █ ██ ██ ██ ██████xx██xxx██xxxx██xx████████xxx████xxx███xx██xxx█xxx███ +█████ ██ █████████████ █ █████ ██ ████ █████ █ ██████ ██ ██ ████ ██████xx██xx█████xx██xxxxxx████xxx████xx████xx██xxx█xxx███ +█████ ██████ ███████ ██████ █ ████ ███ ████ ████ █ ████ ██ █ ████ ██████xx██xx█████xx████████xx██xxx████xx████xx██xxx█xxx███ +█████ ███ █████████ ███ █████ ███ ███ █ ███ ██ █████xx██xx█████xx██xxxxxxxx███xxxxx█xxxxxxxxx█xxx█xxx███ +█████ ██ ████████████████████████████████████████████████ ████████████████████████████████████████████████████████████████████████████████ +█████ █████ ██████████████████████████████████████████████████ ████████████████████████████████████████████████████████████████████████████████ + + +""" + + +@app.command() +def install( + use_docker: Optional[bool] = typer.Option(None, help="Install redis using docker."), + load_database: Optional[bool] = typer.Option( + None, help="Load the database with initial data." + ), + load_sotopia_pi_data: bool = typer.Option( + True, + help="Load the database with initial data from Sotopia π. Only applicable if `load_database` is True.", + ), + custom_database_url: Optional[str] = typer.Option( + None, help="Load the database with initial data from a custom URL." + ), + redis_data_path: Optional[str] = typer.Option( + None, + help="Path to store the redis data. Only applicable if `use_docker` is True.", + ), + overwrite_existing_data: Optional[bool] = typer.Option( + None, help="Overwrite existing data in the redis data path." + ), +) -> None: + console = rich.console.Console() + mapping = { + " ": Segment(" ", Style.parse("black on black")), + "█": Segment("█", Style.parse("white")), + "x": Segment("x", Style.parse("magenta on magenta")), + } + pixels = Pixels.from_ascii(_pixel_art, mapping) + console.print(pixels, justify="center") + system = _get_system() + + if use_docker is None: + if system == "Windows": + console.log( + "Installing Redis with Docker... Check if Docker Desktop is installed." + ) + use_docker = True + elif system == "Darwin": + use_docker = ( + Prompt.ask( + "Do you want to use Docker or Homebrew to install redis? We recommand you to use Docker.", + choices=["Docker", "Homebrew"], + default="Docker", + console=console, + ) + == "Docker" + ) + else: + use_docker = ( + Prompt.ask( + "Do you want to use Docker to install redis or directly install Redis stack binary? We recommand you to use Docker.", + choices=["Docker", "Binary"], + default="Docker", + console=console, + ) + == "Docker" + ) + + if use_docker: + try: + subprocess.check_output("command -v docker", shell=True) + except subprocess.CalledProcessError: + if system == "Darwin": + console.log( + """Docker is not installed. + Please check https://docs.docker.com/desktop/install/mac-install/, + or install it using homebrew with `brew install --cask docker`. + And then run this command again. + """ + ) + elif system == "Linux": + console.log( + """Docker is not installed. + Please check https://docs.docker.com/engine/install/ubuntu/. + And then run this command again. + """ + ) + else: + console.log( + """Docker is not installed. + Please check https://docs.docker.com/desktop/install/windows-install/. + And then run this command again. + """ + ) + exit(1) + try: + subprocess.check_output("docker ps", shell=True) + except subprocess.CalledProcessError: + if system == "Darwin": + console.log( + """Docker Daemon was not started. Please launch Docker App. + """ + ) + elif system == "Linux": + console.log( + """Docker Daemon was not started. Please run `dockerd` + """ + ) + else: + console.log( + """Docker Daemon was not started. Please launch Docker App. + """ + ) + exit(1) + else: + if system == "Windows": + console.log("""For Windows, unfortunately only docker is supported. + Check the official documentation: + https://redis.io/docs/latest/operate/oss_and_stack/install/install-stack/windows/. + """) + exit(1) + elif system == "Darwin": + # check if homebrew is installed + try: + subprocess.check_output("command -v brew", shell=True) + subprocess.run("brew update-reset", shell=True, check=True) + except subprocess.CalledProcessError: + console.log( + """Homebrew is required for install redis without docker on MacOS. + Please check https://brew.sh/. + And then run this command again. + """ + ) + exit(1) + + next_state: Literal["ask_data_source", "empty_database", "custom_url"] | None = None + url = "" + + if load_database is None: + load_database = ( + Prompt.ask( + "Do you want to load the database with published data?", + choices=["Yes", "No"], + default="Yes", + console=console, + ) + == "Yes" + ) + if load_database: + next_state = "ask_data_source" + else: + next_state = "empty_database" + elif not load_database: + next_state = "empty_database" + else: + if load_sotopia_pi_data: + next_state = "custom_url" + url = "https://huggingface.co/datasets/cmu-lti/sotopia-pi/resolve/main/dump.rdb?download=true" + elif custom_database_url is None: + next_state = "ask_data_source" + else: + next_state = "custom_url" + url = custom_database_url + + if next_state == "ask_data_source": + fn = Path(__file__).parent / "published_datasets.json" + published_datasets = Datasets.parse_file(fn) + url = _get_dataset_to_be_loaded(published_datasets, console) + next_state = "custom_url" + + assert next_state in ["custom_url", "empty_database"] + + tmpdir_context = tempfile.TemporaryDirectory() + tmpdir = tmpdir_context.__enter__() + + if url: + try: + subprocess.run(f"curl -L {url} -o {Path(tmpdir) / 'dump.rdb'}", shell=True) + console.log("Database downloaded successfully.") + except subprocess.CalledProcessError: + console.log("Database download failed. Please check the URL and try again.") + else: + console.log("Starting redis with an empty database.") + + if use_docker: + current_directory = Path(__file__).parent + if redis_data_path is None: + directory = Prompt.ask( + "Enter the directory where you want to store the data. Press enter to use the current directory.", + default=current_directory, + ) + else: + directory = redis_data_path + (Path(directory) / "redis-data").mkdir(parents=True, exist_ok=True) + if load_database: + if Path.exists(Path(directory) / "redis-data" / "dump.rdb"): + cover_existing = ( + Prompt.ask( + "The directory already contains a dump.rdb file. Do you want to overwrite it?", + choices=["Yes", "No"], + default="No", + console=console, + ) + if overwrite_existing_data is None + else "Yes" + if overwrite_existing_data + else "No" + ) + if cover_existing == "No": + console.log( + "Exiting the installation. Please provide a different directory." + ) + exit(0) + else: + (Path(tmpdir) / "dump.rdb").rename( + Path(directory) / "redis-data/dump.rdb" + ) + try: + subprocess.run( + f"docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 -v {directory}/redis-data:/data/ redis/redis-stack:latest", + shell=True, + check=True, + ) + console.log( + "Redis started successfully. To stop redis, run `docker stop redis-stack`. To restart, run `docker restart redis-stack`." + ) + except subprocess.CalledProcessError: + console.log("Redis start failed. Please check the logs and try again.") + else: + if system == "Darwin": + try: + subprocess.run( + "brew tap redis-stack/redis-stack", shell=True, check=True + ) + subprocess.run("brew install redis-stack", shell=True, check=True) + if load_database: + if Path("/opt/homebrew/var/db/redis-stack/dump.rdb").exists(): + cover_existing = ( + Prompt.ask( + "The directory already contains a dump.rdb file. Do you want to overwrite it?", + choices=["Yes", "No"], + default="No", + console=console, + ) + if overwrite_existing_data is None + else "Yes" + if overwrite_existing_data + else "No" + ) + if cover_existing == "No": + console.log( + "Exiting the installation. Please provide a different directory." + ) + exit(0) + else: + Path("/opt/homebrew/var/db/redis-stack/").mkdir( + parents=True, exist_ok=True + ) + subprocess.run( + f"mv {tmpdir}/dump.rdb /opt/homebrew/var/db/redis-stack/dump.rdb", + shell=True, + check=True, + ) + subprocess.run( + "redis-stack-server --daemonize yes", shell=True, check=True + ) + console.log( + "Redis started successfully. To stop redis, run `redis-cli shutdown`. To restart, run this script again." + ) + except subprocess.CalledProcessError: + console.log("Redis start failed. Please check the logs and try again.") + elif system == "Linux": + try: + subprocess.run( + "curl -fsSL https://packages.redis.io/redis-stack/redis-stack-server-7.2.0-v10.focal.x86_64.tar.gz -o redis-stack-server.tar.gz", + shell=True, + check=True, + ) + subprocess.run( + "tar -xvzf redis-stack-server.tar.gz", shell=True, check=True + ) + if load_database: + Path("./redis-stack-server-7.2.0-v10/var/db/redis-stack").mkdir( + parents=True, exist_ok=True + ) + subprocess.run( + f"mv {tmpdir}/dump.rdb ./redis-stack-server-7.2.0-v10/var/db/redis-stack/dump.rdb", + shell=True, + check=True, + ) + subprocess.run( + "./redis-stack-server-7.2.0-v10/bin/redis-stack-server --daemonize yes", + shell=True, + check=True, + ) + console.log( + "Redis started successfully. To stop redis, run `./redis-stack-server-7.2.0-v10/bin/redis-cli shutdown`. To restart, run this script again." + ) + except subprocess.CalledProcessError: + console.log("Redis start failed. Please check the logs and try again.") + + tmpdir_context.__exit__(None, None, None) + + +if __name__ == "__main__": + app() diff --git a/sotopia/cli/install/menu.py b/sotopia/cli/install/menu.py new file mode 100644 index 000000000..9d35a9f23 --- /dev/null +++ b/sotopia/cli/install/menu.py @@ -0,0 +1,115 @@ +# Intially created by: +# gbPagano +# https://github.com/gbPagano/rich_menu + +from typing import Literal +import click +from rich.align import Align +from rich.console import Group +from rich.live import Live +from rich.panel import Panel +from rich.rule import Rule +from rich.text import Text + + +class Menu: + def __init__( + self, + *options: str, + start_index: int = 0, + rule_title: str = "MENU", + panel_title: str = "", + color: str = "bold green", + align: Literal["left", "center", "right"] = "center", + selection_char: str = ">", + ): + self.options = options + self.index = start_index + self.rule_tile = rule_title + self.panel_title = panel_title + self.color = color + self.align = align + self.selection_char = selection_char + + def _get_click(self) -> str | None: + match click.getchar(): + case "\r": + return "enter" + case "\x1b[B" | "s" | "S" | "àP": + return "down" + case "\x1b[A" | "w" | "W" | "àH": + return "up" + case "\x1b[D" | "a" | "A" | "àK": + return "left" + case "\x1b[C" | "d" | "D" | "àM": + return "right" + case "\x1b": + return "exit" + case _: + return None + + def _update_index(self, key: str) -> None: + if key == "down": + self.index += 1 + elif key == "up": + self.index -= 1 + + if self.index > len(self.options) - 1: + self.index = 0 + elif self.index < 0: + self.index = len(self.options) - 1 + + @property + def _group(self) -> Group: + menu = Text(justify="left") + + selected = Text(self.selection_char + " ", self.color) + not_selected = Text(" " * (len(self.selection_char) + 1)) + selections = [not_selected] * len(self.options) + selections[self.index] = selected + + for idx, option in enumerate(self.options): + menu.append(Text.assemble(selections[idx], option + "\n")) + menu.rstrip() + + panel = Panel.fit(menu) + panel.title = Text(self.panel_title, self.color) + if self.rule_tile: + group = Group( + Rule(self.rule_tile, style=self.color), + Align(panel, self.align), + ) + else: + group = Group( + Align(panel, self.align), + ) + + return group + + def _clean_menu(self) -> None: + rule = 1 if self.rule_tile else 0 + for _ in range(len(self.options) + rule + 2): + print("\x1b[A\x1b[K", end="") + + def ask( + self, screen: bool = True, esc: bool = True, return_index: bool = False + ) -> str | int: + with Live(self._group, auto_refresh=False, screen=screen) as live: + live.update(self._group, refresh=True) + while True: + try: + key = self._get_click() + if key == "enter": + break + elif key == "exit" and esc: + exit() + elif key in ["up", "down"]: + self._update_index(key) + live.update(self._group, refresh=True) + except (KeyboardInterrupt, EOFError): + exit() + + if not screen: + self._clean_menu() + + return self.options[self.index] if not return_index else self.index diff --git a/sotopia/cli/install/published_datasets.json b/sotopia/cli/install/published_datasets.json new file mode 100644 index 000000000..f7600f94c --- /dev/null +++ b/sotopia/cli/install/published_datasets.json @@ -0,0 +1,28 @@ +{ + "datasets": [ + { + "id": "sotopia-pi", + "display_name": "Sotopia-\u03c0 Dataset", + "url": "https://huggingface.co/datasets/cmu-lti/sotopia-pi/resolve/main/dump.rdb?download=true", + "venue": "ACL 2024", + "license": "CC-BY-SA 4.0", + "citation": "@inproceedings{\n wang2024sotopiapi,\n title={SOTOPIA-$\\pi$: Interactive Learning of Socially Intelligent Language Agents},\n author={Ruiyi Wang and Haofei Yu and Wenxin Zhang and Zhengyang Qi and Maarten Sap and Graham Neubig and Yonatan Bisk and Hao Zhu},\"\n booktitle={Proceedings of the Annual Meeting of the Association for Computational Linguistics (ACL) 2024},\n year={2024},\n}\n@inproceedings{\n zhou2024sotopia,\n title={{SOTOPIA}: Interactive Evaluation for Social Intelligence in Language Agents},\n author={Xuhui Zhou and Hao Zhu and Leena Mathur and Ruohong Zhang and Haofei Yu and Zhengyang Qi and Louis-Philippe Morency and Yonatan Bisk and Daniel Fried and Graham Neubig and Maarten Sap},\n booktitle={The Twelfth International Conference on Learning Representations},\n year={2024},\n url={https://openreview.net/forum?id=mM7VurbA4r}\n}\n" + }, + { + "id": "sotopia", + "display_name": "Sotopia Dataset", + "url": "https://cmu.box.com/shared/static/xiivc5z8rnmi1zr6vmk1ohxslylvynur", + "venue": "ICLR 2024", + "license": "CC-BY-SA 4.0", + "citation": "@inproceedings{\n zhou2024sotopia,\n title={{SOTOPIA}: Interactive Evaluation for Social Intelligence in Language Agents},\n author={Xuhui Zhou and Hao Zhu and Leena Mathur and Ruohong Zhang and Haofei Yu and Zhengyang Qi and Louis-Philippe Morency and Yonatan Bisk and Daniel Fried and Graham Neubig and Maarten Sap},\n booktitle={The Twelfth International Conference on Learning Representations},\n year={2024},\n url={https://openreview.net/forum?id=mM7VurbA4r}\n}\n" + }, + { + "id": "agent_vs_script", + "display_name": "Agent vs. Script Dataset", + "url": "https://huggingface.co/datasets/cmu-lti/agent_vs_script/resolve/main/dump.rdb?download=true", + "venue": "arXiv", + "license": "AI2 Impact License", + "citation": "@misc{zhou2024real,\n title={Is this the real life? Is this just fantasy? The Misleading Success of Simulating Social Interactions With LLMs},\n author={Xuhui Zhou and Zhe Su and Tiwalayo Eisape and Hyunwoo Kim and Maarten Sap},\n year={2024}}\n eprint={2403.05020},\n archivePrefix={arXiv},\n}\n@inproceedings{\n zhou2024sotopia,\n title={{SOTOPIA}: Interactive Evaluation for Social Intelligence in Language Agents},\n author={Xuhui Zhou and Hao Zhu and Leena Mathur and Ruohong Zhang and Haofei Yu and Zhengyang Qi and Louis-Philippe Morency and Yonatan Bisk and Daniel Fried and Graham Neubig and Maarten Sap},\n booktitle={The Twelfth International Conference on Learning Representations},\n year={2024},\n url={https://openreview.net/forum?id=mM7VurbA4r}\n}\n" + } + ] +} diff --git a/sotopia/cli/rich_pixels/__init__.py b/sotopia/cli/rich_pixels/__init__.py new file mode 100644 index 000000000..d34237bbd --- /dev/null +++ b/sotopia/cli/rich_pixels/__init__.py @@ -0,0 +1,9 @@ +# Initially created by +# Darren Burns +# https://github.com/darrenburns/rich-pixels + +from ._pixel import Pixels + +__all__ = [ + "Pixels", +] diff --git a/sotopia/cli/rich_pixels/_pixel.py b/sotopia/cli/rich_pixels/_pixel.py new file mode 100644 index 000000000..09523edcf --- /dev/null +++ b/sotopia/cli/rich_pixels/_pixel.py @@ -0,0 +1,52 @@ +from __future__ import annotations + +from typing import Iterable, Mapping, Optional + +from rich.console import Console, ConsoleOptions, RenderResult +from rich.segment import Segment, Segments + + +class Pixels: + def __init__(self) -> None: + self._segments: Segments | None = None + + @staticmethod + def from_segments( + segments: Iterable[Segment], + ) -> Pixels: + """Create a Pixels object from an Iterable of Segments instance.""" + pixels = Pixels() + pixels._segments = Segments(segments) + return pixels + + @staticmethod + def from_ascii( + grid: str, mapping: Optional[Mapping[str, Segment]] = None + ) -> Pixels: + """ + Create a Pixels object from a 2D-grid of ASCII characters. + Each ASCII character can be mapped to a Segment (a character and style combo), + allowing you to add a splash of colour to your grid. + + Args: + grid: A 2D grid of characters (a multi-line string). + mapping: Maps ASCII characters to Segments. Occurrences of a character + will be replaced with the corresponding Segment. + """ + if mapping is None: + mapping = {} + + if not grid: + return Pixels.from_segments([]) + + segments = [] + for character in grid: + segment = mapping.get(character, Segment(character)) + segments.append(segment) + + return Pixels.from_segments(segments) + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + yield self._segments or "" diff --git a/tests/cli/test_install.py b/tests/cli/test_install.py new file mode 100644 index 000000000..350db9107 --- /dev/null +++ b/tests/cli/test_install.py @@ -0,0 +1,56 @@ +import platform +from typer.testing import CliRunner + +from sotopia.cli import app +import subprocess +import time + +runner = CliRunner() + + +def test_install() -> None: + if platform.system() == "Darwin": + result = runner.invoke( + app, + [ + "install", + "--no-use-docker", + "--no-load-database", + "--overwrite-existing-data", + ], + ) + assert result.exit_code == 0 + time.sleep(1) + subprocess.run("redis-cli shutdown", shell=True, check=True) + elif platform.system() == "Linux": + result = runner.invoke( + app, + [ + "install", + "--no-use-docker", + "--load-database", + "--overwrite-existing-data", + ], + ) + assert result.exit_code == 0 + time.sleep(1) + subprocess.run( + "./redis-stack-server-7.2.0-v10/bin/redis-cli shutdown", + shell=True, + check=True, + ) + + if platform.system() == "Darwin": + result = runner.invoke(app, ["install"], input="Homebrew\nNo\n") + assert result.exit_code == 0 + time.sleep(1) + subprocess.run("redis-cli shutdown", shell=True, check=True) + elif platform.system() == "Linux": + result = runner.invoke(app, ["install"], input="Docker\nNo\n\n") + assert result.exit_code == 0 + time.sleep(1) + subprocess.run( + "docker stop redis-stack", + shell=True, + check=True, + ) From 6880b1414319e3c43747aca3cdee01653faa5475 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 30 Jun 2024 11:32:59 -0400 Subject: [PATCH 19/23] Bump anthropic from 0.28.1 to 0.30.0 (#127) Bumps [anthropic](https://github.com/anthropics/anthropic-sdk-python) from 0.28.1 to 0.30.0. - [Release notes](https://github.com/anthropics/anthropic-sdk-python/releases) - [Changelog](https://github.com/anthropics/anthropic-sdk-python/blob/main/CHANGELOG.md) - [Commits](https://github.com/anthropics/anthropic-sdk-python/compare/v0.28.1...v0.30.0) --- updated-dependencies: - dependency-name: anthropic dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 35 ++++++----------------------------- pyproject.toml | 2 +- 2 files changed, 7 insertions(+), 30 deletions(-) diff --git a/poetry.lock b/poetry.lock index 6f23f1e1d..6a96b780c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -123,13 +123,13 @@ frozenlist = ">=1.1.0" [[package]] name = "anthropic" -version = "0.28.1" +version = "0.30.0" description = "The official Python library for the anthropic API" optional = true python-versions = ">=3.7" files = [ - {file = "anthropic-0.28.1-py3-none-any.whl", hash = "sha256:c4773ae2b42951a6b747bed328b0d03fa412938c95c3a8b9dce70d69badb710b"}, - {file = "anthropic-0.28.1.tar.gz", hash = "sha256:e3a6d595bde241141bdc685edc393903ec95c7fa378013a71186cfb8f32b1793"}, + {file = "anthropic-0.30.0-py3-none-any.whl", hash = "sha256:061bf58c9c64968361e6c21c76ff5016a6f7fdd9a5f6b7f2280ede2c3b44bfd5"}, + {file = "anthropic-0.30.0.tar.gz", hash = "sha256:9e9ee2bfce833370eac74d7de433db97a0bf141f9118c40ac0e2f4c39bc2b76f"}, ] [package.dependencies] @@ -2026,30 +2026,6 @@ async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\ langchain-core = ">=0.2.7,<0.3.0" langchain-text-splitters = ">=0.2.0,<0.3.0" langsmith = ">=0.1.17,<0.2.0" -numpy = {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""} -pydantic = ">=1,<3" -PyYAML = ">=5.3" -requests = ">=2,<3" -SQLAlchemy = ">=1.4,<3" -tenacity = ">=8.1.0,<9.0.0" - -[[package]] -name = "langchain" -version = "0.2.6" -description = "Building applications with LLMs through composability" -optional = false -python-versions = "<4.0,>=3.8.1" -files = [ - {file = "langchain-0.2.6-py3-none-any.whl", hash = "sha256:f86e8a7afd3e56f8eb5ba47f01dd00144fb9fc2f1db9873bd197347be2857aa4"}, - {file = "langchain-0.2.6.tar.gz", hash = "sha256:867f6add370c1e3911b0e87d3dd0e36aec1e8f513bf06131340fe8f151d89dc5"}, -] - -[package.dependencies] -aiohttp = ">=3.8.3,<4.0.0" -async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.2.10,<0.3.0" -langchain-text-splitters = ">=0.2.0,<0.3.0" -langsmith = ">=0.1.17,<0.2.0" numpy = [ {version = ">=1,<2", markers = "python_version < \"3.12\""}, {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, @@ -2058,7 +2034,7 @@ pydantic = ">=1,<3" PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" -tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" +tenacity = ">=8.1.0,<9.0.0" [[package]] name = "langchain-core" @@ -2964,6 +2940,7 @@ description = "Nvidia JIT LTO Library" optional = true python-versions = ">=3" files = [ + {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_aarch64.whl", hash = "sha256:004186d5ea6a57758fd6d57052a123c73a4815adf365eb8dd6a85c9eaa7535ff"}, {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d9714f27c1d0f0895cd8915c07a87a1d0029a0aa36acaf9156952ec2a8a12189"}, {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-win_amd64.whl", hash = "sha256:c3401dc8543b52d3a8158007a0c1ab4e9c768fcbd24153a48c86972102197ddd"}, ] @@ -5403,4 +5380,4 @@ groq = ["groq"] [metadata] lock-version = "2.0" python-versions = ">=3.10, <3.13" -content-hash = "bf350a60e7a47dd53d3024fad30e62b8a8eb9a2c3678b523202aafb6d3930928" +content-hash = "ffedc0d7d6aed3596541e63d08ab1214aa4f5228abe44c5a6668e056eed4a0c0" diff --git a/pyproject.toml b/pyproject.toml index c0a3e5765..850de807c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,7 @@ litellm = "~1.23.12" # dependency versions for extras fastapi = { version = ">=0.109.2,<0.111.0", optional = true } tabulate = { version = "^0.9.0", optional = true } -anthropic = { version = ">=0.26,<0.29", optional = true } +anthropic = { version = ">=0.26,<0.31", optional = true } xmltodict = { version = "^0.13.0", optional = true } groq = { version = ">=0.4.2,<0.10.0", optional = true } cohere = { version = "^5.1.8", optional = true } From 4559cfa4229823b3f0da46a82adeea57a3152fde Mon Sep 17 00:00:00 2001 From: Zhe Su <360307598@qq.com> Date: Tue, 2 Jul 2024 11:11:11 -0400 Subject: [PATCH 20/23] Add a test case for a single dimension evaluation (#123) * add a test case for a single dimension evaluation * fix the single dimension bug --------- Co-authored-by: XuhuiZhou --- sotopia/envs/evaluators.py | 28 ++++++++++++--- tests/envs/test_evaluators.py | 66 ++++++++++++++++++++++++++++++++++- 2 files changed, 89 insertions(+), 5 deletions(-) diff --git a/sotopia/envs/evaluators.py b/sotopia/envs/evaluators.py index 01d1cc4a8..a0d56e655 100644 --- a/sotopia/envs/evaluators.py +++ b/sotopia/envs/evaluators.py @@ -143,6 +143,20 @@ def minus_ten_to_zero_validator(cls, v: tuple[str, int]) -> tuple[str, int]: return v +class EvaluationGoalOnly(BaseModel): + goal: tuple[str, int] = Field( + ..., + description="Please first reiterate agent's social goals. " + "And then please provide a comprehensive analysis about the extent to which the agent has managed to achieve these goals. " + "The first entry (str) of the object is the 'reasoning' field, and the second entry (int) of the object is the 'score' field. In the 'reasoning' field, provide a comprehensive account of the logic or thought process that led you to your conclusion. Further, provide an integer score ranging from 0 and 10 in the 'score' field. 0 represents minimal goals achievement, 10 represents complete goal achievement, and a higher score indicates that the agent is making progress towards their social goals.", + ) + + @validator("goal") + def zero_to_ten_validator(cls, v: tuple[str, int]) -> tuple[str, int]: + assert v[1] >= 0 and v[1] <= 10 + return v + + class EnvResponse(BaseModel): agent_1_evaluation: EvaluationBySocialDimensions agent_2_evaluation: EvaluationBySocialDimensions @@ -153,6 +167,11 @@ class EnvResponsePlus(BaseModel): agent_2_evaluation: EvaluationBySocialDimensionsPlus +class EnvResponseGoalOnly(BaseModel): + agent_1_evaluation: EvaluationGoalOnly + agent_2_evaluation: EvaluationGoalOnly + + class Evaluator(abc.ABC): def __init__(self) -> None: pass @@ -268,7 +287,8 @@ async def __acall__( response_format_class = ( EnvResponsePlus if self.response_format == "plus" else EnvResponse ) - + if self.response_format == "goal_only": + response_format_class = EnvResponseGoalOnly try: response: ( EnvResponsePlus | EnvResponse @@ -281,9 +301,9 @@ async def __acall__( {format_instructions} """, input_values=dict(history=history), - output_parser=PydanticOutputParser[EnvResponsePlus | EnvResponse]( - pydantic_object=response_format_class - ), + output_parser=PydanticOutputParser[ + EnvResponsePlus | EnvResponse | EnvResponseGoalOnly + ](pydantic_object=response_format_class), temperature=temperature, ) response_list = [] diff --git a/tests/envs/test_evaluators.py b/tests/envs/test_evaluators.py index b3fc6ba25..eacba3c4f 100644 --- a/tests/envs/test_evaluators.py +++ b/tests/envs/test_evaluators.py @@ -7,7 +7,7 @@ RuleBasedTerminatedEvaluator, unweighted_aggregate_evaluate, ) -from sotopia.messages import AgentAction, Observation +from sotopia.messages import AgentAction, Observation, ScriptBackground, SimpleMessage def test_rule_based_teminated_evaluator() -> None: @@ -173,3 +173,67 @@ async def test_reach_goal_llm_evaluator_async() -> None: assert isinstance(response2[8][1][0][1], int) assert isinstance(response2[9][1][0][1], int) assert response2[2][1][0][1] > response2[3][1][0][1] + + +@pytest.mark.asyncio +async def test_reach_goal_llm_evaluator_goalonly_async() -> None: + evaluator = ReachGoalLLMEvaluator("gpt-4", response_format="goal_only") + background = ScriptBackground( + scenario="Conversation between two friends at a trivia night", + p1_name="Samuel Anderson", + p2_name="Giselle Rousseau", + p1_background="Samuel Anderson is a 29-year-old male software developer. He/him pronouns. Samuel Anderson can cook very well. Personality and values description: Samuel Anderson, though somewhat impulsive and free-spirited, values enjoyment. His decision-making is often spontaneous, staying within familiar boundaries. Samuel's secrets: He was once a competitive figure skater.", + p2_background="Giselle Rousseau is a 21-year-old nonbinary art student. They/them pronouns. Giselle Rousseau enjoys biking and photography. Personality and values description: Giselle Rousseau, open-minded and outgoing yet sensitive, advocates care and fairness. Her decision-making is intuitive and inclusive. Giselle's secrets: Sells forged paintings to wealthy clients", + p1_goal="Greet your friends and be polite", + p2_goal="Be rude and dismissive to your friends", + ) + + # response1, + response2 = await asyncio.gather( + evaluator.__acall__( + 1, + [ + ( + "Environment", + background, + ), + ( + "Environment", + SimpleMessage(message="Turn #1"), + ), + ( + "Alice", + AgentAction(action_type="speak", argument="Thank you so much!"), + ), + ( + "Environment", + SimpleMessage(message="Turn #2"), + ), + ( + "Bob", + AgentAction(action_type="speak", argument="Fuck you!"), + ), + ( + "Environment", + SimpleMessage(message="Turn #3"), + ), + ( + "Alice", + AgentAction( + action_type="speak", argument="Hope you have a great weekend." + ), + ), + ("Environment", SimpleMessage(message="Turn #4")), + ( + "Bob", + AgentAction(action_type="leave", argument="Leave"), + ), + ], + ), + ) + print("---------------------") + print("Response after 2 turns:", response2) + + assert len(response2[0][0][1][1].split()) > len( + "Samuel Anderson's goal was to greet his friends and be polite.".split() + ) From f6bb5bab1df1dc2e0647172ed786f57619430456 Mon Sep 17 00:00:00 2001 From: Zhe Su <360307598@qq.com> Date: Sun, 7 Jul 2024 10:40:40 -0400 Subject: [PATCH 21/23] Change the input type of the ReachGoalLLMEvaluator (#129) * change the input type of the ReachGoalLLMEvaluator to have a clearer type indication * draft for a general typing * Use GenericModel instead of BaseModel. Default parameter is not usable for generic class --------- Co-authored-by: Hao --- examples/experiment_eval.py | 7 ++- examples/fix_missing_episodes.py | 7 ++- examples/fix_missing_episodes_with_tag.py | 7 ++- sotopia-chat/chat_server.py | 6 +- sotopia/cli/benchmark/benchmark.py | 7 ++- sotopia/envs/evaluators.py | 71 +++++++++++------------ sotopia/server.py | 17 +++++- tests/envs/test_evaluators.py | 12 +++- 8 files changed, 86 insertions(+), 48 deletions(-) diff --git a/examples/experiment_eval.py b/examples/experiment_eval.py index 7b658d978..7527c091d 100644 --- a/examples/experiment_eval.py +++ b/examples/experiment_eval.py @@ -19,8 +19,10 @@ EpisodeLog, ) from sotopia.envs.evaluators import ( + EvaluationForTwoAgents, ReachGoalLLMEvaluator, RuleBasedTerminatedEvaluator, + SotopiaDimensions, ) from sotopia.envs.parallel import ParallelSotopiaEnv from sotopia.generation_utils.generate import LLM_Name @@ -143,7 +145,10 @@ def _iterate_env_agent_combo_not_in_db( RuleBasedTerminatedEvaluator(max_turn_number=20, max_stale_turn=2), ], terminal_evaluators=[ - ReachGoalLLMEvaluator(model_names["env"]), + ReachGoalLLMEvaluator( + model_names["env"], + EvaluationForTwoAgents[SotopiaDimensions], + ), ], ) agent_profiles = [AgentProfile.get(id) for id in agent_ids] diff --git a/examples/fix_missing_episodes.py b/examples/fix_missing_episodes.py index c8d568db1..9211aebd9 100644 --- a/examples/fix_missing_episodes.py +++ b/examples/fix_missing_episodes.py @@ -19,8 +19,10 @@ EnvironmentProfile, ) from sotopia.envs.evaluators import ( + EvaluationForTwoAgents, ReachGoalLLMEvaluator, RuleBasedTerminatedEvaluator, + SotopiaDimensions, ) from sotopia.envs.parallel import ParallelSotopiaEnv from sotopia.generation_utils.generate import LLM_Name @@ -227,7 +229,10 @@ def yield_env_agent_combo( RuleBasedTerminatedEvaluator(max_turn_number=20, max_stale_turn=2), ], terminal_evaluators=[ - ReachGoalLLMEvaluator(model_names["env"]), + ReachGoalLLMEvaluator( + model_names["env"], + EvaluationForTwoAgents[SotopiaDimensions], + ), ], ) agent_profiles = [AgentProfile.get(id) for id in (agent_id1, agent_id2)] diff --git a/examples/fix_missing_episodes_with_tag.py b/examples/fix_missing_episodes_with_tag.py index e77415a52..7cd8d1abf 100644 --- a/examples/fix_missing_episodes_with_tag.py +++ b/examples/fix_missing_episodes_with_tag.py @@ -35,8 +35,10 @@ EnvironmentProfile, ) from sotopia.envs.evaluators import ( + EvaluationForTwoAgents, ReachGoalLLMEvaluator, RuleBasedTerminatedEvaluator, + SotopiaDimensions, ) from sotopia.envs.parallel import ParallelSotopiaEnv from sotopia.generation_utils.generate import LLM_Name @@ -325,7 +327,10 @@ def yield_env_agent_combo( RuleBasedTerminatedEvaluator(max_turn_number=20, max_stale_turn=2), ], terminal_evaluators=[ - ReachGoalLLMEvaluator(model_names["env"]), + ReachGoalLLMEvaluator( + model_names["env"], + EvaluationForTwoAgents[SotopiaDimensions], + ), ], ) agent_profiles = [AgentProfile.get(id) for id in (agent_id1, agent_id2)] diff --git a/sotopia-chat/chat_server.py b/sotopia-chat/chat_server.py index 0b3388b5a..21eba5eff 100644 --- a/sotopia-chat/chat_server.py +++ b/sotopia-chat/chat_server.py @@ -27,6 +27,8 @@ from sotopia.envs.parallel import ParallelSotopiaEnv from sotopia.server import arun_one_episode +from sotopia.envs.evaluators import SotopiaDimensions, EvaluationForTwoAgents + process = subprocess.Popen( ["git", "rev-parse", "HEAD"], shell=False, stdout=subprocess.PIPE ) @@ -62,7 +64,7 @@ async def _start_server_with_two_session_ids_and_agent_env_combo( RuleBasedTerminatedEvaluator(max_turn_number=20, max_stale_turn=2), ], terminal_evaluators=[ - ReachGoalLLMEvaluator("gpt-4"), + ReachGoalLLMEvaluator("gpt-4", EvaluationForTwoAgents[SotopiaDimensions]), ], ) random.shuffle(session_ids) @@ -95,7 +97,7 @@ async def _start_server_with_one_session_id_and_agent_env_combo( RuleBasedTerminatedEvaluator(max_turn_number=20, max_stale_turn=2), ], terminal_evaluators=[ - ReachGoalLLMEvaluator("gpt-4"), + ReachGoalLLMEvaluator("gpt-4", EvaluationForTwoAgents[SotopiaDimensions]), ], ) diff --git a/sotopia/cli/benchmark/benchmark.py b/sotopia/cli/benchmark/benchmark.py index 18455f02c..f52e09ba2 100644 --- a/sotopia/cli/benchmark/benchmark.py +++ b/sotopia/cli/benchmark/benchmark.py @@ -20,8 +20,10 @@ ) from sotopia.database.serialization import get_rewards_from_episode from sotopia.envs.evaluators import ( + EvaluationForTwoAgents, ReachGoalLLMEvaluator, RuleBasedTerminatedEvaluator, + SotopiaDimensions, ) from sotopia.envs.parallel import ParallelSotopiaEnv from sotopia.generation_utils.generate import LLM_Name @@ -130,7 +132,10 @@ def _list_all_env_agent_combo_not_in_db( RuleBasedTerminatedEvaluator(max_turn_number=20, max_stale_turn=2), ], terminal_evaluators=[ - ReachGoalLLMEvaluator(model_names["env"]), + ReachGoalLLMEvaluator( + model_names["env"], + EvaluationForTwoAgents[SotopiaDimensions], + ), ], ) agent_profiles = [AgentProfile.get(id) for id in agent_ids] diff --git a/sotopia/envs/evaluators.py b/sotopia/envs/evaluators.py index a0d56e655..71d5abc5c 100644 --- a/sotopia/envs/evaluators.py +++ b/sotopia/envs/evaluators.py @@ -1,6 +1,9 @@ import abc import logging from collections import defaultdict +from typing import Generic, TypeVar + +from pydantic.generics import GenericModel import gin from beartype import beartype @@ -17,7 +20,9 @@ log = logging.getLogger("evaluators") -class EvaluationBySocialDimensions(BaseModel): +class SotopiaDimensions(BaseModel): + """The social dimensions used in Sotopia paper (ICLR 2024)""" + believability: tuple[str, int] = Field( ..., description="Reasoning requirement: 1. Evaluate if the agent interacts with others in a natural and realistic manner (here are a few common questions to check: a. whether the agent is confusing with its own identity? b. whether the agent repeats others' words/actions without any reason? c. whether the agent is being overly polite considering the context?). Start the analysis with tag " @@ -64,23 +69,25 @@ class EvaluationBySocialDimensions(BaseModel): "In the 'reasoning' field, provide a comprehensive account of the logic or thought process that led you to your conclusion. Further, provide an integer score ranging from 0 and 10 in the 'score' field. 0 represents minimal goals achievement, 10 represents complete goal achievement, and a higher score indicates that the agent is making progress towards their social goals.", ) - @validator("believability", "knowledge", "goal") + @validator("believability", "knowledge", "goal", allow_reuse=True) def zero_to_ten_validator(cls, v: tuple[str, int]) -> tuple[str, int]: assert v[1] >= 0 and v[1] <= 10 return v - @validator("relationship", "financial_and_material_benefits") + @validator("relationship", "financial_and_material_benefits", allow_reuse=True) def minus_five_to_five_validator(cls, v: tuple[str, int]) -> tuple[str, int]: assert v[1] >= -5 and v[1] <= 5 return v - @validator("secret", "social_rules") + @validator("secret", "social_rules", allow_reuse=True) def minus_ten_to_zero_validator(cls, v: tuple[str, int]) -> tuple[str, int]: assert v[1] >= -10 and v[1] <= 0 return v -class EvaluationBySocialDimensionsPlus(BaseModel): +class SotopiaDimensionsPlus(BaseModel): + """Updated SotopiaDimensions with more detailed instructions""" + believability: tuple[str, int] = Field( ..., description="Reasoning requirement: 1. Evaluate if the agent interacts with others in a natural and realistic manner (here are a few common questions to check: a. whether the agent is confusing with its own identity? b. whether the agent repeats others' words/actions without any reason? c. whether the agent is being overly polite considering the context?). Start the analysis with tag " @@ -127,23 +134,25 @@ class EvaluationBySocialDimensionsPlus(BaseModel): "In the 'reasoning' field, provide a comprehensive account of the logic or thought process that led you to your conclusion. Further, provide an integer score ranging from 0 and 10 in the 'score' field. 0 represents minimal goals achievement, 10 represents complete goal achievement, and a higher score indicates that the agent is making progress towards their social goals. Almost Not Finishing Any Goal (0-3): Scores from 0 to 3 indicate almost not finishing any goal, suggesting a minimal level of goal achievement. This range signifies either no progress or only a very rudimentary level of advancement towards the completion of set goals. Finishing Less Than 50% of Goals (4-6): A score between 4 and 6 suggests finishing less than 50% of the goals, indicating a moderate level of goal completion. This range represents partial success, with some goals being met while a significant portion remains unachieved. Finishing More Than 50%, But Not All Goals (7-8): Scores in the 7 to 8 range indicate finishing more than 50% but not all of the goals. This suggests a high level of achievement, where the majority of set goals are met, but some goals still remain incomplete. Finishing All Goals (9-10): A score between 9 and 10 signifies finishing all goals, representing the highest level of achievement in goal completion. This range indicates that all set objectives have been met, signifying complete success in achieving the targeted goals.", ) - @validator("believability", "knowledge", "goal") + @validator("believability", "knowledge", "goal", allow_reuse=True) def zero_to_ten_validator(cls, v: tuple[str, int]) -> tuple[str, int]: assert v[1] >= 0 and v[1] <= 10 return v - @validator("relationship", "financial_and_material_benefits") + @validator("relationship", "financial_and_material_benefits", allow_reuse=True) def minus_five_to_five_validator(cls, v: tuple[str, int]) -> tuple[str, int]: assert v[1] >= -5 and v[1] <= 5 return v - @validator("secret", "social_rules") + @validator("secret", "social_rules", allow_reuse=True) def minus_ten_to_zero_validator(cls, v: tuple[str, int]) -> tuple[str, int]: assert v[1] >= -10 and v[1] <= 0 return v -class EvaluationGoalOnly(BaseModel): +class GoalDimension(BaseModel): + """Goal only evaluation""" + goal: tuple[str, int] = Field( ..., description="Please first reiterate agent's social goals. " @@ -151,25 +160,18 @@ class EvaluationGoalOnly(BaseModel): "The first entry (str) of the object is the 'reasoning' field, and the second entry (int) of the object is the 'score' field. In the 'reasoning' field, provide a comprehensive account of the logic or thought process that led you to your conclusion. Further, provide an integer score ranging from 0 and 10 in the 'score' field. 0 represents minimal goals achievement, 10 represents complete goal achievement, and a higher score indicates that the agent is making progress towards their social goals.", ) - @validator("goal") + @validator("goal", allow_reuse=True) def zero_to_ten_validator(cls, v: tuple[str, int]) -> tuple[str, int]: assert v[1] >= 0 and v[1] <= 10 return v -class EnvResponse(BaseModel): - agent_1_evaluation: EvaluationBySocialDimensions - agent_2_evaluation: EvaluationBySocialDimensions - +T_eval_dim = TypeVar("T_eval_dim", bound=BaseModel) -class EnvResponsePlus(BaseModel): - agent_1_evaluation: EvaluationBySocialDimensionsPlus - agent_2_evaluation: EvaluationBySocialDimensionsPlus - -class EnvResponseGoalOnly(BaseModel): - agent_1_evaluation: EvaluationGoalOnly - agent_2_evaluation: EvaluationGoalOnly +class EvaluationForTwoAgents(GenericModel, Generic[T_eval_dim]): + agent_1_evaluation: T_eval_dim + agent_2_evaluation: T_eval_dim class Evaluator(abc.ABC): @@ -244,12 +246,16 @@ async def __acall__( return self(turn_number, messages) -class ReachGoalLLMEvaluator(Evaluator): +class ReachGoalLLMEvaluator(Evaluator, Generic[T_eval_dim]): @beartype - def __init__(self, model_name: str, response_format: str = "basic") -> None: + def __init__( + self, + model_name: str, + response_format_class: type[EvaluationForTwoAgents[T_eval_dim]], + ) -> None: self.model_name = model_name self.prompt = "" - self.response_format = response_format + self.response_format_class = response_format_class def __call__( self, turn_number: int, messages: list[tuple[str, Message]] @@ -284,16 +290,9 @@ async def __acall__( for x, y in messages_filtered ] ) - response_format_class = ( - EnvResponsePlus if self.response_format == "plus" else EnvResponse - ) - if self.response_format == "goal_only": - response_format_class = EnvResponseGoalOnly + try: - response: ( - EnvResponsePlus | EnvResponse - ) # fix type error from langchain 0.0.264. we don't need this line for langchain 0.0.263 - response = await agenerate( + response: EvaluationForTwoAgents[T_eval_dim] = await agenerate( model_name=self.model_name, template="""{history}, Based on previous interactions, evaluate how well participants achieve their goals. @@ -301,9 +300,9 @@ async def __acall__( {format_instructions} """, input_values=dict(history=history), - output_parser=PydanticOutputParser[ - EnvResponsePlus | EnvResponse | EnvResponseGoalOnly - ](pydantic_object=response_format_class), + output_parser=PydanticOutputParser[self.response_format_class]( # type: ignore[name-defined] + pydantic_object=self.response_format_class + ), temperature=temperature, ) response_list = [] diff --git a/sotopia/server.py b/sotopia/server.py index 732cf16a2..167bac335 100644 --- a/sotopia/server.py +++ b/sotopia/server.py @@ -18,8 +18,10 @@ from sotopia.database import EpisodeLog from sotopia.envs import ParallelSotopiaEnv from sotopia.envs.evaluators import ( + EvaluationForTwoAgents, ReachGoalLLMEvaluator, RuleBasedTerminatedEvaluator, + SotopiaDimensions, unweighted_aggregate_evaluate, ) from sotopia.generation_utils.generate import LLM_Name, agenerate_script @@ -268,7 +270,10 @@ def get_agent_class( RuleBasedTerminatedEvaluator(max_turn_number=20, max_stale_turn=2), ], "terminal_evaluators": [ - ReachGoalLLMEvaluator(model_dict["env"]), + ReachGoalLLMEvaluator( + model_dict["env"], + EvaluationForTwoAgents[SotopiaDimensions], + ), ], } agents_model_dict = { @@ -339,7 +344,10 @@ async def arun_one_script( env_message = [("Environment", script_background)] agent_messages = env_message + agent_messages - evaluator = ReachGoalLLMEvaluator(model_name="gpt-4") + evaluator = ReachGoalLLMEvaluator( + model_name="gpt-4", + response_format_class=EvaluationForTwoAgents[SotopiaDimensions], + ) response = unweighted_aggregate_evaluate( list( itertools.chain( @@ -407,7 +415,10 @@ async def aevaluate_one_episode( history = episode.rewards_prompt.replace("Prompt after formatting:", "").split( ",\nBased on previous interactions" )[0] - evaluator = ReachGoalLLMEvaluator(model_name=model, response_format="basic") + evaluator = ReachGoalLLMEvaluator( + model_name=model, + response_format_class=EvaluationForTwoAgents[SotopiaDimensions], + ) response = unweighted_aggregate_evaluate( list( itertools.chain( diff --git a/tests/envs/test_evaluators.py b/tests/envs/test_evaluators.py index eacba3c4f..8da9f6772 100644 --- a/tests/envs/test_evaluators.py +++ b/tests/envs/test_evaluators.py @@ -3,6 +3,8 @@ import pytest from sotopia.envs.evaluators import ( + SotopiaDimensions, + EvaluationForTwoAgents, ReachGoalLLMEvaluator, RuleBasedTerminatedEvaluator, unweighted_aggregate_evaluate, @@ -126,7 +128,9 @@ async def test_rule_based_teminated_evaluator_async() -> None: @pytest.mark.asyncio async def test_reach_goal_llm_evaluator_async() -> None: - evaluator = ReachGoalLLMEvaluator("gpt-4") + evaluator = ReachGoalLLMEvaluator( + "gpt-4", response_format_class=EvaluationForTwoAgents[SotopiaDimensions] + ) response1, response2 = await asyncio.gather( evaluator.__acall__( 1, @@ -176,8 +180,10 @@ async def test_reach_goal_llm_evaluator_async() -> None: @pytest.mark.asyncio -async def test_reach_goal_llm_evaluator_goalonly_async() -> None: - evaluator = ReachGoalLLMEvaluator("gpt-4", response_format="goal_only") +async def test_reach_goal_llm_evaluator_goal_only_async() -> None: + evaluator = ReachGoalLLMEvaluator( + "gpt-4", response_format_class=EvaluationForTwoAgents[SotopiaDimensions] + ) background = ScriptBackground( scenario="Conversation between two friends at a trivia night", p1_name="Samuel Anderson", From f53472ab0aa4b901304f1c71863ca1a2727ee123 Mon Sep 17 00:00:00 2001 From: Ruiyi Wang <76935534+ruiyiw@users.noreply.github.com> Date: Tue, 9 Jul 2024 07:57:38 -0400 Subject: [PATCH 22/23] Support Azure API for agent and env models; Fix updates on langchain V0.2 (#132) * cherry picked generate.py from #69 * Add AzureOpenAI for agent and env models and Update to langchain V0.2 runnable interface * Delete azure api key input * Fix mypy errors --------- --- sotopia/generation_utils/generate.py | 57 ++++++++++++++++------ sotopia_conf/run_async_server_in_batch.gin | 3 +- 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/sotopia/generation_utils/generate.py b/sotopia/generation_utils/generate.py index 39a0d1548..4d9d710ef 100644 --- a/sotopia/generation_utils/generate.py +++ b/sotopia/generation_utils/generate.py @@ -1,12 +1,13 @@ import logging import os import re -from typing import TypeVar +from typing import TypeVar, Any import gin from beartype import beartype from beartype.typing import Type -from langchain.chains.llm import LLMChain +from langchain_core.runnables.base import RunnableSerializable +from langchain_core.messages.base import BaseMessage from langchain.output_parsers import PydanticOutputParser from langchain.prompts import ( ChatPromptTemplate, @@ -14,7 +15,7 @@ PromptTemplate, ) from langchain.schema import BaseOutputParser, OutputParserException -from langchain_openai import ChatOpenAI +from langchain_openai import ChatOpenAI, AzureChatOpenAI from pydantic import BaseModel, Field from rich import print from typing_extensions import Literal @@ -295,7 +296,7 @@ def obtain_chain( input_variables: list[str], temperature: float = 0.7, max_retries: int = 6, -) -> LLMChain: +) -> RunnableSerializable[dict[Any, Any], BaseMessage]: """ Using langchain to sample profiles for participants """ @@ -316,7 +317,7 @@ def obtain_chain( openai_api_base="https://api.together.xyz/v1", openai_api_key=os.environ.get("TOGETHER_API_KEY"), ) - chain = LLMChain(llm=chat_openai, prompt=chat_prompt_template) + chain = chat_prompt_template | chat_openai return chain elif "groq" in model_name: model_name = "/".join(model_name.split("/")[1:]) @@ -334,7 +335,31 @@ def obtain_chain( openai_api_base="https://api.groq.com/openai/v1", openai_api_key=os.environ.get("GROQ_API_KEY"), ) - chain = LLMChain(llm=chat_openai, prompt=chat_prompt_template) + chain = chat_prompt_template | chat_openai + return chain + elif "azure" in model_name: + # azure/resource_name/deployment_name/version + azure_credentials = model_name.split("/")[1:] + resource_name, deployment_name, azure_version = ( + azure_credentials[0], + azure_credentials[1], + azure_credentials[2], + ) + human_message_prompt = HumanMessagePromptTemplate( + prompt=PromptTemplate( + template=template, + input_variables=input_variables, + ) + ) + chat_prompt_template = ChatPromptTemplate.from_messages([human_message_prompt]) + chat_azure_openai = AzureChatOpenAI( + azure_deployment=deployment_name, + openai_api_version=azure_version, + azure_endpoint=f"https://{resource_name}.openai.azure.com", + temperature=temperature, + max_retries=max_retries, + ) + chain = chat_prompt_template | chat_azure_openai return chain else: chat = ChatOpenAI( @@ -346,7 +371,7 @@ def obtain_chain( prompt=PromptTemplate(template=template, input_variables=input_variables) ) chat_prompt_template = ChatPromptTemplate.from_messages([human_message_prompt]) - chain = LLMChain(llm=chat, prompt=chat_prompt_template) + chain = chat_prompt_template | chat return chain @@ -356,7 +381,7 @@ def format_bad_output_for_script( format_instructions: str, agents: list[str], model_name: str = "gpt-3.5-turbo", -) -> str: +) -> BaseMessage: template = """ Given the string that can not be parsed by a parser, reformat it to a string that can be parsed by the parser which uses the following format instructions. Do not add or delete any information. Small tip: for every round of conversation, first determine the name and the case, and whether this line contains errors. Correct it if necessary. @@ -380,17 +405,17 @@ def format_bad_output_for_script( "format_instructions": format_instructions, "agents": agents, } - reformat = chain.predict([logging_handler], **input_values) + reformat = chain.invoke(input_values, config={"callbacks": [logging_handler]}) log.info(f"Reformated output: {reformat}") return reformat @beartype def format_bad_output( - ill_formed_output: str, + ill_formed_output: BaseMessage, format_instructions: str, model_name: str = "gpt-3.5-turbo", -) -> str: +) -> BaseMessage: template = """ Given the string that can not be parsed by json parser, reformat it to a string that can be parsed by json parser. Original string: {ill_formed_output} @@ -405,10 +430,10 @@ def format_bad_output( input_variables=re.findall(r"{(.*?)}", template), ) input_values = { - "ill_formed_output": ill_formed_output, + "ill_formed_output": ill_formed_output.content, "format_instructions": format_instructions, } - reformat = chain.predict([logging_handler], **input_values) + reformat = chain.invoke(input_values, config={"callbacks": [logging_handler]}) log.info(f"Reformated output: {reformat}") return reformat @@ -437,9 +462,9 @@ async def agenerate( ) if "format_instructions" not in input_values: input_values["format_instructions"] = output_parser.get_format_instructions() - result = await chain.apredict([logging_handler], **input_values) + result = await chain.ainvoke(input_values, config={"callbacks": [logging_handler]}) try: - parsed_result = output_parser.parse(result) + parsed_result = output_parser.invoke(result) except Exception as e: if isinstance(output_parser, ScriptOutputParser): raise e # the problem has been handled in the parser @@ -450,7 +475,7 @@ async def agenerate( reformat_parsed_result = format_bad_output( result, format_instructions=output_parser.get_format_instructions() ) - parsed_result = output_parser.parse(reformat_parsed_result) + parsed_result = output_parser.invoke(reformat_parsed_result) log.info(f"Generated result: {parsed_result}") return parsed_result diff --git a/sotopia_conf/run_async_server_in_batch.gin b/sotopia_conf/run_async_server_in_batch.gin index 2d0f88026..544d0679a 100644 --- a/sotopia_conf/run_async_server_in_batch.gin +++ b/sotopia_conf/run_async_server_in_batch.gin @@ -2,12 +2,13 @@ from __gin__ import dynamic_registration import __main__ as main_script BATCH_SIZE=10 +ENV_MODEL="gpt-4" AGENT1_MODEL="gpt-3.5-turbo" AGENT2_MODEL="gpt-3.5-turbo" VERBOSE=False TAG_TO_CHECK_EXISTING_EPISODES=None -MODEL_NAMES={"env": "gpt-4", "agent1": %AGENT1_MODEL, "agent2": %AGENT2_MODEL} +MODEL_NAMES={"env": %ENV_MODEL, "agent1": %AGENT1_MODEL, "agent2": %AGENT2_MODEL} ENV_IDS=%gin.REQUIRED From 28f053a78600db759e0f90d69619050407b52034 Mon Sep 17 00:00:00 2001 From: Zhe Su <360307598@qq.com> Date: Thu, 11 Jul 2024 18:14:05 -0400 Subject: [PATCH 23/23] Improve the benchmark by evaluating multiple models and display the results (#126) * support benchmarking for multiple models & support aggregating and saving the results to compare different models * fix mypy issue * fix mypy issue * merge all the benchmark functions * now support printing to table with Rich * make output_to_json in benchmark_display an argument --- sotopia/cli/benchmark/benchmark.py | 139 +++++++++++++++++++++++++---- 1 file changed, 120 insertions(+), 19 deletions(-) diff --git a/sotopia/cli/benchmark/benchmark.py b/sotopia/cli/benchmark/benchmark.py index f52e09ba2..2e7634067 100644 --- a/sotopia/cli/benchmark/benchmark.py +++ b/sotopia/cli/benchmark/benchmark.py @@ -4,7 +4,8 @@ from sotopia.database.persistent_profile import EnvironmentList import asyncio import logging -from typing import cast +import json +from typing import cast, List, Dict, OrderedDict from logging import FileHandler from rich.logging import RichHandler @@ -267,9 +268,98 @@ def _set_up_logs( ) +def save_to_jsonl( + model_rewards_dict: Dict[str, Dict[str, float]], + partner_model: str, +) -> None: + simplified_model_name = partner_model.split("/")[-1] + output_fn = f"./models_vs_{simplified_model_name}.jsonl" + outputs: List[str] = [] + for model, rewards in model_rewards_dict.items(): + formatted_reward = OrderedDict( + { + "model_name": model, + **{ + f"{v[0]} {v[1]}": rewards[k] + for k, v in dimension_range_mapping.items() + }, + } + ) + outputs.append(json.dumps(formatted_reward)) + with open(output_fn, "w") as f: + f.write("\n".join(outputs)) + + print(f"Output saved to {output_fn}") + + +default_model_list: List[str] = [ + "gpt-4o", +] +dimension_range_mapping = OrderedDict( + { + "social_rules": ["SOC", [-10, 0]], + "secret": ["SEC", [-10, 0]], + "financial_and_material_benefits": ["FIN", [-5, 5]], + "relationship": ["REL", [-5, 5]], + "knowledge": ["KNO", [0, 10]], + "goal": ["GOAL", [0, 10]], + "believability": ["BEL", [0, 10]], + } +) + + +def display_in_table( + model_rewards_dict: Dict[str, Dict[str, float]], partner_model: str +) -> None: + table = rich.table.Table( + title="Model Performance when facing {}".format(partner_model) + ) + table.add_column("Model") + for dimension in dimension_range_mapping.keys(): + table.add_column(dimension) + for model, rewards in model_rewards_dict.items(): + table.add_row( + model, + *[f"{rewards[k]:.2f}" for k in dimension_range_mapping.keys()], + ) + rich.print(table) + + +def benchmark_display( + model_list: List[str] = default_model_list, + partner_model: str = "together_ai/meta-llama/Llama-3-70b-chat-hf", + evaluator_model: str = "gpt-4o", + task: str = "hard", + output_to_jsonl: bool = False, +) -> None: + """ + Usage: sotopia benchmark-display --model-list gpt-4o --model-list together_ai/meta-llama-Llama-3-70b-chat-hf + Aggregate all the results for the benchmark, as described in https://github.com/sotopia-lab/sotopia-space/blob/main/data_dir/models_vs_gpt35.jsonl + """ + + print(f"Displaying performance for {model_list} vs {partner_model} on task {task}") + model_rewards_dict = dict() + for model in model_list: + tag = f"benchmark_{model}_{partner_model}_{evaluator_model}_{task}_trial0" + episodes = EpisodeLog.find(EpisodeLog.tag == tag).all() + if len(episodes) == 0: + print(f"No episodes found for {model}") + continue + avg_rewards = get_avg_reward(episodes, model) # type: ignore + model_rewards_dict[model] = avg_rewards + print(f"Model: {model}, episodes: {len(episodes)}, Avg Rewards: {avg_rewards}") + + display_in_table(model_rewards_dict, partner_model) + if output_to_jsonl: + save_to_jsonl(model_rewards_dict, partner_model) + + @app.command() def benchmark( - model: str = typer.Option(..., help="The language model you want to benchmark."), + models: List[str] = typer.Option( + default_model_list, + help=f"All the language model you want to benchmark. Default is the pre-loaded model list {default_model_list}.", + ), partner_model: str = typer.Option( "together_ai/meta-llama/Llama-3-70b-chat-hf", help="The partner model you want to use.", @@ -280,24 +370,35 @@ def benchmark( batch_size: int = typer.Option(10, help="The batch size you want to use."), task: str = typer.Option("hard", help="The task id you want to benchmark."), print_logs: bool = typer.Option(False, help="Print logs."), + only_show_performance: bool = typer.Option(False, help="Only show performance."), + output_to_jsonl: bool = typer.Option(False, help="Output to jsonl."), ) -> None: + if only_show_performance: + benchmark_display(models, partner_model, evaluator_model, task, output_to_jsonl) + return + """A simple command-line interface example.""" _set_up_logs(print_logs=print_logs) - typer.echo( - f"Running benchmark for {model} chatting with {partner_model} on task {task} with {evaluator_model} as the evaluator." - ) - model = cast(LLM_Name, model) - partner_model = cast(LLM_Name, partner_model) - evaluator_model = cast(LLM_Name, evaluator_model) - tag = f"benchmark_{model}_{partner_model}_{evaluator_model}_{task}_trial0" - run_async_benchmark_in_batch( - batch_size=batch_size, - model_names={ - "env": evaluator_model, - "test_model": model, - "partner_model": partner_model, - }, - tag=tag, - verbose=False, - push_to_db=True, + + for model in models: + typer.echo( + f"Running benchmark for {model} chatting with {partner_model} on task {task} with {evaluator_model} as the evaluator." + ) + model = cast(LLM_Name, model) + partner_model = cast(LLM_Name, partner_model) + evaluator_model = cast(LLM_Name, evaluator_model) + tag = f"benchmark_{model}_{partner_model}_{evaluator_model}_{task}_trial0" + run_async_benchmark_in_batch( + batch_size=batch_size, + model_names={ + "env": evaluator_model, + "test_model": model, + "partner_model": partner_model, + }, + tag=tag, + verbose=False, + push_to_db=True, + ) + benchmark_display( + models, partner_model, evaluator_model, task, output_to_jsonl=output_to_jsonl )