From 6640775cef4cff7d9e2c8bf702864a387c563a39 Mon Sep 17 00:00:00 2001 From: Kenny Vaneetvelde Date: Sun, 18 Oct 2026 13:15:57 +0200 Subject: [PATCH 01/12] Reference Instructor client classes from the package root `instructor.core.client.Instructor` relied on the submodule being reachable as an attribute of the top-level package. Instructor 1.17.0 no longer exposes `instructor.core` that way, so attribute access raises AttributeError, while `instructor.Instructor` and `instructor.AsyncInstructor` are the same classes on 1.14.5 and 1.17.0. Co-Authored-By: Claude Fable 5.1 --- atomic-agents/atomic_agents/agents/atomic_agent.py | 10 +++++----- atomic-agents/tests/agents/test_atomic_agent.py | 3 +-- .../tests/observability/test_openinference_tracing.py | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/atomic-agents/atomic_agents/agents/atomic_agent.py b/atomic-agents/atomic_agents/agents/atomic_agent.py index ebcd289f..c8215fba 100644 --- a/atomic-agents/atomic_agents/agents/atomic_agent.py +++ b/atomic-agents/atomic_agents/agents/atomic_agent.py @@ -65,7 +65,7 @@ class BasicChatOutputSchema(BaseIOSchema): class AgentConfig(BaseModel): - client: instructor.core.client.Instructor = Field(..., description="Client for interacting with the language model.") + client: instructor.Instructor = Field(..., description="Client for interacting with the language model.") model: str = Field(default="gpt-5-mini", description="The model to use for generating responses.") history: Optional[BaseChatHistory] = Field(default=None, description="History component for storing chat history.") system_prompt_generator: Optional[BaseSystemPromptGenerator] = Field( @@ -577,7 +577,7 @@ def run(self, user_input: Optional[InputSchema] = None) -> OutputSchema: OutputSchema: The response from the chat agent. """ assert not isinstance( - self.client, instructor.core.client.AsyncInstructor + self.client, instructor.AsyncInstructor ), "The run method is not supported for async clients. Use run_async instead." if user_input: @@ -612,7 +612,7 @@ def run_stream(self, user_input: Optional[InputSchema] = None) -> Generator[Outp OutputSchema: The final response from the chat agent. """ assert not isinstance( - self.client, instructor.core.client.AsyncInstructor + self.client, instructor.AsyncInstructor ), "The run_stream method is not supported for async clients. Use run_async instead." if user_input: @@ -656,7 +656,7 @@ async def run_async(self, user_input: Optional[InputSchema] = None) -> OutputSch NotAsyncIterableError: If used as an async generator (in an async for loop). Use run_async_stream() method instead for streaming responses. """ - assert isinstance(self.client, instructor.core.client.AsyncInstructor), "The run_async method is for async clients." + assert isinstance(self.client, instructor.AsyncInstructor), "The run_async method is for async clients." if user_input: self.history.initialize_turn() @@ -684,7 +684,7 @@ async def run_async_stream(self, user_input: Optional[InputSchema] = None) -> As Yields: OutputSchema: Partial responses from the chat agent. """ - assert isinstance(self.client, instructor.core.client.AsyncInstructor), "The run_async method is for async clients." + assert isinstance(self.client, instructor.AsyncInstructor), "The run_async method is for async clients." if user_input: self.history.initialize_turn() self.current_user_input = user_input diff --git a/atomic-agents/tests/agents/test_atomic_agent.py b/atomic-agents/tests/agents/test_atomic_agent.py index 3e2782ee..1a207174 100644 --- a/atomic-agents/tests/agents/test_atomic_agent.py +++ b/atomic-agents/tests/agents/test_atomic_agent.py @@ -42,8 +42,7 @@ def mock_instructor(): @pytest.fixture def mock_instructor_async(): - # Changed spec from instructor.Instructor to instructor.core.client.AsyncInstructor - mock = Mock(spec=instructor.core.client.AsyncInstructor) + mock = Mock(spec=instructor.AsyncInstructor) # Configure chat.completions structure mock.chat = Mock() diff --git a/atomic-agents/tests/observability/test_openinference_tracing.py b/atomic-agents/tests/observability/test_openinference_tracing.py index 614ea269..6fed9e26 100644 --- a/atomic-agents/tests/observability/test_openinference_tracing.py +++ b/atomic-agents/tests/observability/test_openinference_tracing.py @@ -144,7 +144,7 @@ def create_partial(**kwargs): def async_client(response=None, partials=None): - client = Mock(spec=instructor.core.client.AsyncInstructor) + client = Mock(spec=instructor.AsyncInstructor) client.chat = Mock() client.chat.completions = Mock() From 00ca06bbfc63d300a20c546bb943d058e67669f2 Mon Sep 17 00:00:00 2001 From: Kenny Vaneetvelde Date: Sun, 18 Oct 2026 13:15:57 +0200 Subject: [PATCH 02/12] Depend on Instructor as a range, >=1.17.0,<2 The exact pin dates from 2a53b60 (instructor 1.9.2, upstream issue 567-labs/instructor#1796) and was bumped by hand ever since, which left every user stuck on whatever version we last touched. Full suite passes on 1.17.0 (618 passed, 3 skipped) after the client class rename in the previous commit. Example projects and the legacy requirements.txt move to the same range so the workspace resolves. Co-Authored-By: Claude Fable 5.1 --- .../basic-multimodal/pyproject.toml | 2 +- .../basic-pdf-analysis/pyproject.toml | 2 +- atomic-examples/fastapi-memory/pyproject.toml | 2 +- atomic-examples/hooks-example/pyproject.toml | 2 +- .../nested-multimodal/pyproject.toml | 2 +- .../orchestration-agent/pyproject.toml | 2 +- .../persistent-memory/pyproject.toml | 2 +- .../phoenix-tracing/pyproject.toml | 2 +- .../progressive-disclosure/pyproject.toml | 2 +- atomic-examples/quickstart/pyproject.toml | 2 +- .../web-search-agent/pyproject.toml | 2 +- .../youtube-summarizer/pyproject.toml | 2 +- .../youtube-to-recipe/pyproject.toml | 2 +- pyproject.toml | 2 +- requirements.txt | 2 +- uv.lock | 245 +++++++++--------- 16 files changed, 135 insertions(+), 140 deletions(-) diff --git a/atomic-examples/basic-multimodal/pyproject.toml b/atomic-examples/basic-multimodal/pyproject.toml index 939758a1..37311284 100644 --- a/atomic-examples/basic-multimodal/pyproject.toml +++ b/atomic-examples/basic-multimodal/pyproject.toml @@ -16,7 +16,7 @@ authors = [ requires-python = ">=3.12" dependencies = [ "atomic-agents", - "instructor==1.14.5", + "instructor>=1.17.0,<2", "openai>=2.0.0,<3.0.0", ] diff --git a/atomic-examples/basic-pdf-analysis/pyproject.toml b/atomic-examples/basic-pdf-analysis/pyproject.toml index 81fb6462..32af3e9b 100644 --- a/atomic-examples/basic-pdf-analysis/pyproject.toml +++ b/atomic-examples/basic-pdf-analysis/pyproject.toml @@ -16,7 +16,7 @@ authors = [ requires-python = ">=3.12,<3.14" dependencies = [ "atomic-agents", - "instructor[google-genai]==1.14.5", + "instructor[google-genai]>=1.17.0,<2", ] [tool.uv.sources] diff --git a/atomic-examples/fastapi-memory/pyproject.toml b/atomic-examples/fastapi-memory/pyproject.toml index c1bb61cf..fbb7486e 100644 --- a/atomic-examples/fastapi-memory/pyproject.toml +++ b/atomic-examples/fastapi-memory/pyproject.toml @@ -18,7 +18,7 @@ dependencies = [ "atomic-agents", "fastapi>=0.115.14,<1.0.0", "uvicorn>=0.32.1,<1.0.0", - "instructor==1.14.5", + "instructor>=1.17.0,<2", "openai>=2.0.0,<3.0.0", "pydantic>=2.10.3,<3.0.0", "httpx>=0.28.1,<1.0.0", diff --git a/atomic-examples/hooks-example/pyproject.toml b/atomic-examples/hooks-example/pyproject.toml index ed77c8f5..4dfd5a62 100644 --- a/atomic-examples/hooks-example/pyproject.toml +++ b/atomic-examples/hooks-example/pyproject.toml @@ -16,7 +16,7 @@ authors = [ requires-python = ">=3.12" dependencies = [ "atomic-agents", - "instructor==1.14.5", + "instructor>=1.17.0,<2", "openai>=2.0.0,<3.0.0", "python-dotenv>=1.0.1,<2.0.0", ] diff --git a/atomic-examples/nested-multimodal/pyproject.toml b/atomic-examples/nested-multimodal/pyproject.toml index 529c9a7b..3584abf5 100644 --- a/atomic-examples/nested-multimodal/pyproject.toml +++ b/atomic-examples/nested-multimodal/pyproject.toml @@ -16,7 +16,7 @@ authors = [ requires-python = ">=3.12" dependencies = [ "atomic-agents", - "instructor==1.14.5", + "instructor>=1.17.0,<2", "openai>=2.0.0,<3.0.0", "python-dotenv>=1.0.0,<2.0.0", ] diff --git a/atomic-examples/orchestration-agent/pyproject.toml b/atomic-examples/orchestration-agent/pyproject.toml index 81dc2518..53badc3a 100644 --- a/atomic-examples/orchestration-agent/pyproject.toml +++ b/atomic-examples/orchestration-agent/pyproject.toml @@ -16,7 +16,7 @@ authors = [ requires-python = ">=3.12" dependencies = [ "atomic-agents", - "instructor==1.14.5", + "instructor>=1.17.0,<2", "pydantic>=2.10.3,<3.0.0", "sympy>=1.13.3,<2.0.0", "python-dotenv>=1.0.1,<2.0.0", diff --git a/atomic-examples/persistent-memory/pyproject.toml b/atomic-examples/persistent-memory/pyproject.toml index 9de27ee5..99336c31 100644 --- a/atomic-examples/persistent-memory/pyproject.toml +++ b/atomic-examples/persistent-memory/pyproject.toml @@ -16,7 +16,7 @@ authors = [ requires-python = ">=3.12" dependencies = [ "atomic-agents", - "instructor[anthropic,groq,google-genai]==1.14.5", + "instructor[anthropic,groq,google-genai]>=1.17.0,<2", "openai>=2.0.0,<3.0.0", "python-dotenv>=1.0.1,<2.0.0", ] diff --git a/atomic-examples/phoenix-tracing/pyproject.toml b/atomic-examples/phoenix-tracing/pyproject.toml index 70511c03..c626725f 100644 --- a/atomic-examples/phoenix-tracing/pyproject.toml +++ b/atomic-examples/phoenix-tracing/pyproject.toml @@ -18,7 +18,7 @@ dependencies = [ "atomic-agents[observability]", "arize-phoenix-otel>=0.17.0,<1.0.0", "openinference-instrumentation-openai>=0.1.30,<0.2.0", - "instructor==1.14.5", + "instructor>=1.17.0,<2", "openai>=2.0.0,<3.0.0", "python-dotenv>=1.0.1,<2.0.0", "sympy>=1.13.3,<2.0.0", diff --git a/atomic-examples/progressive-disclosure/pyproject.toml b/atomic-examples/progressive-disclosure/pyproject.toml index 38c55cb8..3c972a72 100644 --- a/atomic-examples/progressive-disclosure/pyproject.toml +++ b/atomic-examples/progressive-disclosure/pyproject.toml @@ -19,7 +19,7 @@ dependencies = [ "pd-math-server", "pd-text-server", "pd-data-server", - "instructor==1.14.5", + "instructor>=1.17.0,<2", "pydantic>=2.10.3,<3.0.0", "rich>=13.0.0", "openai>=2.0.0,<3.0.0", diff --git a/atomic-examples/quickstart/pyproject.toml b/atomic-examples/quickstart/pyproject.toml index 74888322..effaee02 100644 --- a/atomic-examples/quickstart/pyproject.toml +++ b/atomic-examples/quickstart/pyproject.toml @@ -16,7 +16,7 @@ authors = [ requires-python = ">=3.12" dependencies = [ "atomic-agents", - "instructor[anthropic,groq,google-genai]==1.14.5", + "instructor[anthropic,groq,google-genai]>=1.17.0,<2", "openai>=2.0.0,<3.0.0", "python-dotenv>=1.0.1,<2.0.0", ] diff --git a/atomic-examples/web-search-agent/pyproject.toml b/atomic-examples/web-search-agent/pyproject.toml index 40abac9c..b7c18f24 100644 --- a/atomic-examples/web-search-agent/pyproject.toml +++ b/atomic-examples/web-search-agent/pyproject.toml @@ -18,7 +18,7 @@ dependencies = [ "atomic-agents", "openai>=2.0.0,<3.0.0", "pydantic>=2.9.2,<3.0.0", - "instructor==1.14.5", + "instructor>=1.17.0,<2", "python-dotenv>=1.0.1,<2.0.0", ] diff --git a/atomic-examples/youtube-summarizer/pyproject.toml b/atomic-examples/youtube-summarizer/pyproject.toml index 92f3709e..605a1401 100644 --- a/atomic-examples/youtube-summarizer/pyproject.toml +++ b/atomic-examples/youtube-summarizer/pyproject.toml @@ -20,7 +20,7 @@ dependencies = [ "pydantic>=2.10.3,<3.0.0", "google-api-python-client>=2.101.0,<3.0.0", "youtube-transcript-api>=1.1.1,<2.0.0", - "instructor==1.14.5", + "instructor>=1.17.0,<2", "python-dotenv>=1.0.1,<2.0.0", ] diff --git a/atomic-examples/youtube-to-recipe/pyproject.toml b/atomic-examples/youtube-to-recipe/pyproject.toml index 656337bb..bfc84745 100644 --- a/atomic-examples/youtube-to-recipe/pyproject.toml +++ b/atomic-examples/youtube-to-recipe/pyproject.toml @@ -20,7 +20,7 @@ dependencies = [ "pydantic>=2.10.3,<3.0.0", "google-api-python-client>=2.101.0,<3.0.0", "youtube-transcript-api>=1.1.1,<2.0.0", - "instructor==1.14.5", + "instructor>=1.17.0,<2", "python-dotenv>=1.0.1,<2.0.0", ] diff --git a/pyproject.toml b/pyproject.toml index d5f16663..60e97b64 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,7 @@ classifiers = [ "Topic :: Software Development :: Libraries :: Python Modules", ] dependencies = [ - "instructor==1.14.5", + "instructor>=1.17.0,<2", "pydantic>=2.11.0,<3.0.0", "rich>=13.7.1,<14.0.0", "gitpython>=3.1.43,<4.0.0", diff --git a/requirements.txt b/requirements.txt index 7edaf803..a2089297 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -instructor==1.14.5 +instructor>=1.17.0,<2 pydantic>=2.10.3,<3.0.0 rich>=13.7.1,<14.0.0 gitpython>=3.1.43,<4.0.0 diff --git a/uv.lock b/uv.lock index 3aa0da6b..cde7e8fd 100644 --- a/uv.lock +++ b/uv.lock @@ -56,7 +56,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.13.2" +version = "3.14.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -65,44 +65,53 @@ dependencies = [ { name = "frozenlist" }, { name = "multidict" }, { name = "propcache" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1c/ce/3b83ebba6b3207a7135e5fcaba49706f8a4b6008153b4e30540c982fae26/aiohttp-3.13.2.tar.gz", hash = "sha256:40176a52c186aefef6eb3cad2cdd30cd06e3afbe88fe8ab2af9c0b90f228daca", size = 7837994, upload-time = "2025-10-28T20:59:39.937Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/29/9b/01f00e9856d0a73260e86dd8ed0c2234a466c5c1712ce1c281548df39777/aiohttp-3.13.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b1e56bab2e12b2b9ed300218c351ee2a3d8c8fdab5b1ec6193e11a817767e47b", size = 737623, upload-time = "2025-10-28T20:56:30.797Z" }, - { url = "https://files.pythonhosted.org/packages/5a/1b/4be39c445e2b2bd0aab4ba736deb649fabf14f6757f405f0c9685019b9e9/aiohttp-3.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:364e25edaabd3d37b1db1f0cbcee8c73c9a3727bfa262b83e5e4cf3489a2a9dc", size = 492664, upload-time = "2025-10-28T20:56:32.708Z" }, - { url = "https://files.pythonhosted.org/packages/28/66/d35dcfea8050e131cdd731dff36434390479b4045a8d0b9d7111b0a968f1/aiohttp-3.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c5c94825f744694c4b8db20b71dba9a257cd2ba8e010a803042123f3a25d50d7", size = 491808, upload-time = "2025-10-28T20:56:34.57Z" }, - { url = "https://files.pythonhosted.org/packages/00/29/8e4609b93e10a853b65f8291e64985de66d4f5848c5637cddc70e98f01f8/aiohttp-3.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba2715d842ffa787be87cbfce150d5e88c87a98e0b62e0f5aa489169a393dbbb", size = 1738863, upload-time = "2025-10-28T20:56:36.377Z" }, - { url = "https://files.pythonhosted.org/packages/9d/fa/4ebdf4adcc0def75ced1a0d2d227577cd7b1b85beb7edad85fcc87693c75/aiohttp-3.13.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:585542825c4bc662221fb257889e011a5aa00f1ae4d75d1d246a5225289183e3", size = 1700586, upload-time = "2025-10-28T20:56:38.034Z" }, - { url = "https://files.pythonhosted.org/packages/da/04/73f5f02ff348a3558763ff6abe99c223381b0bace05cd4530a0258e52597/aiohttp-3.13.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:39d02cb6025fe1aabca329c5632f48c9532a3dabccd859e7e2f110668972331f", size = 1768625, upload-time = "2025-10-28T20:56:39.75Z" }, - { url = "https://files.pythonhosted.org/packages/f8/49/a825b79ffec124317265ca7d2344a86bcffeb960743487cb11988ffb3494/aiohttp-3.13.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e67446b19e014d37342f7195f592a2a948141d15a312fe0e700c2fd2f03124f6", size = 1867281, upload-time = "2025-10-28T20:56:41.471Z" }, - { url = "https://files.pythonhosted.org/packages/b9/48/adf56e05f81eac31edcfae45c90928f4ad50ef2e3ea72cb8376162a368f8/aiohttp-3.13.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4356474ad6333e41ccefd39eae869ba15a6c5299c9c01dfdcfdd5c107be4363e", size = 1752431, upload-time = "2025-10-28T20:56:43.162Z" }, - { url = "https://files.pythonhosted.org/packages/30/ab/593855356eead019a74e862f21523db09c27f12fd24af72dbc3555b9bfd9/aiohttp-3.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eeacf451c99b4525f700f078becff32c32ec327b10dcf31306a8a52d78166de7", size = 1562846, upload-time = "2025-10-28T20:56:44.85Z" }, - { url = "https://files.pythonhosted.org/packages/39/0f/9f3d32271aa8dc35036e9668e31870a9d3b9542dd6b3e2c8a30931cb27ae/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8a9b889aeabd7a4e9af0b7f4ab5ad94d42e7ff679aaec6d0db21e3b639ad58d", size = 1699606, upload-time = "2025-10-28T20:56:46.519Z" }, - { url = "https://files.pythonhosted.org/packages/2c/3c/52d2658c5699b6ef7692a3f7128b2d2d4d9775f2a68093f74bca06cf01e1/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:fa89cb11bc71a63b69568d5b8a25c3ca25b6d54c15f907ca1c130d72f320b76b", size = 1720663, upload-time = "2025-10-28T20:56:48.528Z" }, - { url = "https://files.pythonhosted.org/packages/9b/d4/8f8f3ff1fb7fb9e3f04fcad4e89d8a1cd8fc7d05de67e3de5b15b33008ff/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8aa7c807df234f693fed0ecd507192fc97692e61fee5702cdc11155d2e5cadc8", size = 1737939, upload-time = "2025-10-28T20:56:50.77Z" }, - { url = "https://files.pythonhosted.org/packages/03/d3/ddd348f8a27a634daae39a1b8e291ff19c77867af438af844bf8b7e3231b/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9eb3e33fdbe43f88c3c75fa608c25e7c47bbd80f48d012763cb67c47f39a7e16", size = 1555132, upload-time = "2025-10-28T20:56:52.568Z" }, - { url = "https://files.pythonhosted.org/packages/39/b8/46790692dc46218406f94374903ba47552f2f9f90dad554eed61bfb7b64c/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9434bc0d80076138ea986833156c5a48c9c7a8abb0c96039ddbb4afc93184169", size = 1764802, upload-time = "2025-10-28T20:56:54.292Z" }, - { url = "https://files.pythonhosted.org/packages/ba/e4/19ce547b58ab2a385e5f0b8aa3db38674785085abcf79b6e0edd1632b12f/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff15c147b2ad66da1f2cbb0622313f2242d8e6e8f9b79b5206c84523a4473248", size = 1719512, upload-time = "2025-10-28T20:56:56.428Z" }, - { url = "https://files.pythonhosted.org/packages/70/30/6355a737fed29dcb6dfdd48682d5790cb5eab050f7b4e01f49b121d3acad/aiohttp-3.13.2-cp312-cp312-win32.whl", hash = "sha256:27e569eb9d9e95dbd55c0fc3ec3a9335defbf1d8bc1d20171a49f3c4c607b93e", size = 426690, upload-time = "2025-10-28T20:56:58.736Z" }, - { url = "https://files.pythonhosted.org/packages/0a/0d/b10ac09069973d112de6ef980c1f6bb31cb7dcd0bc363acbdad58f927873/aiohttp-3.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:8709a0f05d59a71f33fd05c17fc11fcb8c30140506e13c2f5e8ee1b8964e1b45", size = 453465, upload-time = "2025-10-28T20:57:00.795Z" }, - { url = "https://files.pythonhosted.org/packages/bf/78/7e90ca79e5aa39f9694dcfd74f4720782d3c6828113bb1f3197f7e7c4a56/aiohttp-3.13.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7519bdc7dfc1940d201651b52bf5e03f5503bda45ad6eacf64dda98be5b2b6be", size = 732139, upload-time = "2025-10-28T20:57:02.455Z" }, - { url = "https://files.pythonhosted.org/packages/db/ed/1f59215ab6853fbaa5c8495fa6cbc39edfc93553426152b75d82a5f32b76/aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:088912a78b4d4f547a1f19c099d5a506df17eacec3c6f4375e2831ec1d995742", size = 490082, upload-time = "2025-10-28T20:57:04.784Z" }, - { url = "https://files.pythonhosted.org/packages/68/7b/fe0fe0f5e05e13629d893c760465173a15ad0039c0a5b0d0040995c8075e/aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5276807b9de9092af38ed23ce120539ab0ac955547b38563a9ba4f5b07b95293", size = 489035, upload-time = "2025-10-28T20:57:06.894Z" }, - { url = "https://files.pythonhosted.org/packages/d2/04/db5279e38471b7ac801d7d36a57d1230feeee130bbe2a74f72731b23c2b1/aiohttp-3.13.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1237c1375eaef0db4dcd7c2559f42e8af7b87ea7d295b118c60c36a6e61cb811", size = 1720387, upload-time = "2025-10-28T20:57:08.685Z" }, - { url = "https://files.pythonhosted.org/packages/31/07/8ea4326bd7dae2bd59828f69d7fdc6e04523caa55e4a70f4a8725a7e4ed2/aiohttp-3.13.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:96581619c57419c3d7d78703d5b78c1e5e5fc0172d60f555bdebaced82ded19a", size = 1688314, upload-time = "2025-10-28T20:57:10.693Z" }, - { url = "https://files.pythonhosted.org/packages/48/ab/3d98007b5b87ffd519d065225438cc3b668b2f245572a8cb53da5dd2b1bc/aiohttp-3.13.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2713a95b47374169409d18103366de1050fe0ea73db358fc7a7acb2880422d4", size = 1756317, upload-time = "2025-10-28T20:57:12.563Z" }, - { url = "https://files.pythonhosted.org/packages/97/3d/801ca172b3d857fafb7b50c7c03f91b72b867a13abca982ed6b3081774ef/aiohttp-3.13.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:228a1cd556b3caca590e9511a89444925da87d35219a49ab5da0c36d2d943a6a", size = 1858539, upload-time = "2025-10-28T20:57:14.623Z" }, - { url = "https://files.pythonhosted.org/packages/f7/0d/4764669bdf47bd472899b3d3db91fffbe925c8e3038ec591a2fd2ad6a14d/aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac6cde5fba8d7d8c6ac963dbb0256a9854e9fafff52fbcc58fdf819357892c3e", size = 1739597, upload-time = "2025-10-28T20:57:16.399Z" }, - { url = "https://files.pythonhosted.org/packages/c4/52/7bd3c6693da58ba16e657eb904a5b6decfc48ecd06e9ac098591653b1566/aiohttp-3.13.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2bef8237544f4e42878c61cef4e2839fee6346dc60f5739f876a9c50be7fcdb", size = 1555006, upload-time = "2025-10-28T20:57:18.288Z" }, - { url = "https://files.pythonhosted.org/packages/48/30/9586667acec5993b6f41d2ebcf96e97a1255a85f62f3c653110a5de4d346/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:16f15a4eac3bc2d76c45f7ebdd48a65d41b242eb6c31c2245463b40b34584ded", size = 1683220, upload-time = "2025-10-28T20:57:20.241Z" }, - { url = "https://files.pythonhosted.org/packages/71/01/3afe4c96854cfd7b30d78333852e8e851dceaec1c40fd00fec90c6402dd2/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:bb7fb776645af5cc58ab804c58d7eba545a97e047254a52ce89c157b5af6cd0b", size = 1712570, upload-time = "2025-10-28T20:57:22.253Z" }, - { url = "https://files.pythonhosted.org/packages/11/2c/22799d8e720f4697a9e66fd9c02479e40a49de3de2f0bbe7f9f78a987808/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e1b4951125ec10c70802f2cb09736c895861cd39fd9dcb35107b4dc8ae6220b8", size = 1733407, upload-time = "2025-10-28T20:57:24.37Z" }, - { url = "https://files.pythonhosted.org/packages/34/cb/90f15dd029f07cebbd91f8238a8b363978b530cd128488085b5703683594/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:550bf765101ae721ee1d37d8095f47b1f220650f85fe1af37a90ce75bab89d04", size = 1550093, upload-time = "2025-10-28T20:57:26.257Z" }, - { url = "https://files.pythonhosted.org/packages/69/46/12dce9be9d3303ecbf4d30ad45a7683dc63d90733c2d9fe512be6716cd40/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fe91b87fc295973096251e2d25a811388e7d8adf3bd2b97ef6ae78bc4ac6c476", size = 1758084, upload-time = "2025-10-28T20:57:28.349Z" }, - { url = "https://files.pythonhosted.org/packages/f9/c8/0932b558da0c302ffd639fc6362a313b98fdf235dc417bc2493da8394df7/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0c8e31cfcc4592cb200160344b2fb6ae0f9e4effe06c644b5a125d4ae5ebe23", size = 1716987, upload-time = "2025-10-28T20:57:30.233Z" }, - { url = "https://files.pythonhosted.org/packages/5d/8b/f5bd1a75003daed099baec373aed678f2e9b34f2ad40d85baa1368556396/aiohttp-3.13.2-cp313-cp313-win32.whl", hash = "sha256:0740f31a60848d6edb296a0df827473eede90c689b8f9f2a4cdde74889eb2254", size = 425859, upload-time = "2025-10-28T20:57:32.105Z" }, - { url = "https://files.pythonhosted.org/packages/5d/28/a8a9fc6957b2cee8902414e41816b5ab5536ecf43c3b1843c10e82c559b2/aiohttp-3.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:a88d13e7ca367394908f8a276b89d04a3652044612b9a408a0bb22a5ed976a1a", size = 452192, upload-time = "2025-10-28T20:57:34.166Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/6c/4c/bdccd81e9ee225b69c60e7766c9a5b05364f118f4d383713b89a682d772d/aiohttp-3.14.5.tar.gz", hash = "sha256:5558a7f5a05af9ecf744af91e5baefc436f93c9333e656c27ec253f9a6bbe178", size = 8078052, upload-time = "2026-10-11T01:05:12.408Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/94/6ba86efddcb616c811b40e6a0dfdd862738f647e4e3860a961075d5e9ed8/aiohttp-3.14.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df37b620684e19b5e25724412518ccafc3b1a49cdac706fdbd2f983fad943450", size = 817499, upload-time = "2026-10-11T01:00:18.901Z" }, + { url = "https://files.pythonhosted.org/packages/5e/e1/7bca6d84dabd228aa8eb4b7f9feac2586aaa9be5505d7d65bf287a615c43/aiohttp-3.14.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ef60869969180ec2464f1349aff07138ae35ca2200f0946cb3552e49e8f301a8", size = 549467, upload-time = "2026-10-11T01:00:20.854Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/11b89f45ca486252dd67dd5f3231fec04bf5518da39a95cb3997619f17fb/aiohttp-3.14.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d079c0a0135c36e7beb6f1c88087c8f108dc5891cdd0b5eafa778421bda70ed2", size = 548067, upload-time = "2026-10-11T01:00:22.659Z" }, + { url = "https://files.pythonhosted.org/packages/22/ff/c6615806c14aab34f82b9424ccde8ce6e417315fd57ce1c5b4d4747888e1/aiohttp-3.14.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:abfda5cb094a829f7bc25216a32f7db2e85cc65bd59910f8e7b40b3d9b224764", size = 1896245, upload-time = "2026-10-11T01:00:24.638Z" }, + { url = "https://files.pythonhosted.org/packages/39/b2/25a8c971ae6a92c8394d77e42422d7f38989e05cf41a5ceb92d73d67ab7e/aiohttp-3.14.5-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9cc882cf8619109583c906b4d4a85d6a111a98afa34b7a450d1e08118d016820", size = 1872180, upload-time = "2026-10-11T01:00:26.838Z" }, + { url = "https://files.pythonhosted.org/packages/2f/d5/99f93ea36cc5205e47c1e5a803e087f2ad21b5430b5db2e942cb6e988a37/aiohttp-3.14.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7457580535e019e1247ea35d6a02bf081ad30c26d0cbc210c93f6c3ab67a0835", size = 1937261, upload-time = "2026-10-11T01:00:28.74Z" }, + { url = "https://files.pythonhosted.org/packages/40/a6/9ac9c9e6695040bd73d2584a1b59a9388f6433c76d5294a7bf591e21ffe5/aiohttp-3.14.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c5ed596aedb9c42afd3fe0aae3117725378ac73d2cc5ddc735056fbdb96c5d02", size = 2064994, upload-time = "2026-10-11T01:00:30.623Z" }, + { url = "https://files.pythonhosted.org/packages/da/e4/aa172eb534b7f02f1f8ff1c3213347eaf3cf218db91a727c6863c22f1035/aiohttp-3.14.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20f085697d7e911f1f73c43ed03fafbed1e7121797e2eb5428efa80398060584", size = 1919630, upload-time = "2026-10-11T01:00:32.548Z" }, + { url = "https://files.pythonhosted.org/packages/06/7d/4eedafc5bababa8932636c141e346806966eade12c0b7e5946d43bf8218b/aiohttp-3.14.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:74b0a9c8270f9b0a11410e124ff8d4f18bfc1f1837440ec84da5ae7b50927b5d", size = 1710016, upload-time = "2026-10-11T01:00:34.471Z" }, + { url = "https://files.pythonhosted.org/packages/b2/94/eee018537ba19da0ceb2ac79cab83faed4ac49568e08376e2799043f2538/aiohttp-3.14.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:19e2ba471507c34f8252402ab50f5ab512398b9ea8c8f1cb26beb3f75793ba30", size = 1858112, upload-time = "2026-10-11T01:00:36.581Z" }, + { url = "https://files.pythonhosted.org/packages/68/76/354653a306547238f3427283905972d796ba7c292ba9977abec9f2b6f260/aiohttp-3.14.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d418ce2af40c6bb685b3f663e9e8de27cb0a22431d8e88a167348d7f01878073", size = 1896371, upload-time = "2026-10-11T01:00:38.478Z" }, + { url = "https://files.pythonhosted.org/packages/f2/ec/63e8c7136b570e356345ad3174e3820fdc973ea10712cb6c649bf875755a/aiohttp-3.14.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:70cb4008ac2ed1e0ca9e824deb4b53d3aa0d939109698ebf1e723a84337bd794", size = 1905836, upload-time = "2026-10-11T01:00:40.527Z" }, + { url = "https://files.pythonhosted.org/packages/57/d8/11365bda144b127928cd42533d0eff78a55613c9e28f81941bd6630ea887/aiohttp-3.14.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:a23fe35d776bc03cb495938b9594450d047e3bc08c5255315a82323e9cb7d2dd", size = 1696534, upload-time = "2026-10-11T01:00:42.686Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3d/82df0461b18e00b2998f205c03e0d3010222478c43640aceb8e03dcd7e8f/aiohttp-3.14.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3e0eb43bed3c6801a6cee315195377789e90b2a72c2277a475b578535312488d", size = 1933970, upload-time = "2026-10-11T01:00:44.71Z" }, + { url = "https://files.pythonhosted.org/packages/03/ad/6ddfe0aacd931c17b53533336d97e9d11a98b96d6ae815a9da0b19f82ccf/aiohttp-3.14.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be7dd397d64ca3e1869626fa9318aaebb54b7bf93bc72d7a205448d83e4f748", size = 1899501, upload-time = "2026-10-11T01:00:46.629Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8e/189bdd9ae4793059bb09f6dc880f211a6c6c7859cebcbf33912dbfab7dd7/aiohttp-3.14.5-cp312-cp312-win32.whl", hash = "sha256:eb324e2009fb54db30a071dad7caf6998ee2879c4704007efb244514dad1fec1", size = 480370, upload-time = "2026-10-11T01:00:48.468Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ce/1f08114679d49655b30a6e0a29858375c94b82c1de1a0bd0a20c2fee8b02/aiohttp-3.14.5-cp312-cp312-win_amd64.whl", hash = "sha256:2cc38a4f2b516bef1714e690df87a0e043faf1a7693c82d860091684453d5111", size = 506141, upload-time = "2026-10-11T01:00:50.272Z" }, + { url = "https://files.pythonhosted.org/packages/79/d4/c7b4f60b16a1b7e43249fa9031ae05e7e8c341ba4b7d1866f914dafeaa0e/aiohttp-3.14.5-cp312-cp312-win_arm64.whl", hash = "sha256:a63afd1f757de949028387e65a7127b61ad0f775432dbb0e62816ae619fe69ac", size = 488108, upload-time = "2026-10-11T01:00:52.321Z" }, + { url = "https://files.pythonhosted.org/packages/d3/e1/2841e020ebb7aefae5513586193e011e06313d9a6bdbd296622afbbce204/aiohttp-3.14.5-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:9ad7e6aa38c20da1be697874349c4c273c8a03b7887169665081706398d0439a", size = 538932, upload-time = "2026-10-11T01:00:54.3Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a6/7fb8ea8fe96bcc7b7c7a36d10f021d99d01a8dc8a4b3f0ddacecfad9a80e/aiohttp-3.14.5-cp313-cp313-android_24_x86_64.whl", hash = "sha256:f59c7673465908cbe506117176156c127f29f917677afceada34957179221d91", size = 553329, upload-time = "2026-10-11T01:00:56.442Z" }, + { url = "https://files.pythonhosted.org/packages/de/64/d056e3c27647dc25af1a592cf356245382ea7c808171b9dac7677afedfc8/aiohttp-3.14.5-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1b5416552740edf07234cc9437d0706f2acb67b93c198670b1a68e1b2b587dec", size = 521367, upload-time = "2026-10-11T01:00:58.345Z" }, + { url = "https://files.pythonhosted.org/packages/3e/e4/95226147e11d4db916fd1d495dcf85af8e3816e38333e42718241196e848/aiohttp-3.14.5-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:43351bdb5e4c3cb7d1772368e988534e869a74db7778079a83782c11c69535c7", size = 528322, upload-time = "2026-10-11T01:01:00.211Z" }, + { url = "https://files.pythonhosted.org/packages/17/cd/1d3c9192cafdb51cad62b2d3ded96cff9cc8af51893210aadd448a325389/aiohttp-3.14.5-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:c8c4478bef6d57fcfda15dae461ea3c9f06aa7b257c58df3f2300174ccbb185a", size = 539874, upload-time = "2026-10-11T01:01:02.06Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0c/dfa33aecc7d4d1dc75e05248f5eac5a0edf4d09e7b44d93ab62529b0c1db/aiohttp-3.14.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c2c30484dd1417ef98b51021ffa2cc0d7f3c78918adaaaab7e70817335ab3e02", size = 813836, upload-time = "2026-10-11T01:01:04.01Z" }, + { url = "https://files.pythonhosted.org/packages/33/17/4a63738052d20567d55529d6daa1b9480d906fd52930fbcf6d3fbed618f0/aiohttp-3.14.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dab9ac5a67c8d1f070c00fa8fccb7cbd1b8dcc1a8d6b42f37540df9b3d4cc603", size = 548070, upload-time = "2026-10-11T01:01:06.035Z" }, + { url = "https://files.pythonhosted.org/packages/15/e5/b57e58695a757fd4c02497c033fced96a69c631b13866c43d336530c9670/aiohttp-3.14.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e1cc2bfaee8c214f06080a7c7d5772419b8a1108e8e5349236189811823fb02a", size = 545786, upload-time = "2026-10-11T01:01:07.817Z" }, + { url = "https://files.pythonhosted.org/packages/9a/68/8c2c67a3aedf46e00f3c42f04fbc6983de80d4ed5786151e33681ba45883/aiohttp-3.14.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74efb69332b85675b1eabd760a8cfc2e2cf42c60607c66f88014c1bdfb40942d", size = 1886492, upload-time = "2026-10-11T01:01:09.834Z" }, + { url = "https://files.pythonhosted.org/packages/ab/4b/74aab5e8d28c62e8f795b4fe8f38cf5586fd264a9a27bd2141ef6490333d/aiohttp-3.14.5-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:42b5e616946dbaf505e2bff18c9af2cd4ef9e7ef300ee58a6e951a5b7cf147ae", size = 1870057, upload-time = "2026-10-11T01:01:12.045Z" }, + { url = "https://files.pythonhosted.org/packages/a8/f7/eafc3b1988302b1815d9fd4a21071be5c360d616c0a430d02fd92dc97688/aiohttp-3.14.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f9033b43f511f27547c557dcaba0177649e10a3725336ccd2cce0fdc1dc4850d", size = 1925119, upload-time = "2026-10-11T01:01:14.09Z" }, + { url = "https://files.pythonhosted.org/packages/a1/04/78d8f294f74dd570f3898ff20402349fce524176045df98ba727d6846a68/aiohttp-3.14.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15a310d3c71398e3d7bfc93a1a73fbe664315cd9e9016b8efc1cff85eeab7155", size = 2053137, upload-time = "2026-10-11T01:01:16.344Z" }, + { url = "https://files.pythonhosted.org/packages/32/51/395d225ef36f5a50d8e548dcd3141bfdbcd31fb6eed859022c573d2c4d66/aiohttp-3.14.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ffa3a523a36d8628f98c06492ae16a31a23d14c0b4ec721757b477319f656d6", size = 1911038, upload-time = "2026-10-11T01:01:18.653Z" }, + { url = "https://files.pythonhosted.org/packages/ff/a4/2aec1aa06d82e8a244843b5dae31d78061e5e76744270a86dd0ee051c889/aiohttp-3.14.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5fb6a6e919bfb703227bc1ce6579281b84b1a2ba57deb9794dfdbec7dcd1e40c", size = 1702205, upload-time = "2026-10-11T01:01:20.904Z" }, + { url = "https://files.pythonhosted.org/packages/16/27/6051bfde7b6f418f70edd60d655fa426abb3355fa0981764739d87ecf160/aiohttp-3.14.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:43e1b7994a8b038125f722bff07492ef501110722c2727c408995d9fb864c421", size = 1848588, upload-time = "2026-10-11T01:01:22.918Z" }, + { url = "https://files.pythonhosted.org/packages/9e/44/55efc06fc26c4e6e1c095f231b4c222bf2d86d64a8eebbc24b2bb5958ea8/aiohttp-3.14.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:5f3e96071686755d9cd3600c3880183eb94b012178e92746d68101800f0ed8a3", size = 1887540, upload-time = "2026-10-11T01:01:25.278Z" }, + { url = "https://files.pythonhosted.org/packages/48/dc/1502bfdc2a65760d386ac6a00090b0addaa8a3c9c60b3f8127fad3a9afb2/aiohttp-3.14.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:cd88b01f3d37b7a2a34f91d98f14720206f1ea3d540843fab2d649dd5fb91fec", size = 1895030, upload-time = "2026-10-11T01:01:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/93/7e/44174bb6288264418c9eec07a5e35180969c0d5a796c7af544db3cb8a33a/aiohttp-3.14.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f2ed8b64dc0c651c0f5a9c926777719770021251b8f336d97c4b80b660836ce1", size = 1693244, upload-time = "2026-10-11T01:01:29.39Z" }, + { url = "https://files.pythonhosted.org/packages/47/dd/b507d64e50db23888582fff08eda13998b12f9dea70c072edaac19218380/aiohttp-3.14.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a9918e58faf62ba2c7147927d06057aec78f42475aff5048047ec47e7265a600", size = 1926308, upload-time = "2026-10-11T01:01:31.634Z" }, + { url = "https://files.pythonhosted.org/packages/98/4b/5b51b4f63e3f2793151f4aea49c48fe1e00baeb7cec9c7a206de499f8de0/aiohttp-3.14.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:42f320d4a5b00b9af0bddcfec5407dc6f2d9816f006b2f79ebbaa31f16895df3", size = 1888406, upload-time = "2026-10-11T01:01:33.715Z" }, + { url = "https://files.pythonhosted.org/packages/ff/13/d5e818a5eaba9f822016727299f41c0e1075799f82a6433ec508a93ab867/aiohttp-3.14.5-cp313-cp313-win32.whl", hash = "sha256:3ae800a20947e2c2e53088047d021e6bf7d51560cc49f6a0737a1f79d2e3a13c", size = 479970, upload-time = "2026-10-11T01:01:35.677Z" }, + { url = "https://files.pythonhosted.org/packages/8d/d0/8eca2c65aa467320990d78fb2005f38ed3588944280c39ff9deb6423fef1/aiohttp-3.14.5-cp313-cp313-win_amd64.whl", hash = "sha256:d05e94cdfe0d15d0206f970722d2554780ce562787b21b218b275447f8751319", size = 505985, upload-time = "2026-10-11T01:01:37.574Z" }, + { url = "https://files.pythonhosted.org/packages/7a/f8/4cdd65305d2fca14b886bea9ed2abb1fe726287872524e56e3d26692b47d/aiohttp-3.14.5-cp313-cp313-win_arm64.whl", hash = "sha256:f001b571ead90ca1770f1e616db255351a1703317f20374c361ef22f12c06d09", size = 487629, upload-time = "2026-10-11T01:01:39.477Z" }, + { url = "https://files.pythonhosted.org/packages/68/30/173960c42b05a6c59f7558e4b12a4b0d9ba376cf6aa9bde7f9e08a30ca8d/aiohttp-3.14.5-py3-none-any.whl", hash = "sha256:efc21a454892828368b11c2c780de0ff8bc991f73f6b99c6b66e56205470929b", size = 279517, upload-time = "2026-10-11T01:05:08.523Z" }, ] [[package]] @@ -161,7 +170,7 @@ wheels = [ [[package]] name = "anthropic" -version = "0.71.0" +version = "0.93.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -173,9 +182,9 @@ dependencies = [ { name = "sniffio" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/4f/70682b068d897841f43223df82d96ec1d617435a8b759c4a2d901a50158b/anthropic-0.71.0.tar.gz", hash = "sha256:eb8e6fa86d049061b3ef26eb4cbae0174ebbff21affa6de7b3098da857d8de6a", size = 489102, upload-time = "2025-10-16T15:54:40.08Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c2/70/2429d6f7c2516db99fb342c3ad89575ab3e0cd31d3d2f6cba5fdf5e9c65b/anthropic-0.93.0.tar.gz", hash = "sha256:fea8376f7d5cdf99d5e8e85a48fe7a7bd8ab307cdfee4b1e8283a18b1c0ce1b5", size = 654155, upload-time = "2026-04-09T18:13:53.522Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/77/073e8ac488f335aec7001952825275582fb8f433737e90f24eeef9d878f6/anthropic-0.71.0-py3-none-any.whl", hash = "sha256:85c5015fcdbdc728390f11b17642a65a4365d03b12b799b18b6cc57e71fdb327", size = 355035, upload-time = "2025-10-16T15:54:38.238Z" }, + { url = "https://files.pythonhosted.org/packages/c9/7b/5b2c11902707c49c7a99418eb027ed3eb63876193fee5c80b5c878e3a673/anthropic-0.93.0-py3-none-any.whl", hash = "sha256:2c20b2ce6d305564c66a6cbaedddee8efdd3b9753098bf314093fcf4c662d04c", size = 627482, upload-time = "2026-04-09T18:13:51.606Z" }, ] [[package]] @@ -307,7 +316,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "gitpython", specifier = ">=3.1.43,<4.0.0" }, - { name = "instructor", specifier = "==1.14.5" }, + { name = "instructor", specifier = ">=1.17.0,<2" }, { name = "litellm", specifier = ">=1.50.0,<2.0.0" }, { name = "mcp", extras = ["cli"], specifier = ">=1.6.0,<2" }, { name = "openinference-instrumentation", marker = "extra == 'observability'", specifier = ">=0.1.38,<0.2.0" }, @@ -398,7 +407,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "atomic-agents", editable = "." }, - { name = "instructor", specifier = "==1.14.5" }, + { name = "instructor", specifier = ">=1.17.0,<2" }, { name = "openai", specifier = ">=2.0.0,<3.0.0" }, ] @@ -414,7 +423,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "atomic-agents", editable = "." }, - { name = "instructor", extras = ["google-genai"], specifier = "==1.14.5" }, + { name = "instructor", extras = ["google-genai"], specifier = ">=1.17.0,<2" }, ] [[package]] @@ -754,14 +763,11 @@ wheels = [ [[package]] name = "click" -version = "8.3.1" +version = "8.5.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/0e/7fa0ef50764b67090eca4114772a2abf8b6148198475e54c660b97caeee6/click-8.5.0.tar.gz", hash = "sha256:ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34", size = 382235, upload-time = "2026-08-26T13:33:14.56Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, + { url = "https://files.pythonhosted.org/packages/58/50/6c0d534c5f134586a8e1ba4e330569e32f057e33372ae556463212fb4cd3/click-8.5.0-py3-none-any.whl", hash = "sha256:255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360", size = 125251, upload-time = "2026-08-26T13:33:12.928Z" }, ] [[package]] @@ -1257,7 +1263,7 @@ requires-dist = [ { name = "atomic-agents", editable = "." }, { name = "fastapi", specifier = ">=0.115.14,<1.0.0" }, { name = "httpx", specifier = ">=0.28.1,<1.0.0" }, - { name = "instructor", specifier = "==1.14.5" }, + { name = "instructor", specifier = ">=1.17.0,<2" }, { name = "openai", specifier = ">=2.0.0,<3.0.0" }, { name = "pydantic", specifier = ">=2.10.3,<3.0.0" }, { name = "rich", specifier = ">=13.9.4,<14.0.0" }, @@ -1812,7 +1818,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "atomic-agents", editable = "." }, - { name = "instructor", specifier = "==1.14.5" }, + { name = "instructor", specifier = ">=1.17.0,<2" }, { name = "openai", specifier = ">=2.0.0,<3.0.0" }, { name = "python-dotenv", specifier = ">=1.0.1,<2.0.0" }, ] @@ -1971,11 +1977,11 @@ wheels = [ [[package]] name = "idna" -version = "3.11" +version = "3.20" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/08/8eea9d4b8302028f3abb2c0813953f7aec26d33b7a8960ed760e65ff29fa/idna-3.20.tar.gz", hash = "sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44", size = 216463, upload-time = "2026-09-17T14:11:04.752Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, + { url = "https://files.pythonhosted.org/packages/58/a2/bb081bab032533a855d44de1d56f8e8426114ff1ba5d1f07a438a0a654f8/idna-3.20-py3-none-any.whl", hash = "sha256:ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c", size = 69583, upload-time = "2026-09-17T14:11:03.168Z" }, ] [[package]] @@ -2019,25 +2025,28 @@ wheels = [ [[package]] name = "instructor" -version = "1.14.5" +version = "1.17.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, - { name = "diskcache" }, + { name = "click" }, { name = "docstring-parser" }, + { name = "idna" }, { name = "jinja2" }, { name = "jiter" }, { name = "openai" }, { name = "pydantic" }, { name = "pydantic-core" }, + { name = "regex" }, { name = "requests" }, { name = "rich" }, { name = "tenacity" }, { name = "typer" }, + { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0b/ef/986d059424db204ed57b29d8c07fda35de2a2c72dee8ea7994bc90a6f767/instructor-1.14.5.tar.gz", hash = "sha256:fcb6432867f2fe4a5986e8bf389dcc64ed2ad4039a12a2dff85464e51c2f171a", size = 69950754, upload-time = "2026-01-29T14:18:50.454Z" } +sdist = { url = "https://files.pythonhosted.org/packages/80/cc/d9b8e4e0684033388c9a88df56c47f639758e4ac946e9eb3789d1b4d13d4/instructor-1.17.0.tar.gz", hash = "sha256:aeab1e7f21f5214deedf60e8e264951408057ce21d9589743f533580dc0d6bfb", size = 70240472, upload-time = "2026-09-09T02:26:00.614Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/04/e442e1356c97b03a6d30d2b462f7c0bdfbf207e75f6833815fd1225a75b4/instructor-1.14.5-py3-none-any.whl", hash = "sha256:2a5a31222b008c0989be1cc001e33a237f49506e80ac5833f6d36d7690bae7b1", size = 177445, upload-time = "2026-01-29T14:18:53.641Z" }, + { url = "https://files.pythonhosted.org/packages/42/22/429e950b50569cb56eb324cc62992c0a458121e5d5a43acec295a127ade7/instructor-1.17.0-py3-none-any.whl", hash = "sha256:f6b1832d178e899ee0a6a3f247e221f19580fa525c815211c02447691d761217", size = 269394, upload-time = "2026-09-09T02:25:54.888Z" }, ] [package.optional-dependencies] @@ -2627,7 +2636,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "atomic-agents", editable = "." }, - { name = "instructor", specifier = "==1.14.5" }, + { name = "instructor", specifier = ">=1.17.0,<2" }, { name = "openai", specifier = ">=2.0.0,<3.0.0" }, { name = "python-dotenv", specifier = ">=1.0.0,<2.0.0" }, ] @@ -2954,7 +2963,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "atomic-agents", editable = "." }, - { name = "instructor", specifier = "==1.14.5" }, + { name = "instructor", specifier = ">=1.17.0,<2" }, { name = "openai", specifier = ">=2.0.0,<3.0.0" }, { name = "pydantic", specifier = ">=2.10.3,<3.0.0" }, { name = "python-dotenv", specifier = ">=1.0.1,<2.0.0" }, @@ -3139,7 +3148,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "atomic-agents", editable = "." }, - { name = "instructor", extras = ["anthropic", "groq", "google-genai"], specifier = "==1.14.5" }, + { name = "instructor", extras = ["anthropic", "groq", "google-genai"], specifier = ">=1.17.0,<2" }, { name = "openai", specifier = ">=2.0.0,<3.0.0" }, { name = "python-dotenv", specifier = ">=1.0.1,<2.0.0" }, ] @@ -3162,7 +3171,7 @@ dependencies = [ requires-dist = [ { name = "arize-phoenix-otel", specifier = ">=0.17.0,<1.0.0" }, { name = "atomic-agents", extras = ["observability"], editable = "." }, - { name = "instructor", specifier = "==1.14.5" }, + { name = "instructor", specifier = ">=1.17.0,<2" }, { name = "openai", specifier = ">=2.0.0,<3.0.0" }, { name = "openinference-instrumentation-openai", specifier = ">=0.1.30,<0.2.0" }, { name = "python-dotenv", specifier = ">=1.0.1,<2.0.0" }, @@ -3297,7 +3306,7 @@ dependencies = [ requires-dist = [ { name = "atomic-agents", editable = "." }, { name = "fastmcp", specifier = ">=2.0.0" }, - { name = "instructor", specifier = "==1.14.5" }, + { name = "instructor", specifier = ">=1.17.0,<2" }, { name = "mcp", extras = ["cli"], specifier = ">=1.9.4" }, { name = "openai", specifier = ">=2.0.0,<3.0.0" }, { name = "pd-data-server", directory = "atomic-examples/progressive-disclosure/servers/data_server" }, @@ -3877,7 +3886,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "atomic-agents", editable = "." }, - { name = "instructor", extras = ["anthropic", "groq", "google-genai"], specifier = "==1.14.5" }, + { name = "instructor", extras = ["anthropic", "groq", "google-genai"], specifier = ">=1.17.0,<2" }, { name = "openai", specifier = ">=2.0.0,<3.0.0" }, { name = "python-dotenv", specifier = ">=1.0.1,<2.0.0" }, ] @@ -4004,7 +4013,7 @@ wheels = [ [[package]] name = "requests" -version = "2.32.5" +version = "2.34.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -4012,9 +4021,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, ] [[package]] @@ -4724,11 +4733,11 @@ wheels = [ [[package]] name = "urllib3" -version = "2.5.0" +version = "2.8.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/05/b17359e1cefb4f909b5e40b1b90a496d987258916dbbf88e842c729f510e/urllib3-2.8.0.tar.gz", hash = "sha256:63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63", size = 458972, upload-time = "2026-09-15T19:29:36.253Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, + { url = "https://files.pythonhosted.org/packages/92/9d/c4e665119135114480843e7ab388fa94d8480650450e6f8e26b70d323a4c/urllib3-2.8.0-py3-none-any.whl", hash = "sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3", size = 135717, upload-time = "2026-09-15T19:29:34.577Z" }, ] [[package]] @@ -4882,7 +4891,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "atomic-agents", editable = "." }, - { name = "instructor", specifier = "==1.14.5" }, + { name = "instructor", specifier = ">=1.17.0,<2" }, { name = "openai", specifier = ">=2.0.0,<3.0.0" }, { name = "pydantic", specifier = ">=2.9.2,<3.0.0" }, { name = "python-dotenv", specifier = ">=1.0.1,<2.0.0" }, @@ -5101,64 +5110,50 @@ wheels = [ [[package]] name = "yarl" -version = "1.22.0" +version = "1.25.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169, upload-time = "2025-10-06T14:12:55.963Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/75/ff/46736024fee3429b80a165a732e38e5d5a238721e634ab41b040d49f8738/yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f", size = 142000, upload-time = "2025-10-06T14:09:44.631Z" }, - { url = "https://files.pythonhosted.org/packages/5a/9a/b312ed670df903145598914770eb12de1bac44599549b3360acc96878df8/yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2", size = 94338, upload-time = "2025-10-06T14:09:46.372Z" }, - { url = "https://files.pythonhosted.org/packages/ba/f5/0601483296f09c3c65e303d60c070a5c19fcdbc72daa061e96170785bc7d/yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74", size = 94909, upload-time = "2025-10-06T14:09:48.648Z" }, - { url = "https://files.pythonhosted.org/packages/60/41/9a1fe0b73dbcefce72e46cf149b0e0a67612d60bfc90fb59c2b2efdfbd86/yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df", size = 372940, upload-time = "2025-10-06T14:09:50.089Z" }, - { url = "https://files.pythonhosted.org/packages/17/7a/795cb6dfee561961c30b800f0ed616b923a2ec6258b5def2a00bf8231334/yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb", size = 345825, upload-time = "2025-10-06T14:09:52.142Z" }, - { url = "https://files.pythonhosted.org/packages/d7/93/a58f4d596d2be2ae7bab1a5846c4d270b894958845753b2c606d666744d3/yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2", size = 386705, upload-time = "2025-10-06T14:09:54.128Z" }, - { url = "https://files.pythonhosted.org/packages/61/92/682279d0e099d0e14d7fd2e176bd04f48de1484f56546a3e1313cd6c8e7c/yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82", size = 396518, upload-time = "2025-10-06T14:09:55.762Z" }, - { url = "https://files.pythonhosted.org/packages/db/0f/0d52c98b8a885aeda831224b78f3be7ec2e1aa4a62091f9f9188c3c65b56/yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a", size = 377267, upload-time = "2025-10-06T14:09:57.958Z" }, - { url = "https://files.pythonhosted.org/packages/22/42/d2685e35908cbeaa6532c1fc73e89e7f2efb5d8a7df3959ea8e37177c5a3/yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124", size = 365797, upload-time = "2025-10-06T14:09:59.527Z" }, - { url = "https://files.pythonhosted.org/packages/a2/83/cf8c7bcc6355631762f7d8bdab920ad09b82efa6b722999dfb05afa6cfac/yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa", size = 365535, upload-time = "2025-10-06T14:10:01.139Z" }, - { url = "https://files.pythonhosted.org/packages/25/e1/5302ff9b28f0c59cac913b91fe3f16c59a033887e57ce9ca5d41a3a94737/yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7", size = 382324, upload-time = "2025-10-06T14:10:02.756Z" }, - { url = "https://files.pythonhosted.org/packages/bf/cd/4617eb60f032f19ae3a688dc990d8f0d89ee0ea378b61cac81ede3e52fae/yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d", size = 383803, upload-time = "2025-10-06T14:10:04.552Z" }, - { url = "https://files.pythonhosted.org/packages/59/65/afc6e62bb506a319ea67b694551dab4a7e6fb7bf604e9bd9f3e11d575fec/yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520", size = 374220, upload-time = "2025-10-06T14:10:06.489Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3d/68bf18d50dc674b942daec86a9ba922d3113d8399b0e52b9897530442da2/yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8", size = 81589, upload-time = "2025-10-06T14:10:09.254Z" }, - { url = "https://files.pythonhosted.org/packages/c8/9a/6ad1a9b37c2f72874f93e691b2e7ecb6137fb2b899983125db4204e47575/yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c", size = 87213, upload-time = "2025-10-06T14:10:11.369Z" }, - { url = "https://files.pythonhosted.org/packages/44/c5/c21b562d1680a77634d748e30c653c3ca918beb35555cff24986fff54598/yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74", size = 81330, upload-time = "2025-10-06T14:10:13.112Z" }, - { url = "https://files.pythonhosted.org/packages/ea/f3/d67de7260456ee105dc1d162d43a019ecad6b91e2f51809d6cddaa56690e/yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53", size = 139980, upload-time = "2025-10-06T14:10:14.601Z" }, - { url = "https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a", size = 93424, upload-time = "2025-10-06T14:10:16.115Z" }, - { url = "https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c", size = 93821, upload-time = "2025-10-06T14:10:17.993Z" }, - { url = "https://files.pythonhosted.org/packages/61/3a/caf4e25036db0f2da4ca22a353dfeb3c9d3c95d2761ebe9b14df8fc16eb0/yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601", size = 373243, upload-time = "2025-10-06T14:10:19.44Z" }, - { url = "https://files.pythonhosted.org/packages/6e/9e/51a77ac7516e8e7803b06e01f74e78649c24ee1021eca3d6a739cb6ea49c/yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a", size = 342361, upload-time = "2025-10-06T14:10:21.124Z" }, - { url = "https://files.pythonhosted.org/packages/d4/f8/33b92454789dde8407f156c00303e9a891f1f51a0330b0fad7c909f87692/yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df", size = 387036, upload-time = "2025-10-06T14:10:22.902Z" }, - { url = "https://files.pythonhosted.org/packages/d9/9a/c5db84ea024f76838220280f732970aa4ee154015d7f5c1bfb60a267af6f/yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2", size = 397671, upload-time = "2025-10-06T14:10:24.523Z" }, - { url = "https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b", size = 377059, upload-time = "2025-10-06T14:10:26.406Z" }, - { url = "https://files.pythonhosted.org/packages/a1/b9/ab437b261702ced75122ed78a876a6dec0a1b0f5e17a4ac7a9a2482d8abe/yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273", size = 365356, upload-time = "2025-10-06T14:10:28.461Z" }, - { url = "https://files.pythonhosted.org/packages/b2/9d/8e1ae6d1d008a9567877b08f0ce4077a29974c04c062dabdb923ed98e6fe/yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a", size = 361331, upload-time = "2025-10-06T14:10:30.541Z" }, - { url = "https://files.pythonhosted.org/packages/ca/5a/09b7be3905962f145b73beb468cdd53db8aa171cf18c80400a54c5b82846/yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d", size = 382590, upload-time = "2025-10-06T14:10:33.352Z" }, - { url = "https://files.pythonhosted.org/packages/aa/7f/59ec509abf90eda5048b0bc3e2d7b5099dffdb3e6b127019895ab9d5ef44/yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02", size = 385316, upload-time = "2025-10-06T14:10:35.034Z" }, - { url = "https://files.pythonhosted.org/packages/e5/84/891158426bc8036bfdfd862fabd0e0fa25df4176ec793e447f4b85cf1be4/yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67", size = 374431, upload-time = "2025-10-06T14:10:37.76Z" }, - { url = "https://files.pythonhosted.org/packages/bb/49/03da1580665baa8bef5e8ed34c6df2c2aca0a2f28bf397ed238cc1bbc6f2/yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95", size = 81555, upload-time = "2025-10-06T14:10:39.649Z" }, - { url = "https://files.pythonhosted.org/packages/9a/ee/450914ae11b419eadd067c6183ae08381cfdfcb9798b90b2b713bbebddda/yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d", size = 86965, upload-time = "2025-10-06T14:10:41.313Z" }, - { url = "https://files.pythonhosted.org/packages/98/4d/264a01eae03b6cf629ad69bae94e3b0e5344741e929073678e84bf7a3e3b/yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b", size = 81205, upload-time = "2025-10-06T14:10:43.167Z" }, - { url = "https://files.pythonhosted.org/packages/88/fc/6908f062a2f77b5f9f6d69cecb1747260831ff206adcbc5b510aff88df91/yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10", size = 146209, upload-time = "2025-10-06T14:10:44.643Z" }, - { url = "https://files.pythonhosted.org/packages/65/47/76594ae8eab26210b4867be6f49129861ad33da1f1ebdf7051e98492bf62/yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3", size = 95966, upload-time = "2025-10-06T14:10:46.554Z" }, - { url = "https://files.pythonhosted.org/packages/ab/ce/05e9828a49271ba6b5b038b15b3934e996980dd78abdfeb52a04cfb9467e/yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9", size = 97312, upload-time = "2025-10-06T14:10:48.007Z" }, - { url = "https://files.pythonhosted.org/packages/d1/c5/7dffad5e4f2265b29c9d7ec869c369e4223166e4f9206fc2243ee9eea727/yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f", size = 361967, upload-time = "2025-10-06T14:10:49.997Z" }, - { url = "https://files.pythonhosted.org/packages/50/b2/375b933c93a54bff7fc041e1a6ad2c0f6f733ffb0c6e642ce56ee3b39970/yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0", size = 323949, upload-time = "2025-10-06T14:10:52.004Z" }, - { url = "https://files.pythonhosted.org/packages/66/50/bfc2a29a1d78644c5a7220ce2f304f38248dc94124a326794e677634b6cf/yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e", size = 361818, upload-time = "2025-10-06T14:10:54.078Z" }, - { url = "https://files.pythonhosted.org/packages/46/96/f3941a46af7d5d0f0498f86d71275696800ddcdd20426298e572b19b91ff/yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708", size = 372626, upload-time = "2025-10-06T14:10:55.767Z" }, - { url = "https://files.pythonhosted.org/packages/c1/42/8b27c83bb875cd89448e42cd627e0fb971fa1675c9ec546393d18826cb50/yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f", size = 341129, upload-time = "2025-10-06T14:10:57.985Z" }, - { url = "https://files.pythonhosted.org/packages/49/36/99ca3122201b382a3cf7cc937b95235b0ac944f7e9f2d5331d50821ed352/yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d", size = 346776, upload-time = "2025-10-06T14:10:59.633Z" }, - { url = "https://files.pythonhosted.org/packages/85/b4/47328bf996acd01a4c16ef9dcd2f59c969f495073616586f78cd5f2efb99/yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8", size = 334879, upload-time = "2025-10-06T14:11:01.454Z" }, - { url = "https://files.pythonhosted.org/packages/c2/ad/b77d7b3f14a4283bffb8e92c6026496f6de49751c2f97d4352242bba3990/yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5", size = 350996, upload-time = "2025-10-06T14:11:03.452Z" }, - { url = "https://files.pythonhosted.org/packages/81/c8/06e1d69295792ba54d556f06686cbd6a7ce39c22307100e3fb4a2c0b0a1d/yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f", size = 356047, upload-time = "2025-10-06T14:11:05.115Z" }, - { url = "https://files.pythonhosted.org/packages/4b/b8/4c0e9e9f597074b208d18cef227d83aac36184bfbc6eab204ea55783dbc5/yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62", size = 342947, upload-time = "2025-10-06T14:11:08.137Z" }, - { url = "https://files.pythonhosted.org/packages/e0/e5/11f140a58bf4c6ad7aca69a892bff0ee638c31bea4206748fc0df4ebcb3a/yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03", size = 86943, upload-time = "2025-10-06T14:11:10.284Z" }, - { url = "https://files.pythonhosted.org/packages/31/74/8b74bae38ed7fe6793d0c15a0c8207bbb819cf287788459e5ed230996cdd/yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249", size = 93715, upload-time = "2025-10-06T14:11:11.739Z" }, - { url = "https://files.pythonhosted.org/packages/69/66/991858aa4b5892d57aef7ee1ba6b4d01ec3b7eb3060795d34090a3ca3278/yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b", size = 83857, upload-time = "2025-10-06T14:11:13.586Z" }, - { url = "https://files.pythonhosted.org/packages/73/ae/b48f95715333080afb75a4504487cbe142cae1268afc482d06692d605ae6/yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff", size = 46814, upload-time = "2025-10-06T14:12:53.872Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/75/16/e8be8e2fb175bbf41a0680381a319f1199fae256588241a2ac8677eafb49/yarl-1.25.1.tar.gz", hash = "sha256:03dd38de09bc213e9a8b29761eec33ee1d5318dac0e49d8af36e4d27830e23a7", size = 246245, upload-time = "2026-09-15T19:35:02.264Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/b3/cd32ac66ae622b854c2df0ac52106dda220d361b65a64fde7d5b3684aa3f/yarl-1.25.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d7aa6debf92a1dd14cb5280b083a764169a13cfb23a452111160274ed989f4", size = 144798, upload-time = "2026-09-15T19:31:01.821Z" }, + { url = "https://files.pythonhosted.org/packages/61/fb/a2c52a8007c2051ba74662afb112ecf3d00346af4c25e33df9d80fd14fb8/yarl-1.25.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:83d4a37e4b95da4d8bda930d6d35b75b4cdadbacbb4980cae290ea3100b5d51d", size = 104583, upload-time = "2026-09-15T19:31:04.05Z" }, + { url = "https://files.pythonhosted.org/packages/be/dd/ee38aec8e09fdf957e50d4085453fbe202f56c6c3b4cf07b81cdb4f09ee9/yarl-1.25.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e029648f9c951db30e98a7d7ec90835db88ec4b32820efe2a9bdc2287e032eb6", size = 104325, upload-time = "2026-09-15T19:31:06.338Z" }, + { url = "https://files.pythonhosted.org/packages/1e/b3/058dbfb1857b484c9cf9cc135659f50b85ce66e03c99e44dc2f7b6161f55/yarl-1.25.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d781294bb815ecb5ea57ff6bbf8038e0a31a95fdf3e1788f66e0dc100d64b58", size = 115358, upload-time = "2026-09-15T19:31:08.593Z" }, + { url = "https://files.pythonhosted.org/packages/db/39/29693446cf0cf6b15a0e2f75a5d40f93c56819b05b0622196f45e95b5cc0/yarl-1.25.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e12c538e00e7c1b286a07061046b90e8124e6a9793efae2c70db6a4aad07faad", size = 107658, upload-time = "2026-09-15T19:31:10.802Z" }, + { url = "https://files.pythonhosted.org/packages/86/b3/3c4dd7e1af43b931fba95e0a722737f2ea94a6d199c802585282831d7abd/yarl-1.25.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7e4de3ac4adbad3d0bc7c6f4360a7dbff5de2f15e3b723be3198074e17fd9c40", size = 122660, upload-time = "2026-09-15T19:31:12.84Z" }, + { url = "https://files.pythonhosted.org/packages/bd/b5/1b60dbc3cfc9c5712b15148c206748f2bc93953ffdbe25ea75b63dfc89c9/yarl-1.25.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:419f392a1da624877975709e3864dfe833af6cc7671b39318086d456e288380c", size = 126506, upload-time = "2026-09-15T19:31:15.088Z" }, + { url = "https://files.pythonhosted.org/packages/bc/7b/ca212cbe170ac8b96e45317ecbcf9c3c3ecf0cdec98d5b088a9c4088929b/yarl-1.25.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c6f117789d22dce188e5754e8bc65b7e6ebf8cb73963b9fa761f672a5883769d", size = 117050, upload-time = "2026-09-15T19:31:17.241Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c3/72b4938cdbe619ad71ac156182faef4908846b84dc3ca4dbb4c4e6f84014/yarl-1.25.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:80e47012e730da131c9f059c80936783f9659aae22dc31c03c0595590d11ed54", size = 114174, upload-time = "2026-09-15T19:31:19.294Z" }, + { url = "https://files.pythonhosted.org/packages/e8/43/268717870f9ba0cc9701a95181587f6dc8c5f387aab4aeecc83158f38a79/yarl-1.25.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e80f557716fd765439577131e526b8942ffc2c07bdbc5e39fa62f660ba1e963f", size = 114944, upload-time = "2026-09-15T19:31:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/da/84/baa5bf504d51fe062c4bcaf62936da97fffb43285978d0b39984824231fd/yarl-1.25.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:f61964f235a43738bfac50da46fc4254943a7eea3051aeb0b6fc7c992c29fadc", size = 108263, upload-time = "2026-09-15T19:31:23.388Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/779a2ed9e0152a601a27039bed9aead3f0b79797a67e2c44bfa444622dd8/yarl-1.25.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e546fe1d4a93ebc2910f0d768baff19faa09843ab3f2036a67ed6e69fae4419d", size = 122184, upload-time = "2026-09-15T19:31:25.343Z" }, + { url = "https://files.pythonhosted.org/packages/f8/1f/118e9e5b8f07694d63fd3222e801d7782270003f1a222aa798df3f8d5933/yarl-1.25.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cce0727fd5ac04d372fa9bbfde9febc2bcf209aadfcf0468e45dec72719895d1", size = 114001, upload-time = "2026-09-15T19:31:27.465Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/a4cf1cf372313734b17996d4007f9f73596e7a178b9485802e5494ecf484/yarl-1.25.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af4ea5b37403ef4e30f3927eaed540db942bde01d8d3ff083527c0704d1c9c68", size = 120565, upload-time = "2026-09-15T19:31:29.47Z" }, + { url = "https://files.pythonhosted.org/packages/05/79/ad94f93ca731bc9e44d321833ab96b82a4f9f5f63cf773f81a4aeea5ecc1/yarl-1.25.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:68782fdb4027b8d1eee25ec35e9a6db05e863b899eb0310b3a33b6c3fef55707", size = 117060, upload-time = "2026-09-15T19:31:31.367Z" }, + { url = "https://files.pythonhosted.org/packages/bb/cc/51a7b4abf4ac593b8e7eb3794b28e5a35ae26eed8bc04787628d215af82f/yarl-1.25.1-cp312-cp312-win_amd64.whl", hash = "sha256:7d575b54cb3863ef9bc290ea4b009999d55dc237326131e4853cf33e888fee03", size = 102593, upload-time = "2026-09-15T19:31:33.329Z" }, + { url = "https://files.pythonhosted.org/packages/9d/21/0941a6b93a58b59a1ec75e5333bf06929b671309c43c0cd201c172d9c39f/yarl-1.25.1-cp312-cp312-win_arm64.whl", hash = "sha256:bc3ac7bf569f6b64dad04dd7808c7872dae8a97df657856eac05e9b7e3614a85", size = 97697, upload-time = "2026-09-15T19:31:35.855Z" }, + { url = "https://files.pythonhosted.org/packages/7b/ed/2f3129bbcc9a5c8ba12cc2b29d8060a3bab9c8043c456cfd4b5ca3188890/yarl-1.25.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:25868beca8b6765f8f7d0e11fe6dd7c66dd4b0793b9500286d20cc92352126a5", size = 143623, upload-time = "2026-09-15T19:31:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/17/e1/f1bc3390fdca352826676b531d0712736f156919090206700421d46b2c37/yarl-1.25.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:10b2fd95332f0d716d5eee3c9fb2ce8eada19082de7fee83d32e37992fd75c26", size = 104011, upload-time = "2026-09-15T19:31:40.25Z" }, + { url = "https://files.pythonhosted.org/packages/a8/aa/50acc5c3e5da04172ae3c281c75405af4d2ca911e16120ab0563f4dffb66/yarl-1.25.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f12afda4eea8c8994a76d4df1875c765194f5fbe8a9d197929ea303caee29ec", size = 103677, upload-time = "2026-09-15T19:31:42.46Z" }, + { url = "https://files.pythonhosted.org/packages/30/d2/7d1e0ab9f8390e1fbcede5a6dbf70d23c96ad09b8c5567f3a514d1ddb0e2/yarl-1.25.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14b79a30a93a3ce2e8832603fd0ab780ada281b0ba5110b519a634f2d7d7d1fc", size = 115392, upload-time = "2026-09-15T19:31:44.371Z" }, + { url = "https://files.pythonhosted.org/packages/71/e1/5ba1e3a2a22139213655e760919038e8ed7e2d4a99826d0bbddb3beb96e5/yarl-1.25.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4bd6340d20ae2c7ca719b87b426e808e90743b676d05d4c26c4fb5ca71f41184", size = 107493, upload-time = "2026-09-15T19:31:46.273Z" }, + { url = "https://files.pythonhosted.org/packages/f5/53/780653d5e0f73831f467cf13548912e5eec97f21dc49fc8daf21da027df4/yarl-1.25.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:126a2533570c554719ca40a1288fdee1700b6bc82e7131aa69fa85252d92e651", size = 122537, upload-time = "2026-09-15T19:31:48.654Z" }, + { url = "https://files.pythonhosted.org/packages/03/92/d54fa70236c6036271c9c9c09fd978df5cbe3ef49ef6c46e9b833476d215/yarl-1.25.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a3faadac7d812ddac258feb57b9846b60c1b437c4f4b9ad42595c6f6fe4390df", size = 126170, upload-time = "2026-09-15T19:31:50.872Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b7/a82a49bf88340b837ef6972b508a1604ae377b9e6904b46b10cf5f1cf925/yarl-1.25.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be80550d9bfe83d9b62398a37081a90434e6df2d978ec345c3d2820de6beddab", size = 117012, upload-time = "2026-09-15T19:31:53.189Z" }, + { url = "https://files.pythonhosted.org/packages/ef/78/5d684b411e3f3602464ee9b538db48205038f8605872985f61efb809ced0/yarl-1.25.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e07595c7d6f4db270ceede356a1bd1c07a34f1c26f958d1ed0cd7b48e0d2bba3", size = 114950, upload-time = "2026-09-15T19:31:55.694Z" }, + { url = "https://files.pythonhosted.org/packages/2f/11/51d82b852c64f7fad0fc7a7ff3031517204887e874c722bbca839c0b23ac/yarl-1.25.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eb96ed1ae6c7d072d60840c0434aef07a2df611812810807fbc54263a6053e9a", size = 115428, upload-time = "2026-09-15T19:31:57.966Z" }, + { url = "https://files.pythonhosted.org/packages/e4/49/9d1978049bf646b9ea918313926453c6901b71c92f097467777d47d36a88/yarl-1.25.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3feb99222553a8cbedfa52c2f59dd84c3f50d5b582c728d522caf8d72769a54b", size = 108428, upload-time = "2026-09-15T19:32:00.048Z" }, + { url = "https://files.pythonhosted.org/packages/43/35/7b8f1ebb45d7ec3dda7d1909bf44f458de41ef91e2937f107733582a5166/yarl-1.25.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a2ed0ba415ccdf08f14bf544cb78346d0f76086707ffee24921a2c84dbf1305a", size = 121961, upload-time = "2026-09-15T19:32:02.436Z" }, + { url = "https://files.pythonhosted.org/packages/63/d6/d8b689ab7ca26edeb85f6ff28812aac7a25376eefc1780e303a7bfbaceff/yarl-1.25.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2b49375d22299b0a834c2bca72f39aaecc270d96fb24c30424899676f487b22a", size = 114961, upload-time = "2026-09-15T19:32:04.456Z" }, + { url = "https://files.pythonhosted.org/packages/cf/d5/1a1798ea4dc6b7ee3260010a27907ebc697c95dae99817d817ed446d24aa/yarl-1.25.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ef74070ac553c59eb4f04258722066d6c6135b7baa03b2e9f2da65c096e96d98", size = 120036, upload-time = "2026-09-15T19:32:06.5Z" }, + { url = "https://files.pythonhosted.org/packages/91/8d/b1b35ed7903da6669b1d367cb2c09436acd4ff508029b4f39a0c0c2058fc/yarl-1.25.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0a66db89ea473abeac4b70523cafd94db3772380e565f9d28af7a179b7af71fa", size = 117276, upload-time = "2026-09-15T19:32:09.401Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8f/4db01cef62caff0d7a4593ed694fb8a41a27a11158cab80d290221f13e57/yarl-1.25.1-cp313-cp313-win_amd64.whl", hash = "sha256:1f51020b2eb8a003c84925638ec63c21a750a4bddd3a22ec8eac6a742dadf1b9", size = 101945, upload-time = "2026-09-15T19:32:11.545Z" }, + { url = "https://files.pythonhosted.org/packages/c0/5e/3ce00497c5c0babb74d4130c10c3828ccd215b4819d12020c42429f991ac/yarl-1.25.1-cp313-cp313-win_arm64.whl", hash = "sha256:b10dd0557ba422715b5206b3743192135a6022acca8baec51aa127d0a75db8fe", size = 97270, upload-time = "2026-09-15T19:32:14.127Z" }, + { url = "https://files.pythonhosted.org/packages/54/22/318c7980066769c6bcd9221ed2248294f5698811da099013098c670565ed/yarl-1.25.1-py3-none-any.whl", hash = "sha256:681c758b0490f9e96b78e5fa8e8dc6e648e9185bb6eaebe73183c33ea0c445f3", size = 63617, upload-time = "2026-09-15T19:34:59.616Z" }, ] [[package]] @@ -5179,7 +5174,7 @@ dependencies = [ requires-dist = [ { name = "atomic-agents", editable = "." }, { name = "google-api-python-client", specifier = ">=2.101.0,<3.0.0" }, - { name = "instructor", specifier = "==1.14.5" }, + { name = "instructor", specifier = ">=1.17.0,<2" }, { name = "openai", specifier = ">=2.0.0,<3.0.0" }, { name = "pydantic", specifier = ">=2.10.3,<3.0.0" }, { name = "python-dotenv", specifier = ">=1.0.1,<2.0.0" }, @@ -5204,7 +5199,7 @@ dependencies = [ requires-dist = [ { name = "atomic-agents", editable = "." }, { name = "google-api-python-client", specifier = ">=2.101.0,<3.0.0" }, - { name = "instructor", specifier = "==1.14.5" }, + { name = "instructor", specifier = ">=1.17.0,<2" }, { name = "openai", specifier = ">=2.0.0,<3.0.0" }, { name = "pydantic", specifier = ">=2.10.3,<3.0.0" }, { name = "python-dotenv", specifier = ">=1.0.1,<2.0.0" }, From a32aefe1a9f646ae8ea7c1821ad6df69d28b8848 Mon Sep 17 00:00:00 2001 From: Kenny Vaneetvelde Date: Sun, 18 Oct 2026 13:20:45 +0200 Subject: [PATCH 03/12] Raise the pydantic floor to 2.11.4 The MCP schema transformer passes both __config__ and __base__ to create_model. pydantic allowed that combination in 2.11.4 (pydantic PR #11714); 2.11.3 and below raise PydanticUserError create-model-config-base. Resolving every direct dependency at its declared lowest version put pydantic 2.11.0 in the environment and failed 150 MCP tests with that error, so the old floor was never true. Co-Authored-By: Claude Fable 5.1 --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 60e97b64..9202f4ce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ classifiers = [ ] dependencies = [ "instructor>=1.17.0,<2", - "pydantic>=2.11.0,<3.0.0", + "pydantic>=2.11.4,<3.0.0", "rich>=13.7.1,<14.0.0", "gitpython>=3.1.43,<4.0.0", "pyfiglet>=1.0.2,<2.0.0", diff --git a/uv.lock b/uv.lock index cde7e8fd..c6d6f128 100644 --- a/uv.lock +++ b/uv.lock @@ -322,7 +322,7 @@ requires-dist = [ { name = "openinference-instrumentation", marker = "extra == 'observability'", specifier = ">=0.1.38,<0.2.0" }, { name = "openinference-semantic-conventions", marker = "extra == 'observability'", specifier = ">=0.1.20,<0.2.0" }, { name = "opentelemetry-api", marker = "extra == 'observability'", specifier = ">=1.30.0,<2.0.0" }, - { name = "pydantic", specifier = ">=2.11.0,<3.0.0" }, + { name = "pydantic", specifier = ">=2.11.4,<3.0.0" }, { name = "pyfiglet", specifier = ">=1.0.2,<2.0.0" }, { name = "pyyaml", specifier = ">=6.0.2,<7.0.0" }, { name = "requests", specifier = ">=2.32.3,<3.0.0" }, From b83fe910b43c6650d428e430d81a99785957040b Mon Sep 17 00:00:00 2001 From: Kenny Vaneetvelde Date: Sun, 18 Oct 2026 13:25:34 +0200 Subject: [PATCH 04/12] Raise the mcp floor to 1.8.0 The MCP connectors import mcp.client.streamable_http, which first shipped in mcp 1.8.0 (May 2025). Resolving every direct dependency at its declared lowest version installed mcp 1.6.0 and five connector test modules failed to import. With mcp 1.8.0, pydantic 2.11.4, openai 2.0.0, litellm 1.53.1 and instructor 1.17.0 the suite passes. Co-Authored-By: Claude Fable 5.1 --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9202f4ce..2d04fd5d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,7 +32,7 @@ dependencies = [ "textual>=5.3.0,<6.0.0", "pyyaml>=6.0.2,<7.0.0", "requests>=2.32.3,<3.0.0", - "mcp[cli]>=1.6.0,<2", + "mcp[cli]>=1.8.0,<2", "litellm>=1.50.0,<2.0.0", ] diff --git a/uv.lock b/uv.lock index c6d6f128..250cf9ed 100644 --- a/uv.lock +++ b/uv.lock @@ -318,7 +318,7 @@ requires-dist = [ { name = "gitpython", specifier = ">=3.1.43,<4.0.0" }, { name = "instructor", specifier = ">=1.17.0,<2" }, { name = "litellm", specifier = ">=1.50.0,<2.0.0" }, - { name = "mcp", extras = ["cli"], specifier = ">=1.6.0,<2" }, + { name = "mcp", extras = ["cli"], specifier = ">=1.8.0,<2" }, { name = "openinference-instrumentation", marker = "extra == 'observability'", specifier = ">=0.1.38,<0.2.0" }, { name = "openinference-semantic-conventions", marker = "extra == 'observability'", specifier = ">=0.1.20,<0.2.0" }, { name = "opentelemetry-api", marker = "extra == 'observability'", specifier = ">=1.30.0,<2.0.0" }, From aa2dcc0694cb6380280016b21595cab37d715b7a Mon Sep 17 00:00:00 2001 From: Kenny Vaneetvelde Date: Sun, 18 Oct 2026 13:26:56 +0200 Subject: [PATCH 05/12] Add a CI job that tests on the lowest allowed version of every dependency Declared floors were never exercised: pydantic 2.11.0 and mcp 1.6.0 both failed the suite although pyproject allowed them. This job resolves the runtime dependencies with uv's lowest-direct strategy, installs current test tooling on top, and runs the suite. Locally that is instructor 1.17.0, openai 3.3.0, pydantic 2.11.4, mcp 1.8.0, litellm 1.53.1: 618 passed, 3 skipped. Co-Authored-By: Claude Fable 5.1 --- .github/workflows/code-quality.yml | 31 ++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index 752ce191..ee3958b4 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -103,3 +103,34 @@ jobs: if failures: raise SystemExit(1) PY + + lowest-versions: + name: Tests on the lowest allowed version of every direct dependency + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install uv + uses: astral-sh/setup-uv@v4 + with: + version: "latest" + + - name: Resolve runtime dependencies at their declared floors + run: uv pip compile pyproject.toml --resolution lowest-direct --extra observability -o lowest-requirements.txt + + - name: Install the floors plus current test tooling + run: | + uv venv lowest-venv + uv pip install --python lowest-venv -r lowest-requirements.txt pytest pytest-asyncio pytest-cov + uv pip install --python lowest-venv --no-deps -e . + + - name: Show resolved versions + run: lowest-venv/bin/python -c "import importlib.metadata as m; print(' '.join(p + '=' + m.version(p) for p in ['instructor', 'openai', 'pydantic', 'mcp', 'litellm']))" + + - name: Run Tests + run: lowest-venv/bin/python -m pytest atomic-agents From e31c05df5122361579d5e14b27baca81fea5d2d4 Mon Sep 17 00:00:00 2001 From: Kenny Vaneetvelde Date: Sun, 18 Oct 2026 13:26:56 +0200 Subject: [PATCH 06/12] Start the 2.13.0 release notes with the dependency changes Co-Authored-By: Claude Fable 5.1 --- .release/2.13.0.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .release/2.13.0.md diff --git a/.release/2.13.0.md b/.release/2.13.0.md new file mode 100644 index 00000000..2707bd2b --- /dev/null +++ b/.release/2.13.0.md @@ -0,0 +1,13 @@ +# Atomic Agents 2.13.0 + +Draft. Collects what has landed on main since 2.12.1. + +## Dependencies + +- Instructor is a range again: `instructor>=1.17.0,<2`. The exact pin dated from Instructor 1.9.2 (upstream issue 567-labs/instructor#1796, an import path removed in a patch release) and was bumped by hand ever since. The framework now references `instructor.Instructor` and `instructor.AsyncInstructor` from the package root, which is the only change 1.17.0 needed; the suite passes unchanged otherwise. +- Floors are now true floors: `pydantic>=2.11.4` (the MCP schema transformer passes `__config__` together with `__base__` to `create_model`, allowed since pydantic 2.11.4) and `mcp>=1.8.0,<2` (`mcp.client.streamable_http` first shipped in 1.8.0). +- Two CI jobs guard this: a fresh install of the built wheel that imports every module, and a run of the suite on the lowest allowed version of every runtime dependency. Together they catch the two ways the old pin bit us: an import path removed upstream, and a floor nobody had tested. + +## Compatibility + +Python 3.12 or newer. Applications that pin `instructor==1.14.5` keep working; applications that move to 1.17.0 need no code change on their side. openai 3.x resolves and passes the suite with Instructor 1.17.0. From 4f4e5b8a67509945f9a0272e96d9f740119ff6a1 Mon Sep 17 00:00:00 2001 From: Kenny Vaneetvelde Date: Sun, 18 Oct 2026 13:29:05 +0200 Subject: [PATCH 07/12] Update the codebase map for the dependency ranges and the new CI jobs Co-Authored-By: Claude Fable 5.1 --- .claude/.codebase-info/.map-state.json | 8 ++++---- .claude/.codebase-info/dependencies.md | 11 ++++++----- .claude/.codebase-info/tech-landscape.md | 16 ++++++++++------ 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/.claude/.codebase-info/.map-state.json b/.claude/.codebase-info/.map-state.json index 1d183885..7faad28e 100644 --- a/.claude/.codebase-info/.map-state.json +++ b/.claude/.codebase-info/.map-state.json @@ -2,8 +2,8 @@ "schemaVersion": 1, "tool": "codebase-mapper", "version": "2.15.10", - "mappedAt": "2026-10-15", - "gitCommit": "9e56b85a0173acae6c957a519957b86b5a4c0dad", + "mappedAt": "2026-10-18", + "gitCommit": "194f3dcafc9aae96936200d8e59c848fc85dbd75", "documents": [ "architecture.md", "coding-style.md", @@ -21,12 +21,12 @@ "architecture.md": "59d1265c89d3b42671b7c47165408625018537c016a72df421113cae3f80bb70", "coding-style.md": "b63e8dff06d16a2d882f02624c62f490291317aec8b3032f6d79b3ee035e8567", "communication.md": "70fbeedf239b130cfd3d7a92f27d56e96b207d85117b2f83cc9eef8ec6d6c6b3", - "dependencies.md": "837fe41809eb2753be100ae244fec53423846867b16d91471ec3b5ae03f74e90", + "dependencies.md": "702340e68fc244f2d2529efdef5b3577359c3f6476b0da1d7923ab95807a6ea0", "directory-structure.md": "4efb931cdefecf2c733f0ffb905ad519aff3a81e245a978c0b62b2c5cf0ad49a", "entry-points.md": "3c94fd8a821fc76789794b6d3f4d89cc88a7903055755d97437f9f3ca6193cb6", "modules.md": "cd4f81f8ce74dfc4a7bab15ba91dc569245bc342ddf494845d658b51a0a1dc51", "onboarding.md": "3d28c671dc095a2aadb297bd7ab200c677779a99c7534e03e55a3d64c935f07e", "patterns.md": "30652236ca7524c3b0c2680054e595903652d8c4ece81f4236238e870c09eb42", - "tech-landscape.md": "700b3ba7bb5e47ec14086e2b94ad65ad956c0bfbe1c463f96c39493143e0c912" + "tech-landscape.md": "20bb9e37856b3d7779abb48639a3e033a2fc2c4df1e09c174237a63f6c21cab4" } } diff --git a/.claude/.codebase-info/dependencies.md b/.claude/.codebase-info/dependencies.md index e3c4ccfa..13c37b82 100644 --- a/.claude/.codebase-info/dependencies.md +++ b/.claude/.codebase-info/dependencies.md @@ -1,14 +1,14 @@ # Dependencies -*Last Updated: 2026-10-15* +*Last Updated: 2026-10-18* Declared in `pyproject.toml` (Hatchling build, `uv` workspace; versions locked in `uv.lock`). ## Runtime — core | Package | Purpose | |---------|---------| -| instructor (==1.14.5) | Structured (Pydantic) LLM outputs across providers — the core dependency | -| pydantic (≥2.11,<3) | Schemas / data validation for all I/O | +| instructor (>=1.17.0,<2) | Structured (Pydantic) LLM outputs across providers — the core dependency | +| pydantic (≥2.11.4,<3) | Schemas / data validation for all I/O; 2.11.4 is the first version whose `create_model` accepts `__config__` together with `__base__` (pydantic#11714), which the MCP schema transformer relies on | | litellm (≥1.50,<2) | Provider-agnostic token counting & model metadata | | rich (≥13.7.1,<14) | Console formatting | @@ -26,7 +26,7 @@ already brings the two OpenInference packages, so the Phoenix auto path works wi | Package | Purpose | |---------|---------| | textual (≥5.3,<6) | TUI framework for the `atomic` assembler | -| mcp[cli] (≥1.6) | Model Context Protocol client + CLI | +| mcp[cli] (≥1.8,<2) | Model Context Protocol client + CLI; `mcp.client.streamable_http` first shipped in 1.8.0 and was renamed in 2.0.0, so 2.x waits for a migration | | requests (≥2.32,<3) | HTTP | | gitpython (≥3.1.43,<4) | Clone the repo to fetch forge tools | | pyyaml (≥6,<7) | Read tool `config.yaml` metadata | @@ -50,5 +50,6 @@ already brings the two OpenInference packages, so the Phoenix auto path works wi ## Notes - `requirements.txt` / `setup.py` are legacy shims; `pyproject.toml` + `uv.lock` are the source of truth. -- Instructor is pinned exactly (`==1.14.5`); most other deps use compatible ranges. +- Instructor was an exact pin (`==1.14.5`) until 2026-10-18 because patch releases had removed import paths (567-labs/instructor#1796); it is a range now, guarded by two CI jobs: `fresh-install` (build the wheel, install it without the lockfile, import every module) and `lowest-versions` (run the suite with every runtime dependency at its declared floor). The framework references `instructor.Instructor` / `instructor.AsyncInstructor` from the package root; `instructor.core` is not an attribute path on 1.17.0. +- Every example project and the legacy `requirements.txt` carry the same Instructor range. - Each `atomic-forge` tool and each `atomic-examples` project declares its **own** dependencies. diff --git a/.claude/.codebase-info/tech-landscape.md b/.claude/.codebase-info/tech-landscape.md index f6cb6347..4253878c 100644 --- a/.claude/.codebase-info/tech-landscape.md +++ b/.claude/.codebase-info/tech-landscape.md @@ -1,6 +1,6 @@ # Technology Landscape -*Last Updated: 2026-08-11* +*Last Updated: 2026-10-18* ## Source-of-Truth Files @@ -22,10 +22,10 @@ | Layer | Technology | Notes | |-------|------------|-------| | Language | Python ≥3.12 | PEP 695 generics | -| Structured LLM I/O | Instructor 1.14.5 (pinned) | provider-agnostic structured outputs | +| Structured LLM I/O | Instructor >=1.17.0,<2 (range since 2026-10-18) | provider-agnostic structured outputs | | Data modeling | Pydantic v2 (≥2.11) | all schemas are Pydantic models | | Provider / token utils | LiteLLM (≥1.50) | token counting, model metadata | -| Tool protocol | MCP — `mcp[cli]` (≥1.6) | Model Context Protocol connectors | +| Tool protocol | MCP — `mcp[cli]` (≥1.8,<2) | Model Context Protocol connectors | | TUI | Textual (≥5.3,<6) | the `atomic` assembler UI | | Console output | Rich, pyfiglet | | | HTTP / Git | requests, GitPython | assembler fetches forge from GitHub | @@ -37,9 +37,13 @@ ## Infrastructure - **CI (GitHub Actions):** - - `code-quality.yml` — on push/PR to `main`/`v2.0`: `uv sync`, `black --check`, `flake8`, then - `pytest --cov=atomic_agents` across `atomic-agents`, `atomic-assembler`, `atomic-examples`, - `atomic-forge`. + - `code-quality.yml` — on push/PR to `main`/`v2.0`, three jobs: `quality` (`uv sync`, + `black --check`, `flake8`, then `pytest --cov=atomic_agents` across `atomic-agents`, + `atomic-assembler`, `atomic-examples`, `atomic-forge`); `fresh-install` (build the wheel, install + it with the observability extra into a clean venv without the lockfile, import every module under + `atomic_agents`, which is what a new user's `pip install` sees); `lowest-versions` (resolve runtime + dependencies with `uv pip compile --resolution lowest-direct`, install current pytest tooling, run + the suite, so every declared floor is a tested floor). - `docs.yml` — on push to `main`: build Sphinx docs, run `scripts/generate_llms_files.py` (spec-compliant `llms.txt` index + `llms-*.txt` bundles, copied to the site root), deploy to GitHub Pages. The docs version needs From a573ae38e4a5182aad06c571f0eb234d8a69158d Mon Sep 17 00:00:00 2001 From: Kenny Vaneetvelde Date: Sun, 18 Oct 2026 13:31:42 +0200 Subject: [PATCH 08/12] Accept Instructor's generated response schemas from any instructor module Instructor 1.15.3 moved its response-model wrapper to instructor.v2.core.function_calls. BaseIOSchema only exempted the two older module names from the docstring rule, so on Instructor 1.17.0 every agent.run() and run_async() raised "must have a non-empty docstring" before the request was sent. Streaming survived because Partial models carry from_streaming_response. The mocked suite never saw it; a new test module drives a real Instructor client through an httpx MockTransport and fails on the old check (3 of 4 cases). Co-Authored-By: Claude Fable 5.1 --- .../atomic_agents/base/base_io_schema.py | 9 +- .../tests/agents/test_instructor_transport.py | 94 +++++++++++++++++++ 2 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 atomic-agents/tests/agents/test_instructor_transport.py diff --git a/atomic-agents/atomic_agents/base/base_io_schema.py b/atomic-agents/atomic_agents/base/base_io_schema.py index 0190d141..9b51ce40 100644 --- a/atomic-agents/atomic_agents/base/base_io_schema.py +++ b/atomic-agents/atomic_agents/base/base_io_schema.py @@ -23,12 +23,13 @@ def _validate_description(cls): description = cls.__doc__ if not description or not description.strip(): - # Skip validation for instructor-generated schemas (both old and new module paths) - if cls.__module__ not in ("instructor.function_calls", "instructor.processing.function_calls") and not hasattr( - cls, "from_streaming_response" - ): + if not cls._is_generated_by_instructor(): raise ValueError(f"{cls.__name__} must have a non-empty docstring to serve as its description") + @classmethod + def _is_generated_by_instructor(cls) -> bool: + return cls.__module__.startswith("instructor.") or hasattr(cls, "from_streaming_response") + @classmethod def model_json_schema(cls, *args, **kwargs): schema = super().model_json_schema(*args, **kwargs) diff --git a/atomic-agents/tests/agents/test_instructor_transport.py b/atomic-agents/tests/agents/test_instructor_transport.py new file mode 100644 index 00000000..b1f7eb5f --- /dev/null +++ b/atomic-agents/tests/agents/test_instructor_transport.py @@ -0,0 +1,94 @@ +"""Drive a real Instructor client through a mocked HTTP transport. + +The rest of the suite mocks the Instructor client itself, so it never sees how Instructor wraps the +response model or which keyword arguments it forwards into streaming. Both broke on Instructor 1.17 +without any mocked test noticing. +""" + +import json + +import httpx +import instructor +import openai +import pytest + +from atomic_agents import AgentConfig, AtomicAgent, BasicChatInputSchema, BasicChatOutputSchema + +ASSISTANT_ARGUMENTS = json.dumps({"chat_message": "hi there"}) + + +def tool_call_chunk(arguments_piece: str) -> str: + delta = { + "tool_calls": [ + { + "index": 0, + "id": "call-1", + "type": "function", + "function": {"name": "BasicChatOutputSchema", "arguments": arguments_piece}, + } + ] + } + chunk = {"id": "chunk", "object": "chat.completion.chunk", "created": 0, "model": "m"} + chunk["choices"] = [{"index": 0, "delta": delta, "finish_reason": None}] + return "data: " + json.dumps(chunk) + "\n\n" + + +def respond_with_tool_call(request: httpx.Request) -> httpx.Response: + body = json.loads(request.content) + if body.get("stream"): + frames = tool_call_chunk(ASSISTANT_ARGUMENTS[:10]) + tool_call_chunk(ASSISTANT_ARGUMENTS[10:]) + "data: [DONE]\n\n" + return httpx.Response(200, headers={"content-type": "text/event-stream"}, content=frames.encode()) + message = { + "role": "assistant", + "content": None, + "tool_calls": [ + { + "id": "call-1", + "type": "function", + "function": {"name": "BasicChatOutputSchema", "arguments": ASSISTANT_ARGUMENTS}, + } + ], + } + completion = {"id": "completion", "object": "chat.completion", "created": 0, "model": "m"} + completion["choices"] = [{"index": 0, "message": message, "finish_reason": "tool_calls"}] + completion["usage"] = {"prompt_tokens": 1, "completion_tokens": 1, "total_tokens": 2} + return httpx.Response(200, json=completion) + + +def agent_over_mock_transport(**model_api_parameters) -> AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema]: + raw_client = openai.OpenAI(api_key="test", http_client=httpx.Client(transport=httpx.MockTransport(respond_with_tool_call))) + config = AgentConfig(client=instructor.from_openai(raw_client), model="m", model_api_parameters=model_api_parameters) + return AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config=config) + + +def async_agent_over_mock_transport() -> AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema]: + raw_client = openai.AsyncOpenAI( + api_key="test", http_client=httpx.AsyncClient(transport=httpx.MockTransport(respond_with_tool_call)) + ) + config = AgentConfig(client=instructor.from_openai(raw_client), model="m") + return AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config=config) + + +def test_run_parses_the_tool_call_through_instructor(): + response = agent_over_mock_transport().run(BasicChatInputSchema(chat_message="hey")) + + assert response.chat_message == "hi there" + + +@pytest.mark.asyncio +async def test_run_async_parses_the_tool_call_through_instructor(): + response = await async_agent_over_mock_transport().run_async(BasicChatInputSchema(chat_message="hey")) + + assert response.chat_message == "hi there" + + +def test_run_stream_yields_partials_then_the_complete_response(): + partials = list(agent_over_mock_transport().run_stream(BasicChatInputSchema(chat_message="hey"))) + + assert partials[-1].chat_message == "hi there" + + +def test_run_stream_honors_a_caller_strict_setting(): + partials = list(agent_over_mock_transport(strict=True).run_stream(BasicChatInputSchema(chat_message="hey"))) + + assert partials[-1].chat_message == "hi there" From 2d2c5488513870b428811dc384c7858897292878 Mon Sep 17 00:00:00 2001 From: Kenny Vaneetvelde Date: Sun, 18 Oct 2026 13:31:42 +0200 Subject: [PATCH 09/12] Let callers override strict in streamed validation Instructor 1.17 forwards a caller's strict setting into model_from_chunks, and the streaming patch passed its own strict=None on top, so run_stream with model_api_parameters={"strict": True} raised "got multiple values for keyword argument 'strict'". The patch now only supplies the default when the caller did not. Covered by test_run_stream_honors_a_caller_strict_setting. Co-Authored-By: Claude Fable 5.1 --- atomic-agents/atomic_agents/agents/atomic_agent.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/atomic-agents/atomic_agents/agents/atomic_agent.py b/atomic-agents/atomic_agents/agents/atomic_agent.py index c8215fba..6fdc3204 100644 --- a/atomic-agents/atomic_agents/agents/atomic_agent.py +++ b/atomic-agents/atomic_agents/agents/atomic_agent.py @@ -20,22 +20,24 @@ def model_from_chunks_patched(cls, json_chunks, **kwargs): + kwargs.setdefault("strict", None) potential_object = "" partial_model = cls.get_partial_model() for chunk in json_chunks: potential_object += chunk obj = from_json((potential_object or "{}").encode(), partial_mode="trailing-strings") - obj = partial_model.model_validate(obj, strict=None, **kwargs) + obj = partial_model.model_validate(obj, **kwargs) yield obj async def model_from_chunks_async_patched(cls, json_chunks, **kwargs): + kwargs.setdefault("strict", None) potential_object = "" partial_model = cls.get_partial_model() async for chunk in json_chunks: potential_object += chunk obj = from_json((potential_object or "{}").encode(), partial_mode="trailing-strings") - obj = partial_model.model_validate(obj, strict=None, **kwargs) + obj = partial_model.model_validate(obj, **kwargs) yield obj From faa0fa479d8f579264ab35a2808a99a1f0cb38df Mon Sep 17 00:00:00 2001 From: Kenny Vaneetvelde Date: Sun, 18 Oct 2026 13:31:42 +0200 Subject: [PATCH 10/12] Add the two Instructor 1.17 runtime fixes to the 2.13.0 notes Co-Authored-By: Claude Fable 5.1 --- .release/2.13.0.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.release/2.13.0.md b/.release/2.13.0.md index 2707bd2b..172ba803 100644 --- a/.release/2.13.0.md +++ b/.release/2.13.0.md @@ -8,6 +8,12 @@ Draft. Collects what has landed on main since 2.12.1. - Floors are now true floors: `pydantic>=2.11.4` (the MCP schema transformer passes `__config__` together with `__base__` to `create_model`, allowed since pydantic 2.11.4) and `mcp>=1.8.0,<2` (`mcp.client.streamable_http` first shipped in 1.8.0). - Two CI jobs guard this: a fresh install of the built wheel that imports every module, and a run of the suite on the lowest allowed version of every runtime dependency. Together they catch the two ways the old pin bit us: an import path removed upstream, and a floor nobody had tested. +## Fixes + +- `agent.run()` and `run_async()` work on Instructor 1.15.3 and later. Instructor moved its generated response-model wrapper to `instructor.v2.core.function_calls`, and `BaseIOSchema` only exempted the older module names from its docstring rule, so every non-streaming call raised before the request went out. The check now accepts any class Instructor generates. +- `run_stream()` with `model_api_parameters={"strict": ...}` no longer fails on Instructor 1.17 ("got multiple values for keyword argument 'strict'"). +- Both are covered by a new test module that drives a real Instructor client through an `httpx.MockTransport`, so Instructor's own request and parse path runs in the suite instead of a mocked client. + ## Compatibility Python 3.12 or newer. Applications that pin `instructor==1.14.5` keep working; applications that move to 1.17.0 need no code change on their side. openai 3.x resolves and passes the suite with Instructor 1.17.0. From 1d8ef5a32cebd9653c231062ba0bdee8e1e836eb Mon Sep 17 00:00:00 2001 From: Kenny Vaneetvelde Date: Sun, 18 Oct 2026 13:33:53 +0200 Subject: [PATCH 11/12] Note the max_retries counting change in the 2.13.0 notes Instructor 1.14.5 used stop_after_attempt(max_retries); 1.17.0 uses stop_after_attempt(max_retries + 1) (v2/core/retry.py:275). The framework does not set max_retries, but the deployment and error-handling guides pass it through model_api_parameters. Co-Authored-By: Claude Fable 5.1 --- .release/2.13.0.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.release/2.13.0.md b/.release/2.13.0.md index 172ba803..53869e30 100644 --- a/.release/2.13.0.md +++ b/.release/2.13.0.md @@ -16,4 +16,5 @@ Draft. Collects what has landed on main since 2.12.1. ## Compatibility +- `max_retries` counts differently on Instructor 1.17: 1.14.5 stopped after `max_retries` attempts in total, 1.17.0 stops after the first attempt plus `max_retries` retries. `max_retries=3` passed through `model_api_parameters` now makes up to four calls instead of three. Lower it by one to keep the old budget. Python 3.12 or newer. Applications that pin `instructor==1.14.5` keep working; applications that move to 1.17.0 need no code change on their side. openai 3.x resolves and passes the suite with Instructor 1.17.0. From 73753c08b54b9b0136197162d6dbb4233e915aa7 Mon Sep 17 00:00:00 2001 From: Kenny Vaneetvelde Date: Mon, 19 Oct 2026 10:08:20 +0200 Subject: [PATCH 12/12] Exercise asynchronous streaming through Instructor transport Co-Authored-By: Claude Code --- .../tests/agents/test_instructor_transport.py | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/atomic-agents/tests/agents/test_instructor_transport.py b/atomic-agents/tests/agents/test_instructor_transport.py index b1f7eb5f..680d424e 100644 --- a/atomic-agents/tests/agents/test_instructor_transport.py +++ b/atomic-agents/tests/agents/test_instructor_transport.py @@ -61,11 +61,11 @@ def agent_over_mock_transport(**model_api_parameters) -> AtomicAgent[BasicChatIn return AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config=config) -def async_agent_over_mock_transport() -> AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema]: +def async_agent_over_mock_transport(**model_api_parameters: bool) -> AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema]: raw_client = openai.AsyncOpenAI( api_key="test", http_client=httpx.AsyncClient(transport=httpx.MockTransport(respond_with_tool_call)) ) - config = AgentConfig(client=instructor.from_openai(raw_client), model="m") + config = AgentConfig(client=instructor.from_openai(raw_client), model="m", model_api_parameters=model_api_parameters) return AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config=config) @@ -92,3 +92,21 @@ def test_run_stream_honors_a_caller_strict_setting(): partials = list(agent_over_mock_transport(strict=True).run_stream(BasicChatInputSchema(chat_message="hey"))) assert partials[-1].chat_message == "hi there" + + +@pytest.mark.asyncio +async def test_run_async_stream_yields_the_complete_response() -> None: + agent = async_agent_over_mock_transport() + + partials = [response async for response in agent.run_async_stream(BasicChatInputSchema(chat_message="hey"))] + + assert partials[-1].chat_message == "hi there" + + +@pytest.mark.asyncio +async def test_run_async_stream_honors_a_caller_strict_setting() -> None: + agent = async_agent_over_mock_transport(strict=True) + + partials = [response async for response in agent.run_async_stream(BasicChatInputSchema(chat_message="hey"))] + + assert partials[-1].chat_message == "hi there"