diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3b565132..6770a643 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -36,6 +36,7 @@ repos: args: - --word-list=.secrets.allowlist - --exclude-files=.secrets.baseline$ + exclude: tests/cassettes - repo: https://github.com/jumanjihouse/pre-commit-hooks rev: 3.0.0 hooks: @@ -62,7 +63,7 @@ repos: additional_dependencies: - "validate-pyproject-schema-store[all]>=2024.08.19" # For Ruff renaming RUF025 to C420 - repo: https://github.com/astral-sh/uv-pre-commit - rev: 0.4.6 + rev: 0.4.9 hooks: - id: uv-lock - repo: https://github.com/pre-commit/mirrors-mypy @@ -73,7 +74,7 @@ repos: - fastapi>=0.109 # Match pyproject.toml - fhaviary>=0.6 # Match pyproject.toml - httpx - - litellm>=1.40.9,<=1.40.12 # Match pyproject.toml + - litellm>=1.42.1 # Match pyproject.toml - numpy - pydantic~=2.0 # Match pyproject.toml - tenacity diff --git a/.secrets.allowlist b/.secrets.allowlist index e69de29b..eef34657 100644 --- a/.secrets.allowlist +++ b/.secrets.allowlist @@ -0,0 +1,2 @@ +authorization +x-api-key diff --git a/ldp/llms/__init__.py b/ldp/llms/__init__.py index 77807d23..7795d172 100644 --- a/ldp/llms/__init__.py +++ b/ldp/llms/__init__.py @@ -3,7 +3,6 @@ LLMModel, LLMResult, MultipleCompletionLLMModel, - process_llm_config, sum_logprobs, validate_json_completion, ) @@ -35,7 +34,6 @@ "append_to_sys", "prepend_sys", "prepend_sys_and_append_sys", - "process_llm_config", "sum_logprobs", "validate_json_completion", ] diff --git a/ldp/llms/chat.py b/ldp/llms/chat.py index 12d64859..183148ef 100644 --- a/ldp/llms/chat.py +++ b/ldp/llms/chat.py @@ -59,24 +59,6 @@ def get_supported_openai_params(self) -> list[str] | None: return litellm.get_supported_openai_params(self.model) -def process_llm_config(llm_config: dict) -> dict: - """Remove model_type and try to set max_tokens.""" - result = llm_config.copy() - result.pop("model_type", None) - - if result.get("max_tokens", -1) == -1: # Either max_tokens is missing or it's -1 - model = llm_config["model"] - # these are estimates - should probably do something better in the future. - if model.startswith("gpt-4") or ( - model.startswith("gpt-3.5") and "0125" in model - ): - result["max_tokens"] = 4000 - elif "rrr" not in model: - result["max_tokens"] = 2500 - - return result - - def sum_logprobs(choice: litellm.utils.Choices) -> float | None: """Calculate the sum of the log probabilities of an LLM completion (a Choices object). @@ -154,22 +136,20 @@ async def achat( self, messages: Iterable[Message], **kwargs ) -> litellm.ModelResponse: return await litellm.acompletion( - messages=[m.model_dump(exclude_none=True, by_alias=True) for m in messages], - **(process_llm_config(self.config) | kwargs), + messages=[m.model_dump(by_alias=True) for m in messages], + **(self.config | kwargs), ) async def achat_iter(self, messages: Iterable[Message], **kwargs) -> AsyncGenerator: return cast( AsyncGenerator, await litellm.acompletion( - messages=[ - m.model_dump(exclude_none=True, by_alias=True) for m in messages - ], - **(process_llm_config(self.config) | kwargs), + messages=[m.model_dump(by_alias=True) for m in messages], stream=True, stream_options={ "include_usage": True, # Included to get prompt token counts }, + **(self.config | kwargs), ), ) @@ -225,7 +205,7 @@ async def call( # noqa: C901, PLR0915 chat_kwargs["response_format"] = {"type": "json_object"} # add static configuration to kwargs - chat_kwargs = process_llm_config(self.config) | chat_kwargs + chat_kwargs = self.config | chat_kwargs n = chat_kwargs.get("n", 1) # number of completions if n < 1: raise ValueError("Number of completions (n) must be >= 1.") diff --git a/pyproject.toml b/pyproject.toml index fdd01cc9..970149c6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,6 +74,7 @@ tests-root = "tests" check-filenames = true check-hidden = true ignore-words-list = "astroid,ser" +skip = "tests/cassettes/*" [tool.mypy] # Type-checks the interior of functions without type annotations. @@ -199,6 +200,8 @@ disable = [ "too-many-return-statements", # Rely on ruff PLR0911 for this "too-many-statements", # Rely on ruff PLR0915 for this "ungrouped-imports", # Rely on ruff I001 for this + "unidiomatic-typecheck", # Rely on ruff E721 for this + "unreachable", # Rely on mypy unreachable for this "unspecified-encoding", # Don't care to enforce this "unsubscriptable-object", # Buggy, SEE: https://github.com/PyCQA/pylint/issues/3637 "unsupported-membership-test", # Buggy, SEE: https://github.com/pylint-dev/pylint/issues/3045 @@ -400,13 +403,14 @@ dev-dependencies = [ "fhaviary[xml]", "ipython>=8", # Pin to keep recent "ldp[monitor,nn,server,typing,visualization]", - "litellm>=1.40.9,<=1.40.12", # Pin lower for get_supported_openai_params not requiring custom LLM, upper for https://github.com/BerriAI/litellm/issues/4032 + "litellm>=1.42.1", # Pin lower for UnsupportedParamsError fix "mypy>=1.8", # Pin for mutable-override "pre-commit~=3.4", # Pin to keep recent "pydantic~=2.9", # Pydantic 2.9 changed JSON schema exports 'allOf', so ensure tests match "pylint-pydantic", "pylint>=3.2", # Pin to keep recent "pytest-asyncio", + "pytest-recording", "pytest-rerunfailures", "pytest-subtests", "pytest-sugar", diff --git a/tests/__init__.py b/tests/__init__.py index f405a0f2..293657e6 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,3 +1,4 @@ +import pathlib from enum import StrEnum @@ -6,3 +7,7 @@ class CILLMModelNames(StrEnum): ANTHROPIC = "claude-3-haiku-20240307" # Cheap and not Anthropic's cutting edge OPENAI = "gpt-4o-mini-2024-07-18" # Cheap and not OpenAI's cutting edge + + +TESTS_DIR = pathlib.Path(__file__).parent +CASSETTES_DIR = TESTS_DIR / "cassettes" diff --git a/tests/cassettes/TestHTTPAgentClient.test_lifecycle.yaml b/tests/cassettes/TestHTTPAgentClient.test_lifecycle.yaml new file mode 100644 index 00000000..bb5b406e --- /dev/null +++ b/tests/cassettes/TestHTTPAgentClient.test_lifecycle.yaml @@ -0,0 +1,713 @@ +interactions: + - request: + body: "" + headers: + accept: + - "*/*" + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - testserver + user-agent: + - python-httpx/0.27.2 + method: GET + uri: http://testserver/info + response: + body: + string: '{"agent_type":"SimpleAgent"}' + headers: + content-length: + - "28" + content-type: + - application/json + status: + code: 200 + message: OK + - request: + body: + '[{"type": "function", "info": {"name": "print_story", "description": "Print + a story.", "parameters": {"type": "object", "properties": {"story": {"description": + "Story to print.", "title": "Story", "type": "string"}}, "required": ["story"]}}}, + {"type": "function", "info": {"name": "cast_float", "description": "Cast the + input argument x to a float.", "parameters": {"type": "object", "properties": + {"x": {"title": "X", "type": "string"}}, "required": ["x"]}}}, {"type": "function", + "info": {"name": "cast_int", "description": "Cast the input argument x to an + integer.", "parameters": {"type": "object", "properties": {"x": {"title": "X", + "type": "number"}}, "required": ["x"]}}}]' + headers: + accept: + - "*/*" + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "679" + content-type: + - application/json + host: + - testserver + user-agent: + - python-httpx/0.27.2 + method: POST + uri: http://testserver/init_state + response: + body: + string: + '{"tools":[{"type":"function","function":{"name":"print_story","description":"Print + a story.","parameters":{"type":"object","properties":{"story":{"description":"Story + to print.","title":"Story","type":"string"}},"required":["story"]}}},{"type":"function","function":{"name":"cast_float","description":"Cast + the input argument x to a float.","parameters":{"type":"object","properties":{"x":{"title":"X","type":"string"}},"required":["x"]}}},{"type":"function","function":{"name":"cast_int","description":"Cast + the input argument x to an integer.","parameters":{"type":"object","properties":{"x":{"title":"X","type":"number"}},"required":["x"]}}}],"messages":[]}' + headers: + content-length: + - "660" + content-type: + - application/json + status: + code: 200 + message: OK + - request: + body: + '{"messages": [{"role": "user", "content": "Cast ''5.5'' to a float, then + to an integer, and finally use it to write a story of that many words."}], "model": + "gpt-4o-2024-08-06", "temperature": 0.1, "tool_choice": "required", "tools": + [{"type": "function", "function": {"name": "print_story", "description": "Print + a story.", "parameters": {"type": "object", "properties": {"story": {"description": + "Story to print.", "title": "Story", "type": "string"}}, "required": ["story"]}}}, + {"type": "function", "function": {"name": "cast_float", "description": "Cast + the input argument x to a float.", "parameters": {"type": "object", "properties": + {"x": {"title": "X", "type": "string"}}, "required": ["x"]}}}, {"type": "function", + "function": {"name": "cast_int", "description": "Cast the input argument x to + an integer.", "parameters": {"type": "object", "properties": {"x": {"title": + "X", "type": "number"}}, "required": ["x"]}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "924" + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.44.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.44.1 + x-stainless-raw-response: + - "true" + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.5 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAAwAAAP//bFJNT+MwFLznV1jv3KCkH0mbGxII7QFBQWJXbFeR676k7jq2Zb8Apep/ + X+WDNlTrQ2TNeN5Mxj4EjIHcQMZAbDmJyqrwOnlMXzbPizdM+U96TXd3u5v3ZPlw93SPaxg1CrPe + oaAv1ZUwlVVI0uiOFg45YTM1TsdJNF/MF5OWqMwGVSMrLYVTE46j8TSM5mGU9MKtkQI9ZOx3wBhj + h/bbRNQb/ICMRaMvpELveYmQnQ4xBs6oBgHuvfTENcHoTAqjCXWTWtdKDQgyRuWCK3U27tZhsD/3 + xJXKH2/v98tlKqrSffpb9fTj+fN1IfmvgV83em/bQEWtxamfAX/CswszxkDzCjtDT3mhDKcLNWPA + XVlXqKlJDocVfKwgW8HsaraCI3w7fAz+t/8zqMFhUXuu+n56/HgqXJnSOrP2F/1BIbX029wh9+1/ + gCdjO+/Gp3WA+ttdgXWmspST+Yu6GRhP4m4enJ/SgJ32JBniaojPgj4h+L0nrPJC6hKddbK9Zyhs + Psc4TtP1JEogOAb/AAAA//8DAM1umOvwAgAA + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba2648fb176d-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:53 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=nGfgJdJZ_pAgme6BLaXdUvXt5eF_Va57hdGwO2EI0JM-1726089893-1.0.1.1-aiXuwj2qv5KPr7P1RKhnQdhPclQrNT8pJczWF7UO4GQEiUofEGZLUeMsjNSaqjn67bVPwISKBhXquEGSKNsz7Q; + path=/; expires=Wed, 11-Sep-24 21:54:53 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=Kgse9sWf7N1FmtSw9gZumAxV5yE3Fh0s1UZBElBJ4Aw-1726089893326-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - future-house-xr4tdh + openai-processing-ms: + - "252" + openai-version: + - "2020-10-01" + strict-transport-security: + - max-age=15552000; includeSubDomains; preload + x-ratelimit-limit-requests: + - "10000" + x-ratelimit-limit-tokens: + - "30000000" + x-ratelimit-remaining-requests: + - "9999" + x-ratelimit-remaining-tokens: + - "29999958" + x-ratelimit-reset-requests: + - 6ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_d244f47ad44e97122336c8d2683ec3f8 + status: + code: 200 + message: OK + - request: + body: + '{"agent_state": {"tools": [{"type": "function", "info": {"name": "print_story", + "description": "Print a story.", "parameters": {"type": "object", "properties": + {"story": {"description": "Story to print.", "title": "Story", "type": "string"}}, + "required": ["story"]}}}, {"type": "function", "info": {"name": "cast_float", + "description": "Cast the input argument x to a float.", "parameters": {"type": + "object", "properties": {"x": {"title": "X", "type": "string"}}, "required": + ["x"]}}}, {"type": "function", "info": {"name": "cast_int", "description": "Cast + the input argument x to an integer.", "parameters": {"type": "object", "properties": + {"x": {"title": "X", "type": "number"}}, "required": ["x"]}}}], "messages": + []}, "obs": [{"role": "user", "content": "Cast ''5.5'' to a float, then to an + integer, and finally use it to write a story of that many words."}], "training": + false}' + headers: + accept: + - "*/*" + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "882" + content-type: + - application/json + host: + - testserver + user-agent: + - python-httpx/0.27.2 + method: POST + uri: http://testserver/get_asv + response: + body: + string: + '[{"call_id":{"run_id":"acba9f93-749f-444e-aafa-f2d3f42e3035","fwd_id":"de61b0ce-b246-4323-b7ae-689ee49321f1"},"op_name":"_llm_call_op","op_class_name":"ldp.graph.common_ops.LLMCallOp","value":{"role":"assistant","content":null,"function_call":null,"tool_calls":[{"id":"call_PEMyQQ7cmgrzsElRISzZ9iaX","type":"function","function":{"arguments":"{\"x\": + \"5.5\"}","name":"cast_float"}}]}},{"tools":[{"type":"function","function":{"name":"print_story","description":"Print + a story.","parameters":{"type":"object","properties":{"story":{"description":"Story + to print.","title":"Story","type":"string"}},"required":["story"]}}},{"type":"function","function":{"name":"cast_float","description":"Cast + the input argument x to a float.","parameters":{"type":"object","properties":{"x":{"title":"X","type":"string"}},"required":["x"]}}},{"type":"function","function":{"name":"cast_int","description":"Cast + the input argument x to an integer.","parameters":{"type":"object","properties":{"x":{"title":"X","type":"number"}},"required":["x"]}}}],"messages":[{"role":"user","content":"Cast + ''5.5'' to a float, then to an integer, and finally use it to write a story + of that many words."},{"role":"assistant","content":null,"function_call":null,"tool_calls":[{"id":"call_PEMyQQ7cmgrzsElRISzZ9iaX","type":"function","function":{"arguments":"{\"x\": + \"5.5\"}","name":"cast_float"}}]}]},0.0]' + headers: + content-length: + - "1370" + content-type: + - application/json + status: + code: 200 + message: OK + - request: + body: + '{"messages": [{"role": "user", "content": "Cast ''5.5'' to a float, then + to an integer, and finally use it to write a story of that many words."}], "model": + "gpt-4o-2024-08-06", "temperature": 0.1, "tool_choice": "required", "tools": + [{"type": "function", "function": {"name": "print_story", "description": "Print + a story.", "parameters": {"type": "object", "properties": {"story": {"description": + "Story to print.", "title": "Story", "type": "string"}}, "required": ["story"]}}}, + {"type": "function", "function": {"name": "cast_float", "description": "Cast + the input argument x to a float.", "parameters": {"type": "object", "properties": + {"x": {"title": "X", "type": "string"}}, "required": ["x"]}}}, {"type": "function", + "function": {"name": "cast_int", "description": "Cast the input argument x to + an integer.", "parameters": {"type": "object", "properties": {"x": {"title": + "X", "type": "number"}}, "required": ["x"]}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "924" + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.44.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.44.1 + x-stainless-raw-response: + - "true" + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.5 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAA2xSXWvbMBR9968Q9zkutuOkjt9SOli3BTrYCu0yjCJfO25kXU2SWULIfy/+aOKG + 6sGIc3TuOT7S0WMMqhxSBmLLnai19Jfzx9un3V4+5D9WStzFX0zz63mVzOnl97clTFoFbV5RuHfV + jaBaS3QVqZ4WBrnDdmp4G82DZJEsph1RU46ylZXa+TH5URDFfpD4wXwQbqkSaCFlfzzGGDt23zai + ynEPKQsm70iN1vISIT0fYgwMyRYBbm1lHVcOJhdSkHKo2tSqkXJEOCKZCS7lxbhfx9H+0hOXMnt8 + +nrYheHdIvo32+ffEcMlrv7f/xz59aMPugtUNEqc+xnxZzy9MmMMFK+xN7QuKyRxd6VmDLgpmxqV + a5PDcQ37NaRrmN3M1nCCD4dP3mf7v6MaDBaN5XLoZ8BP58IlldrQxl71B0WlKrvNDHLb/QdYR7r3 + bn06B2g+3BVoQ7V2maMdqnZgOA37eXB5SiM2HkhHjssxPvOGhGAP1mGdFZUq0WhTdfcMhc7CeLrZ + JPEiEuCdvDcAAAD//wMAmBfOVfACAAA= + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba2a1cbc176d-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:53 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - future-house-xr4tdh + openai-processing-ms: + - "271" + openai-version: + - "2020-10-01" + strict-transport-security: + - max-age=15552000; includeSubDomains; preload + x-ratelimit-limit-requests: + - "10000" + x-ratelimit-limit-tokens: + - "30000000" + x-ratelimit-remaining-requests: + - "9999" + x-ratelimit-remaining-tokens: + - "29999958" + x-ratelimit-reset-requests: + - 6ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_9728da4b9ff43ba096f41d51f5693669 + status: + code: 200 + message: OK + - request: + body: + '{"agent_state": {"tools": [{"type": "function", "info": {"name": "print_story", + "description": "Print a story.", "parameters": {"type": "object", "properties": + {"story": {"description": "Story to print.", "title": "Story", "type": "string"}}, + "required": ["story"]}}}, {"type": "function", "info": {"name": "cast_float", + "description": "Cast the input argument x to a float.", "parameters": {"type": + "object", "properties": {"x": {"title": "X", "type": "string"}}, "required": + ["x"]}}}, {"type": "function", "info": {"name": "cast_int", "description": "Cast + the input argument x to an integer.", "parameters": {"type": "object", "properties": + {"x": {"title": "X", "type": "number"}}, "required": ["x"]}}}], "messages": + []}, "obs": [{"role": "user", "content": "Cast ''5.5'' to a float, then to an + integer, and finally use it to write a story of that many words."}], "training": + false}' + headers: + accept: + - "*/*" + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "882" + content-type: + - application/json + host: + - testserver + user-agent: + - python-httpx/0.27.2 + method: POST + uri: http://testserver/get_asv + response: + body: + string: + '[{"call_id":{"run_id":"937b3bc0-d39f-44f5-ae3a-ac33bbf9a8f8","fwd_id":"1324e9d6-12c8-441a-8b30-dc11fd8766a1"},"op_name":"_llm_call_op","op_class_name":"ldp.graph.common_ops.LLMCallOp","value":{"role":"assistant","content":null,"function_call":null,"tool_calls":[{"id":"call_PVHyk11B92q5xdKee1AeMwDQ","type":"function","function":{"arguments":"{\"x\": + \"5.5\"}","name":"cast_float"}}]}},{"tools":[{"type":"function","function":{"name":"print_story","description":"Print + a story.","parameters":{"type":"object","properties":{"story":{"description":"Story + to print.","title":"Story","type":"string"}},"required":["story"]}}},{"type":"function","function":{"name":"cast_float","description":"Cast + the input argument x to a float.","parameters":{"type":"object","properties":{"x":{"title":"X","type":"string"}},"required":["x"]}}},{"type":"function","function":{"name":"cast_int","description":"Cast + the input argument x to an integer.","parameters":{"type":"object","properties":{"x":{"title":"X","type":"number"}},"required":["x"]}}}],"messages":[{"role":"user","content":"Cast + ''5.5'' to a float, then to an integer, and finally use it to write a story + of that many words."},{"role":"assistant","content":null,"function_call":null,"tool_calls":[{"id":"call_PVHyk11B92q5xdKee1AeMwDQ","type":"function","function":{"arguments":"{\"x\": + \"5.5\"}","name":"cast_float"}}]}]},0.0]' + headers: + content-length: + - "1370" + content-type: + - application/json + status: + code: 200 + message: OK + - request: + body: + '{"messages": [{"role": "user", "content": "Cast ''5.5'' to a float, then + to an integer, and finally use it to write a story of that many words."}], "model": + "gpt-4o-2024-08-06", "temperature": 0.1, "tool_choice": "required", "tools": + [{"type": "function", "function": {"name": "print_story", "description": "Print + a story.", "parameters": {"type": "object", "properties": {"story": {"description": + "Story to print.", "title": "Story", "type": "string"}}, "required": ["story"]}}}, + {"type": "function", "function": {"name": "cast_float", "description": "Cast + the input argument x to a float.", "parameters": {"type": "object", "properties": + {"x": {"title": "X", "type": "string"}}, "required": ["x"]}}}, {"type": "function", + "function": {"name": "cast_int", "description": "Cast the input argument x to + an integer.", "parameters": {"type": "object", "properties": {"x": {"title": + "X", "type": "number"}}, "required": ["x"]}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "924" + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.44.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.44.1 + x-stainless-raw-response: + - "true" + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.5 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAAwAAAP//bFJNb6MwFLzzK6x3DhXQfHKr2kNXarM9bbttVsiYB6Fr/FzbqImi/PeV + gSY0Wh+QNeN5M4x9CBiDuoCUgdhyJxotw5v50+J59sNE610T/Xx+en1ZF3p/197er37fwsQrKH9H + 4b5UV4IaLdHVpHpaGOQO/dR4kcyj5Wq5mnZEQwVKL6u0C6cUJlEyDaNlGM0H4ZZqgRZS9hYwxtih + +/qIqsAdpCyafCENWssrhPR0iDEwJD0C3NraOq4cTM6kIOVQ+dSqlXJEOCKZCS7l2bhfh9H+3BOX + MvtoP4jfV4WO39d58vqZV2b7+JD8Gvn1o/e6C1S2Spz6GfEnPL0wYwwUb7A3tC4rJXF3oWYMuKna + BpXzyeGwgd0G0g3MrmYbOMK3w8fgf/s/oxoMlq3lcuhnwI+nwiVV2lBuL/qDsla13WYGue3+A6wj + 3Xt7n84B2m93BdpQo13m6C8qPzC+jvt5cH5KI3Y6kI4cl2N8FgwJwe6twyYra1Wh0abu7hlKnS0x + jheL/DqaQ3AM/gEAAP//AwD5mgcs8AIAAA== + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba2d1f6a176d-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:54 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - future-house-xr4tdh + openai-processing-ms: + - "345" + openai-version: + - "2020-10-01" + strict-transport-security: + - max-age=15552000; includeSubDomains; preload + x-ratelimit-limit-requests: + - "10000" + x-ratelimit-limit-tokens: + - "30000000" + x-ratelimit-remaining-requests: + - "9999" + x-ratelimit-remaining-tokens: + - "29999958" + x-ratelimit-reset-requests: + - 6ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_f9352ae0515ce462949f20bf757c6f4f + status: + code: 200 + message: OK + - request: + body: + '{"agent_state": {"tools": [{"type": "function", "info": {"name": "print_story", + "description": "Print a story.", "parameters": {"type": "object", "properties": + {"story": {"description": "Story to print.", "title": "Story", "type": "string"}}, + "required": ["story"]}}}, {"type": "function", "info": {"name": "cast_float", + "description": "Cast the input argument x to a float.", "parameters": {"type": + "object", "properties": {"x": {"title": "X", "type": "string"}}, "required": + ["x"]}}}, {"type": "function", "info": {"name": "cast_int", "description": "Cast + the input argument x to an integer.", "parameters": {"type": "object", "properties": + {"x": {"title": "X", "type": "number"}}, "required": ["x"]}}}], "messages": + []}, "obs": [{"role": "user", "content": "Cast ''5.5'' to a float, then to an + integer, and finally use it to write a story of that many words."}], "training": + false}' + headers: + accept: + - "*/*" + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "882" + content-type: + - application/json + host: + - testserver + user-agent: + - python-httpx/0.27.2 + method: POST + uri: http://testserver/get_asv + response: + body: + string: + '[{"call_id":{"run_id":"055641df-3d69-4714-931b-0e09fca5b501","fwd_id":"506cf576-8260-4da3-84eb-ce6d92a8d866"},"op_name":"_llm_call_op","op_class_name":"ldp.graph.common_ops.LLMCallOp","value":{"role":"assistant","content":null,"function_call":null,"tool_calls":[{"id":"call_quqoaHgdp1jNb2ZwbgrhML2V","type":"function","function":{"arguments":"{\"x\": + \"5.5\"}","name":"cast_float"}}]}},{"tools":[{"type":"function","function":{"name":"print_story","description":"Print + a story.","parameters":{"type":"object","properties":{"story":{"description":"Story + to print.","title":"Story","type":"string"}},"required":["story"]}}},{"type":"function","function":{"name":"cast_float","description":"Cast + the input argument x to a float.","parameters":{"type":"object","properties":{"x":{"title":"X","type":"string"}},"required":["x"]}}},{"type":"function","function":{"name":"cast_int","description":"Cast + the input argument x to an integer.","parameters":{"type":"object","properties":{"x":{"title":"X","type":"number"}},"required":["x"]}}}],"messages":[{"role":"user","content":"Cast + ''5.5'' to a float, then to an integer, and finally use it to write a story + of that many words."},{"role":"assistant","content":null,"function_call":null,"tool_calls":[{"id":"call_quqoaHgdp1jNb2ZwbgrhML2V","type":"function","function":{"arguments":"{\"x\": + \"5.5\"}","name":"cast_float"}}]}]},0.0]' + headers: + content-length: + - "1370" + content-type: + - application/json + status: + code: 200 + message: OK + - request: + body: + '{"messages": [{"role": "user", "content": "Cast ''5.5'' to a float, then + to an integer, and finally use it to write a story of that many words."}, {"role": + "assistant", "content": null, "function_call": null, "tool_calls": [{"id": "call_quqoaHgdp1jNb2ZwbgrhML2V", + "type": "function", "function": {"arguments": "{\"x\": \"5.5\"}", "name": "cast_float"}}]}, + {"role": "tool", "content": "5.5", "name": "cast_float", "tool_call_id": "call_quqoaHgdp1jNb2ZwbgrhML2V"}], + "model": "gpt-4o-2024-08-06", "temperature": 0.1, "tool_choice": "required", + "tools": [{"type": "function", "function": {"name": "print_story", "description": + "Print a story.", "parameters": {"type": "object", "properties": {"story": {"description": + "Story to print.", "title": "Story", "type": "string"}}, "required": ["story"]}}}, + {"type": "function", "function": {"name": "cast_float", "description": "Cast + the input argument x to a float.", "parameters": {"type": "object", "properties": + {"x": {"title": "X", "type": "string"}}, "required": ["x"]}}}, {"type": "function", + "function": {"name": "cast_int", "description": "Cast the input argument x to + an integer.", "parameters": {"type": "object", "properties": {"x": {"title": + "X", "type": "number"}}, "required": ["x"]}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "1240" + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.44.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.44.1 + x-stainless-raw-response: + - "true" + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.5 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAA2xS0WrjMBB891eIfY6L7XMSx29XelAoCQfpUY62GFmRHaWypEprmhDy74dsJ3HK + 6UGImd2d0UjHgBAQG8gJsC1F1hgZ/pz9nr8s1m7l9suD/rN+XK3+xs/7l8+sLiVMfIcud5zhueuO + 6cZIjkKrnmaWU+R+ajxPZlG2yBZpRzR6w6Vvqw2GqQ6TKEnDKAuj2dC41YJxBzl5DQgh5Njt3qLa + 8D3kJJqckYY7R2sO+aWIELBaegSoc8IhVQiTK8m0Qq68a9VKOSJQa1kwKuVVuF/H0fmaE5WySJhL + vpZrfGjTnaGz7dNz+ev+ax6P9PrRB9MZqlrFLvmM+AuefxMjBBRteC/osBA3dxkqqK3bhiv0vuH4 + Bvs3yKd30xPcFJ6C/53fRwFYXrWOyiGZAT9dopa6NlaX7ltyUAkl3LawnLruBuBQm17b63QK0N68 + EhirG4MF6g+u/MB4mvXz4PqJRmw6kKiRyhE+T4LBIbiDQ94UlVA1t8aK7oWhMkWc/ijLLF0kDIJT + 8A8AAP//AwB101uF6gIAAA== + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba3029e5176d-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:54 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - future-house-xr4tdh + openai-processing-ms: + - "264" + openai-version: + - "2020-10-01" + strict-transport-security: + - max-age=15552000; includeSubDomains; preload + x-ratelimit-limit-requests: + - "10000" + x-ratelimit-limit-tokens: + - "30000000" + x-ratelimit-remaining-requests: + - "9999" + x-ratelimit-remaining-tokens: + - "29999954" + x-ratelimit-reset-requests: + - 6ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_868539a9c38578e65ef1d51e7f9df4fb + status: + code: 200 + message: OK + - request: + body: + '{"agent_state": {"tools": [{"type": "function", "info": {"name": "print_story", + "description": "Print a story.", "parameters": {"type": "object", "properties": + {"story": {"description": "Story to print.", "title": "Story", "type": "string"}}, + "required": ["story"]}}}, {"type": "function", "info": {"name": "cast_float", + "description": "Cast the input argument x to a float.", "parameters": {"type": + "object", "properties": {"x": {"title": "X", "type": "string"}}, "required": + ["x"]}}}, {"type": "function", "info": {"name": "cast_int", "description": "Cast + the input argument x to an integer.", "parameters": {"type": "object", "properties": + {"x": {"title": "X", "type": "number"}}, "required": ["x"]}}}], "messages": + [{"role": "user", "content": "Cast ''5.5'' to a float, then to an integer, and + finally use it to write a story of that many words."}, {"role": "assistant", + "content": null, "function_call": null, "tool_calls": [{"id": "call_quqoaHgdp1jNb2ZwbgrhML2V", + "type": "function", "function": {"arguments": "{\"x\": \"5.5\"}", "name": "cast_float"}}]}]}, + "obs": [{"role": "tool", "content": "5.5", "name": "cast_float", "tool_call_id": + "call_quqoaHgdp1jNb2ZwbgrhML2V"}], "training": false}' + headers: + accept: + - "*/*" + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "1196" + content-type: + - application/json + host: + - testserver + user-agent: + - python-httpx/0.27.2 + method: POST + uri: http://testserver/get_asv + response: + body: + string: + '[{"call_id":{"run_id":"5b25839e-2950-495c-acb8-fb71249e2d05","fwd_id":"e0b1a912-9551-4f5d-b7ee-157883d8fbc4"},"op_name":"_llm_call_op","op_class_name":"ldp.graph.common_ops.LLMCallOp","value":{"role":"assistant","content":null,"function_call":null,"tool_calls":[{"id":"call_2cs2wMStDu4jpa6hKTbEBw71","type":"function","function":{"arguments":"{\"x\": + 5.5}","name":"cast_int"}}]}},{"tools":[{"type":"function","function":{"name":"print_story","description":"Print + a story.","parameters":{"type":"object","properties":{"story":{"description":"Story + to print.","title":"Story","type":"string"}},"required":["story"]}}},{"type":"function","function":{"name":"cast_float","description":"Cast + the input argument x to a float.","parameters":{"type":"object","properties":{"x":{"title":"X","type":"string"}},"required":["x"]}}},{"type":"function","function":{"name":"cast_int","description":"Cast + the input argument x to an integer.","parameters":{"type":"object","properties":{"x":{"title":"X","type":"number"}},"required":["x"]}}}],"messages":[{"role":"user","content":"Cast + ''5.5'' to a float, then to an integer, and finally use it to write a story + of that many words."},{"role":"assistant","content":null,"function_call":null,"tool_calls":[{"id":"call_quqoaHgdp1jNb2ZwbgrhML2V","type":"function","function":{"arguments":"{\"x\": + \"5.5\"}","name":"cast_float"}}]},{"role":"tool","content":"5.5","name":"cast_float","tool_call_id":"call_quqoaHgdp1jNb2ZwbgrhML2V"},{"role":"assistant","content":null,"function_call":null,"tool_calls":[{"id":"call_2cs2wMStDu4jpa6hKTbEBw71","type":"function","function":{"arguments":"{\"x\": + 5.5}","name":"cast_int"}}]}]},0.0]' + headers: + content-length: + - "1650" + content-type: + - application/json + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestLLMModel.test_model[claude-3-haiku-20240307].yaml b/tests/cassettes/TestLLMModel.test_model[claude-3-haiku-20240307].yaml new file mode 100644 index 00000000..aa17738d --- /dev/null +++ b/tests/cassettes/TestLLMModel.test_model[claude-3-haiku-20240307].yaml @@ -0,0 +1,61 @@ +interactions: + - request: + body: + '{"messages": [{"role": "user", "content": [{"type": "text", "text": "Hello, + how are you?"}]}], "system": [{"type": "text", "text": "Respond with single + words."}], "max_tokens": 4096, "model": "claude-3-haiku-20240307"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + anthropic-version: + - "2023-06-01" + connection: + - keep-alive + content-length: + - "218" + content-type: + - application/json + host: + - api.anthropic.com + user-agent: + - litellm/1.44.24 + method: POST + uri: https://api.anthropic.com/v1/messages + response: + body: + string: !!binary | + H4sIAAAAAAAAA0yO22rDMBBE/2We5eLcCNFjSEJ+oDRQilHkxRaWV653BS3G/x4cWsjTwJkLMyHU + sOilqcrVx/adxHetnC7j8dzce387XFsY6O9AS4pEXEMwGFNcgBMJoo4VBn2qKcLCR5drKjZF60KX + i3W53pabcg8Dn1iJFfZz+l9U+lm6T7G4BKY3zF8GommoRnKSGBbEdaV5ZPwZQt+Z2BMs5xgN8vOV + nRB4yFpp6ogFdnUwSFlf0W6eHwAAAP//AwBu9B8r8gAAAA== + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1adb64febe9800-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:47:34 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Robots-Tag: + - none + request-id: + - req_013F7JJtkufBc3MGej2SFWxA + via: + - 1.1 google + x-cloud-trace-context: + - 5a7bd3586c4b8aa6cf7dc15b4a10a79e + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestLLMModel.test_model[gpt-3.5-turbo].yaml b/tests/cassettes/TestLLMModel.test_model[gpt-3.5-turbo].yaml new file mode 100644 index 00000000..c6e0e986 --- /dev/null +++ b/tests/cassettes/TestLLMModel.test_model[gpt-3.5-turbo].yaml @@ -0,0 +1,96 @@ +interactions: + - request: + body: + '{"messages": [{"role": "system", "content": "Respond with single words."}, + {"role": "user", "content": "Hello, how are you?"}], "model": "gpt-3.5-turbo"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "153" + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.44.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.44.1 + x-stainless-raw-response: + - "true" + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.5 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAAwAAAP//VJBBawIxFITv+yvCO7virqzFvQkFD4W2UHtpKRKzzzWa5IXkLa2I/71k + XbW95DBfZjKTUyYE6AZqAWonWVlv8sXsdbWSRdBvy8PyyM9zsh/0+LRf+O+XdxglB232qPjqGiuy + 3iBrchesAkrGlFo8lLPJvCirqgeWGjTJ1nrOp+Mq5y5sKJ8UZTU4d6QVRqjFZyaEEKf+TB1dgz9Q + i8noqliMUbYI9e2SEBDIJAVkjDqydAyjO1TkGF1fe0nU/EUBt12UqZrrjBn08+0tQ60PtIkDv+lb + 7XTcrQPKSC7lRiYPPT1nQnz1m7p/NcEHsp7XTAd0KbAsL3Fw/8U7LAbGxNL88UyzoR7EY2S06612 + LQYfdL+vH3HOfgEAAP//AwBMSqZg3gEAAA== + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1adb68dfeb966f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:47:35 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - future-house-xr4tdh + openai-processing-ms: + - "94" + openai-version: + - "2020-10-01" + strict-transport-security: + - max-age=15552000; includeSubDomains; preload + x-ratelimit-limit-requests: + - "12000" + x-ratelimit-limit-tokens: + - "1000000" + x-ratelimit-remaining-requests: + - "11999" + x-ratelimit-remaining-tokens: + - "999969" + x-ratelimit-reset-requests: + - 5ms + x-ratelimit-reset-tokens: + - 1ms + x-request-id: + - req_59689a9a4b451bc51b25aa932438cde3 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestLLMModel.test_output_schema.yaml b/tests/cassettes/TestLLMModel.test_output_schema.yaml new file mode 100644 index 00000000..95d87ba6 --- /dev/null +++ b/tests/cassettes/TestLLMModel.test_output_schema.yaml @@ -0,0 +1,101 @@ +interactions: + - request: + body: + '{"messages": [{"role": "system", "content": "Respond following this JSON + schema:\n\n{\n \"properties\": {\n \"name\": {\n \"title\": \"Name\",\n \"type\": + \"string\"\n },\n \"age\": {\n \"title\": \"Age\",\n \"type\": + \"integer\"\n }\n },\n \"required\": [\n \"name\",\n \"age\"\n ],\n \"title\": + \"DummyOutputSchema\",\n \"type\": \"object\"\n}"}, {"role": "user", "content": + "My name is Claude and I am 1 year old. What is my name and age?"}], "model": + "gpt-3.5-turbo", "response_format": {"type": "json_object"}}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "559" + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.44.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.44.1 + x-stainless-raw-response: + - "true" + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.5 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAA1SQzW7CMBCE73mK1Z4TREghIbeqVXurekFV21TIJEswdWzLdgQI8e6VTfjpxYf5 + POMZHyMA5A2WgPWGubrTInmcvRfZ4evjk78U+vU5e9i+LXb73aIxOcsx9g612lLtLq5RrTotyHEl + z7g2xBz51DSfzMbFfD7JA+hUQ8LbWu2SbDRNXG9WKhmnk+ng3Chek8USviMAgGM4fUfZ0B5LGMcX + pSNrWUtYXi8BoFHCK8is5dYx6TC+wVpJRzLUPlYSoELJOqqwhAqfBOsbqjA+A9YGPa3k6T7B0Lq3 + zC+QvRCDfrpWEqrVRq3swK/6mktuN0tDzCrpn7dOaQz0FAH8hOn9vzWojeq0Wzr1S9IHpmlxzsPb + b9/RfIBOOSbu9GwaDQ3RHqyjbrnmsiWjDQ8/EXacoj8AAAD//wMANu8s3AgCAAA= + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1abafcea3c171a-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:25:27 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - future-house-xr4tdh + openai-processing-ms: + - "267" + openai-version: + - "2020-10-01" + strict-transport-security: + - max-age=15552000; includeSubDomains; preload + x-ratelimit-limit-requests: + - "12000" + x-ratelimit-limit-tokens: + - "1000000" + x-ratelimit-remaining-requests: + - "11999" + x-ratelimit-remaining-tokens: + - "999838" + x-ratelimit-reset-requests: + - 5ms + x-ratelimit-reset-tokens: + - 9ms + x-request-id: + - req_65355d90c1cb42732d3c85abb2413f94 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestLLMModel.test_text_image_message[claude-3-haiku-20240307].yaml b/tests/cassettes/TestLLMModel.test_text_image_message[claude-3-haiku-20240307].yaml new file mode 100644 index 00000000..9897ebd3 --- /dev/null +++ b/tests/cassettes/TestLLMModel.test_text_image_message[claude-3-haiku-20240307].yaml @@ -0,0 +1,62 @@ +interactions: + - request: + body: + '{"messages": [{"role": "user", "content": [{"type": "image", "source": + {"type": "base64", "media_type": "image/png", "data": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR4nO3NMQEAAAjDMMC/ZzDBvlRA01vZJvwHAAAAAAAAAAAAbx2jxAE/i2AjOgAAAABJRU5ErkJggg=="}}, + {"type": "text", "text": "What color is this square? Respond only with the color + name."}]}], "max_tokens": 4096, "model": "claude-3-haiku-20240307"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + anthropic-version: + - "2023-06-01" + connection: + - keep-alive + content-length: + - "411" + content-type: + - application/json + host: + - api.anthropic.com + user-agent: + - litellm/1.44.24 + method: POST + uri: https://api.anthropic.com/v1/messages + response: + body: + string: !!binary | + H4sIAAAAAAAAA0yOT2vCQBDFv8s7byBNBOlehV5KRUS9SAlLdqrBdTZmZool5LuXiIWeHvzeH96I + LsLjKqemfNnFj3U4L982h9V2d/ve1/b+RQMc9KenOUUi4URwGHKaQRDpRAMrHK45UoJHm4JFKuri + HLqLFVVZLcq6XMKhzazECn8c/xaV7nP3IR5bipg+HURz3wwUJDM8iGOjNjCehtDNiFuCZ0vJwR6f + /IiOe9NG84VY4KtXh2z6Hy2m6RcAAP//AwB6WGlZ8AAAAA== + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba3c6c959664-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:56 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Robots-Tag: + - none + request-id: + - req_01HzTrvjM4ny4Fa5TnY8n8pE + via: + - 1.1 google + x-cloud-trace-context: + - 4ab7e744703e1034c4b84f8d53549416 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestLLMModel.test_text_image_message[gpt-4-turbo].yaml b/tests/cassettes/TestLLMModel.test_text_image_message[gpt-4-turbo].yaml new file mode 100644 index 00000000..55c8ae2c --- /dev/null +++ b/tests/cassettes/TestLLMModel.test_text_image_message[gpt-4-turbo].yaml @@ -0,0 +1,98 @@ +interactions: + - request: + body: + '{"messages": [{"role": "user", "content": [{"type": "image_url", "image_url": + {"url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR4nO3NMQEAAAjDMMC/ZzDBvlRA01vZJvwHAAAAAAAAAAAAbx2jxAE/i2AjOgAAAABJRU5ErkJggg=="}}, + {"type": "text", "text": "What color is this square? Respond only with the color + name."}]}], "model": "gpt-4-turbo"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "362" + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.44.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.44.1 + x-stainless-raw-response: + - "true" + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.5 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAA1SQS0/DMBCE7/kV1p4blIT0kdyQSrkgBEVwQShykk3i4tiWvUGgqv8dOU0fXPYw + n2d21vuAMRA15AyqjlPVGxneLZ6X5dP29n39+F12r5t487LbZe6eHtbxG8y8Q5c7rOjkuql0bySS + 0OqIK4uc0KfGy2QRrbJVlo2g1zVKb2sNhWlIgy11mERJGkZpGGWTu9OiQgc5+wgYY2w/Tt9T1fgD + OYtmJ6VH53iLkJ8fMQZWS68Ad0444opgdoGVVoRqrL7F+ppYbAbHfTs1SDnph/MqqVtjdekmftYb + oYTrCovcaeVjHWkDIz0EjH2OJw3/WoKxujdUkP5C5QOT5fyYB5efvNB4YqSJy2vTIpgKgvt1hH3R + CNWiNVYcD2xMkSXzuEnnNW8gOAR/AAAA//8DANYbuh/uAQAA + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba4488fdd035-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:25:00 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - future-house-xr4tdh + openai-processing-ms: + - "1891" + openai-version: + - "2020-10-01" + strict-transport-security: + - max-age=15552000; includeSubDomains; preload + x-ratelimit-limit-requests: + - "10000" + x-ratelimit-limit-tokens: + - "2000000" + x-ratelimit-remaining-requests: + - "9999" + x-ratelimit-remaining-tokens: + - "1999203" + x-ratelimit-reset-requests: + - 6ms + x-ratelimit-reset-tokens: + - 23ms + x-request-id: + - req_70379d0b10dbfd23826f5319eb7c48f4 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestLLMModel.test_text_image_message[gpt-4o-mini-2024-07-18].yaml b/tests/cassettes/TestLLMModel.test_text_image_message[gpt-4o-mini-2024-07-18].yaml new file mode 100644 index 00000000..d73d01a6 --- /dev/null +++ b/tests/cassettes/TestLLMModel.test_text_image_message[gpt-4o-mini-2024-07-18].yaml @@ -0,0 +1,98 @@ +interactions: + - request: + body: + '{"messages": [{"role": "user", "content": [{"type": "image_url", "image_url": + {"url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR4nO3NMQEAAAjDMMC/ZzDBvlRA01vZJvwHAAAAAAAAAAAAbx2jxAE/i2AjOgAAAABJRU5ErkJggg=="}}, + {"type": "text", "text": "What color is this square? Respond only with the color + name."}]}], "model": "gpt-4o-mini-2024-07-18"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "373" + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.44.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.44.1 + x-stainless-raw-response: + - "true" + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.5 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAA1SQP2/CMBTE93wKyzOpkjRAyNaBpVNF/wytqshxXoKL7WfZD9QK8d0rhxTK4uF+ + vvOdjwljXHW8ZlxuBUnjdPqweFoKef+46iQ9Z6+bl3YXDsq9rQ/v+ZrPogPbL5D057qTaJwGUmjP + WHoQBDE1XxaLrFpVq2oEBjvQ0TY4SktMjbIqLbKiTLNlmleTe4tKQuA1+0gYY+w4nrGn7eCb1yyb + /SkGQhAD8PpyiTHuUUeFixBUIGGJz65QoiWwY/UNdP+Jh34fRGxn91pP+unylMbBeWzDxC96r6wK + 28aDCGhjbCB0fKSnhLHPcdL+piV3Ho2jhnAHNgZW82LaxK9fecX5xAhJ6BtXnkwVefgJBKbplR3A + O6/OE3vXzEso+rIqW+DJKfkFAAD//wMAfqvd//ABAAA= + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba436f88aaa6-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:58 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - future-house-xr4tdh + openai-processing-ms: + - "895" + openai-version: + - "2020-10-01" + strict-transport-security: + - max-age=15552000; includeSubDomains; preload + x-ratelimit-limit-requests: + - "30000" + x-ratelimit-limit-tokens: + - "150000000" + x-ratelimit-remaining-requests: + - "29999" + x-ratelimit-remaining-tokens: + - "149999202" + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_93eab71f1f2d07d3a7cb0fbe4fe21df1 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestMemoryAgent.test_agent_grad.yaml b/tests/cassettes/TestMemoryAgent.test_agent_grad.yaml new file mode 100644 index 00000000..b5605916 --- /dev/null +++ b/tests/cassettes/TestMemoryAgent.test_agent_grad.yaml @@ -0,0 +1,107 @@ +interactions: + - request: + body: + '{"messages": [{"role": "user", "content": "Write a 5 word story via print_story"}], + "model": "gpt-4o-2024-08-06", "temperature": 0.1, "tool_choice": "required", + "tools": [{"type": "function", "function": {"name": "print_story", "description": + "Print a story.", "parameters": {"type": "object", "properties": {"story": {"description": + "Story to print.", "title": "Story", "type": "string"}}, "required": ["story"]}}}, + {"type": "function", "function": {"name": "cast_float", "description": "Cast + the input argument x to a float.", "parameters": {"type": "object", "properties": + {"x": {"title": "X", "type": "string"}}, "required": ["x"]}}}, {"type": "function", + "function": {"name": "cast_int", "description": "Cast the input argument x to + an integer.", "parameters": {"type": "object", "properties": {"x": {"title": + "X", "type": "number"}}, "required": ["x"]}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "862" + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.44.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.44.1 + x-stainless-raw-response: + - "true" + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.5 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAAwAAAP//bFLLbptAFN3zFaO7NhEQ5GB2abJIValJlVZtU1doGA8w8bw6c0mLLf97 + xSM2scICje6Z8+Bc9gEhIDaQE2ANRaasDK+XD1ffl1RnP9SXP3efnm825f3t14fPP7v7eAuLnmHK + Z87wlXXBjLKSozB6hJnjFHmvGl8lyyhbZat0AJTZcNnTaothasIkStIwysJoOREbIxj3kJNfASGE + 7Id3H1Fv+D/ISbR4nSjuPa055MdLhIAzsp8A9V54pBphcQKZ0ch1n1q3Us4ANEYWjEp5Mh6f/ex8 + 6olKWWw/PFX+Yym76+VO7dqXp+7l7tvj7nbmN0p3dghUtZod+5nhx3l+ZkYIaKoGrnVCY+HRuO6M + TghQV7eKa+yjw34Nw7U15Gt4bLXnSP42wlvuPPGcOY6eoCFa1A1erOEAb+QOwXvn37OmHK9aT+VU + 4TQ/HHciTW2dKf1ZxVAJLXxTOE798Kl9Sjt69z6DA7Rv1gnWGWWxQLPluheM42TUg9PfNkOzCUSD + VM7ml1EwJQTfeeSqqISuuRtKHTZjizi9LMssXSUMgkPwHwAA//8DAJjMFkUTAwAA + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba2d2d9e1601-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:54 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - future-house-xr4tdh + openai-processing-ms: + - "368" + openai-version: + - "2020-10-01" + strict-transport-security: + - max-age=15552000; includeSubDomains; preload + x-ratelimit-limit-requests: + - "10000" + x-ratelimit-limit-tokens: + - "30000000" + x-ratelimit-remaining-requests: + - "9999" + x-ratelimit-remaining-tokens: + - "29999973" + x-ratelimit-reset-requests: + - 6ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_fa05087f5334c0d12f533106097751dd + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestMemoryAgent.test_dummyenv[gpt-4o-mini-2024-07-18].yaml b/tests/cassettes/TestMemoryAgent.test_dummyenv[gpt-4o-mini-2024-07-18].yaml new file mode 100644 index 00000000..2433e801 --- /dev/null +++ b/tests/cassettes/TestMemoryAgent.test_dummyenv[gpt-4o-mini-2024-07-18].yaml @@ -0,0 +1,121 @@ +interactions: + - request: + body: + '{"messages": [{"role": "user", "content": "Write a 5 word story via print_story"}, + {"role": "user", "content": "\n\nThese are relevant + memories from previous attempts at similar tasks, along with the action taken + and the discounted cumulative reward from that action. A negative reward is + failure, a positive reward is success.\n\n \n Write + a 5 word story and call print\n \n \n Tool request message + \"Stories that start with ''Once there was'' are always interesting.\" for tool + calls: print_story(story=''Once there were was nothing.'') [id=c92b617a-7dcb-466e-a3ed-f61ec0590cb3]\n \n \n 1000.0\n \n\n\nConsidering + the memories, choose the next action."}], "model": "gpt-4o-mini-2024-07-18", + "temperature": 0.1, "tool_choice": "required", "tools": [{"type": "function", + "function": {"name": "print_story", "description": "Print a story.", "parameters": + {"type": "object", "properties": {"story": {"description": "Story to print.", + "title": "Story", "type": "string"}}, "required": ["story"]}}}, {"type": "function", + "function": {"name": "cast_float", "description": "Cast the input argument x + to a float.", "parameters": {"type": "object", "properties": {"x": {"title": + "X", "type": "string"}}, "required": ["x"]}}}, {"type": "function", "function": + {"name": "cast_int", "description": "Cast the input argument x to an integer.", + "parameters": {"type": "object", "properties": {"x": {"title": "X", "type": + "number"}}, "required": ["x"]}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "1578" + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.44.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.44.1 + x-stainless-raw-response: + - "true" + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.5 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAA2xSW2+bMBR+51dY5zlUhFwgvE3t01qtm6ZJrZYJueYAbnybbZpGUf77ZEgDjcYD + ss7n78J3OEaEAK+gIMBa6pk0Iv6y/p79un9z7frp4W2Xfnv4encrs2Sxa5+Nhllg6JdXZP6DdcO0 + NAI912qAmUXqMajOs3Sd5Jt8k/aA1BWKQGuMj5c6llzxOE3SZZxk8Tw/s1vNGTooyO+IEEKO/Tvk + VBW+Q0GS2cdEonO0QSgulwgBq0WYAHWOO0+Vh9kIMq08qhBddUJMAK+1KBkVYjQenuPkPJZFhSif + HpsEX/O/99mev//Uq2a1P/yo2fPEb5A+mD5Q3Sl2KWmCX+bFlRkhoKjsucZy5UvntT1c0QkBaptO + ovIhOhy30F/bQrGFR8WQ+BYtkj11RGnfctXcbOEEn0RO0f/Ofyb9WKw7R8W5uPP8dNmE0I2x+sVd + FQs1V9y1pUXq+g8M2czgHXx6B+g+LRGM1dL40usdqiCY5stBD8YfbUTn6zPotadinC+SJDonBHdw + HmVZc9Wg7avs92HKZb6oFpsqX2UQnaJ/AAAA//8DAL8BsbwOAwAA + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba248f8bcf2f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:52 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=viZdDbMlPim18zXA2VSk3Ps42oEX6OxE7sBVhT13fDE-1726089892-1.0.1.1-zUP54gGNaVXKUnFpkubX4TG1ojkxbIbWQOfOy8T728MOP.DLhzYV8D1zfbxiBdPPlq4wuFK3QDaHmdSZAywPOg; + path=/; expires=Wed, 11-Sep-24 21:54:52 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=o_nGJtTs1cXWPFPetWlXSw9gJf7WeFSTun8Ozgl__Gg-1726089892934-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - future-house-xr4tdh + openai-processing-ms: + - "255" + openai-version: + - "2020-10-01" + strict-transport-security: + - max-age=15552000; includeSubDomains; preload + x-ratelimit-limit-requests: + - "30000" + x-ratelimit-limit-tokens: + - "150000000" + x-ratelimit-remaining-requests: + - "29999" + x-ratelimit-remaining-tokens: + - "149999807" + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_c0ed70d37c948634bae4f2d44f0d8ec1 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestMultipleCompletionLLMModel.test_output_schema.yaml b/tests/cassettes/TestMultipleCompletionLLMModel.test_output_schema.yaml new file mode 100644 index 00000000..17bce6a7 --- /dev/null +++ b/tests/cassettes/TestMultipleCompletionLLMModel.test_output_schema.yaml @@ -0,0 +1,102 @@ +interactions: + - request: + body: + '{"messages": [{"role": "system", "content": "Respond following this JSON + schema:\n\n{\n \"properties\": {\n \"name\": {\n \"title\": \"Name\",\n \"type\": + \"string\"\n },\n \"age\": {\n \"title\": \"Age\",\n \"type\": + \"integer\"\n }\n },\n \"required\": [\n \"name\",\n \"age\"\n ],\n \"title\": + \"DummyOutputSchema\",\n \"type\": \"object\"\n}"}, {"role": "user", "content": + "My name is Claude and I am 1 year old. What is my name and age?"}], "model": + "gpt-3.5-turbo", "n": 2, "response_format": {"type": "json_object"}}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "567" + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.44.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.44.1 + x-stainless-raw-response: + - "true" + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.5 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAA9ySzU7DMBCE73kKa88JalraJrlFcEBwAHFBgqDKdTapwbEte8OPqr47cpr+IN6A + iw/zedYztrcRYyBrKBiIDSfRWZWUi4fls13cNHmW3Tflx5NIy+s7uqXHMv+EODjM+g0FHVwXwnRW + IUmj91g45IRharqcLiZZnuXLAXSmRhVsraVkdjFPqHdrk0zS6Xx0bowU6KFgLxFjjG2HNWTUNX5B + wSbxQenQe94iFMdNjIEzKijAvZeeuCaIT1AYTaiH2NtKM1aB5h1WULAKrhTva6wg3gPeDnpa6d35 + BIdN73looHulRn13jKRMa51Z+5Ef9UZq6Tcrh9wbHY73ZCxEZ+Y/PdP/1jNi7HV44v5XG7DOdJZW + ZN5Rh4Fpmu3nwelXnejscoRkiKsz13wajQnBf3vCbtVI3aKzTg43MfTYRT8AAAD//wMAt0bHfvAC + AAA= + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba40e9e2ce5c-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:57 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - future-house-xr4tdh + openai-processing-ms: + - "342" + openai-version: + - "2020-10-01" + strict-transport-security: + - max-age=15552000; includeSubDomains; preload + x-ratelimit-limit-requests: + - "12000" + x-ratelimit-limit-tokens: + - "1000000" + x-ratelimit-remaining-requests: + - "11999" + x-ratelimit-remaining-tokens: + - "999877" + x-ratelimit-reset-requests: + - 5ms + x-ratelimit-reset-tokens: + - 7ms + x-request-id: + - req_134069e4a1883fe754d46858e6824763 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestMultipleCompletionLLMModel.test_text_image_message[gpt-4o-mini-2024-07-18].yaml b/tests/cassettes/TestMultipleCompletionLLMModel.test_text_image_message[gpt-4o-mini-2024-07-18].yaml new file mode 100644 index 00000000..b38dfabc --- /dev/null +++ b/tests/cassettes/TestMultipleCompletionLLMModel.test_text_image_message[gpt-4o-mini-2024-07-18].yaml @@ -0,0 +1,98 @@ +interactions: + - request: + body: + '{"messages": [{"role": "user", "content": [{"type": "image_url", "image_url": + {"url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR4nO3NMQEAAAjDMMC/ZzDBvlRA01vZJvwHAAAAAAAAAAAAbx2jxAE/i2AjOgAAAABJRU5ErkJggg=="}}, + {"type": "text", "text": "What color is this square? Respond only with the color + name."}]}], "model": "gpt-4o-mini-2024-07-18", "n": 2}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "381" + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.44.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.44.1 + x-stainless-raw-response: + - "true" + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.5 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAA9SSy2rDMBBF9/4KMeu42K6TON7lC1Ia6INSgmKPbbWyRkgTaBvy70WO86Jf0I0W + 9+iOjpD2kRCgaigFVJ3kqrc6Xs4e5q/L5/VPkqpVu6q9vufkpVt31BZPMAkN2n5gxafWXUW91ciK + zBFXDiVjmJrOs1lSLIrFbAA91ahDrbUc5xT3yqg4S7I8TuZxWoztjlSFHkrxFgkhxH5Yg6ep8QtK + kUxOSY/eyxahPG8SAhzpkID0XnmWhmFygRUZRjOoP2J9TRw2Oy+DndlpPeaH81GaWuto60d+zhtl + lO82DqUnE8Z6JgvRVfmPf/pf/CMh3ocn2d1YgnXUW94wfaIJA4tpNr4JXL7CBWcjY2Kpb1pZNCqC + //aM/aZRpkVnnTpesbGbaY5Zkxf5FiE6RL8AAAD//wMAIMaR3bACAAA= + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba3908cdcfed-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:57 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - future-house-xr4tdh + openai-processing-ms: + - "1107" + openai-version: + - "2020-10-01" + strict-transport-security: + - max-age=15552000; includeSubDomains; preload + x-ratelimit-limit-requests: + - "30000" + x-ratelimit-limit-tokens: + - "150000000" + x-ratelimit-remaining-requests: + - "29999" + x-ratelimit-remaining-tokens: + - "149999187" + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_157e90ed4d9d67bdf5b00544b0abd92c + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestParallelism.test_SimpleAgent_can_parallel_call.yaml b/tests/cassettes/TestParallelism.test_SimpleAgent_can_parallel_call.yaml new file mode 100644 index 00000000..698ac465 --- /dev/null +++ b/tests/cassettes/TestParallelism.test_SimpleAgent_can_parallel_call.yaml @@ -0,0 +1,117 @@ +interactions: + - request: + body: + '{"messages": [{"role": "user", "content": "You are the president of the + United States of America. Please move both hands at the same time, and then + smile and wave."}], "model": "gpt-4o-2024-08-06", "temperature": 0.1, "tool_choice": + "required", "tools": [{"type": "function", "function": {"name": "move_left_hand", + "description": "Move your left hand forward or backward.", "parameters": {"type": + "object", "properties": {"distance": {"description": "Integer distance to move + (mm), where forward is positive.", "title": "Distance", "type": "integer"}}, + "required": ["distance"]}}}, {"type": "function", "function": {"name": "move_right_hand", + "description": "Move your right hand forward or backward.", "parameters": {"type": + "object", "properties": {"distance": {"description": "Integer distance to move + (mm), where forward is positive.", "title": "Distance", "type": "integer"}}, + "required": ["distance"]}}}, {"type": "function", "function": {"name": "smile_and_wave", + "description": "Smile and wave.", "parameters": {"type": "object", "properties": + {}, "required": []}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "1075" + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.44.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.44.1 + x-stainless-raw-response: + - "true" + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.5 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAA7RTy26bQBTd8xWjuzYVxpQQdmlVWUqlPuSmjdpEaBguj3pemRn8qOV/rwDHEK+y + CQs03MM5557L5eARAk0BKQFWU8eE5v5N/E38WqxuK9bmH4vlenn/+SZZ76PlTr3/DbOOofK/yNwz + 6x1TQnN0jZIDzAxSh53q/CqMg+swWsQ9IFSBvKNV2vmR8sMgjPwg8YP4RKxVw9BCSv54hBBy6O9d + i7LAHaQkmD1XBFpLK4T0/BIhYBTvKkCtbayj0sFsBJmSDmXXtWw5nwBOKZ4xyvloPFyHyXmcE+U8 + 235q75J8U16p9c+8etrG3/P6dsO/TPwG6b3uGypbyc7zmeDnenphRghIKnquUBvMOJYuq6ksLhQI + AWqqVqB0XfdweICij87woZt/EBzhBeE4eTrOXhV239bsDv/hrtzGH1b3T1/d6ofYxsGbhTVNVb9B + 2vP5cfLxDZatpfy0Fd7FYICrShuV24utgbKRja0zg9T2gcA6pQfvzqd3gPbFhoI2SmiXObVG2QnO + o3DQg/EHGtEoOoFOOconrCT2Th2C3VuHIisbWaHRpum3G0qdzaNFnifRdcjAO3r/AQAA//8DALMf + x7zmAwAA + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1af8420ad4ce34-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 22:07:17 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=CDVprdEjDku6eW5.oHwxi34qNPUf0Z_Eg_JuiJbDLtk-1726092437-1.0.1.1-1nqiNifcK_hRnyxsIjyxVSNiqxzrvlIRLAtBU7nG0XC7x3MPzeKOHw40ez8MY6MD7xZqIYJAV8ZhGEHacRZDRA; + path=/; expires=Wed, 11-Sep-24 22:37:17 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=ir88uyXDCyNVW34YUDv_88AguuE7avD_4h5x1Ioe_04-1726092437874-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - future-house-xr4tdh + openai-processing-ms: + - "900" + openai-version: + - "2020-10-01" + strict-transport-security: + - max-age=15552000; includeSubDomains; preload + x-ratelimit-limit-requests: + - "10000" + x-ratelimit-limit-tokens: + - "30000000" + x-ratelimit-remaining-requests: + - "9999" + x-ratelimit-remaining-tokens: + - "29999953" + x-ratelimit-reset-requests: + - 6ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_e5e1609cebb3838c268b3b12cb0dd98d + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestReActAgent.test_agent_grad[claude-3-haiku-20240307].yaml b/tests/cassettes/TestReActAgent.test_agent_grad[claude-3-haiku-20240307].yaml new file mode 100644 index 00000000..a9638d75 --- /dev/null +++ b/tests/cassettes/TestReActAgent.test_agent_grad[claude-3-haiku-20240307].yaml @@ -0,0 +1,75 @@ +interactions: + - request: + body: + '{"messages": [{"role": "user", "content": [{"type": "text", "text": "Write + a 5 word story via print_story"}]}], "temperature": 0.1, "stop_sequences": ["Observation:"], + "system": [{"type": "text", "text": "Answer the following questions as best + you can. You have access to the following tools:\n\nNAME: print_story\n\nSYNOPSIS:\n print_story(string + story)\n\nDESCRIPTION:\n Print a story.\n\nPARAMETERS:\n story (string): + Story to print.\n\nNAME: cast_float\n\nSYNOPSIS:\n cast_float(string x)\n\nDESCRIPTION:\n Cast + the input argument x to a float.\n\nPARAMETERS:\n x (string): No description + provided.\n\nNAME: cast_int\n\nSYNOPSIS:\n cast_int(number x)\n\nDESCRIPTION:\n Cast + the input argument x to an integer.\n\nPARAMETERS:\n x (number): No description + provided.\n\nUse the following format:\n\nThought: you should always think about + what to do\nAction: the action to take, should be one of [print_story, cast_float, + cast_int]\nAction Input: comma separated list of inputs to action as python + tuple\nObservation: the result of the action\n... (this Thought/Action/Action + Input/Observation can repeat N times)\n\nExample:\n\nThought: I need to use + the get_weather tool\nAction: get_weather\nAction Input: \"New York\", 7\nObservation: + The 7 day forecast for New York is [...]"}], "max_tokens": 4096, "model": "claude-3-haiku-20240307"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + anthropic-version: + - "2023-06-01" + connection: + - keep-alive + content-length: + - "1366" + content-type: + - application/json + host: + - api.anthropic.com + user-agent: + - litellm/1.44.24 + method: POST + uri: https://api.anthropic.com/v1/messages + response: + body: + string: !!binary | + H4sIAAAAAAAAA1SQT2sCMRDFv8owpxaibLUq5NbSP9gevBRa6MoSN8NuWJ2kyUQr4ncvu8WDp+H9 + mHmPNyd0FjXuUlMVd6/71D3z4/y9frIhbj7Dy9sXz1ChHAP1W5SSaQgVRr/tgUnJJTEsqHDnLW1R + Y7012dJoOmqN6/JoUkzui2mxQIW1ZyEW1N+ni6PQb387DI0frc9NKxqWwEQWxMMhOiEwMIODjxaS + +Hgcl/xQi/OsIUTHUg30AmHJIYuGmxJXXBPk4BkMiNuRAmkJiO24xNuS8bxWmMSHKpJJnlH/q0Q/ + mbjue15rjatNorg3QzgqzMM79Aldn1mJ74gT6mmxUOizXLH5+fwHAAD//wMANd2UgG0BAAA= + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba247cd324df-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:53 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Robots-Tag: + - none + request-id: + - req_01AP39pgvBs5GinrCu265JDv + via: + - 1.1 google + x-cloud-trace-context: + - 137e17d4feda2dee4ed60d2340ac0f00 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestReActAgent.test_agent_grad[gpt-4-turbo].yaml b/tests/cassettes/TestReActAgent.test_agent_grad[gpt-4-turbo].yaml new file mode 100644 index 00000000..dc345dc3 --- /dev/null +++ b/tests/cassettes/TestReActAgent.test_agent_grad[gpt-4-turbo].yaml @@ -0,0 +1,118 @@ +interactions: + - request: + body: + '{"messages": [{"role": "system", "content": "Answer the following questions + as best you can. You have access to the following tools:\n\nNAME: print_story\n\nSYNOPSIS:\n print_story(string + story)\n\nDESCRIPTION:\n Print a story.\n\nPARAMETERS:\n story (string): + Story to print.\n\nNAME: cast_float\n\nSYNOPSIS:\n cast_float(string x)\n\nDESCRIPTION:\n Cast + the input argument x to a float.\n\nPARAMETERS:\n x (string): No description + provided.\n\nNAME: cast_int\n\nSYNOPSIS:\n cast_int(number x)\n\nDESCRIPTION:\n Cast + the input argument x to an integer.\n\nPARAMETERS:\n x (number): No description + provided.\n\nUse the following format:\n\nThought: you should always think about + what to do\nAction: the action to take, should be one of [print_story, cast_float, + cast_int]\nAction Input: comma separated list of inputs to action as python + tuple\nObservation: the result of the action\n... (this Thought/Action/Action + Input/Observation can repeat N times)\n\nExample:\n\nThought: I need to use + the get_weather tool\nAction: get_weather\nAction Input: \"New York\", 7\nObservation: + The 7 day forecast for New York is [...]"}, {"role": "user", "content": "Write + a 5 word story via print_story"}], "model": "gpt-4-turbo", "stop": ["Observation:"], + "temperature": 0.1}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "1289" + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.44.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.44.1 + x-stainless-raw-response: + - "true" + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.5 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAA1SRQWvbQBCF7/oVw55asIysOLalWxIoBBooofTQuoj17kjaWNpZdkdN3OD/XlaW + Hfeyh/fNG968fU8AhNGiBKFayap3XXq3+rb+ces13T/8fHre/JVe71V7//z0+qVQYhYdtHtBxWfX + XFHvOmRD9oSVR8kYty7W+SrbFJviZgQ9aeyirXGcLlMe/I7SPMuXabZMs2Jyt2QUBlHCrwQA4H18 + Y06r8U2UkM3OSo8hyAZFeRkCEJ66qAgZggksLYvZB1RkGe0Y/XtLQ9NyCY9gETUwwSk4SNh5gzUE + Jn+AIRjbAL5Jxd0BavMH4ZW8DvOtvVPx6BKcN5arcfwswqN1A5fwaSu+UmDY4yFATYPVMFiNHgLV + cr4Vn7f2Op/HeggydmSHrpv04+XgjhrnaRcmftFrY01oK48ykI3HBSYnRnpMAH6PxQ7/dSWcp95x + xbRHGxfmq/Vpn/j4zytaTJCJZXetr5IpoQiHwNhXtbEN+rGTGKV21aLO85uFXBa3Ijkm/wAAAP// + AwCnrkw8dQIAAA== + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba2bdbe5ce90-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:55 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=6q5OK8YOw4TpDZicGrlwpFodhg6BV25taNZ0U3Pm7nA-1726089895-1.0.1.1-iqAphWihSlws3LFtAGDmAlw6MS5MnYsAbg7y53FvZuRRf0bmCAmgZszJYiFn15AK5T0r1bpkbyHS1mKiIYLwWw; + path=/; expires=Wed, 11-Sep-24 21:54:55 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=Tk6wEhPWEpyORtlkLjrTQSFWntY37MYAwouqprtCAhU-1726089895219-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - future-house-xr4tdh + openai-processing-ms: + - "1244" + openai-version: + - "2020-10-01" + strict-transport-security: + - max-age=15552000; includeSubDomains; preload + x-ratelimit-limit-requests: + - "10000" + x-ratelimit-limit-tokens: + - "2000000" + x-ratelimit-remaining-requests: + - "9999" + x-ratelimit-remaining-tokens: + - "1999710" + x-ratelimit-reset-requests: + - 6ms + x-ratelimit-reset-tokens: + - 8ms + x-request-id: + - req_e8d97f9cde79348fbaed1da39eb1d6e6 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestReActAgent.test_react_dummyenv[claude-3-haiku-20240307].yaml b/tests/cassettes/TestReActAgent.test_react_dummyenv[claude-3-haiku-20240307].yaml new file mode 100644 index 00000000..b1e6d24a --- /dev/null +++ b/tests/cassettes/TestReActAgent.test_react_dummyenv[claude-3-haiku-20240307].yaml @@ -0,0 +1,75 @@ +interactions: + - request: + body: + '{"messages": [{"role": "user", "content": [{"type": "text", "text": "Write + a 5 word story via print_story"}]}], "temperature": 0.1, "stop_sequences": ["Observation:"], + "system": [{"type": "text", "text": "Answer the following questions as best + you can. You have access to the following tools:\n\nNAME: print_story\n\nSYNOPSIS:\n print_story(string + story)\n\nDESCRIPTION:\n Print a story.\n\nPARAMETERS:\n story (string): + Story to print.\n\nNAME: cast_float\n\nSYNOPSIS:\n cast_float(string x)\n\nDESCRIPTION:\n Cast + the input argument x to a float.\n\nPARAMETERS:\n x (string): No description + provided.\n\nNAME: cast_int\n\nSYNOPSIS:\n cast_int(number x)\n\nDESCRIPTION:\n Cast + the input argument x to an integer.\n\nPARAMETERS:\n x (number): No description + provided.\n\nUse the following format:\n\nThought: you should always think about + what to do\nAction: the action to take, should be one of [print_story, cast_float, + cast_int]\nAction Input: comma separated list of inputs to action as python + tuple\nObservation: the result of the action\n... (this Thought/Action/Action + Input/Observation can repeat N times)\n\nExample:\n\nThought: I need to use + the get_weather tool\nAction: get_weather\nAction Input: \"New York\", 7\nObservation: + The 7 day forecast for New York is [...]"}], "max_tokens": 4096, "model": "claude-3-haiku-20240307"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + anthropic-version: + - "2023-06-01" + connection: + - keep-alive + content-length: + - "1366" + content-type: + - application/json + host: + - api.anthropic.com + user-agent: + - litellm/1.44.24 + method: POST + uri: https://api.anthropic.com/v1/messages + response: + body: + string: !!binary | + H4sIAAAAAAAAA1SQQWvCQBCF/8owpxZWiVor7K0eSj0UKXiwNCVsk8Esmpm4O1trg/+9JMWDp+F9 + zLzHmw59hRabuCuyycvkfeObbXuk+Wn5u1m+bV+f5w4N6rmlfotidDtCg0EOPXAx+qiOFQ02UtEB + LZYHlyoazUa18/s0mmbTh2yWLdBgKazEivajuzoq/fS3w7C4qSXtarWwAiaqQAVOwSuBgzmcJFQQ + VcJ5nPNTqV7YQhs8azHQK4QVt0kt3OW45pIgtcLgQH1DBrQmIK7GOd7njJdPg1GlLQK5KIz2X0U6 + JuKy73mrLa6/IoVvN4SjwTS8w3bo+8xCZU8c0c6yhUFJesMeL5c/AAAA//8DAFHvxlNtAQAA + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba247b2ace8c-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:53 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Robots-Tag: + - none + request-id: + - req_01J5QEgPTjLNb21napT1yMju + via: + - 1.1 google + x-cloud-trace-context: + - 8d6cc4291c877477bb67bbcb245affdf + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestReActAgent.test_react_dummyenv[gpt-4-turbo].yaml b/tests/cassettes/TestReActAgent.test_react_dummyenv[gpt-4-turbo].yaml new file mode 100644 index 00000000..83e3c296 --- /dev/null +++ b/tests/cassettes/TestReActAgent.test_react_dummyenv[gpt-4-turbo].yaml @@ -0,0 +1,118 @@ +interactions: + - request: + body: + '{"messages": [{"role": "system", "content": "Answer the following questions + as best you can. You have access to the following tools:\n\nNAME: print_story\n\nSYNOPSIS:\n print_story(string + story)\n\nDESCRIPTION:\n Print a story.\n\nPARAMETERS:\n story (string): + Story to print.\n\nNAME: cast_float\n\nSYNOPSIS:\n cast_float(string x)\n\nDESCRIPTION:\n Cast + the input argument x to a float.\n\nPARAMETERS:\n x (string): No description + provided.\n\nNAME: cast_int\n\nSYNOPSIS:\n cast_int(number x)\n\nDESCRIPTION:\n Cast + the input argument x to an integer.\n\nPARAMETERS:\n x (number): No description + provided.\n\nUse the following format:\n\nThought: you should always think about + what to do\nAction: the action to take, should be one of [print_story, cast_float, + cast_int]\nAction Input: comma separated list of inputs to action as python + tuple\nObservation: the result of the action\n... (this Thought/Action/Action + Input/Observation can repeat N times)\n\nExample:\n\nThought: I need to use + the get_weather tool\nAction: get_weather\nAction Input: \"New York\", 7\nObservation: + The 7 day forecast for New York is [...]"}, {"role": "user", "content": "Write + a 5 word story via print_story"}], "model": "gpt-4-turbo", "stop": ["Observation:"], + "temperature": 0.1}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "1289" + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.44.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.44.1 + x-stainless-raw-response: + - "true" + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.5 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAA1SRT2+bQBDF73yK0Z5ayViAXdtwy6GHtK6SQ/8c6gotMMAmsLPeHZrYkb97tRjb + 6YXD++17evN4CwCEqkQGomwll73pwrvV4/pnvP/24/jrc7/ZD/Lh+Ljdf3kqtl8fjmLmHVQ8YckX + 17yk3nTIivQZlxYlo0+N18kq2qSbdDGCnirsvK0xHC5DHmxBYRIlyzBahlE6uVtSJTqRwe8AAOBt + /PqeusJXkUE0uyg9OicbFNn1EYCw1HlFSOeUY6lZzG6wJM2ox+rfWxqaljO4B41YAROci4OEwiqs + wTHZA5SkfZDSDVAN+CpL7g5Qq78IL2QrN9/pu9Ifn4GxSnM+2i4i3GszcAYfdmJLjuEZD24GNQ26 + Ao0vYCS3br4TH3f6fU+L9eCk30oPXTfpp+vhHTXGUuEmftVrpZVrc4vSkfZHOiYjRnoKAP6MAw// + bSaMpd5wzvSM2gcmq/U5T9z+640u4gkysezeudJNMDUU7uAY+7xWukE7buKr1CaP6yRZxHKZfhLB + KfgHAAD//wMAB+eXzX0CAAA= + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba2adb61986a-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:54 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=k6LGjHHIkVhEp6QnlyAXgEkCJanPkbZhZz4SVCHpmUk-1726089894-1.0.1.1-FZzGbppBKvd5I5uz.viWzOBlJbBwRTLJU1pCYSKAte9ZKV4V7j.b0e.ZkE3iD22LMWH1BfyidS5LEwOm6VByBQ; + path=/; expires=Wed, 11-Sep-24 21:54:54 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=JlAl4r6feqcQx1xq3RgOKZV5ZMaj3KeoVnGAkAW_oX4-1726089894996-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - future-house-xr4tdh + openai-processing-ms: + - "1281" + openai-version: + - "2020-10-01" + strict-transport-security: + - max-age=15552000; includeSubDomains; preload + x-ratelimit-limit-requests: + - "10000" + x-ratelimit-limit-tokens: + - "2000000" + x-ratelimit-remaining-requests: + - "9999" + x-ratelimit-remaining-tokens: + - "1999710" + x-ratelimit-reset-requests: + - 6ms + x-ratelimit-reset-tokens: + - 8ms + x-request-id: + - req_56c6fc69f2afd0b3df14ae79de95f1dc + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestSimpleAgent.test_agent_grad[claude-3-haiku-20240307].yaml b/tests/cassettes/TestSimpleAgent.test_agent_grad[claude-3-haiku-20240307].yaml new file mode 100644 index 00000000..ba623fb5 --- /dev/null +++ b/tests/cassettes/TestSimpleAgent.test_agent_grad[claude-3-haiku-20240307].yaml @@ -0,0 +1,72 @@ +interactions: + - request: + body: + '{"messages": [{"role": "user", "content": [{"type": "text", "text": "Write + a 5 word story via print_story"}]}], "temperature": 0.1, "tools": [{"name": + "print_story", "description": "Print a story.", "input_schema": {"type": "object", + "properties": {"story": {"description": "Story to print.", "title": "Story", + "type": "string"}}, "required": ["story"]}}, {"name": "cast_float", "description": + "Cast the input argument x to a float.", "input_schema": {"type": "object", + "properties": {"x": {"title": "X", "type": "string"}}, "required": ["x"]}}, + {"name": "cast_int", "description": "Cast the input argument x to an integer.", + "input_schema": {"type": "object", "properties": {"x": {"title": "X", "type": + "number"}}, "required": ["x"]}}], "tool_choice": {"type": "any"}, "max_tokens": + 4096, "model": "claude-3-haiku-20240307"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + anthropic-beta: + - tools-2024-05-16 + anthropic-version: + - "2023-06-01" + connection: + - keep-alive + content-length: + - "825" + content-type: + - application/json + host: + - api.anthropic.com + user-agent: + - litellm/1.44.24 + method: POST + uri: https://api.anthropic.com/v1/messages + response: + body: + string: !!binary | + H4sIAAAAAAAAA1SQW0vDQBCF/0qY562k6UXZt0J9MSXgDQsiYU2mMU0ym+7MqiHkv8u2CPo4Z845 + fJwR6hI0dFzl8fzhybnl9susuk3yIrdyeE8P2yMokKHH4EJmUyEocLYNgmGuWQwJKOhsiS1oKFrj + S5wtZh+mbvwsiZNlvIivQUFhSZAE9Ov42yjWtrnnUHnmCLfP43l2ujlJWmX32e64a57vskez36eg + gEwXcr2rSXIW64YQpd4L6BEugoZN+Ykk3qGLGLHhSBwa9g5VdKip5MgTfvdYCJbR0XpHOFzBNL2p + 0NDnwWzpP975wXjySAWCJt+2Cvx5Dj1eCHKxDRKDXq0TBdbLX225nqYfAAAA//8DAP317yttAQAA + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba247bffcf27-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:53 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Robots-Tag: + - none + request-id: + - req_01M7Ex1HkXPXVfPGUAXSmnrx + via: + - 1.1 google + x-cloud-trace-context: + - 8fcecb13f13232d5f633d00dec0fbbad + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestSimpleAgent.test_agent_grad[gpt-4o-mini-2024-07-18].yaml b/tests/cassettes/TestSimpleAgent.test_agent_grad[gpt-4o-mini-2024-07-18].yaml new file mode 100644 index 00000000..b61ff104 --- /dev/null +++ b/tests/cassettes/TestSimpleAgent.test_agent_grad[gpt-4o-mini-2024-07-18].yaml @@ -0,0 +1,113 @@ +interactions: + - request: + body: + '{"messages": [{"role": "user", "content": "Write a 5 word story via print_story"}], + "model": "gpt-4o-mini-2024-07-18", "temperature": 0.1, "tool_choice": "required", + "tools": [{"type": "function", "function": {"name": "print_story", "description": + "Print a story.", "parameters": {"type": "object", "properties": {"story": {"description": + "Story to print.", "title": "Story", "type": "string"}}, "required": ["story"]}}}, + {"type": "function", "function": {"name": "cast_float", "description": "Cast + the input argument x to a float.", "parameters": {"type": "object", "properties": + {"x": {"title": "X", "type": "string"}}, "required": ["x"]}}}, {"type": "function", + "function": {"name": "cast_int", "description": "Cast the input argument x to + an integer.", "parameters": {"type": "object", "properties": {"x": {"title": + "X", "type": "number"}}, "required": ["x"]}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "867" + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.44.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.44.1 + x-stainless-raw-response: + - "true" + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.5 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAA2xSy46bMBTd8xXWXYcR5MVjF6mLWUw70y5mWjUVcsyFeMb4IttUpVH+vTIwCROV + BbLu8XlwLqeAMZAl5AzEkTvRtCrcbZ+SZ+3sj3tKn76/RN3uUX1+2TzL+LiJYOEZdHhF4d5Zd4Ka + VqGTpEdYGOQOvWqcLLdRmqXZagAaKlF5Wt26cE1hI7UMl9FyHUZJGKcT+0hSoIWc/QwYY+w0vH1O + XeIfyFm0eJ80aC2vEfLLJcbAkPIT4NZK67h2sLiCgrRD7aPrTqkZ4IhUIbhSV+PxOc3O17K4UsWX + +sFs/37Nsj7bJjb9dngU2S7OPs38Rum+HQJVnRaXkmb4ZZ7fmDEGmjcDtzVSu8I6Mv0NnTHgpu4a + 1M5Hh9Mehmt7yPfwQNaxN+wXrCQyrCKDv9EwochiebeHM3zQOgf/O/+a1WSw6ixXU3/T/HxZiKK6 + NXSwN/1CJbW0x8Igt8N3+ojt6O19BgfoPuwSWkNN6wpHb6i9YBwvRz24/m8zNJ1AR46r2XwVBVNC + sL112BSV1DWaodFhLW2xTlflKivTTQLBOfgHAAD//wMAjgCXzxUDAAA= + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba2bcb73fa9e-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:54 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=FY9zJJk.AkvvBFb40KqpYxb.ksCTGQRszXXDeJ_Q7Ow-1726089894-1.0.1.1-fpfVV9Y7c_H5canwMeaOeEuupAKBaszki0DTAc_YeGtTXINXi6ghzWJsgCwZCKnG58iqk4sATa2Hr_k3AscLFA; + path=/; expires=Wed, 11-Sep-24 21:54:54 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=BCIddIQXcROP.EJte0kXuTtO67IB_JZ5yiMJ1P0vRJQ-1726089894188-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - future-house-xr4tdh + openai-processing-ms: + - "262" + openai-version: + - "2020-10-01" + strict-transport-security: + - max-age=15552000; includeSubDomains; preload + x-ratelimit-limit-requests: + - "30000" + x-ratelimit-limit-tokens: + - "150000000" + x-ratelimit-remaining-requests: + - "29999" + x-ratelimit-remaining-tokens: + - "149999973" + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_3b78d727d925adeb6e81fc5c6aff7a21 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestSimpleAgent.test_dummyenv[claude-3-haiku-20240307].yaml b/tests/cassettes/TestSimpleAgent.test_dummyenv[claude-3-haiku-20240307].yaml new file mode 100644 index 00000000..21ac7c87 --- /dev/null +++ b/tests/cassettes/TestSimpleAgent.test_dummyenv[claude-3-haiku-20240307].yaml @@ -0,0 +1,73 @@ +interactions: + - request: + body: + '{"messages": [{"role": "user", "content": [{"type": "text", "text": "Write + a 5 word story via print_story"}]}], "temperature": 0.1, "tools": [{"name": + "print_story", "description": "Print a story.", "input_schema": {"type": "object", + "properties": {"story": {"description": "Story to print.", "title": "Story", + "type": "string"}}, "required": ["story"]}}, {"name": "cast_float", "description": + "Cast the input argument x to a float.", "input_schema": {"type": "object", + "properties": {"x": {"title": "X", "type": "string"}}, "required": ["x"]}}, + {"name": "cast_int", "description": "Cast the input argument x to an integer.", + "input_schema": {"type": "object", "properties": {"x": {"title": "X", "type": + "number"}}, "required": ["x"]}}], "tool_choice": {"type": "any"}, "max_tokens": + 4096, "model": "claude-3-haiku-20240307"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + anthropic-beta: + - tools-2024-05-16 + anthropic-version: + - "2023-06-01" + connection: + - keep-alive + content-length: + - "825" + content-type: + - application/json + host: + - api.anthropic.com + user-agent: + - litellm/1.44.24 + method: POST + uri: https://api.anthropic.com/v1/messages + response: + body: + string: !!binary | + H4sIAAAAAAAAA1SQUUvDQBCE/0rY54ukaa14b6W2FMSgWPVBJBzJto1J9uLtXmwJ+e9yLYI+7uzM + 8DEDVCVoaHmfJ5O328cs29wfFt364bnftq7f3333oEBOHQYXMps9ggJnmyAY5orFkICC1pbYgIai + Mb7EeBofTFX7OE3SWTJNbkBBYUmQBPT78Nso1ja551B55gi3z5PJ61PdrV6O2Wq93NDB7LZFlpol + KCDThlznKpKcxbpTiFLnBfQAF0HDouyRxDt0ESPWHIlDw96hinYVlRx5wmOHhWAZfVrvCE9XMI4f + KjR0eTBb+o93fjB+eaQCQZNvGgX+PIceLgS52BqJQV/PUwXWy19tNh/HHwAAAP//AwBX1dzRbQEA + AA== + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba247c0ccf5d-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:53 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Robots-Tag: + - none + request-id: + - req_01VrQhCWEqKNRaxQ2vKLTXpH + via: + - 1.1 google + x-cloud-trace-context: + - 2f73b217496c2bc21b328bf1a748a629 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestSimpleAgent.test_dummyenv[gpt-4o-mini-2024-07-18].yaml b/tests/cassettes/TestSimpleAgent.test_dummyenv[gpt-4o-mini-2024-07-18].yaml new file mode 100644 index 00000000..7761efc5 --- /dev/null +++ b/tests/cassettes/TestSimpleAgent.test_dummyenv[gpt-4o-mini-2024-07-18].yaml @@ -0,0 +1,113 @@ +interactions: + - request: + body: + '{"messages": [{"role": "user", "content": "Write a 5 word story via print_story"}], + "model": "gpt-4o-mini-2024-07-18", "temperature": 0.1, "tool_choice": "required", + "tools": [{"type": "function", "function": {"name": "print_story", "description": + "Print a story.", "parameters": {"type": "object", "properties": {"story": {"description": + "Story to print.", "title": "Story", "type": "string"}}, "required": ["story"]}}}, + {"type": "function", "function": {"name": "cast_float", "description": "Cast + the input argument x to a float.", "parameters": {"type": "object", "properties": + {"x": {"title": "X", "type": "string"}}, "required": ["x"]}}}, {"type": "function", + "function": {"name": "cast_int", "description": "Cast the input argument x to + an integer.", "parameters": {"type": "object", "properties": {"x": {"title": + "X", "type": "number"}}, "required": ["x"]}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - "867" + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.44.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.44.1 + x-stainless-raw-response: + - "true" + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.5 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAA2xSTW+bQBC98ytWczaRjWnA3Fo1lVr54FRRqqiu0AYGvM2ys90d0riW/3vER2xi + lQNazdv3wRsOgRCgSsgEFDvJRWN1+PF6k/yIv9zd3iDLm4cNf//6eW3+3mtW+h/MOgY9/saC31hX + BTVWIysyA1w4lIyd6iKJrufpKl3FPdBQibqj1ZbDmMJGGRVG8ygO50m4SEf2jlSBHjLxMxBCiEP/ + 7nKaEl8gE/PZ26RB72WNkJ0uCQGOdDcB6b3yLA3D7AwWZBhNF920Wk8AJtJ5IbU+Gw/PYXI+lyW1 + zj85Hd29LJ9v/WYt7xP98Oeb9r7dTfwG6b3tA1WtKU4lTfDTPLswEwKMbHqudcpw7pnc/oIuBEhX + tw0a7qLDYQv9tS1kW1iTZ/GE+5koiZyoyOEzOlFo8lhebeEI77SOwf/OvyY1OaxaL/XY3zg/nhai + qbaOHv1Fv1Apo/wudyh9/51dRDt4dz69A7TvdgnWUWM5Z3pC0wkuFtGgB+f/bYKmI8jEUk/my3kw + JgS/94xNXilTo+sb7ddi8zhdlstVmX5IIDgGrwAAAP//AwB3Fgx6FQMAAA== + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba2c8fdbcf29-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:54 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=BwmSS43mmarya7_ibOS0g5eAoldYYWja.1i8yk_em38-1726089894-1.0.1.1-EIKFNI5MxGS3DXhWn8H7o.sCuigPgNp4hjyUYUmhs3_JoJj6UCuCrcwRZR9p.a4KsairNDaiDZ7Zp5k7pcuUTQ; + path=/; expires=Wed, 11-Sep-24 21:54:54 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=WTfbxZPAnf1ED3HCRks6o.bsMfHgxin_NmBR09BuOf4-1726089894817-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - future-house-xr4tdh + openai-processing-ms: + - "784" + openai-version: + - "2020-10-01" + strict-transport-security: + - max-age=15552000; includeSubDomains; preload + x-ratelimit-limit-requests: + - "30000" + x-ratelimit-limit-tokens: + - "150000000" + x-ratelimit-remaining-requests: + - "29999" + x-ratelimit-remaining-tokens: + - "149999973" + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_62f34426de9f766cee3cf0f4b99743e4 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/test_reflect_module.yaml b/tests/cassettes/test_reflect_module.yaml new file mode 100644 index 00000000..46f7af9d --- /dev/null +++ b/tests/cassettes/test_reflect_module.yaml @@ -0,0 +1,67 @@ +interactions: + - request: + body: + '{"messages": [{"role": "user", "content": [{"type": "text", "text": "\n I + am happy. How do I feel?\n\n\n You are sad.\n"}]}], + "temperature": 0, "system": [{"type": "text", "text": "Consider a proposed response + based on context. Reflect on the response within tags then conclude + with a possibly revised response within tags."}], "max_tokens": + 4096, "model": "claude-3-haiku-20240307"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + anthropic-version: + - "2023-06-01" + connection: + - keep-alive + content-length: + - "452" + content-type: + - application/json + host: + - api.anthropic.com + user-agent: + - litellm/1.44.24 + method: POST + uri: https://api.anthropic.com/v1/messages + response: + body: + string: !!binary | + H4sIAAAAAAAAA3RRX0sjQQz/KiHPU69XtXJL8Qv4Jr6IK2W6k+7MuZuMk4xtKf3uxy7KycE9BX5/ + E3LGFLDBUfvt8udjDs8P6/e17fpjXJ9ud4f08DuiQztlmlSk6ntCh0WGCfCqSc2zocNRAg3YYDf4 + GmhxvYg+vdXFarm6WV4v79BhJ2zEhs3L+SvR6Dh559HgxqLUPtp9y0+RoJBmYSVo8Vkq+EKgPrQI + QUiBxWD01kWwSDBnHw1ykY8UKDg4xNRFUPNGCha9zbpMRYUhKUSf8+kKpiKfc5FckrdvpQepQ4Ad + gcmUvk9l/G+Mg51XCiA8s4n3UkZvSRj69EF81fLmx9/jWt7sE/th8VV23/J04Z5o+NxrMvyjwcur + QzXJ20JehbFB4rC1Whg/CaX3StwRNlyHwWGd39WcMXGutjV5I1Zs7lYOpdp3aP3rcvkDAAD//wMA + xRSOPQwCAAA= + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8c1aba490fb367bf-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 11 Sep 2024 21:24:59 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Robots-Tag: + - none + request-id: + - req_01BiuspyQPWq2rsnSvTuaQKJ + via: + - 1.1 google + x-cloud-trace-context: + - 3c185f043e8a4a8ce7ea8911547ea7dd + status: + code: 200 + message: OK +version: 1 diff --git a/tests/conftest.py b/tests/conftest.py index dfee3ed5..3424c16f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,6 @@ import os import random +from typing import Any import numpy as np import pytest @@ -8,6 +9,8 @@ from ldp.utils import configure_log_levels +from . import CASSETTES_DIR + IN_GITHUB_ACTIONS: bool = os.getenv("GITHUB_ACTIONS") == "true" @@ -35,3 +38,18 @@ def set_seed(seed: int | None) -> None: def fixture_seed_zero() -> None: """Set a 0 seed to minimize the chances of test flakiness.""" set_seed(0) + + +OPENAI_API_KEY_HEADER = "authorization" +ANTHROPIC_API_KEY_HEADER = "x-api-key" + + +@pytest.fixture(scope="session", name="vcr_config") +def fixture_vcr_config() -> dict[str, Any]: + return { + "filter_headers": [OPENAI_API_KEY_HEADER, ANTHROPIC_API_KEY_HEADER, "cookie"], + "record_mode": "once", + "match_on": ["method", "host", "path", "query"], + "allow_playback_repeats": True, + "cassette_library_dir": str(CASSETTES_DIR), + } diff --git a/tests/test_agents.py b/tests/test_agents.py index 195b6579..a0351615 100644 --- a/tests/test_agents.py +++ b/tests/test_agents.py @@ -121,9 +121,7 @@ class TestSimpleAgent: "model_name", [CILLMModelNames.ANTHROPIC.value, CILLMModelNames.OPENAI.value] ) @pytest.mark.asyncio - @pytest.mark.flaky( # Rerun if LLM call does not return expected result - reruns=3, only_on=[AssertionError] - ) + @pytest.mark.vcr async def test_dummyenv(self, dummy_env: DummyEnv, model_name: str) -> None: obs, tools = await dummy_env.reset() @@ -157,9 +155,7 @@ async def test_dummyenv(self, dummy_env: DummyEnv, model_name: str) -> None: "model_name", [CILLMModelNames.ANTHROPIC.value, CILLMModelNames.OPENAI.value] ) @pytest.mark.asyncio - @pytest.mark.flaky( # Rerun if LLM call does not return expected result - reruns=3, only_on=[AssertionError] - ) + @pytest.mark.vcr async def test_agent_grad(self, dummy_env: DummyEnv, model_name: str) -> None: obs, tools = await dummy_env.reset() @@ -210,9 +206,7 @@ class TestMemoryAgent: # # On 5/14/2024, claude 3 opus would not follow its past memories @pytest.mark.parametrize("model_name", [CILLMModelNames.OPENAI.value]) @pytest.mark.asyncio - @pytest.mark.flaky( # Rerun if LLM call does not return expected result - reruns=3, only_on=[AssertionError] - ) + @pytest.mark.vcr async def test_dummyenv(self, dummy_env: DummyEnv, model_name: str) -> None: obs, tools = await dummy_env.reset() @@ -256,9 +250,7 @@ async def test_dummyenv(self, dummy_env: DummyEnv, model_name: str) -> None: raise RuntimeError("Could not find LLMCallOp in compute graph") @pytest.mark.asyncio - @pytest.mark.flaky( # Rerun if LLM call does not return expected result - reruns=3, only_on=[AssertionError] - ) + @pytest.mark.vcr async def test_agent_grad(self, dummy_env: DummyEnv) -> None: obs, tools = await dummy_env.reset() @@ -306,9 +298,7 @@ class TestReActAgent: "model_name", [CILLMModelNames.ANTHROPIC.value, "gpt-4-turbo"] ) @pytest.mark.asyncio - @pytest.mark.flaky( # Rerun if LLM call does not return expected result - reruns=3, only_on=[AssertionError] - ) + @pytest.mark.vcr async def test_react_dummyenv(self, dummy_env: DummyEnv, model_name: str) -> None: obs, tools = await dummy_env.reset() agent = ReActAgent(llm_model={"model": model_name, "temperature": 0.1}) @@ -377,9 +367,7 @@ def test_agent_op_naming(self) -> None: "model_name", [CILLMModelNames.ANTHROPIC.value, "gpt-4-turbo"] ) @pytest.mark.asyncio - @pytest.mark.flaky( # Rerun if LLM call does not return expected result - reruns=3, only_on=[AssertionError] - ) + @pytest.mark.vcr async def test_agent_grad(self, dummy_env: DummyEnv, model_name: str) -> None: obs, tools = await dummy_env.reset() @@ -568,9 +556,7 @@ async def test_complex_system_prompt( class TestHTTPAgentClient: @patch.dict("os.environ", {"AUTH_TOKEN": "stub"}) @pytest.mark.asyncio - @pytest.mark.flaky( # Rerun if LLM call does not return expected result - reruns=3, only_on=[AssertionError] - ) + @pytest.mark.vcr async def test_lifecycle(self, dummy_env: DummyEnv) -> None: obs, tools = await dummy_env.reset() # Let's turn the prompt to require multiple steps diff --git a/tests/test_envs.py b/tests/test_envs.py index 2cfa9950..ef1c9c9c 100644 --- a/tests/test_envs.py +++ b/tests/test_envs.py @@ -79,6 +79,7 @@ def smile_and_wave(state: DummyEnvState) -> None: class TestParallelism: @pytest.mark.asyncio + @pytest.mark.vcr async def test_SimpleAgent_can_parallel_call(self) -> None: env = ParallelizedDummyEnv() obs, tools = await env.reset() @@ -127,13 +128,7 @@ async def test_exec_tool_calls_handling(self, model_name: str) -> None: # 2. Well, it looks like both Anthropic and OpenAI don't like DIY-style # (using a bare Message) because they expect a tool call ID and tool name - # APIConnectionError is for a LiteLLM bug: https://github.com/BerriAI/litellm/issues/4348 - # TODO: remove litellm.APIConnectionError catch after release of - # https://github.com/BerriAI/litellm/commit/5e893ed13e87bc1ff5cfa198bae6faec3ad4af05 - # (will happen when litellm>1.40.22) - with pytest.raises( - (litellm.BadRequestError, litellm.APIConnectionError), match="400" - ): + with pytest.raises(litellm.BadRequestError, match="invalid"): await agent.get_asv(agent_state, obs) # 3. Alright, let's check the agent doesn't blow up if we use a diff --git a/tests/test_llms.py b/tests/test_llms.py index 747ff970..6cc9726c 100644 --- a/tests/test_llms.py +++ b/tests/test_llms.py @@ -71,6 +71,7 @@ async def test_achat(model_name: str) -> None: @pytest.mark.parametrize( "model_name", [CILLMModelNames.OPENAI.value, CILLMModelNames.ANTHROPIC.value] ) +@pytest.mark.flaky(reruns=3, only_on=[litellm.exceptions.APIConnectionError]) @pytest.mark.asyncio async def test_tools(dummy_env: DummyEnv, model_name: str) -> None: model = LLMModel(name=model_name) @@ -232,7 +233,7 @@ def play(move: int | None) -> None: assert result.messages[0].tool_calls[0].function.arguments["move"] is None @pytest.mark.asyncio - @pytest.mark.flaky(reruns=3, only_on=[AssertionError]) + @pytest.mark.vcr async def test_output_schema(self) -> None: model = self.MODEL_CLS(name="gpt-3.5-turbo", config=self.DEFAULT_CONFIG) messages = [ @@ -252,7 +253,7 @@ async def test_output_schema(self) -> None: @pytest.mark.parametrize("model_name", [CILLMModelNames.OPENAI.value]) @pytest.mark.asyncio - @pytest.mark.flaky(reruns=3, only_on=[AssertionError]) + @pytest.mark.vcr async def test_text_image_message(self, model_name: str) -> None: model = self.MODEL_CLS(name=model_name, config=self.DEFAULT_CONFIG) @@ -292,6 +293,7 @@ async def call_model(self, model: LLMModel, *args, **kwargs) -> list[LLMResult]: "model_name", [CILLMModelNames.ANTHROPIC.value, "gpt-3.5-turbo"] ) @pytest.mark.asyncio + @pytest.mark.vcr async def test_model(self, model_name: str) -> None: await super().test_model(model_name) @@ -319,9 +321,10 @@ async def test_output_type_rejected_validation(self) -> None: class InstructionList(BaseModel): instructions: list[str] = Field(description="list of instructions") - model = LLMModel(name=CILLMModelNames.ANTHROPIC.value) + model = self.MODEL_CLS(name=CILLMModelNames.ANTHROPIC.value) with pytest.raises( - litellm.APIError, match="anthropic does not support parameters" + litellm.UnsupportedParamsError, + match="anthropic does not support parameters", ): await model.call( [Message(content="What are three things I should do today?")], @@ -333,6 +336,6 @@ class InstructionList(BaseModel): [CILLMModelNames.ANTHROPIC.value, "gpt-4-turbo", CILLMModelNames.OPENAI.value], ) @pytest.mark.asyncio - @pytest.mark.flaky(reruns=3, only_on=[AssertionError]) + @pytest.mark.vcr async def test_text_image_message(self, model_name: str) -> None: await super().test_text_image_message(model_name) diff --git a/tests/test_modules.py b/tests/test_modules.py index 5ef93ba5..5234f4ca 100644 --- a/tests/test_modules.py +++ b/tests/test_modules.py @@ -19,6 +19,7 @@ @pytest.mark.asyncio +@pytest.mark.vcr async def test_reflect_module() -> None: config = ReflectModuleConfig( llm_model={"model": CILLMModelNames.ANTHROPIC.value, "temperature": 0} diff --git a/uv.lock b/uv.lock index 39f87442..ce45f243 100644 --- a/uv.lock +++ b/uv.lock @@ -513,16 +513,16 @@ wheels = [ [[package]] name = "fastapi" -version = "0.114.0" +version = "0.114.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "starlette" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/20/1b/fb621a3bab915ac1c9ad06943eb5a2b2aa01cd63228d524bd45261278787/fastapi-0.114.0.tar.gz", hash = "sha256:9908f2a5cc733004de6ca5e1412698f35085cefcbfd41d539245b9edf87b73c1", size = 295297 } +sdist = { url = "https://files.pythonhosted.org/packages/40/92/601de32e6af54c29667785bb0bba0a3f7fd77ccffc85e65d038264bd61ff/fastapi-0.114.1.tar.gz", hash = "sha256:1d7bbbeabbaae0acb0c22f0ab0b040f642d3093ca3645f8c876b6f91391861d8", size = 295377 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/80/17037f322c280efbc623e341358d38d0299c6ee899d619a879b3593aa6da/fastapi-0.114.0-py3-none-any.whl", hash = "sha256:fee75aa1b1d3d73f79851c432497e4394e413e1dece6234f68d3ce250d12760a", size = 94013 }, + { url = "https://files.pythonhosted.org/packages/51/7d/68b632b717938a50d59c800ecd1f889dc3c37e337a1eb2c8be80f164fbb9/fastapi-0.114.1-py3-none-any.whl", hash = "sha256:5d4746f6e4b7dff0b4f6b6c6d5445645285f662fe75886e99af7ee2d6b58bb3e", size = 94049 }, ] [[package]] @@ -735,14 +735,14 @@ wheels = [ [[package]] name = "importlib-metadata" -version = "8.4.0" +version = "8.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "zipp" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/bd/fa8ce65b0a7d4b6d143ec23b0f5fd3f7ab80121078c465bc02baeaab22dc/importlib_metadata-8.4.0.tar.gz", hash = "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5", size = 54320 } +sdist = { url = "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", size = 55304 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/14/362d31bf1076b21e1bcdcb0dc61944822ff263937b804a79231df2774d28/importlib_metadata-8.4.0-py3-none-any.whl", hash = "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1", size = 26269 }, + { url = "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", size = 26514 }, ] [[package]] @@ -866,6 +866,33 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/15/81/296b1e25c43db67848728cdab34ac3eb5c5cbb4955ceb3f51ae60d4a5e3d/jiter-0.5.0-cp312-none-win_amd64.whl", hash = "sha256:a586832f70c3f1481732919215f36d41c59ca080fa27a65cf23d9490e75b2ef5", size = 189720 }, ] +[[package]] +name = "jsonschema" +version = "4.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462 }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/b9/cc0cc592e7c195fb8a650c1d5990b10175cf13b4c97465c72ec841de9e4b/jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc", size = 13983 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c", size = 18482 }, +] + [[package]] name = "junitparser" version = "3.2.0" @@ -933,7 +960,7 @@ wheels = [ [[package]] name = "ldp" -version = "0.5.1.dev2+g5d88e93.d20240911" +version = "0.5.1.dev11+g72dbf39.d20240911" source = { editable = "." } dependencies = [ { name = "aiofiles" }, @@ -986,6 +1013,7 @@ dev = [ { name = "pylint-pydantic" }, { name = "pytest" }, { name = "pytest-asyncio" }, + { name = "pytest-recording" }, { name = "pytest-rerunfailures" }, { name = "pytest-subtests" }, { name = "pytest-sugar" }, @@ -1029,7 +1057,7 @@ dev = [ { name = "fhaviary", extras = ["xml"] }, { name = "ipython", specifier = ">=8" }, { name = "ldp", extras = ["monitor", "nn", "server", "typing", "visualization"] }, - { name = "litellm", specifier = ">=1.40.9,<=1.40.12" }, + { name = "litellm", specifier = ">=1.42.1" }, { name = "mypy", specifier = ">=1.8" }, { name = "pre-commit", specifier = "~=3.4" }, { name = "pydantic", specifier = "~=2.9" }, @@ -1037,6 +1065,7 @@ dev = [ { name = "pylint-pydantic" }, { name = "pytest", specifier = ">=8" }, { name = "pytest-asyncio" }, + { name = "pytest-recording" }, { name = "pytest-rerunfailures" }, { name = "pytest-subtests" }, { name = "pytest-sugar" }, @@ -1070,22 +1099,24 @@ wheels = [ [[package]] name = "litellm" -version = "1.40.12" +version = "1.44.24" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, { name = "click" }, { name = "importlib-metadata" }, { name = "jinja2" }, + { name = "jsonschema" }, { name = "openai" }, + { name = "pydantic" }, { name = "python-dotenv" }, { name = "requests" }, { name = "tiktoken" }, { name = "tokenizers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/47/6c/ac51d9cf596da82d07bff5ff90f1c8f4897f8c758ea0666ef207e8d63b38/litellm-1.40.12.tar.gz", hash = "sha256:366bb9c3694b9ef59b3d073bb37ff9ca175ab4090dc187b0a11d2b21db3a6a5d", size = 6043010 } +sdist = { url = "https://files.pythonhosted.org/packages/f8/80/7dc284a9e46c22a1133fdf402715c776b8501337ae7cb1a0501b92b66f39/litellm-1.44.24.tar.gz", hash = "sha256:657c7c5365e90427356bea63cf5dcac81752f5ba6c7f205ec9c5c3ea15d57fb9", size = 8345616 } wheels = [ - { url = "https://files.pythonhosted.org/packages/33/cd/90a633bf7738ccc70645f9c7b4734ae99397b5040e3e6fa03d7801152ff1/litellm-1.40.12-py3-none-any.whl", hash = "sha256:42f1648507f29c60543ba5fdf35d38fc161694da043b201508225bae50d3328c", size = 6258659 }, + { url = "https://files.pythonhosted.org/packages/58/1f/64f8ed38f2b540c96814b4aab1e2f5662cea421d9022d7977f5db0de7e3a/litellm-1.44.24-py3-none-any.whl", hash = "sha256:c0aa7f943c031660ad25b72c9ca14accbea6e6e6c79186eb172e1ee69a868eda", size = 8661706 }, ] [[package]] @@ -1723,16 +1754,16 @@ wheels = [ [[package]] name = "protobuf" -version = "5.28.0" +version = "5.28.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5f/d7/331ee1f3b798c34d2257c79d5426ecbe95d46d2b40ba808a29da6947f6d8/protobuf-5.28.0.tar.gz", hash = "sha256:dde74af0fa774fa98892209992295adbfb91da3fa98c8f67a88afe8f5a349add", size = 422388 } +sdist = { url = "https://files.pythonhosted.org/packages/3c/0b/7a997c8939f698d72bdea14d57116e43d3051fffb3b2964c30938c4a08e6/protobuf-5.28.1.tar.gz", hash = "sha256:42597e938f83bb7f3e4b35f03aa45208d49ae8d5bcb4bc10b9fc825e0ab5e423", size = 422422 } wheels = [ - { url = "https://files.pythonhosted.org/packages/66/34/fc43138c93316839080324cb066f35224b75dae56b9f0fdd9d47c988ee9a/protobuf-5.28.0-cp310-abi3-win32.whl", hash = "sha256:66c3edeedb774a3508ae70d87b3a19786445fe9a068dd3585e0cefa8a77b83d0", size = 419672 }, - { url = "https://files.pythonhosted.org/packages/de/f7/e7e03be7e7307123f6467080f283e484de7e892db54dd9a46f057d08c9ee/protobuf-5.28.0-cp310-abi3-win_amd64.whl", hash = "sha256:6d7cc9e60f976cf3e873acb9a40fed04afb5d224608ed5c1a105db4a3f09c5b6", size = 431486 }, - { url = "https://files.pythonhosted.org/packages/ce/ec/34f67d6a3398aa360524d90f75a8c648c99c807b2f1001f5ab16355c1d12/protobuf-5.28.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:532627e8fdd825cf8767a2d2b94d77e874d5ddb0adefb04b237f7cc296748681", size = 414744 }, - { url = "https://files.pythonhosted.org/packages/fe/79/636415c84eed9835fed83183db73fd6ea7ba76a85cae321ff2eaad722e85/protobuf-5.28.0-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:018db9056b9d75eb93d12a9d35120f97a84d9a919bcab11ed56ad2d399d6e8dd", size = 316527 }, - { url = "https://files.pythonhosted.org/packages/19/15/da43113361db20f2d521bc38d92549edbe06856aeec085c420b2b8af5751/protobuf-5.28.0-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:6206afcb2d90181ae8722798dcb56dc76675ab67458ac24c0dd7d75d632ac9bd", size = 316615 }, - { url = "https://files.pythonhosted.org/packages/e3/b2/4df9958122a0377e571972c71692420bafd623d1df3ce506d88c2aba7e12/protobuf-5.28.0-py3-none-any.whl", hash = "sha256:510ed78cd0980f6d3218099e874714cdf0d8a95582e7b059b06cabad855ed0a0", size = 169574 }, + { url = "https://files.pythonhosted.org/packages/5a/d6/6dedb8a2fbbeb4ac92bb9dd830f77800bbe353799eb8b11d2659beffb9f4/protobuf-5.28.1-cp310-abi3-win32.whl", hash = "sha256:fc063acaf7a3d9ca13146fefb5b42ac94ab943ec6e978f543cd5637da2d57957", size = 419673 }, + { url = "https://files.pythonhosted.org/packages/28/ff/6af7b6fad3bd85820f00f3753a2ebd6bdd9dbf29da5a4252e9f402bdfe2a/protobuf-5.28.1-cp310-abi3-win_amd64.whl", hash = "sha256:4c7f5cb38c640919791c9f74ea80c5b82314c69a8409ea36f2599617d03989af", size = 431486 }, + { url = "https://files.pythonhosted.org/packages/99/80/46b61e647a9386f5dc836e9660818f79afd80a4d5802535ec07a7c6aa16e/protobuf-5.28.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4304e4fceb823d91699e924a1fdf95cde0e066f3b1c28edb665bda762ecde10f", size = 414743 }, + { url = "https://files.pythonhosted.org/packages/b3/21/33dbf04427a11c2de5fb835bb37c5d1522e9d5556a92df0acd13644860a9/protobuf-5.28.1-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:0dfd86d2b5edf03d91ec2a7c15b4e950258150f14f9af5f51c17fa224ee1931f", size = 316526 }, + { url = "https://files.pythonhosted.org/packages/c0/be/bac52549cab1aaab112d380b3f2a80a348ba7083a80bf4ff4be4fb5a6729/protobuf-5.28.1-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:51f09caab818707ab91cf09cc5c156026599cf05a4520779ccbf53c1b352fb25", size = 316613 }, + { url = "https://files.pythonhosted.org/packages/51/3d/71fae0078424ba8ea70b222b6fa56ef771a9918ab91cee806c2abc9d57fa/protobuf-5.28.1-py3-none-any.whl", hash = "sha256:c529535e5c0effcf417682563719e5d8ac8d2b93de07a56108b4c2d436d7a29a", size = 169572 }, ] [[package]] @@ -1940,6 +1971,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/31/6607dab48616902f76885dfcf62c08d929796fc3b2d2318faf9fd54dbed9/pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b", size = 18024 }, ] +[[package]] +name = "pytest-recording" +version = "0.13.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, + { name = "vcrpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/2a/ea6b8036ae01979eae02d8ad5a7da14dec90d9176b613e49fb8d134c78fc/pytest_recording-0.13.2.tar.gz", hash = "sha256:000c3babbb466681457fd65b723427c1779a0c6c17d9e381c3142a701e124877", size = 25270 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/52/8e67a969e9fad3fa5ec4eab9f2a7348ff04692065c7deda21d76e9112703/pytest_recording-0.13.2-py3-none-any.whl", hash = "sha256:3820fe5743d1ac46e807989e11d073cb776a60bdc544cf43ebca454051b22d13", size = 12783 }, +] + [[package]] name = "pytest-rerunfailures" version = "14.0" @@ -2045,11 +2089,11 @@ wheels = [ [[package]] name = "pytz" -version = "2024.1" +version = "2024.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/26/9f1f00a5d021fff16dee3de13d43e5e978f3d58928e129c3a62cf7eb9738/pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", size = 316214 } +sdist = { url = "https://files.pythonhosted.org/packages/3a/31/3c70bf7603cc2dca0f19bdc53b4537a797747a58875b552c8c413d963a3f/pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", size = 319692 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/3d/a121f284241f08268b21359bd425f7d4825cffc5ac5cd0e1b3d82ffd2b10/pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319", size = 505474 }, + { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 }, ] [[package]] @@ -2096,6 +2140,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/6f/ca076ad4d18b3d33c31c304fb7e68dd9ce2bfdb49fb8874611ad7c55e969/readchar-4.2.0-py3-none-any.whl", hash = "sha256:2a587a27c981e6d25a518730ad4c88c429c315439baa6fda55d7a8b3ac4cb62a", size = 9349 }, ] +[[package]] +name = "referencing" +version = "0.35.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/73ca1f8e72fff6fa52119dbd185f73a907b1989428917b24cff660129b6d/referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c", size = 62991 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de", size = 26684 }, +] + [[package]] name = "refurb" version = "2.0.0" @@ -2110,40 +2167,55 @@ wheels = [ [[package]] name = "regex" -version = "2024.7.24" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/51/64256d0dc72816a4fe3779449627c69ec8fee5a5625fd60ba048f53b3478/regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506", size = 393485 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/ec/261f8434a47685d61e59a4ef3d9ce7902af521219f3ebd2194c7adb171a6/regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281", size = 470810 }, - { url = "https://files.pythonhosted.org/packages/f0/47/f33b1cac88841f95fff862476a9e875d9a10dae6912a675c6f13c128e5d9/regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b", size = 282126 }, - { url = "https://files.pythonhosted.org/packages/fc/1b/256ca4e2d5041c0aa2f1dc222f04412b796346ab9ce2aa5147405a9457b4/regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a", size = 278920 }, - { url = "https://files.pythonhosted.org/packages/91/03/4603ec057c0bafd2f6f50b0bdda4b12a0ff81022decf1de007b485c356a6/regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73", size = 785420 }, - { url = "https://files.pythonhosted.org/packages/75/f8/13b111fab93e6273e26de2926345e5ecf6ddad1e44c4d419d7b0924f9c52/regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2", size = 828164 }, - { url = "https://files.pythonhosted.org/packages/4a/80/bc3b9d31bd47ff578758af929af0ac1d6169b247e26fa6e87764007f3d93/regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e", size = 812621 }, - { url = "https://files.pythonhosted.org/packages/8b/77/92d4a14530900d46dddc57b728eea65d723cc9fcfd07b96c2c141dabba84/regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51", size = 786609 }, - { url = "https://files.pythonhosted.org/packages/35/58/06695fd8afad4c8ed0a53ec5e222156398b9fe5afd58887ab94ea68e4d16/regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364", size = 775290 }, - { url = "https://files.pythonhosted.org/packages/1b/0f/50b97ee1fc6965744b9e943b5c0f3740792ab54792df73d984510964ef29/regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee", size = 772849 }, - { url = "https://files.pythonhosted.org/packages/8f/64/565ff6cf241586ab7ae76bb4138c4d29bc1d1780973b457c2db30b21809a/regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c", size = 778428 }, - { url = "https://files.pythonhosted.org/packages/e5/fe/4ceabf4382e44e1e096ac46fd5e3bca490738b24157116a48270fd542e88/regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce", size = 849436 }, - { url = "https://files.pythonhosted.org/packages/68/23/1868e40d6b594843fd1a3498ffe75d58674edfc90d95e18dd87865b93bf2/regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1", size = 849484 }, - { url = "https://files.pythonhosted.org/packages/f3/52/bff76de2f6e2bc05edce3abeb7e98e6309aa022fc06071100a0216fbeb50/regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e", size = 776712 }, - { url = "https://files.pythonhosted.org/packages/f2/72/70ade7b0b5fe5c6df38fdfa2a5a8273e3ea6a10b772aa671b7e889e78bae/regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c", size = 257716 }, - { url = "https://files.pythonhosted.org/packages/04/4d/80e04f4e27ab0cbc9096e2d10696da6d9c26a39b60db52670fd57614fea5/regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52", size = 269662 }, - { url = "https://files.pythonhosted.org/packages/0f/26/f505782f386ac0399a9237571833f187414882ab6902e2e71a1ecb506835/regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86", size = 471748 }, - { url = "https://files.pythonhosted.org/packages/bb/1d/ea9a21beeb433dbfca31ab82867d69cb67ff8674af9fab6ebd55fa9d3387/regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad", size = 282841 }, - { url = "https://files.pythonhosted.org/packages/9b/f2/c6182095baf0a10169c34e87133a8e73b2e816a80035669b1278e927685e/regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9", size = 279114 }, - { url = "https://files.pythonhosted.org/packages/72/58/b5161bf890b6ca575a25685f19a4a3e3b6f4a072238814f8658123177d84/regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289", size = 789749 }, - { url = "https://files.pythonhosted.org/packages/09/fb/5381b19b62f3a3494266be462f6a015a869cf4bfd8e14d6e7db67e2c8069/regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9", size = 831666 }, - { url = "https://files.pythonhosted.org/packages/3d/6d/2a21c85f970f9be79357d12cf4b97f4fc6bf3bf6b843c39dabbc4e5f1181/regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c", size = 817544 }, - { url = "https://files.pythonhosted.org/packages/f9/ae/5f23e64f6cf170614237c654f3501a912dfb8549143d4b91d1cd13dba319/regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440", size = 790854 }, - { url = "https://files.pythonhosted.org/packages/29/0a/d04baad1bbc49cdfb4aef90c4fc875a60aaf96d35a1616f1dfe8149716bc/regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610", size = 779242 }, - { url = "https://files.pythonhosted.org/packages/3a/27/b242a962f650c3213da4596d70e24c7c1c46e3aa0f79f2a81164291085f8/regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5", size = 776932 }, - { url = "https://files.pythonhosted.org/packages/9c/ae/de659bdfff80ad2c0b577a43dd89dbc43870a4fc4bbf604e452196758e83/regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799", size = 784521 }, - { url = "https://files.pythonhosted.org/packages/d4/ac/eb6a796da0bdefbf09644a7868309423b18d344cf49963a9d36c13502d46/regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05", size = 854548 }, - { url = "https://files.pythonhosted.org/packages/56/77/fde8d825dec69e70256e0925af6c81eea9acf0a634d3d80f619d8dcd6888/regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94", size = 853345 }, - { url = "https://files.pythonhosted.org/packages/ff/04/2b79ad0bb9bc05ab4386caa2c19aa047a66afcbdfc2640618ffc729841e4/regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38", size = 781414 }, - { url = "https://files.pythonhosted.org/packages/bf/71/d0af58199283ada7d25b20e416f5b155f50aad99b0e791c0966ff5a1cd00/regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc", size = 258125 }, - { url = "https://files.pythonhosted.org/packages/95/b3/10e875c45c60b010b66fc109b899c6fc4f05d485fe1d54abff98ce791124/regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908", size = 269162 }, +version = "2024.9.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/38/148df33b4dbca3bd069b963acab5e0fa1a9dbd6820f8c322d0dd6faeff96/regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd", size = 399403 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/a1/d526b7b6095a0019aa360948c143aacfeb029919c898701ce7763bbe4c15/regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df", size = 482483 }, + { url = "https://files.pythonhosted.org/packages/32/d9/bfdd153179867c275719e381e1e8e84a97bd186740456a0dcb3e7125c205/regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268", size = 287442 }, + { url = "https://files.pythonhosted.org/packages/33/c4/60f3370735135e3a8d673ddcdb2507a8560d0e759e1398d366e43d000253/regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad", size = 284561 }, + { url = "https://files.pythonhosted.org/packages/b1/51/91a5ebdff17f9ec4973cb0aa9d37635efec1c6868654bbc25d1543aca4ec/regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679", size = 791779 }, + { url = "https://files.pythonhosted.org/packages/07/4a/022c5e6f0891a90cd7eb3d664d6c58ce2aba48bff107b00013f3d6167069/regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4", size = 832605 }, + { url = "https://files.pythonhosted.org/packages/ac/1c/3793990c8c83ca04e018151ddda83b83ecc41d89964f0f17749f027fc44d/regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664", size = 818556 }, + { url = "https://files.pythonhosted.org/packages/e9/5c/8b385afbfacb853730682c57be56225f9fe275c5bf02ac1fc88edbff316d/regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50", size = 792808 }, + { url = "https://files.pythonhosted.org/packages/9b/8b/a4723a838b53c771e9240951adde6af58c829fb6a6a28f554e8131f53839/regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199", size = 781115 }, + { url = "https://files.pythonhosted.org/packages/83/5f/031a04b6017033d65b261259c09043c06f4ef2d4eac841d0649d76d69541/regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4", size = 778155 }, + { url = "https://files.pythonhosted.org/packages/fd/cd/4660756070b03ce4a66663a43f6c6e7ebc2266cc6b4c586c167917185eb4/regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd", size = 784614 }, + { url = "https://files.pythonhosted.org/packages/93/8d/65b9bea7df120a7be8337c415b6d256ba786cbc9107cebba3bf8ff09da99/regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f", size = 853744 }, + { url = "https://files.pythonhosted.org/packages/96/a7/fba1eae75eb53a704475baf11bd44b3e6ccb95b316955027eb7748f24ef8/regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96", size = 855890 }, + { url = "https://files.pythonhosted.org/packages/45/14/d864b2db80a1a3358534392373e8a281d95b28c29c87d8548aed58813910/regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1", size = 781887 }, + { url = "https://files.pythonhosted.org/packages/4d/a9/bfb29b3de3eb11dc9b412603437023b8e6c02fb4e11311863d9bf62c403a/regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9", size = 261644 }, + { url = "https://files.pythonhosted.org/packages/c7/ab/1ad2511cf6a208fde57fafe49829cab8ca018128ab0d0b48973d8218634a/regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf", size = 274033 }, + { url = "https://files.pythonhosted.org/packages/6e/92/407531450762bed778eedbde04407f68cbd75d13cee96c6f8d6903d9c6c1/regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7", size = 483590 }, + { url = "https://files.pythonhosted.org/packages/8e/a2/048acbc5ae1f615adc6cba36cc45734e679b5f1e4e58c3c77f0ed611d4e2/regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231", size = 288175 }, + { url = "https://files.pythonhosted.org/packages/8a/ea/909d8620329ab710dfaf7b4adee41242ab7c9b95ea8d838e9bfe76244259/regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d", size = 284749 }, + { url = "https://files.pythonhosted.org/packages/ca/fa/521eb683b916389b4975337873e66954e0f6d8f91bd5774164a57b503185/regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64", size = 795181 }, + { url = "https://files.pythonhosted.org/packages/28/db/63047feddc3280cc242f9c74f7aeddc6ee662b1835f00046f57d5630c827/regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42", size = 835842 }, + { url = "https://files.pythonhosted.org/packages/e3/94/86adc259ff8ec26edf35fcca7e334566c1805c7493b192cb09679f9c3dee/regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766", size = 823533 }, + { url = "https://files.pythonhosted.org/packages/29/52/84662b6636061277cb857f658518aa7db6672bc6d1a3f503ccd5aefc581e/regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a", size = 797037 }, + { url = "https://files.pythonhosted.org/packages/c3/2a/cd4675dd987e4a7505f0364a958bc41f3b84942de9efaad0ef9a2646681c/regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9", size = 784106 }, + { url = "https://files.pythonhosted.org/packages/6f/75/3ea7ec29de0bbf42f21f812f48781d41e627d57a634f3f23947c9a46e303/regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d", size = 782468 }, + { url = "https://files.pythonhosted.org/packages/d3/67/15519d69b52c252b270e679cb578e22e0c02b8dd4e361f2b04efcc7f2335/regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822", size = 790324 }, + { url = "https://files.pythonhosted.org/packages/9c/71/eff77d3fe7ba08ab0672920059ec30d63fa7e41aa0fb61c562726e9bd721/regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0", size = 860214 }, + { url = "https://files.pythonhosted.org/packages/81/11/e1bdf84a72372e56f1ea4b833dd583b822a23138a616ace7ab57a0e11556/regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a", size = 859420 }, + { url = "https://files.pythonhosted.org/packages/ea/75/9753e9dcebfa7c3645563ef5c8a58f3a47e799c872165f37c55737dadd3e/regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a", size = 787333 }, + { url = "https://files.pythonhosted.org/packages/bc/4e/ba1cbca93141f7416624b3ae63573e785d4bc1834c8be44a8f0747919eca/regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776", size = 262058 }, + { url = "https://files.pythonhosted.org/packages/6e/16/efc5f194778bf43e5888209e5cec4b258005d37c613b67ae137df3b89c53/regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009", size = 273526 }, + { url = "https://files.pythonhosted.org/packages/93/0a/d1c6b9af1ff1e36832fe38d74d5c5bab913f2bdcbbd6bc0e7f3ce8b2f577/regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784", size = 483376 }, + { url = "https://files.pythonhosted.org/packages/a4/42/5910a050c105d7f750a72dcb49c30220c3ae4e2654e54aaaa0e9bc0584cb/regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36", size = 288112 }, + { url = "https://files.pythonhosted.org/packages/8d/56/0c262aff0e9224fa7ffce47b5458d373f4d3e3ff84e99b5ff0cb15e0b5b2/regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92", size = 284608 }, + { url = "https://files.pythonhosted.org/packages/b9/54/9fe8f9aec5007bbbbce28ba3d2e3eaca425f95387b7d1e84f0d137d25237/regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86", size = 795337 }, + { url = "https://files.pythonhosted.org/packages/b2/e7/6b2f642c3cded271c4f16cc4daa7231be544d30fe2b168e0223724b49a61/regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85", size = 835848 }, + { url = "https://files.pythonhosted.org/packages/cd/9e/187363bdf5d8c0e4662117b92aa32bf52f8f09620ae93abc7537d96d3311/regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963", size = 823503 }, + { url = "https://files.pythonhosted.org/packages/f8/10/601303b8ee93589f879664b0cfd3127949ff32b17f9b6c490fb201106c4d/regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6", size = 797049 }, + { url = "https://files.pythonhosted.org/packages/ef/1c/ea200f61ce9f341763f2717ab4daebe4422d83e9fd4ac5e33435fd3a148d/regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802", size = 784144 }, + { url = "https://files.pythonhosted.org/packages/d8/5c/d2429be49ef3292def7688401d3deb11702c13dcaecdc71d2b407421275b/regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29", size = 782483 }, + { url = "https://files.pythonhosted.org/packages/12/d9/cbc30f2ff7164f3b26a7760f87c54bf8b2faed286f60efd80350a51c5b99/regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8", size = 790320 }, + { url = "https://files.pythonhosted.org/packages/19/1d/43ed03a236313639da5a45e61bc553c8d41e925bcf29b0f8ecff0c2c3f25/regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84", size = 860435 }, + { url = "https://files.pythonhosted.org/packages/34/4f/5d04da61c7c56e785058a46349f7285ae3ebc0726c6ea7c5c70600a52233/regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554", size = 859571 }, + { url = "https://files.pythonhosted.org/packages/12/7f/8398c8155a3c70703a8e91c29532558186558e1aea44144b382faa2a6f7a/regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8", size = 787398 }, + { url = "https://files.pythonhosted.org/packages/58/3a/f5903977647a9a7e46d5535e9e96c194304aeeca7501240509bde2f9e17f/regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8", size = 262035 }, + { url = "https://files.pythonhosted.org/packages/ff/80/51ba3a4b7482f6011095b3a036e07374f64de180b7d870b704ed22509002/regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f", size = 273510 }, ] [[package]] @@ -2173,6 +2245,53 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9c/cc/ff7046c009c17136f83764f8ff225309b58d364c2ffd5626b5a338bd865a/returns-0.23.0-py3-none-any.whl", hash = "sha256:278aa6168072b24574ad14be32f7123d1b835928473dd40bc506f47c8b25859a", size = 155284 }, ] +[[package]] +name = "rpds-py" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/55/64/b693f262791b818880d17268f3f8181ef799b0d187f6f731b1772e05a29a/rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121", size = 25814 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/2a/191374c52d7be0b056cc2a04d718d2244c152f915d4a8d2db2aacc526189/rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489", size = 318369 }, + { url = "https://files.pythonhosted.org/packages/0e/6a/2c9fdcc6d235ac0d61ec4fd9981184689c3e682abd05e3caa49bccb9c298/rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318", size = 311303 }, + { url = "https://files.pythonhosted.org/packages/d2/b2/725487d29633f64ef8f9cbf4729111a0b61702c8f8e94db1653930f52cce/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db", size = 366424 }, + { url = "https://files.pythonhosted.org/packages/7a/8c/668195ab9226d01b7cf7cd9e59c1c0be1df05d602df7ec0cf46f857dcf59/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5", size = 368359 }, + { url = "https://files.pythonhosted.org/packages/52/28/356f6a39c1adeb02cf3e5dd526f5e8e54e17899bef045397abcfbf50dffa/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5", size = 394886 }, + { url = "https://files.pythonhosted.org/packages/a2/65/640fb1a89080a8fb6f4bebd3dafb65a2edba82e2e44c33e6eb0f3e7956f1/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6", size = 432416 }, + { url = "https://files.pythonhosted.org/packages/a7/e8/85835077b782555d6b3416874b702ea6ebd7db1f145283c9252968670dd5/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209", size = 354819 }, + { url = "https://files.pythonhosted.org/packages/4f/87/1ac631e923d65cbf36fbcfc6eaa702a169496de1311e54be142f178e53ee/rpds_py-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3", size = 373282 }, + { url = "https://files.pythonhosted.org/packages/e4/ce/cb316f7970189e217b998191c7cf0da2ede3d5437932c86a7210dc1e9994/rpds_py-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272", size = 541540 }, + { url = "https://files.pythonhosted.org/packages/90/d7/4112d7655ec8aff168ecc91d4ceb51c557336edde7e6ccf6463691a2f253/rpds_py-0.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad", size = 547640 }, + { url = "https://files.pythonhosted.org/packages/ab/44/4f61d64dfed98cc71623f3a7fcb612df636a208b4b2c6611eaa985e130a9/rpds_py-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58", size = 525555 }, + { url = "https://files.pythonhosted.org/packages/35/f2/a862d81eacb21f340d584cd1c749c289979f9a60e9229f78bffc0418a199/rpds_py-0.20.0-cp311-none-win32.whl", hash = "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0", size = 199338 }, + { url = "https://files.pythonhosted.org/packages/cc/ec/77d0674f9af4872919f3738018558dd9d37ad3f7ad792d062eadd4af7cba/rpds_py-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c", size = 213585 }, + { url = "https://files.pythonhosted.org/packages/89/b7/f9682c5cc37fcc035f4a0fc33c1fe92ec9cbfdee0cdfd071cf948f53e0df/rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6", size = 321468 }, + { url = "https://files.pythonhosted.org/packages/b8/ad/fc82be4eaceb8d444cb6fc1956ce972b3a0795104279de05e0e4131d0a47/rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b", size = 313062 }, + { url = "https://files.pythonhosted.org/packages/0e/1c/6039e80b13a08569a304dc13476dc986352dca4598e909384db043b4e2bb/rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739", size = 370168 }, + { url = "https://files.pythonhosted.org/packages/dc/c9/5b9aa35acfb58946b4b785bc8e700ac313669e02fb100f3efa6176a83e81/rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c", size = 371376 }, + { url = "https://files.pythonhosted.org/packages/7b/dd/0e0dbeb70d8a5357d2814764d467ded98d81d90d3570de4fb05ec7224f6b/rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee", size = 397200 }, + { url = "https://files.pythonhosted.org/packages/e4/da/a47d931eb688ccfd77a7389e45935c79c41e8098d984d87335004baccb1d/rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96", size = 426824 }, + { url = "https://files.pythonhosted.org/packages/0f/f7/a59a673594e6c2ff2dbc44b00fd4ecdec2fc399bb6a7bd82d612699a0121/rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4", size = 357967 }, + { url = "https://files.pythonhosted.org/packages/5f/61/3ba1905396b2cb7088f9503a460b87da33452da54d478cb9241f6ad16d00/rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef", size = 378905 }, + { url = "https://files.pythonhosted.org/packages/08/31/6d0df9356b4edb0a3a077f1ef714e25ad21f9f5382fc490c2383691885ea/rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821", size = 546348 }, + { url = "https://files.pythonhosted.org/packages/ae/15/d33c021de5cb793101df9961c3c746dfc476953dbbf5db337d8010dffd4e/rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940", size = 553152 }, + { url = "https://files.pythonhosted.org/packages/70/2d/5536d28c507a4679179ab15aa0049440e4d3dd6752050fa0843ed11e9354/rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174", size = 528807 }, + { url = "https://files.pythonhosted.org/packages/e3/62/7ebe6ec0d3dd6130921f8cffb7e34afb7f71b3819aa0446a24c5e81245ec/rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139", size = 200993 }, + { url = "https://files.pythonhosted.org/packages/ec/2f/b938864d66b86a6e4acadefdc56de75ef56f7cafdfd568a6464605457bd5/rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585", size = 214458 }, + { url = "https://files.pythonhosted.org/packages/99/32/43b919a0a423c270a838ac2726b1c7168b946f2563fd99a51aaa9692d00f/rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29", size = 321465 }, + { url = "https://files.pythonhosted.org/packages/58/a9/c4d899cb28e9e47b0ff12462e8f827381f243176036f17bef9c1604667f2/rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91", size = 312900 }, + { url = "https://files.pythonhosted.org/packages/8f/90/9e51670575b5dfaa8c823369ef7d943087bfb73d4f124a99ad6ef19a2b26/rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24", size = 370973 }, + { url = "https://files.pythonhosted.org/packages/fc/c1/523f2a03f853fc0d4c1acbef161747e9ab7df0a8abf6236106e333540921/rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7", size = 370890 }, + { url = "https://files.pythonhosted.org/packages/51/ca/2458a771f16b0931de4d384decbe43016710bc948036c8f4562d6e063437/rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9", size = 397174 }, + { url = "https://files.pythonhosted.org/packages/00/7d/6e06807f6305ea2408b364efb0eef83a6e21b5e7b5267ad6b473b9a7e416/rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8", size = 426449 }, + { url = "https://files.pythonhosted.org/packages/8c/d1/6c9e65260a819a1714510a7d69ac1d68aa23ee9ce8a2d9da12187263c8fc/rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879", size = 357698 }, + { url = "https://files.pythonhosted.org/packages/5d/fb/ecea8b5286d2f03eec922be7173a03ed17278944f7c124348f535116db15/rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f", size = 378530 }, + { url = "https://files.pythonhosted.org/packages/e3/e3/ac72f858957f52a109c588589b73bd2fad4a0fc82387fb55fb34aeb0f9cd/rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c", size = 545753 }, + { url = "https://files.pythonhosted.org/packages/b2/a4/a27683b519d5fc98e4390a3b130117d80fd475c67aeda8aac83c0e8e326a/rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2", size = 552443 }, + { url = "https://files.pythonhosted.org/packages/a1/ed/c074d248409b4432b1ccb2056974175fa0af2d1bc1f9c21121f80a358fa3/rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57", size = 528380 }, + { url = "https://files.pythonhosted.org/packages/d5/bd/04caf938895d2d78201e89c0c8a94dfd9990c34a19ff52fb01d0912343e3/rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a", size = 200540 }, + { url = "https://files.pythonhosted.org/packages/95/cc/109eb8b9863680411ae703664abacaa035820c7755acc9686d5dd02cdd2e/rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2", size = 214111 }, +] + [[package]] name = "runs" version = "1.2.2" @@ -2560,11 +2679,11 @@ wheels = [ [[package]] name = "urllib3" -version = "2.2.2" +version = "1.26.20" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/6d/fa469ae21497ddc8bc93e5877702dca7cb8f911e337aca7452b5724f1bb6/urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168", size = 292266 } +sdist = { url = "https://files.pythonhosted.org/packages/e4/e8/6ff5e6bc22095cfc59b6ea711b687e2b7ed4bdb373f7eeec370a97d7392f/urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32", size = 307380 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", size = 121444 }, + { url = "https://files.pythonhosted.org/packages/33/cf/8435d5a7159e2a9c83a95896ed596f68cf798005fe107cc655b5c5c14704/urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e", size = 144225 }, ] [[package]] @@ -2596,6 +2715,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/24/ff/0e5232ed5c539afc0ce1c07e7fc046a01d4769d601e0fe30d83458efa447/usearch-2.15.1-cp312-cp312-win_arm64.whl", hash = "sha256:d32e1cd5624efe64c735f70f34ff969a628ccee964f213d58c6fb8bab1d6244e", size = 262874 }, ] +[[package]] +name = "vcrpy" +version = "6.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, + { name = "urllib3", marker = "platform_python_implementation == 'PyPy'" }, + { name = "wrapt" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/59/9fe85bf7af469bdb0ab8416c76cde630cdff6d1790ecb87e5a58f259c89c/vcrpy-6.0.1.tar.gz", hash = "sha256:9e023fee7f892baa0bbda2f7da7c8ac51165c1c6e38ff8688683a12a4bde9278", size = 84836 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dd/eb/922cfd27d6593363c3e50b7808bcc234ec996128813fd34341685bb307b7/vcrpy-6.0.1-py2.py3-none-any.whl", hash = "sha256:621c3fb2d6bd8aa9f87532c688e4575bcbbde0c0afeb5ebdb7e14cac409edfdd", size = 41880 }, +] + [[package]] name = "virtualenv" version = "20.26.4" @@ -2647,6 +2781,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, ] +[[package]] +name = "wrapt" +version = "1.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/4c/063a912e20bcef7124e0df97282a8af3ff3e4b603ce84c481d6d7346be0a/wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d", size = 53972 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09", size = 37313 }, + { url = "https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d", size = 38164 }, + { url = "https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389", size = 80890 }, + { url = "https://files.pythonhosted.org/packages/b7/96/bb5e08b3d6db003c9ab219c487714c13a237ee7dcc572a555eaf1ce7dc82/wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060", size = 73118 }, + { url = "https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1", size = 80746 }, + { url = "https://files.pythonhosted.org/packages/11/fb/18ec40265ab81c0e82a934de04596b6ce972c27ba2592c8b53d5585e6bcd/wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3", size = 85668 }, + { url = "https://files.pythonhosted.org/packages/0f/ef/0ecb1fa23145560431b970418dce575cfaec555ab08617d82eb92afc7ccf/wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956", size = 78556 }, + { url = "https://files.pythonhosted.org/packages/25/62/cd284b2b747f175b5a96cbd8092b32e7369edab0644c45784871528eb852/wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d", size = 85712 }, + { url = "https://files.pythonhosted.org/packages/e5/a7/47b7ff74fbadf81b696872d5ba504966591a3468f1bc86bca2f407baef68/wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362", size = 35327 }, + { url = "https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89", size = 37523 }, + { url = "https://files.pythonhosted.org/packages/92/17/224132494c1e23521868cdd57cd1e903f3b6a7ba6996b7b8f077ff8ac7fe/wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b", size = 37614 }, + { url = "https://files.pythonhosted.org/packages/6a/d7/cfcd73e8f4858079ac59d9db1ec5a1349bc486ae8e9ba55698cc1f4a1dff/wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36", size = 38316 }, + { url = "https://files.pythonhosted.org/packages/7e/79/5ff0a5c54bda5aec75b36453d06be4f83d5cd4932cc84b7cb2b52cee23e2/wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73", size = 86322 }, + { url = "https://files.pythonhosted.org/packages/c4/81/e799bf5d419f422d8712108837c1d9bf6ebe3cb2a81ad94413449543a923/wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809", size = 79055 }, + { url = "https://files.pythonhosted.org/packages/62/62/30ca2405de6a20448ee557ab2cd61ab9c5900be7cbd18a2639db595f0b98/wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b", size = 87291 }, + { url = "https://files.pythonhosted.org/packages/49/4e/5d2f6d7b57fc9956bf06e944eb00463551f7d52fc73ca35cfc4c2cdb7aed/wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81", size = 90374 }, + { url = "https://files.pythonhosted.org/packages/a6/9b/c2c21b44ff5b9bf14a83252a8b973fb84923764ff63db3e6dfc3895cf2e0/wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9", size = 83896 }, + { url = "https://files.pythonhosted.org/packages/14/26/93a9fa02c6f257df54d7570dfe8011995138118d11939a4ecd82cb849613/wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c", size = 91738 }, + { url = "https://files.pythonhosted.org/packages/a2/5b/4660897233eb2c8c4de3dc7cefed114c61bacb3c28327e64150dc44ee2f6/wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc", size = 35568 }, + { url = "https://files.pythonhosted.org/packages/5c/cc/8297f9658506b224aa4bd71906447dea6bb0ba629861a758c28f67428b91/wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8", size = 37653 }, + { url = "https://files.pythonhosted.org/packages/ff/21/abdedb4cdf6ff41ebf01a74087740a709e2edb146490e4d9beea054b0b7a/wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1", size = 23362 }, +] + [[package]] name = "xmod" version = "1.8.1"