From fe59f2cc8841d77e9d39210aee17ff15b5cc9501 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Wed, 12 Feb 2025 10:05:33 -0800 Subject: [PATCH 01/24] core: Fix output of convert_messages when called with BaseMessage.model_dump() (#29763) - additional_kwargs was being nested twice - example, response_metadata was placed inside additional_kwargs --- libs/core/Makefile | 2 +- libs/core/langchain_core/messages/utils.py | 7 +++++++ libs/core/tests/unit_tests/test_messages.py | 16 ++++++++++++++++ libs/core/uv.lock | 8 ++++---- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/libs/core/Makefile b/libs/core/Makefile index 557ac1a138a..d64f9f241f7 100644 --- a/libs/core/Makefile +++ b/libs/core/Makefile @@ -23,7 +23,7 @@ test_watch: -u LANGCHAIN_API_KEY \ -u LANGSMITH_TRACING \ -u LANGCHAIN_PROJECT \ - uv run --group test ptw --snapshot-update --now . --disable-socket --allow-unix-socket -- -vv $(TEST_FILE) + uv run --group test ptw --snapshot-update --now . --disable-socket --allow-unix-socket -vv -- $(TEST_FILE) test_profile: uv run --group test pytest -vv tests/unit_tests/ --profile-svg diff --git a/libs/core/langchain_core/messages/utils.py b/libs/core/langchain_core/messages/utils.py index ccdb0b24e9d..0f27234d0ab 100644 --- a/libs/core/langchain_core/messages/utils.py +++ b/libs/core/langchain_core/messages/utils.py @@ -236,7 +236,10 @@ def _create_message_from_message_type( if tool_call_id is not None: kwargs["tool_call_id"] = tool_call_id if additional_kwargs: + if response_metadata := additional_kwargs.pop("response_metadata", None): + kwargs["response_metadata"] = response_metadata kwargs["additional_kwargs"] = additional_kwargs # type: ignore[assignment] + additional_kwargs.update(additional_kwargs.pop("additional_kwargs", {})) if id is not None: kwargs["id"] = id if tool_calls is not None: @@ -258,8 +261,12 @@ def _create_message_from_message_type( else: kwargs["tool_calls"].append(tool_call) if message_type in ("human", "user"): + if example := kwargs.get("additional_kwargs", {}).pop("example", False): + kwargs["example"] = example message: BaseMessage = HumanMessage(content=content, **kwargs) elif message_type in ("ai", "assistant"): + if example := kwargs.get("additional_kwargs", {}).pop("example", False): + kwargs["example"] = example message = AIMessage(content=content, **kwargs) elif message_type in ("system", "developer"): if message_type == "developer": diff --git a/libs/core/tests/unit_tests/test_messages.py b/libs/core/tests/unit_tests/test_messages.py index d9928b729f3..c64611e5a8e 100644 --- a/libs/core/tests/unit_tests/test_messages.py +++ b/libs/core/tests/unit_tests/test_messages.py @@ -738,6 +738,15 @@ def test_convert_to_messages() -> None: "artifact": {"foo": 123}, }, {"role": "remove", "id": "message_to_remove", "content": ""}, + { + "content": "Now the turn for Larry to ask a question about the book!", + "additional_kwargs": {"metadata": {"speaker_name": "Presenter"}}, + "response_metadata": {}, + "type": "human", + "name": None, + "id": "1", + "example": False, + }, ] ) expected = [ @@ -762,6 +771,13 @@ def test_convert_to_messages() -> None: ToolMessage(tool_call_id="tool_id", content="Hi!"), ToolMessage(tool_call_id="tool_id2", content="Bye!", artifact={"foo": 123}), RemoveMessage(id="message_to_remove"), + HumanMessage( + content="Now the turn for Larry to ask a question about the book!", + additional_kwargs={"metadata": {"speaker_name": "Presenter"}}, + response_metadata={}, + id="1", + example=False, + ), ] assert expected == actual diff --git a/libs/core/uv.lock b/libs/core/uv.lock index cf1caf5e3ef..0204bcb35bc 100644 --- a/libs/core/uv.lock +++ b/libs/core/uv.lock @@ -1026,7 +1026,7 @@ typing = [ [[package]] name = "langchain-tests" -version = "0.3.10" +version = "0.3.11" source = { directory = "../standard-tests" } dependencies = [ { name = "httpx" }, @@ -1042,7 +1042,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "httpx", specifier = ">=0.25.0,<1" }, - { name = "langchain-core", specifier = ">=0.3.33,<1.0.0" }, + { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, { name = "pytest", specifier = ">=7,<9" }, @@ -1063,14 +1063,14 @@ typing = [ [[package]] name = "langchain-text-splitters" -version = "0.3.5" +version = "0.3.6" source = { directory = "../text-splitters" } dependencies = [ { name = "langchain-core" }, ] [package.metadata] -requires-dist = [{ name = "langchain-core", specifier = ">=0.3.33,<1.0.0" }] +requires-dist = [{ name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }] [package.metadata.requires-dev] dev = [ From e61f46374534c8aee65ba3e5b61df510adc6e6ef Mon Sep 17 00:00:00 2001 From: ccurme Date: Wed, 12 Feb 2025 10:13:10 -0800 Subject: [PATCH 02/24] core[patch]: release 0.3.35 (#29764) --- libs/core/pyproject.toml | 2 +- libs/core/uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/core/pyproject.toml b/libs/core/pyproject.toml index 25dbe2cec60..3100a02440e 100644 --- a/libs/core/pyproject.toml +++ b/libs/core/pyproject.toml @@ -17,7 +17,7 @@ dependencies = [ "pydantic<3.0.0,>=2.7.4; python_full_version >= \"3.12.4\"", ] name = "langchain-core" -version = "0.3.34" +version = "0.3.35" description = "Building applications with LLMs through composability" readme = "README.md" diff --git a/libs/core/uv.lock b/libs/core/uv.lock index 0204bcb35bc..f917a6aeae9 100644 --- a/libs/core/uv.lock +++ b/libs/core/uv.lock @@ -935,7 +935,7 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.34" +version = "0.3.35" source = { editable = "." } dependencies = [ { name = "jsonpatch" }, From e4eec9e9aa011bf3a4205d14ab854804b02d51c8 Mon Sep 17 00:00:00 2001 From: Hugues Chocart Date: Wed, 12 Feb 2025 19:57:33 +0000 Subject: [PATCH 03/24] community: add langchain-abso documentation (#29739) Add the documentation for the community package `langchain-abso`. It provides a new Chat Model class, that uses https://abso.ai --------- Co-authored-by: Harrison Chase --- docs/docs/integrations/chat/abso.ipynb | 206 +++++++++++++++++++++++ docs/docs/integrations/providers/abso.md | 14 ++ libs/packages.yml | 4 + 3 files changed, 224 insertions(+) create mode 100644 docs/docs/integrations/chat/abso.ipynb create mode 100644 docs/docs/integrations/providers/abso.md diff --git a/docs/docs/integrations/chat/abso.ipynb b/docs/docs/integrations/chat/abso.ipynb new file mode 100644 index 00000000000..8ed52bb4dc4 --- /dev/null +++ b/docs/docs/integrations/chat/abso.ipynb @@ -0,0 +1,206 @@ +{ + "cells": [ + { + "cell_type": "raw", + "id": "afaf8039", + "metadata": {}, + "source": [ + "---\n", + "sidebar_label: Abso\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "e49f1e0d", + "metadata": {}, + "source": [ + "# ChatAbso\n", + "\n", + "This will help you getting started with ChatAbso [chat models](https://python.langchain.com/docs/concepts/chat_models/). For detailed documentation of all ChatAbso features and configurations head to the [API reference](https://python.langchain.com/api_reference/en/latest/chat_models/langchain_abso.chat_models.ChatAbso.html).\n", + "\n", + "- You can find the full documentation for the Abso router [here] (https://abso.ai)\n", + "\n", + "## Overview\n", + "### Integration details\n", + "\n", + "| Class | Package | Local | Serializable | [JS support](https://js.langchain.com/docs/integrations/chat/abso) | Package downloads | Package latest |\n", + "| :--- | :--- | :---: | :---: | :---: | :---: | :---: |\n", + "| [ChatAbso](https://python.langchain.com/api_reference/en/latest/chat_models/langchain_abso.chat_models.ChatAbso.html) | [langchain-abso](https://python.langchain.com/api_reference/en/latest/abso_api_reference.html) | ❌ | ❌ | ❌ | ![PyPI - Downloads](https://img.shields.io/pypi/dm/langchain-abso?style=flat-square&label=%20) | ![PyPI - Version](https://img.shields.io/pypi/v/langchain-abso?style=flat-square&label=%20) |\n", + "\n", + "## Setup\n", + "To access ChatAbso models you'll need to create an OpenAI account, get an API key, and install the `langchain-abso` integration package.\n", + "\n", + "### Credentials\n", + "\n", + "- TODO: Update with relevant info.\n", + "\n", + "Head to (TODO: link) to sign up to ChatAbso and generate an API key. Once you've done this set the ABSO_API_KEY environment variable:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "433e8d2b-9519-4b49-b2c4-7ab65b046c94", + "metadata": {}, + "outputs": [], + "source": [ + "import getpass\n", + "import os\n", + "\n", + "if not os.getenv(\"OPENAI_API_KEY\"):\n", + " os.environ[\"OPENAI_API_KEY\"] = getpass.getpass(\"Enter your OpenAI API key: \")" + ] + }, + { + "cell_type": "markdown", + "id": "0730d6a1-c893-4840-9817-5e5251676d5d", + "metadata": {}, + "source": [ + "### Installation\n", + "\n", + "The LangChain ChatAbso integration lives in the `langchain-abso` package:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "652d6238-1f87-422a-b135-f5abbb8652fc", + "metadata": {}, + "outputs": [], + "source": [ + "%pip install -qU langchain-abso" + ] + }, + { + "cell_type": "markdown", + "id": "a38cde65-254d-4219-a441-068766c0d4b5", + "metadata": {}, + "source": [ + "## Instantiation\n", + "\n", + "Now we can instantiate our model object and generate chat completions:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cb09c344-1836-4e0c-acf8-11d13ac1dbae", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_abso import ChatAbso\n", + "\n", + "llm = ChatAbso(fast_model=\"gpt-4o\", slow_model=\"o3-mini\")" + ] + }, + { + "cell_type": "markdown", + "id": "2b4f3e15", + "metadata": {}, + "source": [ + "## Invocation\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "62e0dbc3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "messages = [\n", + " (\n", + " \"system\",\n", + " \"You are a helpful assistant that translates English to French. Translate the user sentence.\",\n", + " ),\n", + " (\"human\", \"I love programming.\"),\n", + "]\n", + "ai_msg = llm.invoke(messages)\n", + "ai_msg" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d86145b3-bfef-46e8-b227-4dda5c9c2705", + "metadata": {}, + "outputs": [], + "source": [ + "print(ai_msg.content)" + ] + }, + { + "cell_type": "markdown", + "id": "18e2bfc0-7e78-4528-a73f-499ac150dca8", + "metadata": {}, + "source": [ + "## Chaining\n", + "\n", + "We can [chain](/docs/how_to/sequence/) our model with a prompt template like so:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e197d1d7-a070-4c96-9f8a-a0e86d046e0b", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_core.prompts import ChatPromptTemplate\n", + "\n", + "prompt = ChatPromptTemplate(\n", + " [\n", + " (\n", + " \"system\",\n", + " \"You are a helpful assistant that translates {input_language} to {output_language}.\",\n", + " ),\n", + " (\"human\", \"{input}\"),\n", + " ]\n", + ")\n", + "\n", + "chain = prompt | llm\n", + "chain.invoke(\n", + " {\n", + " \"input_language\": \"English\",\n", + " \"output_language\": \"German\",\n", + " \"input\": \"I love programming.\",\n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "3a5bb5ca-c3ae-4a58-be67-2cd18574b9a3", + "metadata": {}, + "source": [ + "## API reference\n", + "\n", + "For detailed documentation of all ChatAbso features and configurations head to the API reference: https://python.langchain.com/api_reference/en/latest/chat_models/langchain_abso.chat_models.ChatAbso.html" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/docs/integrations/providers/abso.md b/docs/docs/integrations/providers/abso.md new file mode 100644 index 00000000000..0a33ffceb09 --- /dev/null +++ b/docs/docs/integrations/providers/abso.md @@ -0,0 +1,14 @@ +# Abso + +[Abso](https://abso.ai/#router) is an open-source LLM proxy that automatically routes requests between fast and slow models based on prompt complexity. It uses various heuristics to chose the proper model. It's very fast and has low latency. + + +## Installation and setup + +```bash +pip install langchain-abso +``` + +## Chat Model + +See usage details [here](/docs/integrations/chat/abso) diff --git a/libs/packages.yml b/libs/packages.yml index 600c7057f6e..4d03811a0ab 100644 --- a/libs/packages.yml +++ b/libs/packages.yml @@ -390,3 +390,7 @@ packages: repo: cvs-health/langfair path: . downloads: 0 +- name: langchain-abso + repo: lunary-ai/langchain-abso + path: . + downloads: 0 From 043d78d85d204b22fb84d0162264da6aefab3742 Mon Sep 17 00:00:00 2001 From: Sunish Sheth Date: Wed, 12 Feb 2025 15:50:35 -0800 Subject: [PATCH 04/24] Deprecate langhchain community ucfunctiontoolkit in favor for databricks_langchain (#29746) Thank you for contributing to LangChain! - [ ] **PR title**: "package: description" - Where "package" is whichever of langchain, community, core, etc. is being modified. Use "docs: ..." for purely docs changes, "infra: ..." for CI changes. - Example: "community: add foobar LLM" - [ ] **PR message**: ***Delete this entire checklist*** and replace with - **Description:** a description of the change - **Issue:** the issue # it fixes, if applicable - **Dependencies:** any dependencies required for this change - **Twitter handle:** if your PR gets announced, and you'd like a mention, we'll gladly shout you out! - [ ] **Add tests and docs**: If you're adding a new integration, please include 1. a test for the integration, preferably unit tests that do not rely on network access, 2. an example notebook showing its use. It lives in `docs/docs/integrations` directory. - [ ] **Lint and test**: Run `make format`, `make lint` and `make test` from the root of the package(s) you've modified. See contribution guidelines for more: https://python.langchain.com/docs/contributing/ Additional guidelines: - Make sure optional dependencies are imported within a function. - Please do not add dependencies to pyproject.toml files (even optional ones) unless they are required for unit tests. - Most PRs should not touch more than one package. - Changes should be backwards compatible. - If you are adding something to community, do not re-import it in langchain. If no one reviews your PR within a few days, please @-mention one of baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17. --- docs/docs/integrations/tools/databricks.ipynb | 27 +++++++++---------- .../tools/databricks/tool.py | 6 +++++ 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/docs/docs/integrations/tools/databricks.ipynb b/docs/docs/integrations/tools/databricks.ipynb index 9fa37315385..61aa76484f2 100644 --- a/docs/docs/integrations/tools/databricks.ipynb +++ b/docs/docs/integrations/tools/databricks.ipynb @@ -66,21 +66,20 @@ "metadata": {}, "outputs": [], "source": [ - "from databricks.sdk import WorkspaceClient\n", - "from langchain_community.tools.databricks import UCFunctionToolkit\n", + "from databricks_langchain.uc_ai import (\n", + " DatabricksFunctionClient,\n", + " UCFunctionToolkit,\n", + " set_uc_function_client,\n", + ")\n", "\n", - "tools = (\n", - " UCFunctionToolkit(\n", - " # You can find the SQL warehouse ID in its UI after creation.\n", - " warehouse_id=\"xxxx123456789\"\n", - " )\n", - " .include(\n", - " # Include functions as tools using their qualified names.\n", - " # You can use \"{catalog_name}.{schema_name}.*\" to get all functions in a schema.\n", - " \"main.tools.python_exec\",\n", - " )\n", - " .get_tools()\n", - ")" + "client = DatabricksFunctionClient()\n", + "set_uc_function_client(client)\n", + "\n", + "tools = UCFunctionToolkit(\n", + " # Include functions as tools using their qualified names.\n", + " # You can use \"{catalog_name}.{schema_name}.*\" to get all functions in a schema.\n", + " function_names=[\"main.tools.python_exec\"]\n", + ").tools" ] }, { diff --git a/libs/community/langchain_community/tools/databricks/tool.py b/libs/community/langchain_community/tools/databricks/tool.py index f64616ea5fb..67ef21148e4 100644 --- a/libs/community/langchain_community/tools/databricks/tool.py +++ b/libs/community/langchain_community/tools/databricks/tool.py @@ -4,6 +4,7 @@ from decimal import Decimal from hashlib import md5 from typing import TYPE_CHECKING, Any, Dict, List, Optional, Type, Union +from langchain_core._api import deprecated from langchain_core.tools import BaseTool, StructuredTool from langchain_core.tools.base import BaseToolkit from pydantic import BaseModel, Field, create_model @@ -131,6 +132,11 @@ def _get_default_workspace_client() -> Any: return WorkspaceClient() +@deprecated( + since="0.3.18", + removal="1.0", + alternative_import="databricks_langchain.uc_ai.UCFunctionToolkit", +) class UCFunctionToolkit(BaseToolkit): warehouse_id: str = Field( description="The ID of a Databricks SQL Warehouse to execute functions." From 1fbc01c3509224bcc29aec8f0d7c9e53f8bb8b24 Mon Sep 17 00:00:00 2001 From: Jorge Piedrahita Ortiz Date: Wed, 12 Feb 2025 18:58:00 -0500 Subject: [PATCH 05/24] docs: update sambanova integration api reference links (#29762) - **Description:** update sambanova external package integration api reference links in docs --- docs/docs/integrations/chat/sambanova.ipynb | 6 ++--- docs/docs/integrations/chat/sambastudio.ipynb | 6 ++--- .../integrations/providers/sambanova.ipynb | 23 ++++++++++++++++++- .../text_embedding/sambanova.ipynb | 8 +++---- 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/docs/docs/integrations/chat/sambanova.ipynb b/docs/docs/integrations/chat/sambanova.ipynb index 4ea2b151dfb..aec5b9df7a7 100644 --- a/docs/docs/integrations/chat/sambanova.ipynb +++ b/docs/docs/integrations/chat/sambanova.ipynb @@ -19,7 +19,7 @@ "source": [ "# ChatSambaNovaCloud\n", "\n", - "This will help you getting started with SambaNovaCloud [chat models](/docs/concepts/chat_models/). For detailed documentation of all ChatSambaNovaCloud features and configurations head to the [API reference](https://python.langchain.com/api_reference/sambanova/chat_models/langchain_sambanova.ChatSambaNovaCloud.html).\n", + "This will help you getting started with SambaNovaCloud [chat models](/docs/concepts/chat_models/). For detailed documentation of all ChatSambaNovaCloud features and configurations head to the [API reference](https://docs.sambanova.ai/cloud/docs/get-started/overview).\n", "\n", "**[SambaNova](https://sambanova.ai/)'s** [SambaNova Cloud](https://cloud.sambanova.ai/) is a platform for performing inference with open-source models\n", "\n", @@ -28,7 +28,7 @@ "\n", "| Class | Package | Local | Serializable | JS support | Package downloads | Package latest |\n", "| :--- | :--- | :---: | :---: | :---: | :---: | :---: |\n", - "| [ChatSambaNovaCloud](https://python.langchain.com/api_reference/sambanova/chat_models/langchain_sambanova.ChatSambaNovaCloud.html) | [langchain-community](https://python.langchain.com/api_reference/community/index.html) | ❌ | ❌ | ❌ | ![PyPI - Downloads](https://img.shields.io/pypi/dm/langchain_sambanova?style=flat-square&label=%20) | ![PyPI - Version](https://img.shields.io/pypi/v/langchain_sambanova?style=flat-square&label=%20) |\n", + "| [ChatSambaNovaCloud](https://docs.sambanova.ai/cloud/docs/get-started/overview) | [langchain-sambanova](https://python.langchain.com/docs/integrations/providers/sambanova/) | ❌ | ❌ | ❌ | ![PyPI - Downloads](https://img.shields.io/pypi/dm/langchain_sambanova?style=flat-square&label=%20) | ![PyPI - Version](https://img.shields.io/pypi/v/langchain_sambanova?style=flat-square&label=%20) |\n", "\n", "### Model features\n", "\n", @@ -545,7 +545,7 @@ "source": [ "## API reference\n", "\n", - "For detailed documentation of all ChatSambaNovaCloud features and configurations head to the API reference: https://python.langchain.com/api_reference/sambanova/chat_models/langchain_sambanova.ChatSambaNovaCloud.html" + "For detailed documentation of all SambaNovaCloud features and configurations head to the API reference: https://docs.sambanova.ai/cloud/docs/get-started/overview" ] } ], diff --git a/docs/docs/integrations/chat/sambastudio.ipynb b/docs/docs/integrations/chat/sambastudio.ipynb index 87660522ebd..305ad8989e0 100644 --- a/docs/docs/integrations/chat/sambastudio.ipynb +++ b/docs/docs/integrations/chat/sambastudio.ipynb @@ -19,7 +19,7 @@ "source": [ "# ChatSambaStudio\n", "\n", - "This will help you getting started with SambaStudio [chat models](/docs/concepts/chat_models). For detailed documentation of all ChatStudio features and configurations head to the [API reference](https://python.langchain.com/api_reference/sambanova/chat_models/langchain_sambanova.chat_models.sambanova.ChatSambaStudio.html).\n", + "This will help you getting started with SambaStudio [chat models](/docs/concepts/chat_models). For detailed documentation of all ChatStudio features and configurations head to the [API reference](https://docs.sambanova.ai/sambastudio/latest/index.html).\n", "\n", "**[SambaNova](https://sambanova.ai/)'s** [SambaStudio](https://docs.sambanova.ai/sambastudio/latest/sambastudio-intro.html) SambaStudio is a rich, GUI-based platform that provides the functionality to train, deploy, and manage models in SambaNova [DataScale](https://sambanova.ai/products/datascale) systems.\n", "\n", @@ -28,7 +28,7 @@ "\n", "| Class | Package | Local | Serializable | JS support | Package downloads | Package latest |\n", "| :--- | :--- | :---: | :---: | :---: | :---: | :---: |\n", - "| [ChatSambaStudio](https://python.langchain.com/api_reference/sambanova/chat_models/langchain_sambanova.chat_models.sambanova.ChatSambaStudio.html) | [langchain-community](https://python.langchain.com/api_reference/community/index.html) | ❌ | ❌ | ❌ | ![PyPI - Downloads](https://img.shields.io/pypi/dm/langchain_sambanova?style=flat-square&label=%20) | ![PyPI - Version](https://img.shields.io/pypi/v/langchain_sambanova?style=flat-square&label=%20) |\n", + "| [ChatSambaStudio](https://docs.sambanova.ai/sambastudio/latest/index.html) | [langchain-sambanova](https://python.langchain.com/docs/integrations/providers/sambanova/) | ❌ | ❌ | ❌ | ![PyPI - Downloads](https://img.shields.io/pypi/dm/langchain_sambanova?style=flat-square&label=%20) | ![PyPI - Version](https://img.shields.io/pypi/v/langchain_sambanova?style=flat-square&label=%20) |\n", "\n", "### Model features\n", "\n", @@ -483,7 +483,7 @@ "source": [ "## API reference\n", "\n", - "For detailed documentation of all ChatSambaStudio features and configurations head to the API reference: https://python.langchain.com/api_reference/sambanova/chat_models/langchain_sambanova.sambanova.chat_models.ChatSambaStudio.html" + "For detailed documentation of all SambaStudio features and configurations head to the API reference: https://docs.sambanova.ai/sambastudio/latest/api-ref-landing.html" ] } ], diff --git a/docs/docs/integrations/providers/sambanova.ipynb b/docs/docs/integrations/providers/sambanova.ipynb index 572bd7b3d08..585948248c7 100644 --- a/docs/docs/integrations/providers/sambanova.ipynb +++ b/docs/docs/integrations/providers/sambanova.ipynb @@ -81,6 +81,13 @@ "llm.invoke(\"Tell me a joke about artificial intelligence.\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For a more detailed walkthrough of the ChatSambaNovaCloud component, see [this notebook](https://python.langchain.com/docs/integrations/chat/sambanova/)" + ] + }, { "cell_type": "code", "execution_count": null, @@ -93,6 +100,13 @@ "llm.invoke(\"Tell me a joke about artificial intelligence.\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For a more detailed walkthrough of the ChatSambaStudio component, see [this notebook](https://python.langchain.com/docs/integrations/chat/sambastudio/)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -116,7 +130,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "API Reference [langchain-sambanova](https://python.langchain.com/api_reference/sambanova/index.html)" + "For a more detailed walkthrough of the SambaStudioEmbeddings component, see [this notebook](https://python.langchain.com/docs/integrations/text_embedding/sambanova/)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "API Reference [langchain-sambanova](https://docs.sambanova.ai/cloud/api-reference)" ] } ], diff --git a/docs/docs/integrations/text_embedding/sambanova.ipynb b/docs/docs/integrations/text_embedding/sambanova.ipynb index 2f4fe9c8512..71bbfa7f5ac 100644 --- a/docs/docs/integrations/text_embedding/sambanova.ipynb +++ b/docs/docs/integrations/text_embedding/sambanova.ipynb @@ -21,16 +21,16 @@ "source": [ "# SambaStudioEmbeddings\n", "\n", - "This will help you get started with SambaNova's SambaStudio embedding models using LangChain. For detailed documentation on `SambaStudioEmbeddings` features and configuration options, please refer to the [API reference](https://python.langchain.com/api_reference/sambanova/embeddings/langchain_sambanova.embeddingsSambaStudioEmbeddings.html).\n", + "This will help you get started with SambaNova's SambaStudio embedding models using LangChain. For detailed documentation on `SambaStudioEmbeddings` features and configuration options, please refer to the [API reference](https://docs.sambanova.ai/sambastudio/latest/index.html).\n", "\n", - "**[SambaNova](https://sambanova.ai/)'s** [Sambastudio](https://sambanova.ai/technology/full-stack-ai-platform) is a platform for running your own open-source models\n", + "**[SambaNova](https://sambanova.ai/)'s** [SambaStudio](https://sambanova.ai/technology/full-stack-ai-platform) is a platform for running your own open-source models\n", "\n", "## Overview\n", "### Integration details\n", "\n", "| Provider | Package |\n", "|:--------:|:-------:|\n", - "| [SambaNova](/docs/integrations/providers/sambanova/) | [langchain-sambanova](https://python.langchain.com/api_reference/langchain_sambanova/embeddings/langchain_sambanova.embeddings.SambaStudioEmbeddings.html) |\n", + "| [SambaNova](/docs/integrations/providers/sambanova/) | [langchain-sambanova](https://python.langchain.com/docs/integrations/providers/sambanova/) |\n", "\n", "## Setup\n", "\n", @@ -227,7 +227,7 @@ "source": [ "## API Reference\n", "\n", - "For detailed documentation on `SambaNovaEmbeddings` features and configuration options, please refer to the [API reference](https://python.langchain.com/api_reference/langchain_sambanova/embeddings/langchain_sambanova.embeddings.SambaStudioEmbeddings.html).\n" + "For detailed documentation on `SambaStudio` features and configuration options, please refer to the [API reference](https://docs.sambanova.ai/sambastudio/latest/api-ref-landing.html).\n" ] } ], From 4b08a7e8e8bb1d4947068e1b6252344019e02b0a Mon Sep 17 00:00:00 2001 From: Chaymae El Aattabi <93398062+chaymaeelaattabi@users.noreply.github.com> Date: Thu, 13 Feb 2025 02:28:26 +0100 Subject: [PATCH 06/24] Fix #29759: Use local chunk_size_ for looping in embed_documents (#29761) This fix ensures that the chunk size is correctly determined when processing text embeddings. Previously, the code did not properly handle cases where chunk_size was None, potentially leading to incorrect chunking behavior. Now, chunk_size_ is explicitly set to either the provided chunk_size or the default self.chunk_size, ensuring consistent chunking. This update improves reliability when processing large text inputs in batches and prevents unintended behavior when chunk_size is not specified. --------- Co-authored-by: Chester Curme --- .../langchain_openai/embeddings/base.py | 2 +- .../tests/unit_tests/embeddings/test_base.py | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/libs/partners/openai/langchain_openai/embeddings/base.py b/libs/partners/openai/langchain_openai/embeddings/base.py index 252996dc8b3..4e2f7c74cfb 100644 --- a/libs/partners/openai/langchain_openai/embeddings/base.py +++ b/libs/partners/openai/langchain_openai/embeddings/base.py @@ -573,7 +573,7 @@ class OpenAIEmbeddings(BaseModel, Embeddings): chunk_size_ = chunk_size or self.chunk_size if not self.check_embedding_ctx_length: embeddings: List[List[float]] = [] - for i in range(0, len(texts), self.chunk_size): + for i in range(0, len(texts), chunk_size_): response = self.client.create( input=texts[i : i + chunk_size_], **self._invocation_params ) diff --git a/libs/partners/openai/tests/unit_tests/embeddings/test_base.py b/libs/partners/openai/tests/unit_tests/embeddings/test_base.py index 3bb5a61e4a9..d464b9cbb5b 100644 --- a/libs/partners/openai/tests/unit_tests/embeddings/test_base.py +++ b/libs/partners/openai/tests/unit_tests/embeddings/test_base.py @@ -1,4 +1,5 @@ import os +from unittest.mock import patch import pytest @@ -16,3 +17,23 @@ def test_openai_incorrect_field() -> None: with pytest.warns(match="not default parameter"): llm = OpenAIEmbeddings(foo="bar") # type: ignore[call-arg] assert llm.model_kwargs == {"foo": "bar"} + + +def test_embed_documents_with_custom_chunk_size() -> None: + embeddings = OpenAIEmbeddings(chunk_size=2, check_embedding_ctx_length=False) + texts = ["text1", "text2", "text3", "text4"] + custom_chunk_size = 3 + + with patch.object(embeddings.client, "create") as mock_create: + mock_create.side_effect = [ + {"data": [{"embedding": [0.1, 0.2]}, {"embedding": [0.3, 0.4]}]}, + {"data": [{"embedding": [0.5, 0.6]}, {"embedding": [0.7, 0.8]}]}, + ] + + result = embeddings.embed_documents(texts, chunk_size=custom_chunk_size) + + mock_create.call_args + mock_create.assert_any_call(input=texts[0:3], **embeddings._invocation_params) + mock_create.assert_any_call(input=texts[3:4], **embeddings._invocation_params) + + assert result == [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6], [0.7, 0.8]] From a0970d8d7ec2c6a2e662d4593b70b81c6365a4f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thor=20=E9=9B=B7=E7=A5=9E=20Schaeff?= <5748289+thorwebdev@users.noreply.github.com> Date: Thu, 13 Feb 2025 09:54:34 +0800 Subject: [PATCH 07/24] [WIP] chore: update ElevenLabs tool. (#29722) Thank you for contributing to LangChain! - [ ] **PR title**: "package: description" - Where "package" is whichever of langchain, community, core, etc. is being modified. Use "docs: ..." for purely docs changes, "infra: ..." for CI changes. - Example: "community: add foobar LLM" - [ ] **PR message**: ***Delete this entire checklist*** and replace with - **Description:** a description of the change - **Issue:** the issue # it fixes, if applicable - **Dependencies:** any dependencies required for this change - **Twitter handle:** if your PR gets announced, and you'd like a mention, we'll gladly shout you out! - [ ] **Add tests and docs**: If you're adding a new integration, please include 1. a test for the integration, preferably unit tests that do not rely on network access, 2. an example notebook showing its use. It lives in `docs/docs/integrations` directory. - [ ] **Lint and test**: Run `make format`, `make lint` and `make test` from the root of the package(s) you've modified. See contribution guidelines for more: https://python.langchain.com/docs/contributing/ Additional guidelines: - Make sure optional dependencies are imported within a function. - Please do not add dependencies to pyproject.toml files (even optional ones) unless they are required for unit tests. - Most PRs should not touch more than one package. - Changes should be backwards compatible. - If you are adding something to community, do not re-import it in langchain. If no one reviews your PR within a few days, please @-mention one of baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17. --------- Co-authored-by: Chester Curme --- .../integrations/tools/eleven_labs_tts.ipynb | 4 +-- .../agent_toolkits/load_tools.py | 2 +- .../tools/eleven_labs/models.py | 5 ++-- .../tools/eleven_labs/text2speech.py | 27 +++++++++++++------ 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/docs/docs/integrations/tools/eleven_labs_tts.ipynb b/docs/docs/integrations/tools/eleven_labs_tts.ipynb index ff70757d258..ef1dc59e511 100644 --- a/docs/docs/integrations/tools/eleven_labs_tts.ipynb +++ b/docs/docs/integrations/tools/eleven_labs_tts.ipynb @@ -5,7 +5,7 @@ "id": "a991a6f8-1897-4f49-a191-ae3bdaeda856", "metadata": {}, "source": [ - "# Eleven Labs Text2Speech\n", + "# ElevenLabs Text2Speech\n", "\n", "This notebook shows how to interact with the `ElevenLabs API` to achieve text-to-speech capabilities." ] @@ -37,7 +37,7 @@ "source": [ "import os\n", "\n", - "os.environ[\"ELEVEN_API_KEY\"] = \"\"" + "os.environ[\"ELEVENLABS_API_KEY\"] = \"\"" ] }, { diff --git a/libs/community/langchain_community/agent_toolkits/load_tools.py b/libs/community/langchain_community/agent_toolkits/load_tools.py index d7f5fc3cfd1..db3f7a425b3 100644 --- a/libs/community/langchain_community/agent_toolkits/load_tools.py +++ b/libs/community/langchain_community/agent_toolkits/load_tools.py @@ -557,7 +557,7 @@ _EXTRA_OPTIONAL_TOOLS: Dict[str, Tuple[Callable[[KwArg(Any)], BaseTool], List[st _get_dataforseo_api_search_json, ["api_login", "api_password", "aiosession"], ), - "eleven_labs_text2speech": (_get_eleven_labs_text2speech, ["eleven_api_key"]), + "eleven_labs_text2speech": (_get_eleven_labs_text2speech, ["elevenlabs_api_key"]), "google_cloud_texttospeech": (_get_google_cloud_texttospeech, []), "read_file": (_get_file_management_tool, []), "reddit_search": ( diff --git a/libs/community/langchain_community/tools/eleven_labs/models.py b/libs/community/langchain_community/tools/eleven_labs/models.py index c977b2972f7..72e699a7810 100644 --- a/libs/community/langchain_community/tools/eleven_labs/models.py +++ b/libs/community/langchain_community/tools/eleven_labs/models.py @@ -4,5 +4,6 @@ from enum import Enum class ElevenLabsModel(str, Enum): """Models available for Eleven Labs Text2Speech.""" - MULTI_LINGUAL = "eleven_multilingual_v1" - MONO_LINGUAL = "eleven_monolingual_v1" + MULTI_LINGUAL = "eleven_multilingual_v2" + MULTI_LINGUAL_FLASH = "eleven_flash_v2_5" + MONO_LINGUAL = "eleven_flash_v2" diff --git a/libs/community/langchain_community/tools/eleven_labs/text2speech.py b/libs/community/langchain_community/tools/eleven_labs/text2speech.py index 9f56647caf5..b6e51061a71 100644 --- a/libs/community/langchain_community/tools/eleven_labs/text2speech.py +++ b/libs/community/langchain_community/tools/eleven_labs/text2speech.py @@ -21,24 +21,26 @@ def _import_elevenlabs() -> Any: class ElevenLabsModel(str, Enum): """Models available for Eleven Labs Text2Speech.""" - MULTI_LINGUAL = "eleven_multilingual_v1" - MONO_LINGUAL = "eleven_monolingual_v1" + MULTI_LINGUAL = "eleven_multilingual_v2" + MULTI_LINGUAL_FLASH = "eleven_flash_v2_5" + MONO_LINGUAL = "eleven_flash_v2" class ElevenLabsText2SpeechTool(BaseTool): # type: ignore[override] """Tool that queries the Eleven Labs Text2Speech API. In order to set this up, follow instructions at: - https://docs.elevenlabs.io/welcome/introduction + https://elevenlabs.io/docs """ model: Union[ElevenLabsModel, str] = ElevenLabsModel.MULTI_LINGUAL + voice: str = "JBFqnCBsd6RMkjVDRZzb" name: str = "eleven_labs_text2speech" description: str = ( "A wrapper around Eleven Labs Text2Speech. " "Useful for when you need to convert text to speech. " - "It supports multiple languages, including English, German, Polish, " + "It supports more than 30 languages, including English, German, Polish, " "Spanish, Italian, French, Portuguese, and Hindi. " ) @@ -46,7 +48,7 @@ class ElevenLabsText2SpeechTool(BaseTool): # type: ignore[override] @classmethod def validate_environment(cls, values: Dict) -> Any: """Validate that api key exists in environment.""" - _ = get_from_dict_or_env(values, "eleven_api_key", "ELEVEN_API_KEY") + _ = get_from_dict_or_env(values, "elevenlabs_api_key", "ELEVENLABS_API_KEY") return values @@ -55,10 +57,16 @@ class ElevenLabsText2SpeechTool(BaseTool): # type: ignore[override] ) -> str: """Use the tool.""" elevenlabs = _import_elevenlabs() + client = elevenlabs.client.ElevenLabs() try: - speech = elevenlabs.generate(text=query, model=self.model) + speech = client.text_to_speech.convert( + text=query, + model_id=self.model, + voice_id=self.voice, + output_format="mp3_44100_128", + ) with tempfile.NamedTemporaryFile( - mode="bx", suffix=".wav", delete=False + mode="bx", suffix=".mp3", delete=False ) as f: f.write(speech) return f.name @@ -77,5 +85,8 @@ class ElevenLabsText2SpeechTool(BaseTool): # type: ignore[override] """Stream the text as speech as it is generated. Play the text in your speakers.""" elevenlabs = _import_elevenlabs() - speech_stream = elevenlabs.generate(text=query, model=self.model, stream=True) + client = elevenlabs.client.ElevenLabs() + speech_stream = client.text_to_speech.convert_as_stream( + text=query, model_id=self.model, voice_id=self.voice + ) elevenlabs.stream(speech_stream) From f42dafa80942484c60c92f07d6ebc8e03ae903fe Mon Sep 17 00:00:00 2001 From: Sunish Sheth Date: Wed, 12 Feb 2025 18:24:44 -0800 Subject: [PATCH 08/24] Deprecating sql_database access for creating UC functions for agent tools (#29745) Thank you for contributing to LangChain! - [ ] **PR title**: "package: description" - Where "package" is whichever of langchain, community, core, etc. is being modified. Use "docs: ..." for purely docs changes, "infra: ..." for CI changes. - Example: "community: add foobar LLM" - [ ] **PR message**: ***Delete this entire checklist*** and replace with - **Description:** a description of the change - **Issue:** the issue # it fixes, if applicable - **Dependencies:** any dependencies required for this change - **Twitter handle:** if your PR gets announced, and you'd like a mention, we'll gladly shout you out! - [ ] **Add tests and docs**: If you're adding a new integration, please include 1. a test for the integration, preferably unit tests that do not rely on network access, 2. an example notebook showing its use. It lives in `docs/docs/integrations` directory. - [ ] **Lint and test**: Run `make format`, `make lint` and `make test` from the root of the package(s) you've modified. See contribution guidelines for more: https://python.langchain.com/docs/contributing/ Additional guidelines: - Make sure optional dependencies are imported within a function. - Please do not add dependencies to pyproject.toml files (even optional ones) unless they are required for unit tests. - Most PRs should not touch more than one package. - Changes should be backwards compatible. - If you are adding something to community, do not re-import it in langchain. If no one reviews your PR within a few days, please @-mention one of baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17. --------- Co-authored-by: ccurme --- cookbook/README.md | 1 - cookbook/databricks_sql_db.ipynb | 273 ------------------ .../docs/integrations/providers/databricks.md | 9 +- .../utilities/sql_database.py | 8 + 4 files changed, 9 insertions(+), 282 deletions(-) delete mode 100644 cookbook/databricks_sql_db.ipynb diff --git a/cookbook/README.md b/cookbook/README.md index 2b90e07c791..6b18e508af7 100644 --- a/cookbook/README.md +++ b/cookbook/README.md @@ -21,7 +21,6 @@ Notebook | Description [code-analysis-deeplake.ipynb](https://github.com/langchain-ai/langchain/tree/master/cookbook/code-analysis-deeplake.ipynb) | Analyze its own code base with the help of gpt and activeloop's deep lake. [custom_agent_with_plugin_retri...](https://github.com/langchain-ai/langchain/tree/master/cookbook/custom_agent_with_plugin_retrieval.ipynb) | Build a custom agent that can interact with ai plugins by retrieving tools and creating natural language wrappers around openapi endpoints. [custom_agent_with_plugin_retri...](https://github.com/langchain-ai/langchain/tree/master/cookbook/custom_agent_with_plugin_retrieval_using_plugnplai.ipynb) | Build a custom agent with plugin retrieval functionality, utilizing ai plugins from the `plugnplai` directory. -[databricks_sql_db.ipynb](https://github.com/langchain-ai/langchain/tree/master/cookbook/databricks_sql_db.ipynb) | Connect to databricks runtimes and databricks sql. [deeplake_semantic_search_over_...](https://github.com/langchain-ai/langchain/tree/master/cookbook/deeplake_semantic_search_over_chat.ipynb) | Perform semantic search and question-answering over a group chat using activeloop's deep lake with gpt4. [elasticsearch_db_qa.ipynb](https://github.com/langchain-ai/langchain/tree/master/cookbook/elasticsearch_db_qa.ipynb) | Interact with elasticsearch analytics databases in natural language and build search queries via the elasticsearch dsl API. [extraction_openai_tools.ipynb](https://github.com/langchain-ai/langchain/tree/master/cookbook/extraction_openai_tools.ipynb) | Structured Data Extraction with OpenAI Tools diff --git a/cookbook/databricks_sql_db.ipynb b/cookbook/databricks_sql_db.ipynb deleted file mode 100644 index 78fba6b914e..00000000000 --- a/cookbook/databricks_sql_db.ipynb +++ /dev/null @@ -1,273 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "707d13a7", - "metadata": {}, - "source": [ - "# Databricks\n", - "\n", - "This notebook covers how to connect to the [Databricks runtimes](https://docs.databricks.com/runtime/index.html) and [Databricks SQL](https://www.databricks.com/product/databricks-sql) using the SQLDatabase wrapper of LangChain.\n", - "It is broken into 3 parts: installation and setup, connecting to Databricks, and examples." - ] - }, - { - "cell_type": "markdown", - "id": "0076d072", - "metadata": {}, - "source": [ - "## Installation and Setup" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "739b489b", - "metadata": {}, - "outputs": [], - "source": [ - "!pip install databricks-sql-connector" - ] - }, - { - "cell_type": "markdown", - "id": "73113163", - "metadata": {}, - "source": [ - "## Connecting to Databricks\n", - "\n", - "You can connect to [Databricks runtimes](https://docs.databricks.com/runtime/index.html) and [Databricks SQL](https://www.databricks.com/product/databricks-sql) using the `SQLDatabase.from_databricks()` method.\n", - "\n", - "### Syntax\n", - "```python\n", - "SQLDatabase.from_databricks(\n", - " catalog: str,\n", - " schema: str,\n", - " host: Optional[str] = None,\n", - " api_token: Optional[str] = None,\n", - " warehouse_id: Optional[str] = None,\n", - " cluster_id: Optional[str] = None,\n", - " engine_args: Optional[dict] = None,\n", - " **kwargs: Any)\n", - "```\n", - "### Required Parameters\n", - "* `catalog`: The catalog name in the Databricks database.\n", - "* `schema`: The schema name in the catalog.\n", - "\n", - "### Optional Parameters\n", - "There following parameters are optional. When executing the method in a Databricks notebook, you don't need to provide them in most of the cases.\n", - "* `host`: The Databricks workspace hostname, excluding 'https://' part. Defaults to 'DATABRICKS_HOST' environment variable or current workspace if in a Databricks notebook.\n", - "* `api_token`: The Databricks personal access token for accessing the Databricks SQL warehouse or the cluster. Defaults to 'DATABRICKS_TOKEN' environment variable or a temporary one is generated if in a Databricks notebook.\n", - "* `warehouse_id`: The warehouse ID in the Databricks SQL.\n", - "* `cluster_id`: The cluster ID in the Databricks Runtime. If running in a Databricks notebook and both 'warehouse_id' and 'cluster_id' are None, it uses the ID of the cluster the notebook is attached to.\n", - "* `engine_args`: The arguments to be used when connecting Databricks.\n", - "* `**kwargs`: Additional keyword arguments for the `SQLDatabase.from_uri` method." - ] - }, - { - "cell_type": "markdown", - "id": "b11c7e48", - "metadata": {}, - "source": [ - "## Examples" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "8102bca0", - "metadata": {}, - "outputs": [], - "source": [ - "# Connecting to Databricks with SQLDatabase wrapper\n", - "from langchain_community.utilities import SQLDatabase\n", - "\n", - "db = SQLDatabase.from_databricks(catalog=\"samples\", schema=\"nyctaxi\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "9dd36f58", - "metadata": {}, - "outputs": [], - "source": [ - "# Creating a OpenAI Chat LLM wrapper\n", - "from langchain_openai import ChatOpenAI\n", - "\n", - "llm = ChatOpenAI(temperature=0, model_name=\"gpt-4\")" - ] - }, - { - "cell_type": "markdown", - "id": "5b5c5f1a", - "metadata": {}, - "source": [ - "### SQL Chain example\n", - "\n", - "This example demonstrates the use of the [SQL Chain](https://python.langchain.com/en/latest/modules/chains/examples/sqlite.html) for answering a question over a Databricks database." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "36f2270b", - "metadata": {}, - "outputs": [], - "source": [ - "from langchain_community.utilities import SQLDatabaseChain\n", - "\n", - "db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "4e2b5f25", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n", - "\u001b[1m> Entering new SQLDatabaseChain chain...\u001b[0m\n", - "What is the average duration of taxi rides that start between midnight and 6am?\n", - "SQLQuery:\u001b[32;1m\u001b[1;3mSELECT AVG(UNIX_TIMESTAMP(tpep_dropoff_datetime) - UNIX_TIMESTAMP(tpep_pickup_datetime)) as avg_duration\n", - "FROM trips\n", - "WHERE HOUR(tpep_pickup_datetime) >= 0 AND HOUR(tpep_pickup_datetime) < 6\u001b[0m\n", - "SQLResult: \u001b[33;1m\u001b[1;3m[(987.8122786304605,)]\u001b[0m\n", - "Answer:\u001b[32;1m\u001b[1;3mThe average duration of taxi rides that start between midnight and 6am is 987.81 seconds.\u001b[0m\n", - "\u001b[1m> Finished chain.\u001b[0m\n" - ] - }, - { - "data": { - "text/plain": [ - "'The average duration of taxi rides that start between midnight and 6am is 987.81 seconds.'" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "db_chain.run(\n", - " \"What is the average duration of taxi rides that start between midnight and 6am?\"\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "e496d5e5", - "metadata": {}, - "source": [ - "### SQL Database Agent example\n", - "\n", - "This example demonstrates the use of the [SQL Database Agent](/docs/integrations/tools/sql_database) for answering questions over a Databricks database." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "9918e86a", - "metadata": {}, - "outputs": [], - "source": [ - "from langchain.agents import create_sql_agent\n", - "from langchain_community.agent_toolkits import SQLDatabaseToolkit\n", - "\n", - "toolkit = SQLDatabaseToolkit(db=db, llm=llm)\n", - "agent = create_sql_agent(llm=llm, toolkit=toolkit, verbose=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "c484a76e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n", - "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", - "\u001b[32;1m\u001b[1;3mAction: list_tables_sql_db\n", - "Action Input: \u001b[0m\n", - "Observation: \u001b[38;5;200m\u001b[1;3mtrips\u001b[0m\n", - "Thought:\u001b[32;1m\u001b[1;3mI should check the schema of the trips table to see if it has the necessary columns for trip distance and duration.\n", - "Action: schema_sql_db\n", - "Action Input: trips\u001b[0m\n", - "Observation: \u001b[33;1m\u001b[1;3m\n", - "CREATE TABLE trips (\n", - "\ttpep_pickup_datetime TIMESTAMP, \n", - "\ttpep_dropoff_datetime TIMESTAMP, \n", - "\ttrip_distance FLOAT, \n", - "\tfare_amount FLOAT, \n", - "\tpickup_zip INT, \n", - "\tdropoff_zip INT\n", - ") USING DELTA\n", - "\n", - "/*\n", - "3 rows from trips table:\n", - "tpep_pickup_datetime\ttpep_dropoff_datetime\ttrip_distance\tfare_amount\tpickup_zip\tdropoff_zip\n", - "2016-02-14 16:52:13+00:00\t2016-02-14 17:16:04+00:00\t4.94\t19.0\t10282\t10171\n", - "2016-02-04 18:44:19+00:00\t2016-02-04 18:46:00+00:00\t0.28\t3.5\t10110\t10110\n", - "2016-02-17 17:13:57+00:00\t2016-02-17 17:17:55+00:00\t0.7\t5.0\t10103\t10023\n", - "*/\u001b[0m\n", - "Thought:\u001b[32;1m\u001b[1;3mThe trips table has the necessary columns for trip distance and duration. I will write a query to find the longest trip distance and its duration.\n", - "Action: query_checker_sql_db\n", - "Action Input: SELECT trip_distance, tpep_dropoff_datetime - tpep_pickup_datetime as duration FROM trips ORDER BY trip_distance DESC LIMIT 1\u001b[0m\n", - "Observation: \u001b[31;1m\u001b[1;3mSELECT trip_distance, tpep_dropoff_datetime - tpep_pickup_datetime as duration FROM trips ORDER BY trip_distance DESC LIMIT 1\u001b[0m\n", - "Thought:\u001b[32;1m\u001b[1;3mThe query is correct. I will now execute it to find the longest trip distance and its duration.\n", - "Action: query_sql_db\n", - "Action Input: SELECT trip_distance, tpep_dropoff_datetime - tpep_pickup_datetime as duration FROM trips ORDER BY trip_distance DESC LIMIT 1\u001b[0m\n", - "Observation: \u001b[36;1m\u001b[1;3m[(30.6, '0 00:43:31.000000000')]\u001b[0m\n", - "Thought:\u001b[32;1m\u001b[1;3mI now know the final answer.\n", - "Final Answer: The longest trip distance is 30.6 miles and it took 43 minutes and 31 seconds.\u001b[0m\n", - "\n", - "\u001b[1m> Finished chain.\u001b[0m\n" - ] - }, - { - "data": { - "text/plain": [ - "'The longest trip distance is 30.6 miles and it took 43 minutes and 31 seconds.'" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "agent.run(\"What is the longest trip distance and how long did it take?\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/docs/integrations/providers/databricks.md b/docs/docs/integrations/providers/databricks.md index a45e8e3e03e..2cf4961971a 100644 --- a/docs/docs/integrations/providers/databricks.md +++ b/docs/docs/integrations/providers/databricks.md @@ -103,14 +103,7 @@ See [MLflow LangChain Integration](/docs/integrations/providers/mlflow_tracking) SQLDatabase ----------- -You can connect to Databricks SQL using the SQLDatabase wrapper of LangChain. -``` -from langchain.sql_database import SQLDatabase - -db = SQLDatabase.from_databricks(catalog="samples", schema="nyctaxi") -``` - -See [Databricks SQL Agent](https://docs.databricks.com/en/large-language-models/langchain.html#databricks-sql-agent) for how to connect Databricks SQL with your LangChain Agent as a powerful querying tool. +To connect to Databricks SQL or query structured data, see the [Databricks structured retriever tool documentation](https://docs.databricks.com/en/generative-ai/agent-framework/structured-retrieval-tools.html#table-query-tool) and to create an agent using the above created SQL UDF see [Databricks UC Integration](https://docs.unitycatalog.io/ai/integrations/langchain/). Open Models ----------- diff --git a/libs/community/langchain_community/utilities/sql_database.py b/libs/community/langchain_community/utilities/sql_database.py index d6ecc4ca008..2b6b84ca4a1 100644 --- a/libs/community/langchain_community/utilities/sql_database.py +++ b/libs/community/langchain_community/utilities/sql_database.py @@ -139,6 +139,14 @@ class SQLDatabase: return cls(create_engine(database_uri, **_engine_args), **kwargs) @classmethod + @deprecated( + "0.3.18", + message="For performing structured retrieval using Databricks SQL, " + "see the latest best practices and recommended APIs at " + "https://docs.unitycatalog.io/ai/integrations/langchain/ " # noqa: E501 + "instead", + removal="1.0", + ) def from_databricks( cls, catalog: str, From 716fd89d8eb38cde75ccbb6afbad7bd913316ac3 Mon Sep 17 00:00:00 2001 From: Eric Pinzur <2641606+epinzur@users.noreply.github.com> Date: Thu, 13 Feb 2025 03:25:48 +0100 Subject: [PATCH 09/24] docs: contributed `Graph RAG` Retriever integration (#29744) **Description:** This adds the `Graph RAG` Retriever integration documentation, per https://python.langchain.com/docs/contributing/how_to/integrations/. * The integration exists in this public repository: https://github.com/datastax/graph-rag * We've implemented the standard langchain tests for retrievers: https://github.com/datastax/graph-rag/blob/main/packages/langchain-graph-retriever/tests/test_langchain.py * Our integration is published to PyPi: https://pypi.org/project/langchain-graph-retriever/ --- .../docs/integrations/providers/graph_rag.mdx | 22 + .../integrations/retrievers/graph_rag.mdx | 379 ++++++++++++++++++ libs/packages.yml | 6 + 3 files changed, 407 insertions(+) create mode 100644 docs/docs/integrations/providers/graph_rag.mdx create mode 100644 docs/docs/integrations/retrievers/graph_rag.mdx diff --git a/docs/docs/integrations/providers/graph_rag.mdx b/docs/docs/integrations/providers/graph_rag.mdx new file mode 100644 index 00000000000..c2561ef0c7f --- /dev/null +++ b/docs/docs/integrations/providers/graph_rag.mdx @@ -0,0 +1,22 @@ +# Graph RAG + +## Overview + +[Graph RAG](https://datastax.github.io/graph-rag/) provides a retriever interface +that combines **unstructured** similarity search on vectors with **structured** +traversal of metadata properties. This enables graph-based retrieval over **existing** +vector stores. + +## Installation and setup + +```bash +pip install langchain-graph-retriever +``` + +## Retrievers + +```python +from langchain_graph_retriever import GraphRetriever +``` + +For more information, see the [Graph RAG Integration Guide](/docs/integrations/retrievers/graph_rag). diff --git a/docs/docs/integrations/retrievers/graph_rag.mdx b/docs/docs/integrations/retrievers/graph_rag.mdx new file mode 100644 index 00000000000..ca70b00852d --- /dev/null +++ b/docs/docs/integrations/retrievers/graph_rag.mdx @@ -0,0 +1,379 @@ +--- +sidebar_label: Graph RAG +description: Graph traversal over any Vector Store using document metadata. +--- + +import ChatModelTabs from "@theme/ChatModelTabs"; +import EmbeddingTabs from "@theme/EmbeddingTabs"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + + +# Graph RAG + +This guide provides an introduction to Graph RAG. For detailed documentation of all +supported features and configurations, refer to the +[Graph RAG Project Page](https://datastax.github.io/graph-rag/). + +## Overview + +The `GraphRetriever` from the `langchain-graph-retriever` package provides a LangChain +[retriever](/docs/concepts/retrievers/) that combines **unstructured** similarity search +on vectors with **structured** traversal of metadata properties. This enables graph-based +retrieval over an **existing** vector store. + +### Integration details + +| Retriever | Source | PyPI Package | Latest | Project Page | +| :--- | :--- | :---: | :---: | :---: | +| GraphRetriever | [github.com/datastax/graph-rag](https://github.com/datastax/graph-rag/tree/main/packages/langchain-graph-retriever) | [langchain-graph-retriever](https://pypi.org/project/langchain-graph-retriever/) | ![PyPI - Version](https://img.shields.io/pypi/v/langchain-graph-retriever?style=flat-square&label=%20&color=orange) | [Graph RAG](https://datastax.github.io/graph-rag/) | + + +## Benefits + +* [**Link based on existing metadata:**](https://datastax.github.io/graph-rag/get-started/) + Use existing metadata fields without additional processing. Retrieve more from an + existing vector store! + +* [**Change links on demand:**](https://datastax.github.io/graph-rag/get-started/edges/) + Edges can be specified on-the-fly, allowing different relationships to be traversed + based on the question. + + +* [**Pluggable Traversal Strategies:**](https://datastax.github.io/graph-rag/get-started/strategies/) + Use built-in traversal strategies like Eager or MMR, or define custom logic to select + which nodes to explore. + +* [**Broad compatibility:**](https://datastax.github.io/graph-rag/get-started/adapters/) + Adapters are available for a variety of vector stores with support for additional + stores easily added. + +## Setup + +### Installation + +This retriever lives in the `langchain-graph-retriever` package. + +```bash +pip install -qU langchain-graph-retriever +``` +## Instantiation + +The following examples will show how to perform graph traversal over some sample +Documents about animals. + +### Prerequisites + +
+ Toggle for Details +
+ 1. Ensure you have Python 3.10+ installed + + 1. Install the following package that provides sample data. + ```bash + pip install -qU graph_rag_example_helpers + ``` + + 1. Download the test documents: + ```python + from graph_rag_example_helpers.datasets.animals import fetch_documents + animals = fetch_documents() + ``` + + 1. +
+
+ +### Populating the Vector store + +This section shows how to populate a variety of vector stores with the sample data. + +For help on choosing one of the vector stores below, or to add support for your +vector store, consult the documentation about +[Adapters and Supported Stores](https://datastax.github.io/graph-rag/guide/adapters/). + + + +
+ Install the `langchain-graph-retriever` package with the `astra` extra: + + ```bash + pip install "langchain-graph-retriever[astra]" + ``` + + Then create a vector store and load the test documents: + + ```python + from langchain_astradb import AstraDBVectorStore + + vector_store = AstraDBVectorStore.from_documents( + documents=animals, + embedding=embeddings, + collection_name="animals", + api_endpoint=ASTRA_DB_API_ENDPOINT, + token=ASTRA_DB_APPLICATION_TOKEN, + ) + ``` + For the `ASTRA_DB_API_ENDPOINT` and `ASTRA_DB_APPLICATION_TOKEN` credentials, + consult the [AstraDB Vector Store Guide](/docs/integrations/vectorstores/astradb). + + :::note + For faster initial testing, consider using the **InMemory** Vector Store. + ::: +
+
+ +
+ Install the `langchain-graph-retriever` package with the `cassandra` extra: + + ```bash + pip install "langchain-graph-retriever[cassandra]" + ``` + + Then create a vector store and load the test documents: + + ```python + from langchain_community.vectorstores.cassandra import Cassandra + from langchain_graph_retriever.transformers import ShreddingTransformer + + vector_store = Cassandra.from_documents( + documents=list(ShreddingTransformer().transform_documents(animals)), + embedding=embeddings, + table_name="animals", + ) + ``` + + For help creating a Cassandra connection, consult the + [Apache Cassandra Vector Store Guide](/docs/integrations/vectorstores/cassandra#connection-parameters) + + :::note + Apache Cassandra doesn't support searching in nested metadata. Because of this + it is necessary to use the [`ShreddingTransformer`](https://datastax.github.io/graph-rag/reference/langchain_graph_retriever/transformers/#langchain_graph_retriever.transformers.shredding.ShreddingTransformer) + when inserting documents. + ::: +
+
+ +
+ Install the `langchain-graph-retriever` package with the `opensearch` extra: + + ```bash + pip install "langchain-graph-retriever[opensearch]" + ``` + + Then create a vector store and load the test documents: + + ```python + from langchain_community.vectorstores import OpenSearchVectorSearch + + vector_store = OpenSearchVectorSearch.from_documents( + documents=animals, + embedding=embeddings, + engine="faiss", + index_name="animals", + opensearch_url=OPEN_SEARCH_URL, + bulk_size=500, + ) + ``` + + For help creating an OpenSearch connection, consult the + [OpenSearch Vector Store Guide](/docs/integrations/vectorstores/opensearch). +
+
+ +
+ Install the `langchain-graph-retriever` package with the `chroma` extra: + + ```bash + pip install "langchain-graph-retriever[chroma]" + ``` + + Then create a vector store and load the test documents: + + ```python + from langchain_chroma.vectorstores import Chroma + from langchain_graph_retriever.transformers import ShreddingTransformer + + vector_store = Chroma.from_documents( + documents=list(ShreddingTransformer().transform_documents(animals)), + embedding=embeddings, + collection_name="animals", + ) + ``` + + For help creating an Chroma connection, consult the + [Chroma Vector Store Guide](/docs/integrations/vectorstores/chroma). + + :::note + Chroma doesn't support searching in nested metadata. Because of this + it is necessary to use the [`ShreddingTransformer`](https://datastax.github.io/graph-rag/reference/langchain_graph_retriever/transformers/#langchain_graph_retriever.transformers.shredding.ShreddingTransformer) + when inserting documents. + ::: +
+
+ +
+ Install the `langchain-graph-retriever` package: + + ```bash + pip install "langchain-graph-retriever" + ``` + + Then create a vector store and load the test documents: + + ```python + from langchain_core.vectorstores import InMemoryVectorStore + + vector_store = InMemoryVectorStore.from_documents( + documents=animals, + embedding=embeddings, + ) + ``` + + :::tip + Using the `InMemoryVectorStore` is the fastest way to get started with Graph RAG + but it isn't recommended for production use. Instead it is recommended to use + **AstraDB** or **OpenSearch**. + ::: +
+
+
+ +### Graph Traversal + +This graph retriever starts with a single animal that best matches the query, then +traverses to other animals sharing the same `habitat` and/or `origin`. + + ```python + from graph_retriever.strategies import Eager + from langchain_graph_retriever import GraphRetriever + + traversal_retriever = GraphRetriever( + store = vector_store, + edges = [("habitat", "habitat"), ("origin", "origin")], + strategy = Eager(k=5, start_k=1, max_depth=2), + ) + ``` + +The above creates a graph traversing retriever that starts with the nearest +animal (`start_k=1`), retrieves 5 documents (`k=5`) and limits the search to documents +that are at most 2 steps away from the first animal (`max_depth=2`). + +The `edges` define how metadata values can be used for traversal. In this case, every +animal is connected to other animals with the same `habitat` and/or `origin`. + +```python +results = traversal_retriever.invoke("what animals could be found near a capybara?") + +for doc in results: + print(f"{doc.id}: {doc.page_content}") +``` + +```output +capybara: capybaras are the largest rodents in the world and are highly social animals. +heron: herons are wading birds known for their long legs and necks, often seen near water. +crocodile: crocodiles are large reptiles with powerful jaws and a long lifespan, often living over 70 years. +frog: frogs are amphibians known for their jumping ability and croaking sounds. +duck: ducks are waterfowl birds known for their webbed feet and quacking sounds. +``` + +Graph traversal improves retrieval quality by leveraging structured relationships in +the data. Unlike standard similarity search (see below), it provides a clear, +explainable rationale for why documents are selected. + +In this case, the documents `capybara`, `heron`, `frog`, `crocodile`, and `newt` all +share the same `habitat=wetlands`, as defined by their metadata. This should increase +Document Relevance and the quality of the answer from the LLM. + +### Comparison to Standard Retrieval + +When `max_depth=0`, the graph traversing retriever behaves like a standard retriever: + +```python +standard_retriever = GraphRetriever( + store = vector_store, + edges = [("habitat", "habitat"), ("origin", "origin")], + strategy = Eager(k=5, start_k=5, max_depth=0), +) +``` + +This creates a retriever that starts with the nearest 5 animals (`start_k=5`), +and returns them without any traversal (`max_depth=0`). The edge definitions +are ignored in this case. + +This is essentially the same as: + +```python +standard_retriever = vector_store.as_retriever(search_kwargs={"k":5}) +``` + +For either case, invoking the retriever returns: + +```python +results = standard_retriever.invoke("what animals could be found near a capybara?") + +for doc in results: + print(f"{doc.id}: {doc.page_content}") +``` + +```output +capybara: capybaras are the largest rodents in the world and are highly social animals. +iguana: iguanas are large herbivorous lizards often found basking in trees and near water. +guinea pig: guinea pigs are small rodents often kept as pets due to their gentle and social nature. +hippopotamus: hippopotamuses are large semi-aquatic mammals known for their massive size and territorial behavior. +boar: boars are wild relatives of pigs, known for their tough hides and tusks. +``` + +These documents are joined based on similarity alone. Any structural data that existed +in the store is ignored. As compared to graph retrieval, this can decrease Document +Relevance because the returned results have a lower chance of being helpful to answer +the query. + +## Usage + +Following the examples above, `.invoke` is used to initiate retrieval on a query. + +## Use within a chain + +Like other retrievers, `GraphRetriever` can be incorporated into LLM applications +via [chains](/docs/how_to/sequence/). + + + +```python +from langchain_core.output_parsers import StrOutputParser +from langchain_core.prompts import ChatPromptTemplate +from langchain_core.runnables import RunnablePassthrough + +prompt = ChatPromptTemplate.from_template( +"""Answer the question based only on the context provided. + +Context: {context} + +Question: {question}""" +) + +def format_docs(docs): + return "\n\n".join(f"text: {doc.page_content} metadata: {doc.metadata}" for doc in docs) + +chain = ( + {"context": traversal_retriever | format_docs, "question": RunnablePassthrough()} + | prompt + | llm + | StrOutputParser() +) +``` + +```python +chain.invoke("what animals could be found near a capybara?") +``` + +```output +Animals that could be found near a capybara include herons, crocodiles, frogs, +and ducks, as they all inhabit wetlands. +``` + +## API reference + +To explore all available parameters and advanced configurations, refer to the +[Graph RAG API reference](https://datastax.github.io/graph-rag/reference/). diff --git a/libs/packages.yml b/libs/packages.yml index 4d03811a0ab..58cf01aad52 100644 --- a/libs/packages.yml +++ b/libs/packages.yml @@ -394,3 +394,9 @@ packages: repo: lunary-ai/langchain-abso path: . downloads: 0 +- name: langchain-graph-retriever + name_title: 'Graph RAG' + repo: datastax/graph-rag + path: packages/langchain-graph-retriever + downloads: 0 + provider_page: graph_rag From 2310847c0f81042765c8944967bfac14b6af2375 Mon Sep 17 00:00:00 2001 From: Mohammad Mohtashim <45242107+keenborder786@users.noreply.github.com> Date: Thu, 13 Feb 2025 07:26:13 +0500 Subject: [PATCH 10/24] (Chroma): Small Fix in `add_texts` when checking for embeddings (#29766) - **Description:** Small fix in `add_texts` to make embedding nullability is checked properly. - **Issue:** #29765 --------- Co-authored-by: Chester Curme --- libs/partners/chroma/langchain_chroma/vectorstores.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libs/partners/chroma/langchain_chroma/vectorstores.py b/libs/partners/chroma/langchain_chroma/vectorstores.py index 121f412ca3e..ccb175be9d3 100644 --- a/libs/partners/chroma/langchain_chroma/vectorstores.py +++ b/libs/partners/chroma/langchain_chroma/vectorstores.py @@ -547,7 +547,9 @@ class Chroma(VectorStore): metadatas = [metadatas[idx] for idx in non_empty_ids] texts_with_metadatas = [texts[idx] for idx in non_empty_ids] embeddings_with_metadatas = ( - [embeddings[idx] for idx in non_empty_ids] if embeddings else None + [embeddings[idx] for idx in non_empty_ids] + if embeddings is not None + else None ) ids_with_metadata = [ids[idx] for idx in non_empty_ids] try: From 16fb1f5371871c30fffb9f79205172db54a1ca9b Mon Sep 17 00:00:00 2001 From: ccurme Date: Wed, 12 Feb 2025 18:39:16 -0800 Subject: [PATCH 11/24] chroma[patch]: release 0.2.2 (#29769) Resolves https://github.com/langchain-ai/langchain/issues/29765 --- .../chroma/langchain_chroma/vectorstores.py | 2 +- libs/partners/chroma/pyproject.toml | 2 +- libs/partners/chroma/uv.lock | 18 ++++++++++++++---- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/libs/partners/chroma/langchain_chroma/vectorstores.py b/libs/partners/chroma/langchain_chroma/vectorstores.py index ccb175be9d3..bac16a5d660 100644 --- a/libs/partners/chroma/langchain_chroma/vectorstores.py +++ b/libs/partners/chroma/langchain_chroma/vectorstores.py @@ -548,7 +548,7 @@ class Chroma(VectorStore): texts_with_metadatas = [texts[idx] for idx in non_empty_ids] embeddings_with_metadatas = ( [embeddings[idx] for idx in non_empty_ids] - if embeddings is not None + if embeddings is not None and len(embeddings) > 0 else None ) ids_with_metadata = [ids[idx] for idx in non_empty_ids] diff --git a/libs/partners/chroma/pyproject.toml b/libs/partners/chroma/pyproject.toml index 6de0699eaee..e8f4a164335 100644 --- a/libs/partners/chroma/pyproject.toml +++ b/libs/partners/chroma/pyproject.toml @@ -13,7 +13,7 @@ dependencies = [ "chromadb!=0.5.10,!=0.5.11,!=0.5.12,!=0.5.4,!=0.5.5,!=0.5.7,!=0.5.9,<0.7.0,>=0.4.0", ] name = "langchain-chroma" -version = "0.2.1" +version = "0.2.2" description = "An integration package connecting Chroma and LangChain" readme = "README.md" diff --git a/libs/partners/chroma/uv.lock b/libs/partners/chroma/uv.lock index d57f8e19825..4e6a4de0193 100644 --- a/libs/partners/chroma/uv.lock +++ b/libs/partners/chroma/uv.lock @@ -732,7 +732,7 @@ wheels = [ [[package]] name = "langchain-chroma" -version = "0.2.1" +version = "0.2.2" source = { editable = "." } dependencies = [ { name = "chromadb" }, @@ -814,7 +814,7 @@ typing = [ [[package]] name = "langchain-core" -version = "0.3.34rc1" +version = "0.3.35" source = { directory = "../../core" } dependencies = [ { name = "jsonpatch" }, @@ -872,7 +872,7 @@ typing = [ [[package]] name = "langchain-tests" -version = "0.3.10" +version = "0.3.11" source = { directory = "../../standard-tests" } dependencies = [ { name = "httpx" }, @@ -887,7 +887,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "httpx", specifier = ">=0.25.0,<1" }, - { name = "langchain-core", specifier = ">=0.3.33,<0.4.0" }, + { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, { name = "pytest", specifier = ">=7,<9" }, @@ -896,6 +896,16 @@ requires-dist = [ { name = "syrupy", specifier = ">=4,<5" }, ] +[package.metadata.requires-dev] +codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] +lint = [{ name = "ruff", specifier = ">=0.9.2,<1.0.0" }] +test = [{ name = "langchain-core", directory = "../core" }] +test-integration = [] +typing = [ + { name = "langchain-core", directory = "../core" }, + { name = "mypy", specifier = ">=1,<2" }, +] + [[package]] name = "langsmith" version = "0.3.5" From c8cb7c25bff205c5e6545b7fa657398d9b5b7b86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Kopeck=C3=BD?= Date: Thu, 13 Feb 2025 05:02:55 +0100 Subject: [PATCH 12/24] docs: update apify integration (#29553) **Description:** Fixed and updated Apify integration documentation to use the new [langchain-apify](https://github.com/apify/langchain-apify) package. **Twitter handle:** @apify --- .../document_loaders/apify_dataset.ipynb | 122 +++++++-- docs/docs/integrations/providers/apify.mdx | 29 +- .../integrations/tools/apify_actors.ipynb | 256 ++++++++++++++++++ docs/static/img/ApifyActors.png | Bin 150809 -> 216653 bytes .../document_loaders/apify_dataset.py | 11 + .../langchain_community/utilities/apify.py | 11 + libs/packages.yml | 4 + 7 files changed, 399 insertions(+), 34 deletions(-) create mode 100644 docs/docs/integrations/tools/apify_actors.ipynb diff --git a/docs/docs/integrations/document_loaders/apify_dataset.ipynb b/docs/docs/integrations/document_loaders/apify_dataset.ipynb index fac8f472d3f..637f2977664 100644 --- a/docs/docs/integrations/document_loaders/apify_dataset.ipynb +++ b/docs/docs/integrations/document_loaders/apify_dataset.ipynb @@ -2,7 +2,9 @@ "cells": [ { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "id": "xwiDq5fOuoRn" + }, "source": [ "# Apify Dataset\n", "\n", @@ -20,33 +22,63 @@ "cell_type": "code", "execution_count": null, "metadata": { + "id": "qRW2-mokuoRp", "tags": [] }, "outputs": [], "source": [ - "%pip install --upgrade --quiet apify-client" + "%pip install --upgrade --quiet langchain langchain-apify langchain-openai" ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "id": "8jRVq16LuoRq" + }, "source": [ "First, import `ApifyDatasetLoader` into your source code:" ] }, { "cell_type": "code", - "execution_count": 1, - "metadata": {}, + "execution_count": 2, + "metadata": { + "id": "umXQHqIJuoRq" + }, "outputs": [], "source": [ - "from langchain_community.document_loaders import ApifyDatasetLoader\n", + "from langchain_apify import ApifyDatasetLoader\n", "from langchain_core.documents import Document" ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "id": "NjGwKy59vz1X" + }, + "source": [ + "Find your [Apify API token](https://console.apify.com/account/integrations) and [OpenAI API key](https://platform.openai.com/account/api-keys) and initialize these into environment variable:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "AvzNtyCxwDdr" + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "os.environ[\"APIFY_API_TOKEN\"] = \"your-apify-api-token\"\n", + "os.environ[\"OPENAI_API_KEY\"] = \"your-openai-api-key\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "d1O-KL48uoRr" + }, "source": [ "Then provide a function that maps Apify dataset record fields to LangChain `Document` format.\n", "\n", @@ -64,8 +96,10 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, + "execution_count": 8, + "metadata": { + "id": "m1SpA7XZuoRr" + }, "outputs": [], "source": [ "loader = ApifyDatasetLoader(\n", @@ -78,8 +112,10 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, + "execution_count": 9, + "metadata": { + "id": "0hWX7ABsuoRs" + }, "outputs": [], "source": [ "data = loader.load()" @@ -87,7 +123,9 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "id": "EJCVFVKNuoRs" + }, "source": [ "## An example with question answering\n", "\n", @@ -96,21 +134,26 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, + "execution_count": 14, + "metadata": { + "id": "sNisJKzZuoRt" + }, "outputs": [], "source": [ "from langchain.indexes import VectorstoreIndexCreator\n", - "from langchain_community.utilities import ApifyWrapper\n", + "from langchain_apify import ApifyWrapper\n", "from langchain_core.documents import Document\n", - "from langchain_openai import OpenAI\n", + "from langchain_core.vectorstores import InMemoryVectorStore\n", + "from langchain_openai import ChatOpenAI\n", "from langchain_openai.embeddings import OpenAIEmbeddings" ] }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, + "execution_count": 15, + "metadata": { + "id": "qcfmnbdDuoRu" + }, "outputs": [], "source": [ "loader = ApifyDatasetLoader(\n", @@ -123,27 +166,47 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, + "execution_count": 16, + "metadata": { + "id": "8b0xzKJxuoRv" + }, "outputs": [], "source": [ - "index = VectorstoreIndexCreator(embedding=OpenAIEmbeddings()).from_loaders([loader])" + "index = VectorstoreIndexCreator(\n", + " vectorstore_cls=InMemoryVectorStore, embedding=OpenAIEmbeddings()\n", + ").from_loaders([loader])" ] }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, + "execution_count": 17, + "metadata": { + "id": "7zPXGsVFwUGA" + }, + "outputs": [], + "source": [ + "llm = ChatOpenAI(model=\"gpt-4o-mini\")" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "id": "ecWrdM4guoRv" + }, "outputs": [], "source": [ "query = \"What is Apify?\"\n", - "result = index.query_with_sources(query, llm=OpenAI())" + "result = index.query_with_sources(query, llm=llm)" ] }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, + "execution_count": null, + "metadata": { + "id": "QH8r44e9uoRv", + "outputId": "361fe050-f75d-4d5a-c327-5e7bd190fba5" + }, "outputs": [ { "name": "stdout", @@ -162,6 +225,9 @@ } ], "metadata": { + "colab": { + "provenance": [] + }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", @@ -181,5 +247,5 @@ } }, "nbformat": 4, - "nbformat_minor": 4 -} + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/docs/docs/integrations/providers/apify.mdx b/docs/docs/integrations/providers/apify.mdx index 172d0f12c31..4e7a8848283 100644 --- a/docs/docs/integrations/providers/apify.mdx +++ b/docs/docs/integrations/providers/apify.mdx @@ -14,20 +14,34 @@ blogs, or knowledge bases. ## Installation and Setup -- Install the Apify API client for Python with `pip install apify-client` +- Install the LangChain Apify package for Python with: +```bash +pip install langchain-apify +``` - Get your [Apify API token](https://console.apify.com/account/integrations) and either set it as - an environment variable (`APIFY_API_TOKEN`) or pass it to the `ApifyWrapper` as `apify_api_token` in the constructor. + an environment variable (`APIFY_API_TOKEN`) or pass it as `apify_api_token` in the constructor. +## Tool -## Utility +You can use the `ApifyActorsTool` to use Apify Actors with agents. + +```python +from langchain_apify import ApifyActorsTool +``` + +See [this notebook](/docs/integrations/tools/apify_actors) for example usage. + +For more information on how to use this tool, visit [the Apify integration documentation](https://docs.apify.com/platform/integrations/langgraph). + +## Wrapper You can use the `ApifyWrapper` to run Actors on the Apify platform. ```python -from langchain_community.utilities import ApifyWrapper +from langchain_apify import ApifyWrapper ``` -For more information on this wrapper, see [the API reference](https://python.langchain.com/api_reference/community/utilities/langchain_community.utilities.apify.ApifyWrapper.html). +For more information on how to use this wrapper, see [the Apify integration documentation](https://docs.apify.com/platform/integrations/langchain). ## Document loader @@ -35,7 +49,10 @@ For more information on this wrapper, see [the API reference](https://python.lan You can also use our `ApifyDatasetLoader` to get data from Apify dataset. ```python -from langchain_community.document_loaders import ApifyDatasetLoader +from langchain_apify import ApifyDatasetLoader ``` For a more detailed walkthrough of this loader, see [this notebook](/docs/integrations/document_loaders/apify_dataset). + + +Source code for this integration can be found in the [LangChain Apify repository](https://github.com/apify/langchain-apify). diff --git a/docs/docs/integrations/tools/apify_actors.ipynb b/docs/docs/integrations/tools/apify_actors.ipynb new file mode 100644 index 00000000000..33b564a6ec2 --- /dev/null +++ b/docs/docs/integrations/tools/apify_actors.ipynb @@ -0,0 +1,256 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "_9MNj58sIkGN" + }, + "source": [ + "# Apify Actor\n", + "\n", + "## Overview\n", + "\n", + ">[Apify Actors](https://docs.apify.com/platform/actors) are cloud programs designed for a wide range of web scraping, crawling, and data extraction tasks. These actors facilitate automated data gathering from the web, enabling users to extract, process, and store information efficiently. Actors can be used to perform tasks like scraping e-commerce sites for product details, monitoring price changes, or gathering search engine results. They integrate seamlessly with [Apify Datasets](https://docs.apify.com/platform/storage/dataset), allowing the structured data collected by actors to be stored, managed, and exported in formats like JSON, CSV, or Excel for further analysis or use.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OHLF9t9v9HCb" + }, + "source": [ + "## Setup\n", + "\n", + "This integration lives in the [langchain-apify](https://pypi.org/project/langchain-apify/) package. The package can be installed using pip.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "4DdGmBn5IbXz" + }, + "outputs": [], + "source": [ + "%pip install langchain-apify" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rEAwonXqwggR" + }, + "source": [ + "### Prerequisites\n", + "\n", + "- **Apify account**: Register your free Apify account [here](https://console.apify.com/sign-up).\n", + "- **Apify API token**: Learn how to get your API token in the [Apify documentation](https://docs.apify.com/platform/integrations/api)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "9nJOl4MBMkcR" + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "os.environ[\"APIFY_API_TOKEN\"] = \"your-apify-api-token\"\n", + "os.environ[\"OPENAI_API_KEY\"] = \"your-openai-api-key\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UfoQxAlCxR9q" + }, + "source": [ + "## Instantiation" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qG9KtXtLM8i7" + }, + "source": [ + "Here we instantiate the `ApifyActorsTool` to be able to call [RAG Web Browser](https://apify.com/apify/rag-web-browser) Apify Actor. This Actor provides web browsing functionality for AI and LLM applications, similar to the web browsing feature in ChatGPT. Any Actor from the [Apify Store](https://apify.com/store) can be used in this way." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "id": "cyxeTlPnM4Ya" + }, + "outputs": [], + "source": [ + "from langchain_apify import ApifyActorsTool\n", + "\n", + "tool = ApifyActorsTool(\"apify/rag-web-browser\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fGDLvDCqyKWO" + }, + "source": [ + "## Invocation\n", + "\n", + "The `ApifyActorsTool` takes a single argument, which is `run_input` - a dictionary that is passed as a run input to the Actor. Run input schema documentation can be found in the input section of the Actor details page. See [RAG Web Browser input schema](https://apify.com/apify/rag-web-browser/input-schema).\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "nTWy6Hx1yk04" + }, + "outputs": [], + "source": [ + "tool.invoke({\"run_input\": {\"query\": \"what is apify?\", \"maxResults\": 2}})" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kQsa27hoO58S" + }, + "source": [ + "## Chaining\n", + "\n", + "We can provide the created tool to an [agent](https://python.langchain.com/docs/tutorials/agents/). When asked to search for information, the agent will call the Apify Actor, which will search the web, and then retrieve the search results.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "YySvLskW72Y8" + }, + "outputs": [], + "source": [ + "%pip install langgraph langchain-openai" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "id": "QEDz07btO5Gi" + }, + "outputs": [], + "source": [ + "from langchain_core.messages import ToolMessage\n", + "from langchain_openai import ChatOpenAI\n", + "from langgraph.prebuilt import create_react_agent\n", + "\n", + "model = ChatOpenAI(model=\"gpt-4o\")\n", + "tools = [tool]\n", + "graph = create_react_agent(model, tools=tools)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "XS1GEyNkQxGu", + "outputId": "195273d7-034c-425b-f3f9-95c0a9fb0c9e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "================================\u001b[1m Human Message \u001b[0m=================================\n", + "\n", + "search for what is Apify\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "Tool Calls:\n", + " apify_actor_apify_rag-web-browser (call_27mjHLzDzwa5ZaHWCMH510lm)\n", + " Call ID: call_27mjHLzDzwa5ZaHWCMH510lm\n", + " Args:\n", + " run_input: {\"run_input\":{\"query\":\"Apify\",\"maxResults\":3,\"outputFormats\":[\"markdown\"]}}\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "\n", + "Apify is a comprehensive platform for web scraping, browser automation, and data extraction. It offers a wide array of tools and services that cater to developers and businesses looking to extract data from websites efficiently and effectively. Here's an overview of Apify:\n", + "\n", + "1. **Ecosystem and Tools**:\n", + " - Apify provides an ecosystem where developers can build, deploy, and publish data extraction and web automation tools called Actors.\n", + " - The platform supports various use cases such as extracting data from social media platforms, conducting automated browser-based tasks, and more.\n", + "\n", + "2. **Offerings**:\n", + " - Apify offers over 3,000 ready-made scraping tools and code templates.\n", + " - Users can also build custom solutions or hire Apify's professional services for more tailored data extraction needs.\n", + "\n", + "3. **Technology and Integration**:\n", + " - The platform supports integration with popular tools and services like Zapier, GitHub, Google Sheets, Pinecone, and more.\n", + " - Apify supports open-source tools and technologies such as JavaScript, Python, Puppeteer, Playwright, Selenium, and its own Crawlee library for web crawling and browser automation.\n", + "\n", + "4. **Community and Learning**:\n", + " - Apify hosts a community on Discord where developers can get help and share expertise.\n", + " - It offers educational resources through the Web Scraping Academy to help users become proficient in data scraping and automation.\n", + "\n", + "5. **Enterprise Solutions**:\n", + " - Apify provides enterprise-grade web data extraction solutions with high reliability, 99.95% uptime, and compliance with SOC2, GDPR, and CCPA standards.\n", + "\n", + "For more information, you can visit [Apify's official website](https://apify.com/) or their [GitHub page](https://github.com/apify) which contains their code repositories and further details about their projects.\n" + ] + } + ], + "source": [ + "inputs = {\"messages\": [(\"user\", \"search for what is Apify\")]}\n", + "for s in graph.stream(inputs, stream_mode=\"values\"):\n", + " message = s[\"messages\"][-1]\n", + " # skip tool messages\n", + " if isinstance(message, ToolMessage):\n", + " continue\n", + " message.pretty_print()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WYXuQIQx8AvG" + }, + "source": [ + "## API reference\n", + "\n", + "For more information on how to use this integration, see the [git repository](https://github.com/apify/langchain-apify) or the [Apify integration documentation](https://docs.apify.com/platform/integrations/langgraph)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "f1NnMik78oib" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [], + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/static/img/ApifyActors.png b/docs/static/img/ApifyActors.png index c2f76bb812e6b554461234f6e755f0d0f45cb80c..c5641dcdb54b13566dc8b01fb6700bf1ec764667 100644 GIT binary patch literal 216653 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%0Dp{Mb*J8#w% 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

$-V=ZIsh$*iD1goBfSX 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%0DqSumFV~N!_ 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Ν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 MF?rD{VS~W`1;Qq~CIA2c literal 150809 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

    SvkQZfH$L0uvyIHesJpmoQ(HN7)ra6S$H0*G*x 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
      G+P(oP(? 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 B(u)89 diff --git a/libs/community/langchain_community/document_loaders/apify_dataset.py b/libs/community/langchain_community/document_loaders/apify_dataset.py index 7148f1084c9..34f74185a7d 100644 --- a/libs/community/langchain_community/document_loaders/apify_dataset.py +++ b/libs/community/langchain_community/document_loaders/apify_dataset.py @@ -1,11 +1,22 @@ from typing import Any, Callable, Dict, List +from langchain_core._api import deprecated from langchain_core.documents import Document from pydantic import BaseModel, model_validator from langchain_community.document_loaders.base import BaseLoader +@deprecated( + since="0.3.18", + message=( + "This class is deprecated and will be removed in a future version. " + "You can swap to using the `ApifyDatasetLoader`" + " implementation in `langchain_apify` package. " + "See " + ), + alternative_import="langchain_apify.ApifyDatasetLoader", +) class ApifyDatasetLoader(BaseLoader, BaseModel): """Load datasets from `Apify` web scraping, crawling, and data extraction platform. diff --git a/libs/community/langchain_community/utilities/apify.py b/libs/community/langchain_community/utilities/apify.py index 077bcc12b29..37048bc97f5 100644 --- a/libs/community/langchain_community/utilities/apify.py +++ b/libs/community/langchain_community/utilities/apify.py @@ -1,5 +1,6 @@ from typing import TYPE_CHECKING, Any, Callable, Dict, Optional +from langchain_core._api import deprecated from langchain_core.documents import Document from langchain_core.utils import get_from_dict_or_env from pydantic import BaseModel, model_validator @@ -8,6 +9,16 @@ if TYPE_CHECKING: from langchain_community.document_loaders import ApifyDatasetLoader +@deprecated( + since="0.3.18", + message=( + "This class is deprecated and will be removed in a future version. " + "You can swap to using the `ApifyWrapper`" + " implementation in `langchain_apify` package. " + "See " + ), + alternative_import="langchain_apify.ApifyWrapper", +) class ApifyWrapper(BaseModel): """Wrapper around Apify. To use, you should have the ``apify-client`` python package installed, diff --git a/libs/packages.yml b/libs/packages.yml index 58cf01aad52..252ca412639 100644 --- a/libs/packages.yml +++ b/libs/packages.yml @@ -386,6 +386,10 @@ packages: repo: Nimbleway/langchain-nimble path: . downloads: 0 +- name: langchain-apify + path: . + repo: apify/langchain-apify + downloads: 204 - name: langfair repo: cvs-health/langfair path: . From f1c66a3040b165eeecdf2d27da965140f32fd20c Mon Sep 17 00:00:00 2001 From: ccurme Date: Wed, 12 Feb 2025 20:06:58 -0800 Subject: [PATCH 13/24] docs: minor fix to provider table (#29771) Langfair renders as LangfAIr --- libs/packages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/packages.yml b/libs/packages.yml index 252ca412639..1dd283ba617 100644 --- a/libs/packages.yml +++ b/libs/packages.yml @@ -393,6 +393,7 @@ packages: - name: langfair repo: cvs-health/langfair path: . + name_title: LangFair downloads: 0 - name: langchain-abso repo: lunary-ai/langchain-abso From 96ad09fa2d9deaae42bb93b0e880d4beb4f19448 Mon Sep 17 00:00:00 2001 From: Mohammad Mohtashim <45242107+keenborder786@users.noreply.github.com> Date: Thu, 13 Feb 2025 09:12:07 +0500 Subject: [PATCH 14/24] (Community): Added API Key for Jina Search API Wrapper (#29622) - **Description:** Simple change for adding the API Key for Jina Search API Wrapper - **Issue:** #29596 --- .../docs/integrations/tools/jina_search.ipynb | 5 +++- .../tools/jina_search/tool.py | 2 +- .../utilities/jina_search.py | 21 +++++++++++++-- .../unit_tests/tools/jina_search/__init__.py | 0 .../tools/jina_search/test_jina_search.py | 27 +++++++++++++++++++ 5 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 libs/community/tests/unit_tests/tools/jina_search/__init__.py create mode 100644 libs/community/tests/unit_tests/tools/jina_search/test_jina_search.py diff --git a/docs/docs/integrations/tools/jina_search.ipynb b/docs/docs/integrations/tools/jina_search.ipynb index 03af86055f0..c07e9904ff2 100644 --- a/docs/docs/integrations/tools/jina_search.ipynb +++ b/docs/docs/integrations/tools/jina_search.ipynb @@ -64,7 +64,10 @@ "outputs": [], "source": [ "import getpass\n", - "import os" + "import os\n", + "\n", + "if not os.environ.get(\"JINA_API_KEY\"):\n", + " os.environ[\"JINA_API_KEY\"] = getpass.getpass(\"Jina API key:\\n\")" ] }, { diff --git a/libs/community/langchain_community/tools/jina_search/tool.py b/libs/community/langchain_community/tools/jina_search/tool.py index 42a2a5e7e7a..dbb707f7f6a 100644 --- a/libs/community/langchain_community/tools/jina_search/tool.py +++ b/libs/community/langchain_community/tools/jina_search/tool.py @@ -30,7 +30,7 @@ class JinaSearch(BaseTool): # type: ignore[override] "each in clean, LLM-friendly text. This way, you can always keep your LLM " "up-to-date, improve its factuality, and reduce hallucinations." ) - search_wrapper: JinaSearchAPIWrapper = Field(default_factory=JinaSearchAPIWrapper) + search_wrapper: JinaSearchAPIWrapper = Field(default_factory=JinaSearchAPIWrapper) # type: ignore[arg-type] def _run( self, diff --git a/libs/community/langchain_community/utilities/jina_search.py b/libs/community/langchain_community/utilities/jina_search.py index b35b31f6830..d879b0ebd35 100644 --- a/libs/community/langchain_community/utilities/jina_search.py +++ b/libs/community/langchain_community/utilities/jina_search.py @@ -1,18 +1,34 @@ import json -from typing import List +from typing import Any, Dict, List import requests from langchain_core.documents import Document -from pydantic import BaseModel +from langchain_core.utils import get_from_dict_or_env +from pydantic import BaseModel, ConfigDict, SecretStr, model_validator from yarl import URL class JinaSearchAPIWrapper(BaseModel): """Wrapper around the Jina search engine.""" + api_key: SecretStr + base_url: str = "https://s.jina.ai/" """The base URL for the Jina search engine.""" + model_config = ConfigDict( + extra="forbid", + ) + + @model_validator(mode="before") + @classmethod + def validate_environment(cls, values: Dict) -> Any: + """Validate that api key and endpoint exists in environment.""" + api_key = get_from_dict_or_env(values, "api_key", "JINA_API_KEY") + values["api_key"] = api_key + + return values + def run(self, query: str) -> str: """Query the Jina search engine and return the results as a JSON string. @@ -59,6 +75,7 @@ class JinaSearchAPIWrapper(BaseModel): def _search_request(self, query: str) -> List[dict]: headers = { "Accept": "application/json", + "Authorization": f"Bearer {self.api_key.get_secret_value()}", } url = str(URL(self.base_url + query)) response = requests.get(url, headers=headers) diff --git a/libs/community/tests/unit_tests/tools/jina_search/__init__.py b/libs/community/tests/unit_tests/tools/jina_search/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/libs/community/tests/unit_tests/tools/jina_search/test_jina_search.py b/libs/community/tests/unit_tests/tools/jina_search/test_jina_search.py new file mode 100644 index 00000000000..89174714523 --- /dev/null +++ b/libs/community/tests/unit_tests/tools/jina_search/test_jina_search.py @@ -0,0 +1,27 @@ +import os +import unittest +from typing import Any +from unittest.mock import patch + +from langchain_community.tools.jina_search.tool import JinaSearch +from langchain_community.utilities.jina_search import JinaSearchAPIWrapper + +os.environ["JINA_API_KEY"] = "test_key" + + +class TestJinaSearchTool(unittest.TestCase): + @patch( + "langchain_community.tools.jina_search.tool.JinaSearch.invoke", + return_value="mocked_result", + ) + def test_invoke(self, mock_run: Any) -> None: + query = "Test query text" + wrapper = JinaSearchAPIWrapper(api_key="test_key") # type: ignore[arg-type] + jina_search_tool = JinaSearch(api_wrapper=wrapper) # type: ignore[call-arg] + results = jina_search_tool.invoke(query) + expected_result = "mocked_result" + assert results == expected_result + + +if __name__ == "__main__": + unittest.main() From b82cef36a5d14190ac3ddf87ed28db8274cbddfb Mon Sep 17 00:00:00 2001 From: Mateusz Szewczyk <139469471+MateuszOssGit@users.noreply.github.com> Date: Thu, 13 Feb 2025 17:41:07 +0100 Subject: [PATCH 15/24] docs: Update IBM WatsonxLLM and ChatWatsonx documentation (#29752) Thank you for contributing to LangChain! Update presented model in `WatsonxLLM` and `ChatWatsonx` documentation. - [x] **Lint and test**: Run `make format`, `make lint` and `make test` from the root of the package(s) you've modified. See contribution guidelines for more: https://python.langchain.com/docs/contributing/ --- docs/docs/integrations/chat/ibm_watsonx.ipynb | 33 ++++++++++++++++--- docs/docs/integrations/llms/ibm_watsonx.ipynb | 4 +-- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/docs/docs/integrations/chat/ibm_watsonx.ipynb b/docs/docs/integrations/chat/ibm_watsonx.ipynb index e6755d9a4b7..ae87d6cdf09 100644 --- a/docs/docs/integrations/chat/ibm_watsonx.ipynb +++ b/docs/docs/integrations/chat/ibm_watsonx.ipynb @@ -210,7 +210,7 @@ "id": "96ed13d4", "metadata": {}, "source": [ - "Instead of `model_id`, you can also pass the `deployment_id` of the previously tuned model. The entire model tuning workflow is described in [Working with TuneExperiment and PromptTuner](https://ibm.github.io/watsonx-ai-python-sdk/pt_working_with_class_and_prompt_tuner.html)." + "Instead of `model_id`, you can also pass the `deployment_id` of the previously [deployed model with reference to a Prompt Template](https://cloud.ibm.com/apidocs/watsonx-ai#deployments-text-chat)." ] }, { @@ -228,6 +228,31 @@ ")" ] }, + { + "cell_type": "markdown", + "id": "3d29767c", + "metadata": {}, + "source": [ + "For certain requirements, there is an option to pass the IBM's [`APIClient`](https://ibm.github.io/watsonx-ai-python-sdk/base.html#apiclient) object into the `ChatWatsonx` class." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0ae9531e", + "metadata": {}, + "outputs": [], + "source": [ + "from ibm_watsonx_ai import APIClient\n", + "\n", + "api_client = APIClient(...)\n", + "\n", + "chat = ChatWatsonx(\n", + " model_id=\"ibm/granite-34b-code-instruct\",\n", + " watsonx_client=api_client,\n", + ")" + ] + }, { "cell_type": "markdown", "id": "f571001d", @@ -448,9 +473,7 @@ "source": [ "## Tool calling\n", "\n", - "### ChatWatsonx.bind_tools()\n", - "\n", - "Please note that `ChatWatsonx.bind_tools` is on beta state, so we recommend using `mistralai/mistral-large` model." + "### ChatWatsonx.bind_tools()" ] }, { @@ -563,7 +586,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "langchain_ibm", "language": "python", "name": "python3" }, diff --git a/docs/docs/integrations/llms/ibm_watsonx.ipynb b/docs/docs/integrations/llms/ibm_watsonx.ipynb index 10360b7ff4d..90eba549895 100644 --- a/docs/docs/integrations/llms/ibm_watsonx.ipynb +++ b/docs/docs/integrations/llms/ibm_watsonx.ipynb @@ -195,7 +195,7 @@ "id": "96ed13d4", "metadata": {}, "source": [ - "Instead of `model_id`, you can also pass the `deployment_id` of the previously tuned model. The entire model tuning workflow is described [here](https://ibm.github.io/watsonx-ai-python-sdk/pt_working_with_class_and_prompt_tuner.html)." + "Instead of `model_id`, you can also pass the `deployment_id` of the previously tuned model. The entire model tuning workflow is described in [Working with TuneExperiment and PromptTuner](https://ibm.github.io/watsonx-ai-python-sdk/pt_tune_experiment_run.html)." ] }, { @@ -420,7 +420,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "langchain_ibm", "language": "python", "name": "python3" }, From 76d32754ffd83483a3fe5c9d1460de0cc2201423 Mon Sep 17 00:00:00 2001 From: HackHuang Date: Fri, 14 Feb 2025 00:41:47 +0800 Subject: [PATCH 16/24] core : update the class docs of InMemoryVectorStore in in_memory.py (#29781) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - **Description:** Add the new introduction about checking `store` in in_memory.py, It’s necessary and useful for beginners. ```python Check Documents: .. code-block:: python for doc in vector_store.store.values(): print(doc) ``` --------- Co-authored-by: Chester Curme --- libs/core/langchain_core/vectorstores/in_memory.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libs/core/langchain_core/vectorstores/in_memory.py b/libs/core/langchain_core/vectorstores/in_memory.py index ab32c7cdacb..5fb385a21c3 100644 --- a/libs/core/langchain_core/vectorstores/in_memory.py +++ b/libs/core/langchain_core/vectorstores/in_memory.py @@ -59,6 +59,17 @@ class InMemoryVectorStore(VectorStore): documents = [document_1, document_2, document_3] vector_store.add_documents(documents=documents) + Inspect documents: + .. code-block:: python + + top_n = 10 + for index, (id, doc) in enumerate(vector_store.store.items()): + if index < top_n: + # docs have keys 'id', 'vector', 'text', 'metadata' + print(f"{id}: {doc['text']}") + else: + break + Delete Documents: .. code-block:: python From 61f1be21528ed8f750351f97ec53a83b04ba746c Mon Sep 17 00:00:00 2001 From: Mateusz Szewczyk <139469471+MateuszOssGit@users.noreply.github.com> Date: Thu, 13 Feb 2025 17:43:42 +0100 Subject: [PATCH 17/24] docs: Added IBM to ChatModelTabs and EmbeddingTabs (#29774) Thank you for contributing to LangChain! Added IBM to ChatModelTabs and EmbeddingTabs - [x] **Lint and test**: Run `make format`, `make lint` and `make test` from the root of the package(s) you've modified. See contribution guidelines for more: https://python.langchain.com/docs/contributing/ --- docs/src/theme/ChatModelTabs.js | 13 +++++++++++++ docs/src/theme/EmbeddingTabs.js | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/docs/src/theme/ChatModelTabs.js b/docs/src/theme/ChatModelTabs.js index a27c2654466..1eb627f6b63 100644 --- a/docs/src/theme/ChatModelTabs.js +++ b/docs/src/theme/ChatModelTabs.js @@ -191,6 +191,19 @@ ${llmVarName} = AzureChatOpenAI( apiKeyName: "TOGETHER_API_KEY", packageName: "langchain[together]", }, + { + value: "ibm", + label: "IBM", + text: `from langchain_ibm import ChatWatsonx + +${llmVarName} = ChatWatsonx( + model_id="ibm/granite-34b-code-instruct", + url="https://us-south.ml.cloud.ibm.com", + project_id="" +)`, + apiKeyName: "WATSONX_APIKEY", + packageName: "langchain-ibm", + }, { value: "databricks", label: "Databricks", diff --git a/docs/src/theme/EmbeddingTabs.js b/docs/src/theme/EmbeddingTabs.js index e452989aea0..0f0fb0390d5 100644 --- a/docs/src/theme/EmbeddingTabs.js +++ b/docs/src/theme/EmbeddingTabs.js @@ -27,6 +27,8 @@ export default function EmbeddingTabs(props) { hideNvidia, voyageaiParams, hideVoyageai, + ibmParams, + hideIBM, fakeEmbeddingParams, hideFakeEmbedding, customVarName, @@ -45,6 +47,8 @@ export default function EmbeddingTabs(props) { const nomicsParamsOrDefault = nomicParams ?? `model="nomic-embed-text-v1.5"`; const nvidiaParamsOrDefault = nvidiaParams ?? `model="NV-Embed-QA"`; const voyageaiParamsOrDefault = voyageaiParams ?? `model="voyage-3"`; + const ibmParamsOrDefault = ibmParams ?? + `\n model_id="ibm/slate-125m-english-rtrvr,\n url="https://us-south.ml.cloud.ibm.com",\n project_id="",\n`; const fakeEmbeddingParamsOrDefault = fakeEmbeddingParams ?? `size=4096`; const embeddingVarName = customVarName ?? "embeddings"; @@ -149,6 +153,15 @@ export default function EmbeddingTabs(props) { default: false, shouldHide: hideVoyageai, }, + { + value: "IBM", + label: "IBM", + text: `from langchain_ibm import WatsonxEmbeddings\n\n${embeddingVarName} = WatsonxEmbeddings(${ibmParamsOrDefault})`, + apiKeyName: "WATSONX_APIKEY", + packageName: "langchain-ibm", + default: false, + shouldHide: hideIBM, + }, { value: "Fake", label: "Fake", From 8d0e31cbc58b4da3dc198d8e83184cd4fa6c071b Mon Sep 17 00:00:00 2001 From: Mateusz Szewczyk <139469471+MateuszOssGit@users.noreply.github.com> Date: Thu, 13 Feb 2025 18:41:51 +0100 Subject: [PATCH 18/24] docs: Fix `model_id` on EmbeddingTabs page (#29784) Thank you for contributing to LangChain! Fix `model_id` in IBM provider on EmbeddingTabs page - [x] **Lint and test**: Run `make format`, `make lint` and `make test` from the root of the package(s) you've modified. See contribution guidelines for more: https://python.langchain.com/docs/contributing/ --- docs/src/theme/EmbeddingTabs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/theme/EmbeddingTabs.js b/docs/src/theme/EmbeddingTabs.js index 0f0fb0390d5..7853e6dc0b1 100644 --- a/docs/src/theme/EmbeddingTabs.js +++ b/docs/src/theme/EmbeddingTabs.js @@ -48,7 +48,7 @@ export default function EmbeddingTabs(props) { const nvidiaParamsOrDefault = nvidiaParams ?? `model="NV-Embed-QA"`; const voyageaiParamsOrDefault = voyageaiParams ?? `model="voyage-3"`; const ibmParamsOrDefault = ibmParams ?? - `\n model_id="ibm/slate-125m-english-rtrvr,\n url="https://us-south.ml.cloud.ibm.com",\n project_id="",\n`; + `\n model_id="ibm/slate-125m-english-rtrvr",\n url="https://us-south.ml.cloud.ibm.com",\n project_id="",\n`; const fakeEmbeddingParamsOrDefault = fakeEmbeddingParams ?? `size=4096`; const embeddingVarName = customVarName ?? "embeddings"; From ff13384eb69c3c6103a6bea0a7b6935d9e007121 Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Thu, 13 Feb 2025 12:45:25 -0800 Subject: [PATCH 19/24] packages: update counts, add command (#29789) --- Makefile | 3 + docs/scripts/packages_yml_get_downloads.py | 1 + libs/packages.yml | 311 +++++++++++---------- 3 files changed, 169 insertions(+), 146 deletions(-) diff --git a/Makefile b/Makefile index 3f54514c427..58084a735c9 100644 --- a/Makefile +++ b/Makefile @@ -83,3 +83,6 @@ lint lint_package lint_tests: format format_diff: uv run --group lint ruff format docs cookbook uv run --group lint ruff check --select I --fix docs cookbook + +update-package-downloads: + uv run python docs/scripts/packages_yml_get_downloads.py diff --git a/docs/scripts/packages_yml_get_downloads.py b/docs/scripts/packages_yml_get_downloads.py index 07525194b39..6cdf7923a45 100644 --- a/docs/scripts/packages_yml_get_downloads.py +++ b/docs/scripts/packages_yml_get_downloads.py @@ -36,6 +36,7 @@ def _reorder_keys(p): "js", "downloads", "downloads_updated_at", + "disabled", ] if set(keys) - set(key_order): raise ValueError(f"Unexpected keys: {set(keys) - set(key_order)}") diff --git a/libs/packages.yml b/libs/packages.yml index 1dd283ba617..602492db21e 100644 --- a/libs/packages.yml +++ b/libs/packages.yml @@ -5,403 +5,422 @@ packages: - name: langchain-core path: libs/core repo: langchain-ai/langchain - downloads: 27728892 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 27722594 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-text-splitters path: libs/text-splitters repo: langchain-ai/langchain - downloads: 10343427 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 12866727 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain path: libs/langchain repo: langchain-ai/langchain - downloads: 27515102 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 32917727 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-community path: libs/community repo: langchain-ai/langchain - downloads: 17505668 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 21967466 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-experimental path: libs/experimental repo: langchain-ai/langchain-experimental - downloads: 1710421 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 1960508 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-cli path: libs/cli repo: langchain-ai/langchain - downloads: 55505 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 84415 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-ai21 path: libs/ai21 repo: langchain-ai/langchain-ai21 - downloads: 3453 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 13100 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-anthropic path: libs/partners/anthropic repo: langchain-ai/langchain js: '@langchain/anthropic' - downloads: 1163020 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 1549411 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-chroma path: libs/partners/chroma repo: langchain-ai/langchain - downloads: 450092 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 553991 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-exa path: libs/partners/exa repo: langchain-ai/langchain provider_page: exa_search js: '@langchain/exa' - downloads: 4560 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 5817 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-fireworks path: libs/partners/fireworks repo: langchain-ai/langchain - downloads: 73179 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 264866 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-groq path: libs/partners/groq repo: langchain-ai/langchain js: '@langchain/groq' - downloads: 370373 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 452801 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-huggingface path: libs/partners/huggingface repo: langchain-ai/langchain - downloads: 375151 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 403346 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-ibm path: libs/ibm repo: langchain-ai/langchain-ibm js: '@langchain/ibm' - downloads: 261091 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 95572 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-localai path: libs/localai repo: mkhludnev/langchain-localai - downloads: 510 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 306 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-milvus path: libs/milvus repo: langchain-ai/langchain-milvus - downloads: 111126 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 162619 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-mistralai path: libs/partners/mistralai repo: langchain-ai/langchain js: '@langchain/mistralai' - downloads: 232463 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 315149 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-mongodb path: libs/langchain-mongodb repo: langchain-ai/langchain-mongodb provider_page: mongodb_atlas js: '@langchain/mongodb' - downloads: 113328 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 160711 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' disabled: true - name: langchain-nomic path: libs/partners/nomic repo: langchain-ai/langchain js: '@langchain/nomic' - downloads: 10175 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 10335 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-openai path: libs/partners/openai repo: langchain-ai/langchain js: '@langchain/openai' - downloads: 7994138 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 9823331 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-pinecone path: libs/partners/pinecone repo: langchain-ai/langchain js: '@langchain/pinecone' - downloads: 345657 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 393153 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-prompty path: libs/partners/prompty repo: langchain-ai/langchain provider_page: microsoft - downloads: 976 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 1216 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-qdrant path: libs/partners/qdrant repo: langchain-ai/langchain js: '@langchain/qdrant' - downloads: 77743 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 125551 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-scrapegraph path: . repo: ScrapeGraphAI/langchain-scrapegraph - downloads: 907 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 851 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-sema4 path: libs/sema4 repo: langchain-ai/langchain-sema4 provider_page: robocorp - downloads: 987 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 1647 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-together path: libs/together repo: langchain-ai/langchain-together - downloads: 44887 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 53987 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-upstage path: libs/upstage repo: langchain-ai/langchain-upstage - downloads: 20951 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 29553 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-voyageai path: libs/partners/voyageai repo: langchain-ai/langchain - downloads: 11253 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 17269 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-aws name_title: AWS path: libs/aws repo: langchain-ai/langchain-aws js: '@langchain/aws' - downloads: 1507701 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 2133380 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-astradb path: libs/astradb repo: langchain-ai/langchain-datastax - downloads: 64185 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 83037 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-google-genai name_title: Google Generative AI path: libs/genai repo: langchain-ai/langchain-google provider_page: google js: '@langchain/google-genai' - downloads: 732265 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 1019707 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-google-vertexai path: libs/vertexai repo: langchain-ai/langchain-google provider_page: google js: '@langchain/google-vertexai' - downloads: 7668881 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 13033464 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-google-community path: libs/community repo: langchain-ai/langchain-google provider_page: google - downloads: 3055901 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 3787822 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-weaviate path: libs/weaviate repo: langchain-ai/langchain-weaviate js: '@langchain/weaviate' - downloads: 26639 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 31199 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-cohere path: libs/cohere repo: langchain-ai/langchain-cohere js: '@langchain/cohere' - downloads: 513053 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 653329 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-elasticsearch path: libs/elasticsearch repo: langchain-ai/langchain-elastic - downloads: 108874 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 137212 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-nvidia-ai-endpoints path: libs/ai-endpoints repo: langchain-ai/langchain-nvidia provider_page: nvidia - downloads: 129677 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 157267 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-postgres path: . repo: langchain-ai/langchain-postgres provider_page: pgvector - downloads: 293866 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 320831 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-redis path: libs/redis repo: langchain-ai/langchain-redis js: '@langchain/redis' - downloads: 17549 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 22787 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-unstructured path: libs/unstructured repo: langchain-ai/langchain-unstructured - downloads: 88721 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 118888 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-azure-dynamic-sessions path: libs/azure-dynamic-sessions repo: langchain-ai/langchain-azure provider_page: microsoft js: '@langchain/azure-dynamic-sessions' - downloads: 7285 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 7401 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-sqlserver path: libs/sqlserver repo: langchain-ai/langchain-azure provider_page: microsoft - downloads: 1489 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 2298 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-cerebras path: libs/cerebras repo: langchain-ai/langchain-cerebras - downloads: 9426 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 26690 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-snowflake path: libs/snowflake repo: langchain-ai/langchain-snowflake - downloads: 2374 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 1905 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: databricks-langchain + name_title: Databricks path: integrations/langchain repo: databricks/databricks-ai-bridge provider_page: databricks - name_title: Databricks - downloads: 35495 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 36221 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-couchbase path: . repo: Couchbase-Ecosystem/langchain-couchbase - downloads: 347 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 725 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-ollama path: libs/partners/ollama repo: langchain-ai/langchain js: '@langchain/ollama' - downloads: 310741 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 623011 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-box path: libs/box repo: box-community/langchain-box - downloads: 2749 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 730 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-tests path: libs/standard-tests repo: langchain-ai/langchain - downloads: 3691 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 180354 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-neo4j path: libs/neo4j repo: langchain-ai/langchain-neo4j - downloads: 8871 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 30320 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-linkup path: . repo: LinkupPlatform/langchain-linkup - downloads: 818 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 532 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-yt-dlp path: . repo: aqib0770/langchain-yt-dlp - downloads: 776 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 461 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-oceanbase path: . repo: oceanbase/langchain-oceanbase - downloads: 322 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 58 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-predictionguard path: . repo: predictionguard/langchain-predictionguard - downloads: 156 - downloads_updated_at: '2024-12-23T20:10:11.816059+00:00' + downloads: 422 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-cratedb path: . repo: crate/langchain-cratedb - downloads: 362 - downloads_updated_at: '2024-12-23T20:53:27.001852+00:00' + downloads: 417 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-modelscope path: . repo: modelscope/langchain-modelscope - downloads: 0 + downloads: 131 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-falkordb path: . repo: kingtroga/langchain-falkordb - downloads: 610 - downloads_updated_at: '2025-01-02T20:23:02.544257+00:00' + downloads: 178 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-dappier path: . repo: DappierAI/langchain-dappier - downloads: 0 + downloads: 353 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-pull-md path: . repo: chigwell/langchain-pull-md - downloads: 0 + downloads: 161 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-kuzu path: . repo: kuzudb/langchain-kuzu - downloads: 0 + downloads: 426 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-docling path: . repo: DS4SD/docling-langchain - downloads: 0 -- name: langchain-lindorm + downloads: 6800 + downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' +- name: langchain-lindorm-integration path: . + provider_page: lindorm repo: AlwaysBluer/langchain-lindorm-integration - downloads: 0 + downloads: 79 + downloads_updated_at: '2025-02-13T20:30:13.814314+00:00' - name: langchain-hyperbrowser path: . repo: hyperbrowserai/langchain-hyperbrowser - downloads: 0 + downloads: 371 + downloads_updated_at: '2025-02-13T20:30:13.814314+00:00' - name: langchain-fmp-data path: . repo: MehdiZare/langchain-fmp-data - downloads: 0 + downloads: 366 + downloads_updated_at: '2025-02-13T20:30:13.814314+00:00' - name: tilores-langchain + name_title: Tilores path: . repo: tilotech/tilores-langchain provider_page: tilores - name_title: Tilores - downloads: 0 + downloads: 121 + downloads_updated_at: '2025-02-13T20:30:13.814314+00:00' - name: langchain-pipeshift path: . repo: pipeshift-org/langchain-pipeshift - downloads: 115 + downloads: 133 + downloads_updated_at: '2025-02-13T20:30:13.814314+00:00' - name: langchain-payman-tool path: . repo: paymanai/langchain-payman-tool - downloads: 0 - downloads_updated_at: "2025-01-22T00:00:00+00:00" + downloads: 685 + downloads_updated_at: '2025-02-13T20:30:13.814314+00:00' - name: langchain-sambanova - repo: sambanova/langchain-sambanova path: . - downloads: 0 + repo: sambanova/langchain-sambanova + downloads: 1313 + downloads_updated_at: '2025-02-13T20:30:13.814314+00:00' - name: langchain-deepseek - repo: langchain-ai/langchain path: libs/partners/deepseek - downloads: 0 - js: '@langchain/deepseek' + repo: langchain-ai/langchain provider_page: deepseek + js: '@langchain/deepseek' + downloads: 6871 + downloads_updated_at: '2025-02-13T20:30:13.814314+00:00' - name: langchain-jenkins path: . repo: Amitgb14/langchain_jenkins - downloads: 0 + downloads: 386 + downloads_updated_at: '2025-02-13T20:30:13.814314+00:00' - name: langchain-goodfire path: . repo: keenanpepper/langchain-goodfire - downloads: 51 - downloads_updated_at: '2025-01-30T00:00:00+00:00' + downloads: 585 + downloads_updated_at: '2025-02-13T20:30:13.814314+00:00' - name: langchain-nimble - repo: Nimbleway/langchain-nimble path: . - downloads: 0 + repo: Nimbleway/langchain-nimble + downloads: 388 + downloads_updated_at: '2025-02-13T20:30:13.814314+00:00' - name: langchain-apify path: . repo: apify/langchain-apify - downloads: 204 + downloads: 443 + downloads_updated_at: '2025-02-13T20:30:13.814314+00:00' - name: langfair - repo: cvs-health/langfair - path: . name_title: LangFair - downloads: 0 -- name: langchain-abso - repo: lunary-ai/langchain-abso path: . + repo: cvs-health/langfair + downloads: 901 + downloads_updated_at: '2025-02-13T20:30:13.814314+00:00' +- name: langchain-abso + path: . + repo: lunary-ai/langchain-abso downloads: 0 + downloads_updated_at: '2025-02-13T20:30:13.814314+00:00' - name: langchain-graph-retriever - name_title: 'Graph RAG' - repo: datastax/graph-rag + name_title: Graph RAG path: packages/langchain-graph-retriever - downloads: 0 + repo: datastax/graph-rag provider_page: graph_rag + downloads: 2093 + downloads_updated_at: '2025-02-13T20:32:23.744801+00:00' From 1a225fad038c851b79ab8ed337b5f10551e3ac81 Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Thu, 13 Feb 2025 13:32:34 -0800 Subject: [PATCH 20/24] multiple: fix uv path deps (#29790) file:// format wasn't working with updates - it doesn't install as an editable dep move to tool.uv.sources with path= instead --- libs/cli/pyproject.toml | 38 +- libs/cli/uv.lock | 127 ++- libs/community/pyproject.toml | 24 +- libs/community/uv.lock | 69 +- libs/core/uv.lock | 14 +- libs/langchain/pyproject.toml | 26 +- libs/langchain/uv.lock | 985 +++++++++++------------ libs/partners/anthropic/pyproject.toml | 29 +- libs/partners/anthropic/uv.lock | 24 +- libs/partners/chroma/pyproject.toml | 23 +- libs/partners/chroma/uv.lock | 25 +- libs/partners/deepseek/pyproject.toml | 20 +- libs/partners/deepseek/uv.lock | 68 +- libs/partners/exa/pyproject.toml | 38 +- libs/partners/exa/uv.lock | 12 +- libs/partners/fireworks/pyproject.toml | 27 +- libs/partners/fireworks/uv.lock | 30 +- libs/partners/groq/pyproject.toml | 35 +- libs/partners/groq/uv.lock | 32 +- libs/partners/huggingface/pyproject.toml | 30 +- libs/partners/huggingface/uv.lock | 198 ++++- libs/partners/mistralai/pyproject.toml | 35 +- libs/partners/mistralai/uv.lock | 30 +- libs/partners/nomic/pyproject.toml | 35 +- libs/partners/nomic/uv.lock | 12 +- libs/partners/ollama/pyproject.toml | 43 +- libs/partners/ollama/uv.lock | 30 +- libs/partners/openai/pyproject.toml | 41 +- libs/partners/openai/uv.lock | 22 +- libs/partners/pinecone/pyproject.toml | 29 +- libs/partners/pinecone/uv.lock | 26 +- libs/partners/prompty/pyproject.toml | 43 +- libs/partners/prompty/uv.lock | 59 +- libs/partners/qdrant/pyproject.toml | 27 +- libs/partners/qdrant/uv.lock | 17 +- libs/partners/voyageai/pyproject.toml | 32 +- libs/partners/voyageai/uv.lock | 12 +- libs/partners/xai/pyproject.toml | 30 +- libs/partners/xai/uv.lock | 48 +- libs/standard-tests/pyproject.toml | 25 +- libs/standard-tests/uv.lock | 168 ++-- libs/text-splitters/pyproject.toml | 20 +- libs/text-splitters/uv.lock | 12 +- pyproject.toml | 50 +- uv.lock | 187 ++--- 45 files changed, 1548 insertions(+), 1359 deletions(-) diff --git a/libs/cli/pyproject.toml b/libs/cli/pyproject.toml index 08b1f1f1a3f..5daf92cc91d 100644 --- a/libs/cli/pyproject.toml +++ b/libs/cli/pyproject.toml @@ -3,10 +3,8 @@ requires = ["pdm-backend"] build-backend = "pdm.backend" [project] -authors = [ - {name = "Erick Friis", email = "erick@langchain.dev"}, -] -license = {text = "MIT"} +authors = [{ name = "Erick Friis", email = "erick@langchain.dev" }] +license = { text = "MIT" } requires-python = "<4.0,>=3.9" dependencies = [ "typer[all]<1.0.0,>=0.9.0", @@ -31,33 +29,25 @@ langchain = "langchain_cli.cli:app" langchain-cli = "langchain_cli.cli:app" [dependency-groups] -dev = [ - "pytest<8.0.0,>=7.4.2", - "pytest-watch<5.0.0,>=4.2.0", -] -lint = [ - "ruff<1.0,>=0.5", - "mypy<2.0.0,>=1.13.0", -] -test = [ - "langchain @ file:///${PROJECT_ROOT}/../langchain", -] -typing = [ - "langchain @ file:///${PROJECT_ROOT}/../langchain", -] +dev = ["pytest<8.0.0,>=7.4.2", "pytest-watch<5.0.0,>=4.2.0"] +lint = ["ruff<1.0,>=0.5", "mypy<2.0.0,>=1.13.0"] +test = ["langchain"] +typing = ["langchain"] test_integration = [] +[tool.uv.sources] +langchain = { path = "../langchain", editable = true } [tool.ruff.lint] select = [ - "E", # pycodestyle - "F", # pyflakes - "I", # isort - "T201", # print + "E", # pycodestyle + "F", # pyflakes + "I", # isort + "T201", # print ] [tool.mypy] exclude = [ - "langchain_cli/integration_template", - "langchain_cli/package_template", + "langchain_cli/integration_template", + "langchain_cli/package_template", ] diff --git a/libs/cli/uv.lock b/libs/cli/uv.lock index f304e8fb58a..356175a2406 100644 --- a/libs/cli/uv.lock +++ b/libs/cli/uv.lock @@ -620,8 +620,8 @@ wheels = [ [[package]] name = "langchain" -version = "0.3.18rc1" -source = { directory = "../langchain" } +version = "0.3.18" +source = { editable = "../langchain" } dependencies = [ { name = "aiohttp" }, { name = "async-timeout", marker = "python_full_version < '3.11'" }, @@ -645,7 +645,7 @@ requires-dist = [ { name = "langchain-aws", marker = "extra == 'aws'" }, { name = "langchain-cohere", marker = "extra == 'cohere'" }, { name = "langchain-community", marker = "extra == 'community'" }, - { name = "langchain-core", specifier = ">=0.3.33,<1.0.0" }, + { name = "langchain-core", editable = "../core" }, { name = "langchain-deepseek", marker = "extra == 'deepseek'" }, { name = "langchain-fireworks", marker = "extra == 'fireworks'" }, { name = "langchain-google-genai", marker = "extra == 'google-genai'" }, @@ -654,8 +654,8 @@ requires-dist = [ { name = "langchain-huggingface", marker = "extra == 'huggingface'" }, { name = "langchain-mistralai", marker = "extra == 'mistralai'" }, { name = "langchain-ollama", marker = "extra == 'ollama'" }, - { name = "langchain-openai", marker = "extra == 'openai'" }, - { name = "langchain-text-splitters", specifier = ">=0.3.3,<1.0.0" }, + { name = "langchain-openai", marker = "extra == 'openai'", editable = "../partners/openai" }, + { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "langchain-together", marker = "extra == 'together'" }, { name = "langsmith", specifier = ">=0.1.17,<0.4" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.26.4,<2" }, @@ -671,8 +671,8 @@ requires-dist = [ codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "../core" }, + { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "playwright", specifier = ">=1.28.0,<2.0.0" }, { name = "setuptools", specifier = ">=67.6.1,<68.0.0" }, ] @@ -682,14 +682,15 @@ lint = [ { name = "ruff", specifier = ">=0.9.2,<1.0.0" }, ] test = [ + { name = "blockbuster", specifier = ">=1.5.14,<1.6" }, { name = "cffi", marker = "python_full_version < '3.10'", specifier = "<1.17.1" }, { name = "cffi", marker = "python_full_version >= '3.10'" }, { name = "duckdb-engine", specifier = ">=0.9.2,<1.0.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-openai", directory = "../partners/openai" }, - { name = "langchain-tests", directory = "../standard-tests" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "../core" }, + { name = "langchain-openai", editable = "../partners/openai" }, + { name = "langchain-tests", editable = "../standard-tests" }, + { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "lark", specifier = ">=1.1.5,<2.0.0" }, { name = "packaging", specifier = ">=24.2" }, { name = "pandas", specifier = ">=2.0.0,<3.0.0" }, @@ -708,8 +709,8 @@ test = [ ] test-integration = [ { name = "cassio", specifier = ">=0.1.0,<1.0.0" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "../core" }, + { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "langchainhub", specifier = ">=0.1.16,<1.0.0" }, { name = "pytest-vcr", specifier = ">=1.0.2,<2.0.0" }, { name = "python-dotenv", specifier = ">=1.0.0,<2.0.0" }, @@ -717,8 +718,8 @@ test-integration = [ { name = "wrapt", specifier = ">=1.15.0,<2.0.0" }, ] typing = [ - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "../core" }, + { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "mypy-protobuf", specifier = ">=3.0.0,<4.0.0" }, { name = "types-chardet", specifier = ">=5.0.4.6,<6.0.0.0" }, @@ -777,14 +778,14 @@ lint = [ { name = "mypy", specifier = ">=1.13.0,<2.0.0" }, { name = "ruff", specifier = ">=0.5,<1.0" }, ] -test = [{ name = "langchain", directory = "../langchain" }] +test = [{ name = "langchain", editable = "../langchain" }] test-integration = [] -typing = [{ name = "langchain", directory = "../langchain" }] +typing = [{ name = "langchain", editable = "../langchain" }] [[package]] name = "langchain-core" -version = "0.3.33" -source = { registry = "https://pypi.org/simple" } +version = "0.3.35" +source = { editable = "../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -794,21 +795,93 @@ dependencies = [ { name = "tenacity" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/b3/426268e07273c395affc6dd02cdf89803888121cfc59ce60922f363aeff8/langchain_core-0.3.33.tar.gz", hash = "sha256:b5dd93a4e7f8198d2fc6048723b0bfecf7aaf128b0d268cbac19c34c1579b953", size = 331492 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/98/78/463bc92174555cc04b3e234faa169bb8b58f36fff77892d7b8ae2b4f58e4/langchain_core-0.3.33-py3-none-any.whl", hash = "sha256:269706408a2223f863ff1f9616f31903a5712403199d828b50aadbc4c28b553a", size = 412656 }, + +[package.metadata] +requires-dist = [ + { name = "jsonpatch", specifier = ">=1.33,<2.0" }, + { name = "langsmith", specifier = ">=0.1.125,<0.4" }, + { name = "packaging", specifier = ">=23.2,<25" }, + { name = "pydantic", marker = "python_full_version < '3.12.4'", specifier = ">=2.5.2,<3.0.0" }, + { name = "pydantic", marker = "python_full_version >= '3.12.4'", specifier = ">=2.7.4,<3.0.0" }, + { name = "pyyaml", specifier = ">=5.3" }, + { name = "tenacity", specifier = ">=8.1.0,!=8.4.0,<10.0.0" }, + { name = "typing-extensions", specifier = ">=4.7" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "grandalf", specifier = ">=0.8,<1.0" }, + { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, + { name = "setuptools", specifier = ">=67.6.1,<68.0.0" }, +] +lint = [{ name = "ruff", specifier = ">=0.9.2,<1.0.0" }] +test = [ + { name = "blockbuster", specifier = "~=1.5.11" }, + { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, + { name = "grandalf", specifier = ">=0.8,<1.0" }, + { name = "langchain-tests", directory = "../standard-tests" }, + { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, + { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.0,<3" }, + { name = "pytest", specifier = ">=8,<9" }, + { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, + { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, + { name = "pytest-socket", specifier = ">=0.7.0,<1.0.0" }, + { name = "pytest-watcher", specifier = ">=0.3.4,<1.0.0" }, + { name = "pytest-xdist", specifier = ">=3.6.1,<4.0.0" }, + { name = "responses", specifier = ">=0.25.0,<1.0.0" }, + { name = "syrupy", specifier = ">=4.0.2,<5.0.0" }, +] +test-integration = [] +typing = [ + { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "mypy", specifier = ">=1.10,<1.11" }, + { name = "types-jinja2", specifier = ">=2.11.9,<3.0.0" }, + { name = "types-pyyaml", specifier = ">=6.0.12.2,<7.0.0.0" }, + { name = "types-requests", specifier = ">=2.28.11.5,<3.0.0.0" }, ] [[package]] name = "langchain-text-splitters" -version = "0.3.5" -source = { registry = "https://pypi.org/simple" } +version = "0.3.6" +source = { editable = "../text-splitters" } dependencies = [ { name = "langchain-core" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/10/35/a6f8d6b1bb0e6e8c00b49bce4d1a115f8b68368b1899f65bb34dbbb44160/langchain_text_splitters-0.3.5.tar.gz", hash = "sha256:11cb7ca3694e5bdd342bc16d3875b7f7381651d4a53cbb91d34f22412ae16443", size = 26318 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/83/f8081c3bea416bd9d9f0c26af795c74f42c24f9ad3c4fbf361b7d69de134/langchain_text_splitters-0.3.5-py3-none-any.whl", hash = "sha256:8c9b059827438c5fa8f327b4df857e307828a5ec815163c9b5c9569a3e82c8ee", size = 31620 }, + +[package.metadata] +requires-dist = [{ name = "langchain-core", editable = "../core" }] + +[package.metadata.requires-dev] +dev = [ + { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, + { name = "langchain-core", editable = "../core" }, +] +lint = [ + { name = "langchain-core", editable = "../core" }, + { name = "ruff", specifier = ">=0.9.2,<1.0.0" }, +] +test = [ + { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, + { name = "langchain-core", editable = "../core" }, + { name = "pytest", specifier = ">=8,<9" }, + { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, + { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, + { name = "pytest-socket", specifier = ">=0.7.0,<1.0.0" }, + { name = "pytest-watcher", specifier = ">=0.3.4,<1.0.0" }, + { name = "pytest-xdist", specifier = ">=3.6.1,<4.0.0" }, +] +test-integration = [ + { name = "nltk", specifier = ">=3.9.1,<4.0.0" }, + { name = "sentence-transformers", marker = "python_full_version < '3.13'", specifier = ">=2.6.0" }, + { name = "spacy", marker = "python_full_version < '3.10'", specifier = ">=3.0.0,<3.8.4" }, + { name = "spacy", marker = "python_full_version < '3.13'", specifier = ">=3.0.0,<4.0.0" }, + { name = "transformers", specifier = ">=4.47.0,<5.0.0" }, +] +typing = [ + { name = "lxml-stubs", specifier = ">=0.5.1,<1.0.0" }, + { name = "mypy", specifier = ">=1.10,<2.0" }, + { name = "tiktoken", specifier = ">=0.8.0,<1.0.0" }, + { name = "types-requests", specifier = ">=2.31.0.20240218,<3.0.0.0" }, ] [[package]] diff --git a/libs/community/pyproject.toml b/libs/community/pyproject.toml index fef12aa34fb..56c1bd5aacd 100644 --- a/libs/community/pyproject.toml +++ b/libs/community/pyproject.toml @@ -51,9 +51,9 @@ test = [ "blockbuster<1.6,>=1.5.13", "cffi<1.17.1; python_version < \"3.10\"", "cffi; python_version >= \"3.10\"", - "langchain-core @ file:///${PROJECT_ROOT}/../core", - "langchain @ file:///${PROJECT_ROOT}/../langchain", - "langchain-tests @ file:///${PROJECT_ROOT}/../standard-tests", + "langchain-core", + "langchain", + "langchain-tests", "toml>=0.10.2", ] codespell = ["codespell<3.0.0,>=2.2.0"] @@ -63,11 +63,7 @@ lint = [ "cffi<1.17.1; python_version < \"3.10\"", "cffi; python_version >= \"3.10\"", ] -dev = [ - "jupyter<2.0.0,>=1.0.0", - "setuptools<68.0.0,>=67.6.1", - "langchain-core @ file:///${PROJECT_ROOT}/../core", -] +dev = ["jupyter<2.0.0,>=1.0.0", "setuptools<68.0.0,>=67.6.1", "langchain-core"] typing = [ "mypy<2.0,>=1.12", "types-pyyaml<7.0.0.0,>=6.0.12.2", @@ -77,11 +73,17 @@ typing = [ "types-chardet<6.0.0.0,>=5.0.4.6", "types-redis<5.0.0.0,>=4.3.21.6", "mypy-protobuf<4.0.0,>=3.0.0", - "langchain-core @ file:///${PROJECT_ROOT}/../core", - "langchain-text-splitters @ file:///${PROJECT_ROOT}/../text-splitters", - "langchain @ file:///${PROJECT_ROOT}/../langchain", + "langchain-core", + "langchain-text-splitters", + "langchain", ] +[tool.uv.sources] +langchain-core = { path = "../core", editable = true } +langchain = { path = "../langchain", editable = true } +langchain-tests = { path = "../standard-tests", editable = true } +langchain-text-splitters = { path = "../text-splitters", editable = true } + [tool.ruff] target-version = "py39" diff --git a/libs/community/uv.lock b/libs/community/uv.lock index 69f50bd2e78..da6fec8117a 100644 --- a/libs/community/uv.lock +++ b/libs/community/uv.lock @@ -1492,7 +1492,7 @@ wheels = [ [[package]] name = "langchain" version = "0.3.18" -source = { directory = "../langchain" } +source = { editable = "../langchain" } dependencies = [ { name = "aiohttp" }, { name = "async-timeout", marker = "python_full_version < '3.11'" }, @@ -1516,7 +1516,7 @@ requires-dist = [ { name = "langchain-aws", marker = "extra == 'aws'" }, { name = "langchain-cohere", marker = "extra == 'cohere'" }, { name = "langchain-community", marker = "extra == 'community'" }, - { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, + { name = "langchain-core", editable = "../core" }, { name = "langchain-deepseek", marker = "extra == 'deepseek'" }, { name = "langchain-fireworks", marker = "extra == 'fireworks'" }, { name = "langchain-google-genai", marker = "extra == 'google-genai'" }, @@ -1525,8 +1525,8 @@ requires-dist = [ { name = "langchain-huggingface", marker = "extra == 'huggingface'" }, { name = "langchain-mistralai", marker = "extra == 'mistralai'" }, { name = "langchain-ollama", marker = "extra == 'ollama'" }, - { name = "langchain-openai", marker = "extra == 'openai'" }, - { name = "langchain-text-splitters", specifier = ">=0.3.6,<1.0.0" }, + { name = "langchain-openai", marker = "extra == 'openai'", editable = "../partners/openai" }, + { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "langchain-together", marker = "extra == 'together'" }, { name = "langsmith", specifier = ">=0.1.17,<0.4" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.26.4,<2" }, @@ -1542,8 +1542,8 @@ requires-dist = [ codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "../core" }, + { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "playwright", specifier = ">=1.28.0,<2.0.0" }, { name = "setuptools", specifier = ">=67.6.1,<68.0.0" }, ] @@ -1553,14 +1553,15 @@ lint = [ { name = "ruff", specifier = ">=0.9.2,<1.0.0" }, ] test = [ + { name = "blockbuster", specifier = ">=1.5.14,<1.6" }, { name = "cffi", marker = "python_full_version < '3.10'", specifier = "<1.17.1" }, { name = "cffi", marker = "python_full_version >= '3.10'" }, { name = "duckdb-engine", specifier = ">=0.9.2,<1.0.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-openai", directory = "../partners/openai" }, - { name = "langchain-tests", directory = "../standard-tests" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "../core" }, + { name = "langchain-openai", editable = "../partners/openai" }, + { name = "langchain-tests", editable = "../standard-tests" }, + { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "lark", specifier = ">=1.1.5,<2.0.0" }, { name = "packaging", specifier = ">=24.2" }, { name = "pandas", specifier = ">=2.0.0,<3.0.0" }, @@ -1579,8 +1580,8 @@ test = [ ] test-integration = [ { name = "cassio", specifier = ">=0.1.0,<1.0.0" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "../core" }, + { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "langchainhub", specifier = ">=0.1.16,<1.0.0" }, { name = "pytest-vcr", specifier = ">=1.0.2,<2.0.0" }, { name = "python-dotenv", specifier = ">=1.0.0,<2.0.0" }, @@ -1588,8 +1589,8 @@ test-integration = [ { name = "wrapt", specifier = ">=1.15.0,<2.0.0" }, ] typing = [ - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "../core" }, + { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "mypy-protobuf", specifier = ">=3.0.0,<4.0.0" }, { name = "types-chardet", specifier = ">=5.0.4.6,<6.0.0.0" }, @@ -1681,8 +1682,8 @@ requires-dist = [ { name = "aiohttp", specifier = ">=3.8.3,<4.0.0" }, { name = "dataclasses-json", specifier = ">=0.5.7,<0.7" }, { name = "httpx-sse", specifier = ">=0.4.0,<1.0.0" }, - { name = "langchain", specifier = ">=0.3.18,<1.0.0" }, - { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, + { name = "langchain", editable = "../langchain" }, + { name = "langchain-core", editable = "../core" }, { name = "langsmith", specifier = ">=0.1.125,<0.4" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.26.4,<2" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, @@ -1697,7 +1698,7 @@ requires-dist = [ codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../core" }, { name = "setuptools", specifier = ">=67.6.1,<68.0.0" }, ] lint = [ @@ -1711,9 +1712,9 @@ test = [ { name = "cffi", marker = "python_full_version >= '3.10'" }, { name = "duckdb-engine", specifier = ">=0.13.6,<1.0.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain", directory = "../langchain" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-tests", directory = "../standard-tests" }, + { name = "langchain", editable = "../langchain" }, + { name = "langchain-core", editable = "../core" }, + { name = "langchain-tests", editable = "../standard-tests" }, { name = "lark", specifier = ">=1.1.5,<2.0.0" }, { name = "pandas", specifier = ">=2.0.0,<3.0.0" }, { name = "pytest", specifier = ">=7.4.4,<8.0.0" }, @@ -1734,9 +1735,9 @@ test-integration = [ { name = "vcrpy", specifier = ">=6,<7" }, ] typing = [ - { name = "langchain", directory = "../langchain" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain", editable = "../langchain" }, + { name = "langchain-core", editable = "../core" }, + { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "mypy", specifier = ">=1.12,<2.0" }, { name = "mypy-protobuf", specifier = ">=3.0.0,<4.0.0" }, { name = "types-chardet", specifier = ">=5.0.4.6,<6.0.0.0" }, @@ -1749,8 +1750,8 @@ typing = [ [[package]] name = "langchain-core" -version = "0.3.34" -source = { directory = "../core" } +version = "0.3.35" +source = { editable = "../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -1808,7 +1809,7 @@ typing = [ [[package]] name = "langchain-tests" version = "0.3.11" -source = { directory = "../standard-tests" } +source = { editable = "../standard-tests" } dependencies = [ { name = "httpx" }, { name = "langchain-core" }, @@ -1823,7 +1824,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "httpx", specifier = ">=0.25.0,<1" }, - { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, + { name = "langchain-core", editable = "../core" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, { name = "pytest", specifier = ">=7,<9" }, @@ -1835,36 +1836,36 @@ requires-dist = [ [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] lint = [{ name = "ruff", specifier = ">=0.9.2,<1.0.0" }] -test = [{ name = "langchain-core", directory = "../core" }] +test = [{ name = "langchain-core", editable = "../core" }] test-integration = [] typing = [ - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../core" }, { name = "mypy", specifier = ">=1,<2" }, ] [[package]] name = "langchain-text-splitters" version = "0.3.6" -source = { directory = "../text-splitters" } +source = { editable = "../text-splitters" } dependencies = [ { name = "langchain-core" }, ] [package.metadata] -requires-dist = [{ name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }] +requires-dist = [{ name = "langchain-core", editable = "../core" }] [package.metadata.requires-dev] dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../core" }, ] lint = [ - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../core" }, { name = "ruff", specifier = ">=0.9.2,<1.0.0" }, ] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../core" }, { name = "pytest", specifier = ">=8,<9" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, diff --git a/libs/core/uv.lock b/libs/core/uv.lock index f917a6aeae9..cd2eb4f8d5a 100644 --- a/libs/core/uv.lock +++ b/libs/core/uv.lock @@ -1042,7 +1042,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "httpx", specifier = ">=0.25.0,<1" }, - { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, + { name = "langchain-core", editable = "." }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, { name = "pytest", specifier = ">=7,<9" }, @@ -1054,10 +1054,10 @@ requires-dist = [ [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] lint = [{ name = "ruff", specifier = ">=0.9.2,<1.0.0" }] -test = [{ name = "langchain-core", directory = "." }] +test = [{ name = "langchain-core", editable = "." }] test-integration = [] typing = [ - { name = "langchain-core", directory = "." }, + { name = "langchain-core", editable = "." }, { name = "mypy", specifier = ">=1,<2" }, ] @@ -1070,20 +1070,20 @@ dependencies = [ ] [package.metadata] -requires-dist = [{ name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }] +requires-dist = [{ name = "langchain-core", editable = "." }] [package.metadata.requires-dev] dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, - { name = "langchain-core", directory = "." }, + { name = "langchain-core", editable = "." }, ] lint = [ - { name = "langchain-core", directory = "." }, + { name = "langchain-core", editable = "." }, { name = "ruff", specifier = ">=0.9.2,<1.0.0" }, ] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "." }, + { name = "langchain-core", editable = "." }, { name = "pytest", specifier = ">=8,<9" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, diff --git a/libs/langchain/pyproject.toml b/libs/langchain/pyproject.toml index 5bc7acddb19..b18fbd93001 100644 --- a/libs/langchain/pyproject.toml +++ b/libs/langchain/pyproject.toml @@ -69,10 +69,10 @@ test = [ "blockbuster<1.6,>=1.5.14", "cffi<1.17.1; python_version < \"3.10\"", "cffi; python_version >= \"3.10\"", - "langchain-tests @ file:///${PROJECT_ROOT}/../standard-tests", - "langchain-core @ file:///${PROJECT_ROOT}/../core", - "langchain-text-splitters @ file:///${PROJECT_ROOT}/../text-splitters", - "langchain-openai @ file:///${PROJECT_ROOT}/../partners/openai", + "langchain-tests", + "langchain-core", + "langchain-text-splitters", + "langchain-openai", "toml>=0.10.2", "packaging>=24.2", ] @@ -84,8 +84,8 @@ test_integration = [ "python-dotenv<2.0.0,>=1.0.0", "cassio<1.0.0,>=0.1.0", "langchainhub<1.0.0,>=0.1.16", - "langchain-core @ file:///${PROJECT_ROOT}/../core", - "langchain-text-splitters @ file:///${PROJECT_ROOT}/../text-splitters", + "langchain-core", + "langchain-text-splitters", ] lint = [ "ruff<1.0.0,>=0.9.2", @@ -101,18 +101,24 @@ typing = [ "types-pytz<2024.0.0.0,>=2023.3.0.0", "types-chardet<6.0.0.0,>=5.0.4.6", "mypy-protobuf<4.0.0,>=3.0.0", - "langchain-core @ file:///${PROJECT_ROOT}/../core", - "langchain-text-splitters @ file:///${PROJECT_ROOT}/../text-splitters", + "langchain-core", + "langchain-text-splitters", ] dev = [ "jupyter<2.0.0,>=1.0.0", "playwright<2.0.0,>=1.28.0", "setuptools<68.0.0,>=67.6.1", - "langchain-core @ file:///${PROJECT_ROOT}/../core", - "langchain-text-splitters @ file:///${PROJECT_ROOT}/../text-splitters", + "langchain-core", + "langchain-text-splitters", ] +[tool.uv.sources] +langchain-core = { path = "../core", editable = true } +langchain-tests = { path = "../standard-tests", editable = true } +langchain-text-splitters = { path = "../text-splitters", editable = true } +langchain-openai = { path = "../partners/openai", editable = true } + [tool.ruff] target-version = "py39" exclude = ["tests/integration_tests/examples/non-utf8-encoding.py"] diff --git a/libs/langchain/uv.lock b/libs/langchain/uv.lock index 320901707f1..bcd8ca45932 100644 --- a/libs/langchain/uv.lock +++ b/libs/langchain/uv.lock @@ -2,8 +2,8 @@ version = 1 requires-python = ">=3.9, <4.0" resolution-markers = [ "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_python_implementation != 'PyPy'", @@ -17,16 +17,16 @@ resolution-markers = [ [[package]] name = "aiohappyeyeballs" -version = "2.4.4" +version = "2.4.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7f/55/e4373e888fdacb15563ef6fa9fa8c8252476ea071e96fb46defac9f18bf2/aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745", size = 21977 } +sdist = { url = "https://files.pythonhosted.org/packages/08/07/508f9ebba367fc3370162e53a3cfd12f5652ad79f0e0bfdf9f9847c6f159/aiohappyeyeballs-2.4.6.tar.gz", hash = "sha256:9b05052f9042985d32ecbe4b59a77ae19c006a78f1344d7fdad69d28ded3d0b0", size = 21726 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/74/fbb6559de3607b3300b9be3cc64e97548d55678e44623db17820dbd20002/aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8", size = 14756 }, + { url = "https://files.pythonhosted.org/packages/44/4c/03fb05f56551828ec67ceb3665e5dc51638042d204983a03b0a1541475b6/aiohappyeyeballs-2.4.6-py3-none-any.whl", hash = "sha256:147ec992cf873d74f5062644332c539fcd42956dc69453fe5204195e560517e1", size = 14543 }, ] [[package]] name = "aiohttp" -version = "3.11.11" +version = "3.11.12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -38,83 +38,88 @@ dependencies = [ { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/ed/f26db39d29cd3cb2f5a3374304c713fe5ab5a0e4c8ee25a0c45cc6adf844/aiohttp-3.11.11.tar.gz", hash = "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e", size = 7669618 } +sdist = { url = "https://files.pythonhosted.org/packages/37/4b/952d49c73084fb790cb5c6ead50848c8e96b4980ad806cf4d2ad341eaa03/aiohttp-3.11.12.tar.gz", hash = "sha256:7603ca26d75b1b86160ce1bbe2787a0b706e592af5b2504e12caa88a217767b0", size = 7673175 } wheels = [ - { url = "https://files.pythonhosted.org/packages/75/7d/ff2e314b8f9e0b1df833e2d4778eaf23eae6b8cc8f922495d110ddcbf9e1/aiohttp-3.11.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8", size = 708550 }, - { url = "https://files.pythonhosted.org/packages/09/b8/aeb4975d5bba233d6f246941f5957a5ad4e3def8b0855a72742e391925f2/aiohttp-3.11.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5", size = 468430 }, - { url = "https://files.pythonhosted.org/packages/9c/5b/5b620279b3df46e597008b09fa1e10027a39467387c2332657288e25811a/aiohttp-3.11.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2", size = 455593 }, - { url = "https://files.pythonhosted.org/packages/d8/75/0cdf014b816867d86c0bc26f3d3e3f194198dbf33037890beed629cd4f8f/aiohttp-3.11.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43", size = 1584635 }, - { url = "https://files.pythonhosted.org/packages/df/2f/95b8f4e4dfeb57c1d9ad9fa911ede35a0249d75aa339edd2c2270dc539da/aiohttp-3.11.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f", size = 1632363 }, - { url = "https://files.pythonhosted.org/packages/39/cb/70cf69ea7c50f5b0021a84f4c59c3622b2b3b81695f48a2f0e42ef7eba6e/aiohttp-3.11.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d", size = 1668315 }, - { url = "https://files.pythonhosted.org/packages/2f/cc/3a3fc7a290eabc59839a7e15289cd48f33dd9337d06e301064e1e7fb26c5/aiohttp-3.11.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef", size = 1589546 }, - { url = "https://files.pythonhosted.org/packages/15/b4/0f7b0ed41ac6000e283e7332f0f608d734b675a8509763ca78e93714cfb0/aiohttp-3.11.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438", size = 1544581 }, - { url = "https://files.pythonhosted.org/packages/58/b9/4d06470fd85c687b6b0e31935ef73dde6e31767c9576d617309a2206556f/aiohttp-3.11.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3", size = 1529256 }, - { url = "https://files.pythonhosted.org/packages/61/a2/6958b1b880fc017fd35f5dfb2c26a9a50c755b75fd9ae001dc2236a4fb79/aiohttp-3.11.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55", size = 1536592 }, - { url = "https://files.pythonhosted.org/packages/0f/dd/b974012a9551fd654f5bb95a6dd3f03d6e6472a17e1a8216dd42e9638d6c/aiohttp-3.11.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e", size = 1607446 }, - { url = "https://files.pythonhosted.org/packages/e0/d3/6c98fd87e638e51f074a3f2061e81fcb92123bcaf1439ac1b4a896446e40/aiohttp-3.11.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33", size = 1628809 }, - { url = "https://files.pythonhosted.org/packages/a8/2e/86e6f85cbca02be042c268c3d93e7f35977a0e127de56e319bdd1569eaa8/aiohttp-3.11.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c", size = 1564291 }, - { url = "https://files.pythonhosted.org/packages/0b/8d/1f4ef3503b767717f65e1f5178b0173ab03cba1a19997ebf7b052161189f/aiohttp-3.11.11-cp310-cp310-win32.whl", hash = "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745", size = 416601 }, - { url = "https://files.pythonhosted.org/packages/ad/86/81cb83691b5ace3d9aa148dc42bacc3450d749fc88c5ec1973573c1c1779/aiohttp-3.11.11-cp310-cp310-win_amd64.whl", hash = "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9", size = 442007 }, - { url = "https://files.pythonhosted.org/packages/34/ae/e8806a9f054e15f1d18b04db75c23ec38ec954a10c0a68d3bd275d7e8be3/aiohttp-3.11.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76", size = 708624 }, - { url = "https://files.pythonhosted.org/packages/c7/e0/313ef1a333fb4d58d0c55a6acb3cd772f5d7756604b455181049e222c020/aiohttp-3.11.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538", size = 468507 }, - { url = "https://files.pythonhosted.org/packages/a9/60/03455476bf1f467e5b4a32a465c450548b2ce724eec39d69f737191f936a/aiohttp-3.11.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204", size = 455571 }, - { url = "https://files.pythonhosted.org/packages/be/f9/469588603bd75bf02c8ffb8c8a0d4b217eed446b49d4a767684685aa33fd/aiohttp-3.11.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9", size = 1685694 }, - { url = "https://files.pythonhosted.org/packages/88/b9/1b7fa43faf6c8616fa94c568dc1309ffee2b6b68b04ac268e5d64b738688/aiohttp-3.11.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03", size = 1743660 }, - { url = "https://files.pythonhosted.org/packages/2a/8b/0248d19dbb16b67222e75f6aecedd014656225733157e5afaf6a6a07e2e8/aiohttp-3.11.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287", size = 1785421 }, - { url = "https://files.pythonhosted.org/packages/c4/11/f478e071815a46ca0a5ae974651ff0c7a35898c55063305a896e58aa1247/aiohttp-3.11.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e", size = 1675145 }, - { url = "https://files.pythonhosted.org/packages/26/5d/284d182fecbb5075ae10153ff7374f57314c93a8681666600e3a9e09c505/aiohttp-3.11.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665", size = 1619804 }, - { url = "https://files.pythonhosted.org/packages/1b/78/980064c2ad685c64ce0e8aeeb7ef1e53f43c5b005edcd7d32e60809c4992/aiohttp-3.11.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b", size = 1654007 }, - { url = "https://files.pythonhosted.org/packages/21/8d/9e658d63b1438ad42b96f94da227f2e2c1d5c6001c9e8ffcc0bfb22e9105/aiohttp-3.11.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34", size = 1650022 }, - { url = "https://files.pythonhosted.org/packages/85/fd/a032bf7f2755c2df4f87f9effa34ccc1ef5cea465377dbaeef93bb56bbd6/aiohttp-3.11.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d", size = 1732899 }, - { url = "https://files.pythonhosted.org/packages/c5/0c/c2b85fde167dd440c7ba50af2aac20b5a5666392b174df54c00f888c5a75/aiohttp-3.11.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2", size = 1755142 }, - { url = "https://files.pythonhosted.org/packages/bc/78/91ae1a3b3b3bed8b893c5d69c07023e151b1c95d79544ad04cf68f596c2f/aiohttp-3.11.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773", size = 1692736 }, - { url = "https://files.pythonhosted.org/packages/77/89/a7ef9c4b4cdb546fcc650ca7f7395aaffbd267f0e1f648a436bec33c9b95/aiohttp-3.11.11-cp311-cp311-win32.whl", hash = "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62", size = 416418 }, - { url = "https://files.pythonhosted.org/packages/fc/db/2192489a8a51b52e06627506f8ac8df69ee221de88ab9bdea77aa793aa6a/aiohttp-3.11.11-cp311-cp311-win_amd64.whl", hash = "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac", size = 442509 }, - { url = "https://files.pythonhosted.org/packages/69/cf/4bda538c502f9738d6b95ada11603c05ec260807246e15e869fc3ec5de97/aiohttp-3.11.11-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886", size = 704666 }, - { url = "https://files.pythonhosted.org/packages/46/7b/87fcef2cad2fad420ca77bef981e815df6904047d0a1bd6aeded1b0d1d66/aiohttp-3.11.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2", size = 464057 }, - { url = "https://files.pythonhosted.org/packages/5a/a6/789e1f17a1b6f4a38939fbc39d29e1d960d5f89f73d0629a939410171bc0/aiohttp-3.11.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c", size = 455996 }, - { url = "https://files.pythonhosted.org/packages/b7/dd/485061fbfef33165ce7320db36e530cd7116ee1098e9c3774d15a732b3fd/aiohttp-3.11.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a", size = 1682367 }, - { url = "https://files.pythonhosted.org/packages/e9/d7/9ec5b3ea9ae215c311d88b2093e8da17e67b8856673e4166c994e117ee3e/aiohttp-3.11.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231", size = 1736989 }, - { url = "https://files.pythonhosted.org/packages/d6/fb/ea94927f7bfe1d86178c9d3e0a8c54f651a0a655214cce930b3c679b8f64/aiohttp-3.11.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e", size = 1793265 }, - { url = "https://files.pythonhosted.org/packages/40/7f/6de218084f9b653026bd7063cd8045123a7ba90c25176465f266976d8c82/aiohttp-3.11.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8", size = 1691841 }, - { url = "https://files.pythonhosted.org/packages/77/e2/992f43d87831cbddb6b09c57ab55499332f60ad6fdbf438ff4419c2925fc/aiohttp-3.11.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8", size = 1619317 }, - { url = "https://files.pythonhosted.org/packages/96/74/879b23cdd816db4133325a201287c95bef4ce669acde37f8f1b8669e1755/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c", size = 1641416 }, - { url = "https://files.pythonhosted.org/packages/30/98/b123f6b15d87c54e58fd7ae3558ff594f898d7f30a90899718f3215ad328/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab", size = 1646514 }, - { url = "https://files.pythonhosted.org/packages/d7/38/257fda3dc99d6978ab943141d5165ec74fd4b4164baa15e9c66fa21da86b/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da", size = 1702095 }, - { url = "https://files.pythonhosted.org/packages/0c/f4/ddab089053f9fb96654df5505c0a69bde093214b3c3454f6bfdb1845f558/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853", size = 1734611 }, - { url = "https://files.pythonhosted.org/packages/c3/d6/f30b2bc520c38c8aa4657ed953186e535ae84abe55c08d0f70acd72ff577/aiohttp-3.11.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e", size = 1694576 }, - { url = "https://files.pythonhosted.org/packages/bc/97/b0a88c3f4c6d0020b34045ee6d954058abc870814f6e310c4c9b74254116/aiohttp-3.11.11-cp312-cp312-win32.whl", hash = "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600", size = 411363 }, - { url = "https://files.pythonhosted.org/packages/7f/23/cc36d9c398980acaeeb443100f0216f50a7cfe20c67a9fd0a2f1a5a846de/aiohttp-3.11.11-cp312-cp312-win_amd64.whl", hash = "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d", size = 437666 }, - { url = "https://files.pythonhosted.org/packages/49/d1/d8af164f400bad432b63e1ac857d74a09311a8334b0481f2f64b158b50eb/aiohttp-3.11.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9", size = 697982 }, - { url = "https://files.pythonhosted.org/packages/92/d1/faad3bf9fa4bfd26b95c69fc2e98937d52b1ff44f7e28131855a98d23a17/aiohttp-3.11.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194", size = 460662 }, - { url = "https://files.pythonhosted.org/packages/db/61/0d71cc66d63909dabc4590f74eba71f91873a77ea52424401c2498d47536/aiohttp-3.11.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f", size = 452950 }, - { url = "https://files.pythonhosted.org/packages/07/db/6d04bc7fd92784900704e16b745484ef45b77bd04e25f58f6febaadf7983/aiohttp-3.11.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104", size = 1665178 }, - { url = "https://files.pythonhosted.org/packages/54/5c/e95ade9ae29f375411884d9fd98e50535bf9fe316c9feb0f30cd2ac8f508/aiohttp-3.11.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff", size = 1717939 }, - { url = "https://files.pythonhosted.org/packages/6f/1c/1e7d5c5daea9e409ed70f7986001b8c9e3a49a50b28404498d30860edab6/aiohttp-3.11.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3", size = 1775125 }, - { url = "https://files.pythonhosted.org/packages/5d/66/890987e44f7d2f33a130e37e01a164168e6aff06fce15217b6eaf14df4f6/aiohttp-3.11.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1", size = 1677176 }, - { url = "https://files.pythonhosted.org/packages/8f/dc/e2ba57d7a52df6cdf1072fd5fa9c6301a68e1cd67415f189805d3eeb031d/aiohttp-3.11.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4", size = 1603192 }, - { url = "https://files.pythonhosted.org/packages/6c/9e/8d08a57de79ca3a358da449405555e668f2c8871a7777ecd2f0e3912c272/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d", size = 1618296 }, - { url = "https://files.pythonhosted.org/packages/56/51/89822e3ec72db352c32e7fc1c690370e24e231837d9abd056490f3a49886/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87", size = 1616524 }, - { url = "https://files.pythonhosted.org/packages/2c/fa/e2e6d9398f462ffaa095e84717c1732916a57f1814502929ed67dd7568ef/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2", size = 1685471 }, - { url = "https://files.pythonhosted.org/packages/ae/5f/6bb976e619ca28a052e2c0ca7b0251ccd893f93d7c24a96abea38e332bf6/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12", size = 1715312 }, - { url = "https://files.pythonhosted.org/packages/79/c1/756a7e65aa087c7fac724d6c4c038f2faaa2a42fe56dbc1dd62a33ca7213/aiohttp-3.11.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5", size = 1672783 }, - { url = "https://files.pythonhosted.org/packages/73/ba/a6190ebb02176c7f75e6308da31f5d49f6477b651a3dcfaaaca865a298e2/aiohttp-3.11.11-cp313-cp313-win32.whl", hash = "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d", size = 410229 }, - { url = "https://files.pythonhosted.org/packages/b8/62/c9fa5bafe03186a0e4699150a7fed9b1e73240996d0d2f0e5f70f3fdf471/aiohttp-3.11.11-cp313-cp313-win_amd64.whl", hash = "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99", size = 436081 }, - { url = "https://files.pythonhosted.org/packages/9f/37/326ee86b7640be6ca4493c8121cb9a4386e07cf1e5757ce6b7fa854d0a5f/aiohttp-3.11.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e", size = 709424 }, - { url = "https://files.pythonhosted.org/packages/9c/c5/a88ec2160b06c22e57e483a1f78f99f005fcd4e7d6855a2d3d6510881b65/aiohttp-3.11.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add", size = 468907 }, - { url = "https://files.pythonhosted.org/packages/b2/f0/02f03f818e91996161cce200241b631bb2b4a87e61acddb5b974e254a288/aiohttp-3.11.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a", size = 455981 }, - { url = "https://files.pythonhosted.org/packages/0e/17/c8be12436ec19915f67b1ab8240d4105aba0f7e0894a1f0d8939c3e79c70/aiohttp-3.11.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350", size = 1587395 }, - { url = "https://files.pythonhosted.org/packages/43/c0/f4db1ac30ebe855b2fefd6fa98767862d88ac54ab08a6ad07d619146270c/aiohttp-3.11.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6", size = 1636243 }, - { url = "https://files.pythonhosted.org/packages/ea/a7/9acf20e9a09b0d38b5b55691410500d051a9f4194692cac22b0d0fc92ad9/aiohttp-3.11.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1", size = 1672323 }, - { url = "https://files.pythonhosted.org/packages/f7/5b/a27e8fe1a3b0e245ca80863eefd83fc00136752d27d2cf1afa0130a76f34/aiohttp-3.11.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e", size = 1589521 }, - { url = "https://files.pythonhosted.org/packages/25/50/8bccd08004e15906791b46f0a908a8e7f5e0c5882b17da96d1933bd34ac0/aiohttp-3.11.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd", size = 1544059 }, - { url = "https://files.pythonhosted.org/packages/84/5a/42250b37b06ee0cb7a03dd1630243b1d739ca3edb5abd8b18f479a539900/aiohttp-3.11.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1", size = 1530217 }, - { url = "https://files.pythonhosted.org/packages/18/08/eb334da86cd2cdbd0621bb7039255b19ca74ce8b05e8fb61850e2589938c/aiohttp-3.11.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c", size = 1536081 }, - { url = "https://files.pythonhosted.org/packages/1a/a9/9d59958084d5bad7e77a44841013bd59768cda94f9f744769461b66038fc/aiohttp-3.11.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e", size = 1606918 }, - { url = "https://files.pythonhosted.org/packages/4f/e7/27feb1cff17dcddb7a5b703199106196718d622a3aa70f80a386d15361d7/aiohttp-3.11.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28", size = 1629101 }, - { url = "https://files.pythonhosted.org/packages/e8/29/49debcd858b997c655fca274c5247fcfe29bf31a4ddb1ce3f088539b14e4/aiohttp-3.11.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226", size = 1567338 }, - { url = "https://files.pythonhosted.org/packages/3b/34/33af1e97aba1862e1812e2e2b96a1e050c5a6e9cecd5a5370591122fb07b/aiohttp-3.11.11-cp39-cp39-win32.whl", hash = "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3", size = 416914 }, - { url = "https://files.pythonhosted.org/packages/2d/47/28b3fbd97026963af2774423c64341e0d4ec180ea3b79a2762a3c18d5d94/aiohttp-3.11.11-cp39-cp39-win_amd64.whl", hash = "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1", size = 442225 }, + { url = "https://files.pythonhosted.org/packages/65/42/3880e133590820aa7bc6d068eb7d8e0ad9fdce9b4663f92b821d3f6b5601/aiohttp-3.11.12-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:aa8a8caca81c0a3e765f19c6953416c58e2f4cc1b84829af01dd1c771bb2f91f", size = 708721 }, + { url = "https://files.pythonhosted.org/packages/d8/8c/04869803bed108b25afad75f94c651b287851843caacbec6677d8f2d572b/aiohttp-3.11.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:84ede78acde96ca57f6cf8ccb8a13fbaf569f6011b9a52f870c662d4dc8cd854", size = 468596 }, + { url = "https://files.pythonhosted.org/packages/4f/f4/9074011f0d1335b161c953fb32545b6667cf24465e1932b9767874995c7e/aiohttp-3.11.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:584096938a001378484aa4ee54e05dc79c7b9dd933e271c744a97b3b6f644957", size = 455758 }, + { url = "https://files.pythonhosted.org/packages/fd/68/06298c57ef8f534065930b805e6dbd83613f0534447922782fb9920fce28/aiohttp-3.11.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:392432a2dde22b86f70dd4a0e9671a349446c93965f261dbaecfaf28813e5c42", size = 1584797 }, + { url = "https://files.pythonhosted.org/packages/bd/1e/cee6b51fcb3b1c4185a7dc62b3113bc136fae07f39386c88c90b7f79f199/aiohttp-3.11.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:88d385b8e7f3a870146bf5ea31786ef7463e99eb59e31db56e2315535d811f55", size = 1632535 }, + { url = "https://files.pythonhosted.org/packages/71/1f/42424462b7a09da362e1711090db9f8d68a37a33f0aab51307335517c599/aiohttp-3.11.12-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b10a47e5390c4b30a0d58ee12581003be52eedd506862ab7f97da7a66805befb", size = 1668484 }, + { url = "https://files.pythonhosted.org/packages/f6/79/0e25542bbe3c2bfd7a12c7a49c7bce73b09a836f65079e4b77bc2bafc89e/aiohttp-3.11.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b5263dcede17b6b0c41ef0c3ccce847d82a7da98709e75cf7efde3e9e3b5cae", size = 1589708 }, + { url = "https://files.pythonhosted.org/packages/d1/13/93ae26b75e23f7d3a613872e472fae836ca100dc5bde5936ebc93ada8890/aiohttp-3.11.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50c5c7b8aa5443304c55c262c5693b108c35a3b61ef961f1e782dd52a2f559c7", size = 1544752 }, + { url = "https://files.pythonhosted.org/packages/cf/5e/48847fad1b014ef92ef18ea1339a3b58eb81d3bc717b94c3627f5d2a42c5/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d1c031a7572f62f66f1257db37ddab4cb98bfaf9b9434a3b4840bf3560f5e788", size = 1529417 }, + { url = "https://files.pythonhosted.org/packages/ae/56/fbd4ea019303f4877f0e0b8c9de92e9db24338e7545570d3f275f3c74c53/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:7e44eba534381dd2687be50cbd5f2daded21575242ecfdaf86bbeecbc38dae8e", size = 1557808 }, + { url = "https://files.pythonhosted.org/packages/f1/43/112189cf6b3c482ecdd6819b420eaa0c2033426f28d741bb7f19db5dd2bb/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:145a73850926018ec1681e734cedcf2716d6a8697d90da11284043b745c286d5", size = 1536765 }, + { url = "https://files.pythonhosted.org/packages/30/12/59986547de8306e06c7b30e547ccda02d29636e152366caba2dd8627bfe1/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:2c311e2f63e42c1bf86361d11e2c4a59f25d9e7aabdbdf53dc38b885c5435cdb", size = 1607621 }, + { url = "https://files.pythonhosted.org/packages/aa/9b/af3b323b20df3318ed20d701d8242e523d59c842ca93f23134b05c9d5054/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ea756b5a7bac046d202a9a3889b9a92219f885481d78cd318db85b15cc0b7bcf", size = 1628977 }, + { url = "https://files.pythonhosted.org/packages/36/62/adf5a331a7bda475cc326dde393fa2bc5849060b1b37ac3d1bee1953f2cd/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:526c900397f3bbc2db9cb360ce9c35134c908961cdd0ac25b1ae6ffcaa2507ff", size = 1564455 }, + { url = "https://files.pythonhosted.org/packages/90/c4/4a24291f22f111a854dfdb54dc94d4e0a5229ccbb7bc7f0bed972aa50410/aiohttp-3.11.12-cp310-cp310-win32.whl", hash = "sha256:b8d3bb96c147b39c02d3db086899679f31958c5d81c494ef0fc9ef5bb1359b3d", size = 416768 }, + { url = "https://files.pythonhosted.org/packages/51/69/5221c8006acb7bb10d9e8e2238fb216571bddc2e00a8d95bcfbe2f579c57/aiohttp-3.11.12-cp310-cp310-win_amd64.whl", hash = "sha256:7fe3d65279bfbee8de0fb4f8c17fc4e893eed2dba21b2f680e930cc2b09075c5", size = 442170 }, + { url = "https://files.pythonhosted.org/packages/9c/38/35311e70196b6a63cfa033a7f741f800aa8a93f57442991cbe51da2394e7/aiohttp-3.11.12-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:87a2e00bf17da098d90d4145375f1d985a81605267e7f9377ff94e55c5d769eb", size = 708797 }, + { url = "https://files.pythonhosted.org/packages/44/3e/46c656e68cbfc4f3fc7cb5d2ba4da6e91607fe83428208028156688f6201/aiohttp-3.11.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b34508f1cd928ce915ed09682d11307ba4b37d0708d1f28e5774c07a7674cac9", size = 468669 }, + { url = "https://files.pythonhosted.org/packages/a0/d6/2088fb4fd1e3ac2bfb24bc172223babaa7cdbb2784d33c75ec09e66f62f8/aiohttp-3.11.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:936d8a4f0f7081327014742cd51d320296b56aa6d324461a13724ab05f4b2933", size = 455739 }, + { url = "https://files.pythonhosted.org/packages/e7/dc/c443a6954a56f4a58b5efbfdf23cc6f3f0235e3424faf5a0c56264d5c7bb/aiohttp-3.11.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de1378f72def7dfb5dbd73d86c19eda0ea7b0a6873910cc37d57e80f10d64e1", size = 1685858 }, + { url = "https://files.pythonhosted.org/packages/25/67/2d5b3aaade1d5d01c3b109aa76e3aa9630531252cda10aa02fb99b0b11a1/aiohttp-3.11.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9d45dbb3aaec05cf01525ee1a7ac72de46a8c425cb75c003acd29f76b1ffe94", size = 1743829 }, + { url = "https://files.pythonhosted.org/packages/90/9b/9728fe9a3e1b8521198455d027b0b4035522be18f504b24c5d38d59e7278/aiohttp-3.11.12-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:930ffa1925393381e1e0a9b82137fa7b34c92a019b521cf9f41263976666a0d6", size = 1785587 }, + { url = "https://files.pythonhosted.org/packages/ce/cf/28fbb43d4ebc1b4458374a3c7b6db3b556a90e358e9bbcfe6d9339c1e2b6/aiohttp-3.11.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8340def6737118f5429a5df4e88f440746b791f8f1c4ce4ad8a595f42c980bd5", size = 1675319 }, + { url = "https://files.pythonhosted.org/packages/e5/d2/006c459c11218cabaa7bca401f965c9cc828efbdea7e1615d4644eaf23f7/aiohttp-3.11.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4016e383f91f2814e48ed61e6bda7d24c4d7f2402c75dd28f7e1027ae44ea204", size = 1619982 }, + { url = "https://files.pythonhosted.org/packages/9d/83/ca425891ebd37bee5d837110f7fddc4d808a7c6c126a7d1b5c3ad72fc6ba/aiohttp-3.11.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3c0600bcc1adfaaac321422d615939ef300df81e165f6522ad096b73439c0f58", size = 1654176 }, + { url = "https://files.pythonhosted.org/packages/25/df/047b1ce88514a1b4915d252513640184b63624e7914e41d846668b8edbda/aiohttp-3.11.12-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:0450ada317a65383b7cce9576096150fdb97396dcfe559109b403c7242faffef", size = 1660198 }, + { url = "https://files.pythonhosted.org/packages/d3/cc/6ecb8e343f0902528620b9dbd567028a936d5489bebd7dbb0dd0914f4fdb/aiohttp-3.11.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:850ff6155371fd802a280f8d369d4e15d69434651b844bde566ce97ee2277420", size = 1650186 }, + { url = "https://files.pythonhosted.org/packages/f8/f8/453df6dd69256ca8c06c53fc8803c9056e2b0b16509b070f9a3b4bdefd6c/aiohttp-3.11.12-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8fd12d0f989c6099e7b0f30dc6e0d1e05499f3337461f0b2b0dadea6c64b89df", size = 1733063 }, + { url = "https://files.pythonhosted.org/packages/55/f8/540160787ff3000391de0e5d0d1d33be4c7972f933c21991e2ea105b2d5e/aiohttp-3.11.12-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:76719dd521c20a58a6c256d058547b3a9595d1d885b830013366e27011ffe804", size = 1755306 }, + { url = "https://files.pythonhosted.org/packages/30/7d/49f3bfdfefd741576157f8f91caa9ff61a6f3d620ca6339268327518221b/aiohttp-3.11.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:97fe431f2ed646a3b56142fc81d238abcbaff08548d6912acb0b19a0cadc146b", size = 1692909 }, + { url = "https://files.pythonhosted.org/packages/40/9c/8ce00afd6f6112ce9a2309dc490fea376ae824708b94b7b5ea9cba979d1d/aiohttp-3.11.12-cp311-cp311-win32.whl", hash = "sha256:e10c440d142fa8b32cfdb194caf60ceeceb3e49807072e0dc3a8887ea80e8c16", size = 416584 }, + { url = "https://files.pythonhosted.org/packages/35/97/4d3c5f562f15830de472eb10a7a222655d750839943e0e6d915ef7e26114/aiohttp-3.11.12-cp311-cp311-win_amd64.whl", hash = "sha256:246067ba0cf5560cf42e775069c5d80a8989d14a7ded21af529a4e10e3e0f0e6", size = 442674 }, + { url = "https://files.pythonhosted.org/packages/4d/d0/94346961acb476569fca9a644cc6f9a02f97ef75961a6b8d2b35279b8d1f/aiohttp-3.11.12-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e392804a38353900c3fd8b7cacbea5132888f7129f8e241915e90b85f00e3250", size = 704837 }, + { url = "https://files.pythonhosted.org/packages/a9/af/05c503f1cc8f97621f199ef4b8db65fb88b8bc74a26ab2adb74789507ad3/aiohttp-3.11.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8fa1510b96c08aaad49303ab11f8803787c99222288f310a62f493faf883ede1", size = 464218 }, + { url = "https://files.pythonhosted.org/packages/f2/48/b9949eb645b9bd699153a2ec48751b985e352ab3fed9d98c8115de305508/aiohttp-3.11.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dc065a4285307607df3f3686363e7f8bdd0d8ab35f12226362a847731516e42c", size = 456166 }, + { url = "https://files.pythonhosted.org/packages/14/fb/980981807baecb6f54bdd38beb1bd271d9a3a786e19a978871584d026dcf/aiohttp-3.11.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddb31f8474695cd61fc9455c644fc1606c164b93bff2490390d90464b4655df", size = 1682528 }, + { url = "https://files.pythonhosted.org/packages/90/cb/77b1445e0a716914e6197b0698b7a3640590da6c692437920c586764d05b/aiohttp-3.11.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dec0000d2d8621d8015c293e24589d46fa218637d820894cb7356c77eca3259", size = 1737154 }, + { url = "https://files.pythonhosted.org/packages/ff/24/d6fb1f4cede9ccbe98e4def6f3ed1e1efcb658871bbf29f4863ec646bf38/aiohttp-3.11.12-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3552fe98e90fdf5918c04769f338a87fa4f00f3b28830ea9b78b1bdc6140e0d", size = 1793435 }, + { url = "https://files.pythonhosted.org/packages/17/e2/9f744cee0861af673dc271a3351f59ebd5415928e20080ab85be25641471/aiohttp-3.11.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dfe7f984f28a8ae94ff3a7953cd9678550dbd2a1f9bda5dd9c5ae627744c78e", size = 1692010 }, + { url = "https://files.pythonhosted.org/packages/90/c4/4a1235c1df544223eb57ba553ce03bc706bdd065e53918767f7fa1ff99e0/aiohttp-3.11.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a481a574af914b6e84624412666cbfbe531a05667ca197804ecc19c97b8ab1b0", size = 1619481 }, + { url = "https://files.pythonhosted.org/packages/60/70/cf12d402a94a33abda86dd136eb749b14c8eb9fec1e16adc310e25b20033/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1987770fb4887560363b0e1a9b75aa303e447433c41284d3af2840a2f226d6e0", size = 1641578 }, + { url = "https://files.pythonhosted.org/packages/1b/25/7211973fda1f5e833fcfd98ccb7f9ce4fbfc0074e3e70c0157a751d00db8/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a4ac6a0f0f6402854adca4e3259a623f5c82ec3f0c049374133bcb243132baf9", size = 1684463 }, + { url = "https://files.pythonhosted.org/packages/93/60/b5905b4d0693f6018b26afa9f2221fefc0dcbd3773fe2dff1a20fb5727f1/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c96a43822f1f9f69cc5c3706af33239489a6294be486a0447fb71380070d4d5f", size = 1646691 }, + { url = "https://files.pythonhosted.org/packages/b4/fc/ba1b14d6fdcd38df0b7c04640794b3683e949ea10937c8a58c14d697e93f/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a5e69046f83c0d3cb8f0d5bd9b8838271b1bc898e01562a04398e160953e8eb9", size = 1702269 }, + { url = "https://files.pythonhosted.org/packages/5e/39/18c13c6f658b2ba9cc1e0c6fb2d02f98fd653ad2addcdf938193d51a9c53/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:68d54234c8d76d8ef74744f9f9fc6324f1508129e23da8883771cdbb5818cbef", size = 1734782 }, + { url = "https://files.pythonhosted.org/packages/9f/d2/ccc190023020e342419b265861877cd8ffb75bec37b7ddd8521dd2c6deb8/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9fd9dcf9c91affe71654ef77426f5cf8489305e1c66ed4816f5a21874b094b9", size = 1694740 }, + { url = "https://files.pythonhosted.org/packages/3f/54/186805bcada64ea90ea909311ffedcd74369bfc6e880d39d2473314daa36/aiohttp-3.11.12-cp312-cp312-win32.whl", hash = "sha256:0ed49efcd0dc1611378beadbd97beb5d9ca8fe48579fc04a6ed0844072261b6a", size = 411530 }, + { url = "https://files.pythonhosted.org/packages/3d/63/5eca549d34d141bcd9de50d4e59b913f3641559460c739d5e215693cb54a/aiohttp-3.11.12-cp312-cp312-win_amd64.whl", hash = "sha256:54775858c7f2f214476773ce785a19ee81d1294a6bedc5cc17225355aab74802", size = 437860 }, + { url = "https://files.pythonhosted.org/packages/c3/9b/cea185d4b543ae08ee478373e16653722c19fcda10d2d0646f300ce10791/aiohttp-3.11.12-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:413ad794dccb19453e2b97c2375f2ca3cdf34dc50d18cc2693bd5aed7d16f4b9", size = 698148 }, + { url = "https://files.pythonhosted.org/packages/91/5c/80d47fe7749fde584d1404a68ade29bcd7e58db8fa11fa38e8d90d77e447/aiohttp-3.11.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a93d28ed4b4b39e6f46fd240896c29b686b75e39cc6992692e3922ff6982b4c", size = 460831 }, + { url = "https://files.pythonhosted.org/packages/8e/f9/de568f8a8ca6b061d157c50272620c53168d6e3eeddae78dbb0f7db981eb/aiohttp-3.11.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d589264dbba3b16e8951b6f145d1e6b883094075283dafcab4cdd564a9e353a0", size = 453122 }, + { url = "https://files.pythonhosted.org/packages/8b/fd/b775970a047543bbc1d0f66725ba72acef788028fce215dc959fd15a8200/aiohttp-3.11.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5148ca8955affdfeb864aca158ecae11030e952b25b3ae15d4e2b5ba299bad2", size = 1665336 }, + { url = "https://files.pythonhosted.org/packages/82/9b/aff01d4f9716245a1b2965f02044e4474fadd2bcfe63cf249ca788541886/aiohttp-3.11.12-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:525410e0790aab036492eeea913858989c4cb070ff373ec3bc322d700bdf47c1", size = 1718111 }, + { url = "https://files.pythonhosted.org/packages/e0/a9/166fd2d8b2cc64f08104aa614fad30eee506b563154081bf88ce729bc665/aiohttp-3.11.12-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bd8695be2c80b665ae3f05cb584093a1e59c35ecb7d794d1edd96e8cc9201d7", size = 1775293 }, + { url = "https://files.pythonhosted.org/packages/13/c5/0d3c89bd9e36288f10dc246f42518ce8e1c333f27636ac78df091c86bb4a/aiohttp-3.11.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0203433121484b32646a5f5ea93ae86f3d9559d7243f07e8c0eab5ff8e3f70e", size = 1677338 }, + { url = "https://files.pythonhosted.org/packages/72/b2/017db2833ef537be284f64ead78725984db8a39276c1a9a07c5c7526e238/aiohttp-3.11.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40cd36749a1035c34ba8d8aaf221b91ca3d111532e5ccb5fa8c3703ab1b967ed", size = 1603365 }, + { url = "https://files.pythonhosted.org/packages/fc/72/b66c96a106ec7e791e29988c222141dd1219d7793ffb01e72245399e08d2/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a7442662afebbf7b4c6d28cb7aab9e9ce3a5df055fc4116cc7228192ad6cb484", size = 1618464 }, + { url = "https://files.pythonhosted.org/packages/3f/50/e68a40f267b46a603bab569d48d57f23508801614e05b3369898c5b2910a/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8a2fb742ef378284a50766e985804bd6adb5adb5aa781100b09befdbfa757b65", size = 1657827 }, + { url = "https://files.pythonhosted.org/packages/c5/1d/aafbcdb1773d0ba7c20793ebeedfaba1f3f7462f6fc251f24983ed738aa7/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2cee3b117a8d13ab98b38d5b6bdcd040cfb4181068d05ce0c474ec9db5f3c5bb", size = 1616700 }, + { url = "https://files.pythonhosted.org/packages/b0/5e/6cd9724a2932f36e2a6b742436a36d64784322cfb3406ca773f903bb9a70/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f6a19bcab7fbd8f8649d6595624856635159a6527861b9cdc3447af288a00c00", size = 1685643 }, + { url = "https://files.pythonhosted.org/packages/8b/38/ea6c91d5c767fd45a18151675a07c710ca018b30aa876a9f35b32fa59761/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e4cecdb52aaa9994fbed6b81d4568427b6002f0a91c322697a4bfcc2b2363f5a", size = 1715487 }, + { url = "https://files.pythonhosted.org/packages/8e/24/e9edbcb7d1d93c02e055490348df6f955d675e85a028c33babdcaeda0853/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:30f546358dfa0953db92ba620101fefc81574f87b2346556b90b5f3ef16e55ce", size = 1672948 }, + { url = "https://files.pythonhosted.org/packages/25/be/0b1fb737268e003198f25c3a68c2135e76e4754bf399a879b27bd508a003/aiohttp-3.11.12-cp313-cp313-win32.whl", hash = "sha256:ce1bb21fc7d753b5f8a5d5a4bae99566386b15e716ebdb410154c16c91494d7f", size = 410396 }, + { url = "https://files.pythonhosted.org/packages/68/fd/677def96a75057b0a26446b62f8fbb084435b20a7d270c99539c26573bfd/aiohttp-3.11.12-cp313-cp313-win_amd64.whl", hash = "sha256:f7914ab70d2ee8ab91c13e5402122edbc77821c66d2758abb53aabe87f013287", size = 436234 }, + { url = "https://files.pythonhosted.org/packages/a7/bd/358c7032c43d4875dcbedc9113b087ef8bc619bee034f9423335698631e3/aiohttp-3.11.12-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c3623053b85b4296cd3925eeb725e386644fd5bc67250b3bb08b0f144803e7b", size = 709588 }, + { url = "https://files.pythonhosted.org/packages/9f/87/9e4700a56722c139b6ed4ad9be926183545a1b55e82babd9b082be3ef4c5/aiohttp-3.11.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:67453e603cea8e85ed566b2700efa1f6916aefbc0c9fcb2e86aaffc08ec38e78", size = 469076 }, + { url = "https://files.pythonhosted.org/packages/c0/fa/585b66076795911800f8f16f0f93ea8fb9bfa5d8fd757bbf78f32d17c2d9/aiohttp-3.11.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6130459189e61baac5a88c10019b21e1f0c6d00ebc770e9ce269475650ff7f73", size = 456148 }, + { url = "https://files.pythonhosted.org/packages/ba/6b/a1fe710860b10d83799af8c63cf2ffb63eac4edaa42d76e9540679545951/aiohttp-3.11.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9060addfa4ff753b09392efe41e6af06ea5dd257829199747b9f15bfad819460", size = 1587566 }, + { url = "https://files.pythonhosted.org/packages/31/78/ab78f36b44c7239c953afd9bb331edf2b3977925de2ce98545d62e415565/aiohttp-3.11.12-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34245498eeb9ae54c687a07ad7f160053911b5745e186afe2d0c0f2898a1ab8a", size = 1636411 }, + { url = "https://files.pythonhosted.org/packages/e1/5c/b316b559dde4ae983e725132a2fa2518532ad56ca4698d4b71f42af48722/aiohttp-3.11.12-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8dc0fba9a74b471c45ca1a3cb6e6913ebfae416678d90529d188886278e7f3f6", size = 1672484 }, + { url = "https://files.pythonhosted.org/packages/90/08/8c409ab4040276a8c9944d5e444121a2f34151872440b3c69f31c35edf18/aiohttp-3.11.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a478aa11b328983c4444dacb947d4513cb371cd323f3845e53caeda6be5589d5", size = 1589689 }, + { url = "https://files.pythonhosted.org/packages/e0/25/53b4ceffaac5dcaf4772be41f4f06e7201be5407aa743758e1a37f7d1b63/aiohttp-3.11.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c160a04283c8c6f55b5bf6d4cad59bb9c5b9c9cd08903841b25f1f7109ef1259", size = 1544225 }, + { url = "https://files.pythonhosted.org/packages/4a/40/769d221f4067a05974b3352ffa228041bcda72c487689ab4030791691861/aiohttp-3.11.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:edb69b9589324bdc40961cdf0657815df674f1743a8d5ad9ab56a99e4833cfdd", size = 1530391 }, + { url = "https://files.pythonhosted.org/packages/14/48/22527fadfdfca85fb585870ffd98aece982606775fd2f4ee80270f5c85a0/aiohttp-3.11.12-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ee84c2a22a809c4f868153b178fe59e71423e1f3d6a8cd416134bb231fbf6d3", size = 1559005 }, + { url = "https://files.pythonhosted.org/packages/fd/0e/72144954bae5d80a8857dca18b8ed8e2ef76acf557465545ad5b5b9bfb58/aiohttp-3.11.12-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:bf4480a5438f80e0f1539e15a7eb8b5f97a26fe087e9828e2c0ec2be119a9f72", size = 1536244 }, + { url = "https://files.pythonhosted.org/packages/60/db/a2cfb5565f5e5870757e2d3099f8e24640e746ff2ba9ea899b35b6acad3f/aiohttp-3.11.12-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:e6b2732ef3bafc759f653a98881b5b9cdef0716d98f013d376ee8dfd7285abf1", size = 1607092 }, + { url = "https://files.pythonhosted.org/packages/b0/31/87e869650c5532876e83c7c7d9d3f5505c5a738abe991f3ac2264070ee81/aiohttp-3.11.12-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f752e80606b132140883bb262a457c475d219d7163d996dc9072434ffb0784c4", size = 1629268 }, + { url = "https://files.pythonhosted.org/packages/d2/73/25fb4d2d259caf4cf23035204315665976a66292a1055d0937c62273675a/aiohttp-3.11.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ab3247d58b393bda5b1c8f31c9edece7162fc13265334217785518dd770792b8", size = 1567511 }, + { url = "https://files.pythonhosted.org/packages/a3/59/ef91da9971e187033476945cd18bebc3974930bde81cdf66099b318df7a6/aiohttp-3.11.12-cp39-cp39-win32.whl", hash = "sha256:0d5176f310a7fe6f65608213cc74f4228e4f4ce9fd10bcb2bb6da8fc66991462", size = 417082 }, + { url = "https://files.pythonhosted.org/packages/e0/fa/6cfc042c0f59d1fa6eaeeb678b9f13b2c0bf1d7803dae81b93ca55ac6288/aiohttp-3.11.12-cp39-cp39-win_amd64.whl", hash = "sha256:74bd573dde27e58c760d9ca8615c41a57e719bff315c9adb6f2a4281a28e8798", size = 442385 }, ] [[package]] @@ -277,15 +282,15 @@ wheels = [ [[package]] name = "beautifulsoup4" -version = "4.13.1" +version = "4.13.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/58/f3/d90227cc52f7b8fcd0f2af804f56e55edf8dd07036b681a2809e3245318b/beautifulsoup4-4.13.1.tar.gz", hash = "sha256:741c8b6903a1e4ae8ba32b9c9ae7510dab7a197fdbadcf9fcdeb0891ef5ec66a", size = 618295 } +sdist = { url = "https://files.pythonhosted.org/packages/f0/3c/adaf39ce1fb4afdd21b611e3d530b183bb7759c9b673d60db0e347fd4439/beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b", size = 619516 } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/75/899bf9b6270b2ce5e8f01b8da121b29e4b88256feb2cf6c6418d4cc42130/beautifulsoup4-4.13.1-py3-none-any.whl", hash = "sha256:72465267014897bb10ca749bb632bde6c2d20f3254afd5458544bd74e6c2e6d8", size = 185056 }, + { url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16", size = 186015 }, ] [[package]] @@ -307,33 +312,33 @@ css = [ [[package]] name = "blockbuster" -version = "1.5.14" +version = "1.5.18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "forbiddenfruit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e0/77/a46b97dc6807c88c864a134793d7c7b915dea45c7e44da6c3adebac90501/blockbuster-1.5.14.tar.gz", hash = "sha256:d77ed3b931b058b4e746f65e32ea21e8ed21a4ef0ca88b7bb046bdb057e1adb0", size = 50191 } +sdist = { url = "https://files.pythonhosted.org/packages/80/04/592ea42201d3d929bca02ca1c845ffae37eee6a8bfe63f9916f53881144e/blockbuster-1.5.18.tar.gz", hash = "sha256:c3395a01742e1d80a59e7457f6cb5edd9c9333bdac6a3b17908953f94b703431", size = 50856 } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c2/1515ea61aa08f3b44882aa59a0c03be667a6fec2a4026aad76944b40b030/blockbuster-1.5.14-py3-none-any.whl", hash = "sha256:5b5e46ac4b5f5d2a7a599944d83bee0c9eb46509868acb6d8fbc7c8058769aaf", size = 12372 }, + { url = "https://files.pythonhosted.org/packages/93/cb/0885a99be92700adc3f2294179e2ca8700b3197c89d2c87b1ca20ab2537a/blockbuster-1.5.18-py3-none-any.whl", hash = "sha256:0062af118fbddb6e85b4fa5e41df5da95ce4ceba44ff1efcc26be1ade11cad53", size = 13043 }, ] [[package]] name = "boto3" -version = "1.36.12" +version = "1.36.20" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore" }, { name = "jmespath" }, { name = "s3transfer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/04/2b/7365aab02b6768a9694ff43e0e5f1f83f205fc7fe253a410cda990425048/boto3-1.36.12.tar.gz", hash = "sha256:287d84f49bba3255a17b374578127d42b6251e72f55914a62e0ad9ca78c0954b", size = 111048 } +sdist = { url = "https://files.pythonhosted.org/packages/00/9a/f63b820ece3f0411645e686fe48a9ea9daf9ee07fa5dcb07dfb5df8267ec/boto3-1.36.20.tar.gz", hash = "sha256:4a27ffc0543c2a429600542047f00c6a1e95270139d36d8cc636e9cc9a78b835", size = 111015 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/0b/eb4d244ea84b0fd9e255286a30c98f37f8f28bbf6ea85f7f4b734bf929a9/boto3-1.36.12-py3-none-any.whl", hash = "sha256:32cdf0967287f3ec25a9dc09df0d29cb86b8900c3e0546a63d672775d8127abf", size = 139178 }, + { url = "https://files.pythonhosted.org/packages/0f/44/882ab747cfe2164eecd6ab780c11e3d875cffb53b86118664a44b9fb71c1/boto3-1.36.20-py3-none-any.whl", hash = "sha256:e132e31232ee107f1c187f566d96863a907433e5bdd8d8928effddd30a96242f", size = 139179 }, ] [[package]] name = "botocore" -version = "1.36.12" +version = "1.36.20" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jmespath" }, @@ -341,9 +346,9 @@ dependencies = [ { name = "urllib3", version = "1.26.20", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "urllib3", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/54/cc9a665f92534aa105a49dd867f18d4eff4687835994a70a32a103fa11ae/botocore-1.36.12.tar.gz", hash = "sha256:86ed88beb4f244c96529435c868d3940073c2774116f0023fb7691f6e7053bd9", size = 13498321 } +sdist = { url = "https://files.pythonhosted.org/packages/1d/d5/2d54195cefa89708186c036db360d9be23aabdb93d8982df9c08e6df1ef8/botocore-1.36.20.tar.gz", hash = "sha256:3815a05518ff03a8dbc8d5a3c29b95889409a25ac87a282067f6e26fefb7c40a", size = 13521540 } wheels = [ - { url = "https://files.pythonhosted.org/packages/92/3a/5e19d1d1896e86bb9c25f31f5f05ff2e8f40727aa66ee6149b545d3e28b0/botocore-1.36.12-py3-none-any.whl", hash = "sha256:5ae1ed362c8ed908a6ced8cdd12b21e2196c100bc79f9e95c9c1fc7f9ea74f5a", size = 13328293 }, + { url = "https://files.pythonhosted.org/packages/41/6c/0553a1641c749ec8838e153fb77ff17f4de56792d289adf039385294257f/botocore-1.36.20-py3-none-any.whl", hash = "sha256:0110bf2208e4569659d0ccfca94baa4999501334397987b02712a94493cbf48b", size = 13349288 }, ] [[package]] @@ -397,7 +402,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cassandra-driver" }, { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "numpy", version = "2.2.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "requests" }, ] sdist = { url = "https://files.pythonhosted.org/packages/88/00/a9a3a958169677f5f713bb3ed5a4afc1baf7abd1e08f37acad718aa923db/cassio-0.1.10.tar.gz", hash = "sha256:577f0a2ce5898a57c83195bf74811dec8794282477eb6fa4debd4ccec6cfab98", size = 35854 } @@ -493,8 +498,8 @@ version = "1.17.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_python_implementation != 'PyPy'", @@ -665,7 +670,7 @@ wheels = [ [[package]] name = "cohere" -version = "5.13.11" +version = "5.13.12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "fastavro" }, @@ -679,9 +684,9 @@ dependencies = [ { name = "types-requests", version = "2.32.0.20241016", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/59/b567080f93e4cbbd57716530ef3443b69f4517b23cddfdb35df094a026b6/cohere-5.13.11.tar.gz", hash = "sha256:85d2c1a28ac83d3479a5c1ca6cdf97bb52794714c7fde054eb936cfeafaf57f6", size = 132773 } +sdist = { url = "https://files.pythonhosted.org/packages/f4/48/795c53b25b08ec353cc4f48dc5c199ac4615b3c331e716ac50c7cb07034c/cohere-5.13.12.tar.gz", hash = "sha256:97bb9ac107e580780b941acbabd3aa5e71960e6835398292c46aaa8a0a4cab88", size = 132860 } wheels = [ - { url = "https://files.pythonhosted.org/packages/02/84/119fd98f3271efbc072e8d253fc39fcc8d8763a3dfcff8139feaa4548878/cohere-5.13.11-py3-none-any.whl", hash = "sha256:9237e15f5abcda6ecf8252b6784d5424024986316ae319cb266c05d79ca3de83", size = 252482 }, + { url = "https://files.pythonhosted.org/packages/50/c6/cffec9284d9713d28c6235a653a9a34c49b0f880f00cfa002252cdb8d033/cohere-5.13.12-py3-none-any.whl", hash = "sha256:2a043591a3e5280b47716a6b311e4c7f58e799364113a9cb81b50cd4f6c95f7e", size = 252856 }, ] [[package]] @@ -707,71 +712,72 @@ wheels = [ [[package]] name = "coverage" -version = "7.6.10" +version = "7.6.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/84/ba/ac14d281f80aab516275012e8875991bb06203957aa1e19950139238d658/coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", size = 803868 } +sdist = { url = "https://files.pythonhosted.org/packages/0c/d6/2b53ab3ee99f2262e6f0b8369a43f6d66658eab45510331c0b3d5c8c4272/coverage-7.6.12.tar.gz", hash = "sha256:48cfc4641d95d34766ad41d9573cc0f22a48aa88d22657a1fe01dca0dbae4de2", size = 805941 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/12/2a2a923edf4ddabdffed7ad6da50d96a5c126dae7b80a33df7310e329a1e/coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78", size = 207982 }, - { url = "https://files.pythonhosted.org/packages/ca/49/6985dbca9c7be3f3cb62a2e6e492a0c88b65bf40579e16c71ae9c33c6b23/coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c", size = 208414 }, - { url = "https://files.pythonhosted.org/packages/35/93/287e8f1d1ed2646f4e0b2605d14616c9a8a2697d0d1b453815eb5c6cebdb/coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a", size = 236860 }, - { url = "https://files.pythonhosted.org/packages/de/e1/cfdb5627a03567a10031acc629b75d45a4ca1616e54f7133ca1fa366050a/coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165", size = 234758 }, - { url = "https://files.pythonhosted.org/packages/6d/85/fc0de2bcda3f97c2ee9fe8568f7d48f7279e91068958e5b2cc19e0e5f600/coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988", size = 235920 }, - { url = "https://files.pythonhosted.org/packages/79/73/ef4ea0105531506a6f4cf4ba571a214b14a884630b567ed65b3d9c1975e1/coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5", size = 234986 }, - { url = "https://files.pythonhosted.org/packages/c6/4d/75afcfe4432e2ad0405c6f27adeb109ff8976c5e636af8604f94f29fa3fc/coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3", size = 233446 }, - { url = "https://files.pythonhosted.org/packages/86/5b/efee56a89c16171288cafff022e8af44f8f94075c2d8da563c3935212871/coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5", size = 234566 }, - { url = "https://files.pythonhosted.org/packages/f2/db/67770cceb4a64d3198bf2aa49946f411b85ec6b0a9b489e61c8467a4253b/coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244", size = 210675 }, - { url = "https://files.pythonhosted.org/packages/8d/27/e8bfc43f5345ec2c27bc8a1fa77cdc5ce9dcf954445e11f14bb70b889d14/coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e", size = 211518 }, - { url = "https://files.pythonhosted.org/packages/85/d2/5e175fcf6766cf7501a8541d81778fd2f52f4870100e791f5327fd23270b/coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3", size = 208088 }, - { url = "https://files.pythonhosted.org/packages/4b/6f/06db4dc8fca33c13b673986e20e466fd936235a6ec1f0045c3853ac1b593/coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43", size = 208536 }, - { url = "https://files.pythonhosted.org/packages/0d/62/c6a0cf80318c1c1af376d52df444da3608eafc913b82c84a4600d8349472/coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132", size = 240474 }, - { url = "https://files.pythonhosted.org/packages/a3/59/750adafc2e57786d2e8739a46b680d4fb0fbc2d57fbcb161290a9f1ecf23/coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f", size = 237880 }, - { url = "https://files.pythonhosted.org/packages/2c/f8/ef009b3b98e9f7033c19deb40d629354aab1d8b2d7f9cfec284dbedf5096/coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994", size = 239750 }, - { url = "https://files.pythonhosted.org/packages/a6/e2/6622f3b70f5f5b59f705e680dae6db64421af05a5d1e389afd24dae62e5b/coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99", size = 238642 }, - { url = "https://files.pythonhosted.org/packages/2d/10/57ac3f191a3c95c67844099514ff44e6e19b2915cd1c22269fb27f9b17b6/coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd", size = 237266 }, - { url = "https://files.pythonhosted.org/packages/ee/2d/7016f4ad9d553cabcb7333ed78ff9d27248ec4eba8dd21fa488254dff894/coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377", size = 238045 }, - { url = "https://files.pythonhosted.org/packages/a7/fe/45af5c82389a71e0cae4546413266d2195c3744849669b0bab4b5f2c75da/coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8", size = 210647 }, - { url = "https://files.pythonhosted.org/packages/db/11/3f8e803a43b79bc534c6a506674da9d614e990e37118b4506faf70d46ed6/coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609", size = 211508 }, - { url = "https://files.pythonhosted.org/packages/86/77/19d09ea06f92fdf0487499283b1b7af06bc422ea94534c8fe3a4cd023641/coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853", size = 208281 }, - { url = "https://files.pythonhosted.org/packages/b6/67/5479b9f2f99fcfb49c0d5cf61912a5255ef80b6e80a3cddba39c38146cf4/coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078", size = 208514 }, - { url = "https://files.pythonhosted.org/packages/15/d1/febf59030ce1c83b7331c3546d7317e5120c5966471727aa7ac157729c4b/coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0", size = 241537 }, - { url = "https://files.pythonhosted.org/packages/4b/7e/5ac4c90192130e7cf8b63153fe620c8bfd9068f89a6d9b5f26f1550f7a26/coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50", size = 238572 }, - { url = "https://files.pythonhosted.org/packages/dc/03/0334a79b26ecf59958f2fe9dd1f5ab3e2f88db876f5071933de39af09647/coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022", size = 240639 }, - { url = "https://files.pythonhosted.org/packages/d7/45/8a707f23c202208d7b286d78ad6233f50dcf929319b664b6cc18a03c1aae/coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b", size = 240072 }, - { url = "https://files.pythonhosted.org/packages/66/02/603ce0ac2d02bc7b393279ef618940b4a0535b0868ee791140bda9ecfa40/coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0", size = 238386 }, - { url = "https://files.pythonhosted.org/packages/04/62/4e6887e9be060f5d18f1dd58c2838b2d9646faf353232dec4e2d4b1c8644/coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852", size = 240054 }, - { url = "https://files.pythonhosted.org/packages/5c/74/83ae4151c170d8bd071924f212add22a0e62a7fe2b149edf016aeecad17c/coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359", size = 210904 }, - { url = "https://files.pythonhosted.org/packages/c3/54/de0893186a221478f5880283119fc40483bc460b27c4c71d1b8bba3474b9/coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247", size = 211692 }, - { url = "https://files.pythonhosted.org/packages/25/6d/31883d78865529257bf847df5789e2ae80e99de8a460c3453dbfbe0db069/coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9", size = 208308 }, - { url = "https://files.pythonhosted.org/packages/70/22/3f2b129cc08de00c83b0ad6252e034320946abfc3e4235c009e57cfeee05/coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b", size = 208565 }, - { url = "https://files.pythonhosted.org/packages/97/0a/d89bc2d1cc61d3a8dfe9e9d75217b2be85f6c73ebf1b9e3c2f4e797f4531/coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690", size = 241083 }, - { url = "https://files.pythonhosted.org/packages/4c/81/6d64b88a00c7a7aaed3a657b8eaa0931f37a6395fcef61e53ff742b49c97/coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18", size = 238235 }, - { url = "https://files.pythonhosted.org/packages/9a/0b/7797d4193f5adb4b837207ed87fecf5fc38f7cc612b369a8e8e12d9fa114/coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c", size = 240220 }, - { url = "https://files.pythonhosted.org/packages/65/4d/6f83ca1bddcf8e51bf8ff71572f39a1c73c34cf50e752a952c34f24d0a60/coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd", size = 239847 }, - { url = "https://files.pythonhosted.org/packages/30/9d/2470df6aa146aff4c65fee0f87f58d2164a67533c771c9cc12ffcdb865d5/coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e", size = 237922 }, - { url = "https://files.pythonhosted.org/packages/08/dd/723fef5d901e6a89f2507094db66c091449c8ba03272861eaefa773ad95c/coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694", size = 239783 }, - { url = "https://files.pythonhosted.org/packages/3d/f7/64d3298b2baf261cb35466000628706ce20a82d42faf9b771af447cd2b76/coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6", size = 210965 }, - { url = "https://files.pythonhosted.org/packages/d5/58/ec43499a7fc681212fe7742fe90b2bc361cdb72e3181ace1604247a5b24d/coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e", size = 211719 }, - { url = "https://files.pythonhosted.org/packages/ab/c9/f2857a135bcff4330c1e90e7d03446b036b2363d4ad37eb5e3a47bbac8a6/coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe", size = 209050 }, - { url = "https://files.pythonhosted.org/packages/aa/b3/f840e5bd777d8433caa9e4a1eb20503495709f697341ac1a8ee6a3c906ad/coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273", size = 209321 }, - { url = "https://files.pythonhosted.org/packages/85/7d/125a5362180fcc1c03d91850fc020f3831d5cda09319522bcfa6b2b70be7/coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8", size = 252039 }, - { url = "https://files.pythonhosted.org/packages/a9/9c/4358bf3c74baf1f9bddd2baf3756b54c07f2cfd2535f0a47f1e7757e54b3/coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098", size = 247758 }, - { url = "https://files.pythonhosted.org/packages/cf/c7/de3eb6fc5263b26fab5cda3de7a0f80e317597a4bad4781859f72885f300/coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb", size = 250119 }, - { url = "https://files.pythonhosted.org/packages/3e/e6/43de91f8ba2ec9140c6a4af1102141712949903dc732cf739167cfa7a3bc/coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0", size = 249597 }, - { url = "https://files.pythonhosted.org/packages/08/40/61158b5499aa2adf9e37bc6d0117e8f6788625b283d51e7e0c53cf340530/coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf", size = 247473 }, - { url = "https://files.pythonhosted.org/packages/50/69/b3f2416725621e9f112e74e8470793d5b5995f146f596f133678a633b77e/coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", size = 248737 }, - { url = "https://files.pythonhosted.org/packages/3c/6e/fe899fb937657db6df31cc3e61c6968cb56d36d7326361847440a430152e/coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", size = 211611 }, - { url = "https://files.pythonhosted.org/packages/1c/55/52f5e66142a9d7bc93a15192eba7a78513d2abf6b3558d77b4ca32f5f424/coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", size = 212781 }, - { url = "https://files.pythonhosted.org/packages/40/41/473617aadf9a1c15bc2d56be65d90d7c29bfa50a957a67ef96462f7ebf8e/coverage-7.6.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a", size = 207978 }, - { url = "https://files.pythonhosted.org/packages/10/f6/480586607768b39a30e6910a3c4522139094ac0f1677028e1f4823688957/coverage-7.6.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27", size = 208415 }, - { url = "https://files.pythonhosted.org/packages/f1/af/439bb760f817deff6f4d38fe7da08d9dd7874a560241f1945bc3b4446550/coverage-7.6.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4", size = 236452 }, - { url = "https://files.pythonhosted.org/packages/d0/13/481f4ceffcabe29ee2332e60efb52e4694f54a402f3ada2bcec10bb32e43/coverage-7.6.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f", size = 234374 }, - { url = "https://files.pythonhosted.org/packages/c5/59/4607ea9d6b1b73e905c7656da08d0b00cdf6e59f2293ec259e8914160025/coverage-7.6.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25", size = 235505 }, - { url = "https://files.pythonhosted.org/packages/85/60/d66365723b9b7f29464b11d024248ed3523ce5aab958e4ad8c43f3f4148b/coverage-7.6.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315", size = 234616 }, - { url = "https://files.pythonhosted.org/packages/74/f8/2cf7a38e7d81b266f47dfcf137fecd8fa66c7bdbd4228d611628d8ca3437/coverage-7.6.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90", size = 233099 }, - { url = "https://files.pythonhosted.org/packages/50/2b/bff6c1c6b63c4396ea7ecdbf8db1788b46046c681b8fcc6ec77db9f4ea49/coverage-7.6.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d", size = 234089 }, - { url = "https://files.pythonhosted.org/packages/bf/b5/baace1c754d546a67779358341aa8d2f7118baf58cac235db457e1001d1b/coverage-7.6.10-cp39-cp39-win32.whl", hash = "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18", size = 210701 }, - { url = "https://files.pythonhosted.org/packages/b1/bf/9e1e95b8b20817398ecc5a1e8d3e05ff404e1b9fb2185cd71561698fe2a2/coverage-7.6.10-cp39-cp39-win_amd64.whl", hash = "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59", size = 211482 }, - { url = "https://files.pythonhosted.org/packages/a1/70/de81bfec9ed38a64fc44a77c7665e20ca507fc3265597c28b0d989e4082e/coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f", size = 200223 }, + { url = "https://files.pythonhosted.org/packages/ba/67/81dc41ec8f548c365d04a29f1afd492d3176b372c33e47fa2a45a01dc13a/coverage-7.6.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:704c8c8c6ce6569286ae9622e534b4f5b9759b6f2cd643f1c1a61f666d534fe8", size = 208345 }, + { url = "https://files.pythonhosted.org/packages/33/43/17f71676016c8829bde69e24c852fef6bd9ed39f774a245d9ec98f689fa0/coverage-7.6.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ad7525bf0241e5502168ae9c643a2f6c219fa0a283001cee4cf23a9b7da75879", size = 208775 }, + { url = "https://files.pythonhosted.org/packages/86/25/c6ff0775f8960e8c0840845b723eed978d22a3cd9babd2b996e4a7c502c6/coverage-7.6.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06097c7abfa611c91edb9e6920264e5be1d6ceb374efb4986f38b09eed4cb2fe", size = 237925 }, + { url = "https://files.pythonhosted.org/packages/b0/3d/5f5bd37046243cb9d15fff2c69e498c2f4fe4f9b42a96018d4579ed3506f/coverage-7.6.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:220fa6c0ad7d9caef57f2c8771918324563ef0d8272c94974717c3909664e674", size = 235835 }, + { url = "https://files.pythonhosted.org/packages/b5/f1/9e6b75531fe33490b910d251b0bf709142e73a40e4e38a3899e6986fe088/coverage-7.6.12-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3688b99604a24492bcfe1c106278c45586eb819bf66a654d8a9a1433022fb2eb", size = 236966 }, + { url = "https://files.pythonhosted.org/packages/4f/bc/aef5a98f9133851bd1aacf130e754063719345d2fb776a117d5a8d516971/coverage-7.6.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d1a987778b9c71da2fc8948e6f2656da6ef68f59298b7e9786849634c35d2c3c", size = 236080 }, + { url = "https://files.pythonhosted.org/packages/eb/d0/56b4ab77f9b12aea4d4c11dc11cdcaa7c29130b837eb610639cf3400c9c3/coverage-7.6.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cec6b9ce3bd2b7853d4a4563801292bfee40b030c05a3d29555fd2a8ee9bd68c", size = 234393 }, + { url = "https://files.pythonhosted.org/packages/0d/77/28ef95c5d23fe3dd191a0b7d89c82fea2c2d904aef9315daf7c890e96557/coverage-7.6.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ace9048de91293e467b44bce0f0381345078389814ff6e18dbac8fdbf896360e", size = 235536 }, + { url = "https://files.pythonhosted.org/packages/29/62/18791d3632ee3ff3f95bc8599115707d05229c72db9539f208bb878a3d88/coverage-7.6.12-cp310-cp310-win32.whl", hash = "sha256:ea31689f05043d520113e0552f039603c4dd71fa4c287b64cb3606140c66f425", size = 211063 }, + { url = "https://files.pythonhosted.org/packages/fc/57/b3878006cedfd573c963e5c751b8587154eb10a61cc0f47a84f85c88a355/coverage-7.6.12-cp310-cp310-win_amd64.whl", hash = "sha256:676f92141e3c5492d2a1596d52287d0d963df21bf5e55c8b03075a60e1ddf8aa", size = 211955 }, + { url = "https://files.pythonhosted.org/packages/64/2d/da78abbfff98468c91fd63a73cccdfa0e99051676ded8dd36123e3a2d4d5/coverage-7.6.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e18aafdfb3e9ec0d261c942d35bd7c28d031c5855dadb491d2723ba54f4c3015", size = 208464 }, + { url = "https://files.pythonhosted.org/packages/31/f2/c269f46c470bdabe83a69e860c80a82e5e76840e9f4bbd7f38f8cebbee2f/coverage-7.6.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66fe626fd7aa5982cdebad23e49e78ef7dbb3e3c2a5960a2b53632f1f703ea45", size = 208893 }, + { url = "https://files.pythonhosted.org/packages/47/63/5682bf14d2ce20819998a49c0deadb81e608a59eed64d6bc2191bc8046b9/coverage-7.6.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ef01d70198431719af0b1f5dcbefc557d44a190e749004042927b2a3fed0702", size = 241545 }, + { url = "https://files.pythonhosted.org/packages/6a/b6/6b6631f1172d437e11067e1c2edfdb7238b65dff965a12bce3b6d1bf2be2/coverage-7.6.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e92ae5a289a4bc4c0aae710c0948d3c7892e20fd3588224ebe242039573bf0", size = 239230 }, + { url = "https://files.pythonhosted.org/packages/c7/01/9cd06cbb1be53e837e16f1b4309f6357e2dfcbdab0dd7cd3b1a50589e4e1/coverage-7.6.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e695df2c58ce526eeab11a2e915448d3eb76f75dffe338ea613c1201b33bab2f", size = 241013 }, + { url = "https://files.pythonhosted.org/packages/4b/26/56afefc03c30871326e3d99709a70d327ac1f33da383cba108c79bd71563/coverage-7.6.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d74c08e9aaef995f8c4ef6d202dbd219c318450fe2a76da624f2ebb9c8ec5d9f", size = 239750 }, + { url = "https://files.pythonhosted.org/packages/dd/ea/88a1ff951ed288f56aa561558ebe380107cf9132facd0b50bced63ba7238/coverage-7.6.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e995b3b76ccedc27fe4f477b349b7d64597e53a43fc2961db9d3fbace085d69d", size = 238462 }, + { url = "https://files.pythonhosted.org/packages/6e/d4/1d9404566f553728889409eff82151d515fbb46dc92cbd13b5337fa0de8c/coverage-7.6.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b1f097878d74fe51e1ddd1be62d8e3682748875b461232cf4b52ddc6e6db0bba", size = 239307 }, + { url = "https://files.pythonhosted.org/packages/12/c1/e453d3b794cde1e232ee8ac1d194fde8e2ba329c18bbf1b93f6f5eef606b/coverage-7.6.12-cp311-cp311-win32.whl", hash = "sha256:1f7ffa05da41754e20512202c866d0ebfc440bba3b0ed15133070e20bf5aeb5f", size = 211117 }, + { url = "https://files.pythonhosted.org/packages/d5/db/829185120c1686fa297294f8fcd23e0422f71070bf85ef1cc1a72ecb2930/coverage-7.6.12-cp311-cp311-win_amd64.whl", hash = "sha256:e216c5c45f89ef8971373fd1c5d8d1164b81f7f5f06bbf23c37e7908d19e8558", size = 212019 }, + { url = "https://files.pythonhosted.org/packages/e2/7f/4af2ed1d06ce6bee7eafc03b2ef748b14132b0bdae04388e451e4b2c529b/coverage-7.6.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b172f8e030e8ef247b3104902cc671e20df80163b60a203653150d2fc204d1ad", size = 208645 }, + { url = "https://files.pythonhosted.org/packages/dc/60/d19df912989117caa95123524d26fc973f56dc14aecdec5ccd7d0084e131/coverage-7.6.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:641dfe0ab73deb7069fb972d4d9725bf11c239c309ce694dd50b1473c0f641c3", size = 208898 }, + { url = "https://files.pythonhosted.org/packages/bd/10/fecabcf438ba676f706bf90186ccf6ff9f6158cc494286965c76e58742fa/coverage-7.6.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e549f54ac5f301e8e04c569dfdb907f7be71b06b88b5063ce9d6953d2d58574", size = 242987 }, + { url = "https://files.pythonhosted.org/packages/4c/53/4e208440389e8ea936f5f2b0762dcd4cb03281a7722def8e2bf9dc9c3d68/coverage-7.6.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:959244a17184515f8c52dcb65fb662808767c0bd233c1d8a166e7cf74c9ea985", size = 239881 }, + { url = "https://files.pythonhosted.org/packages/c4/47/2ba744af8d2f0caa1f17e7746147e34dfc5f811fb65fc153153722d58835/coverage-7.6.12-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bda1c5f347550c359f841d6614fb8ca42ae5cb0b74d39f8a1e204815ebe25750", size = 242142 }, + { url = "https://files.pythonhosted.org/packages/e9/90/df726af8ee74d92ee7e3bf113bf101ea4315d71508952bd21abc3fae471e/coverage-7.6.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ceeb90c3eda1f2d8c4c578c14167dbd8c674ecd7d38e45647543f19839dd6ea", size = 241437 }, + { url = "https://files.pythonhosted.org/packages/f6/af/995263fd04ae5f9cf12521150295bf03b6ba940d0aea97953bb4a6db3e2b/coverage-7.6.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f16f44025c06792e0fb09571ae454bcc7a3ec75eeb3c36b025eccf501b1a4c3", size = 239724 }, + { url = "https://files.pythonhosted.org/packages/1c/8e/5bb04f0318805e190984c6ce106b4c3968a9562a400180e549855d8211bd/coverage-7.6.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b076e625396e787448d27a411aefff867db2bffac8ed04e8f7056b07024eed5a", size = 241329 }, + { url = "https://files.pythonhosted.org/packages/9e/9d/fa04d9e6c3f6459f4e0b231925277cfc33d72dfab7fa19c312c03e59da99/coverage-7.6.12-cp312-cp312-win32.whl", hash = "sha256:00b2086892cf06c7c2d74983c9595dc511acca00665480b3ddff749ec4fb2a95", size = 211289 }, + { url = "https://files.pythonhosted.org/packages/53/40/53c7ffe3c0c3fff4d708bc99e65f3d78c129110d6629736faf2dbd60ad57/coverage-7.6.12-cp312-cp312-win_amd64.whl", hash = "sha256:7ae6eabf519bc7871ce117fb18bf14e0e343eeb96c377667e3e5dd12095e0288", size = 212079 }, + { url = "https://files.pythonhosted.org/packages/76/89/1adf3e634753c0de3dad2f02aac1e73dba58bc5a3a914ac94a25b2ef418f/coverage-7.6.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:488c27b3db0ebee97a830e6b5a3ea930c4a6e2c07f27a5e67e1b3532e76b9ef1", size = 208673 }, + { url = "https://files.pythonhosted.org/packages/ce/64/92a4e239d64d798535c5b45baac6b891c205a8a2e7c9cc8590ad386693dc/coverage-7.6.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d1095bbee1851269f79fd8e0c9b5544e4c00c0c24965e66d8cba2eb5bb535fd", size = 208945 }, + { url = "https://files.pythonhosted.org/packages/b4/d0/4596a3ef3bca20a94539c9b1e10fd250225d1dec57ea78b0867a1cf9742e/coverage-7.6.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0533adc29adf6a69c1baa88c3d7dbcaadcffa21afbed3ca7a225a440e4744bf9", size = 242484 }, + { url = "https://files.pythonhosted.org/packages/1c/ef/6fd0d344695af6718a38d0861408af48a709327335486a7ad7e85936dc6e/coverage-7.6.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53c56358d470fa507a2b6e67a68fd002364d23c83741dbc4c2e0680d80ca227e", size = 239525 }, + { url = "https://files.pythonhosted.org/packages/0c/4b/373be2be7dd42f2bcd6964059fd8fa307d265a29d2b9bcf1d044bcc156ed/coverage-7.6.12-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64cbb1a3027c79ca6310bf101014614f6e6e18c226474606cf725238cf5bc2d4", size = 241545 }, + { url = "https://files.pythonhosted.org/packages/a6/7d/0e83cc2673a7790650851ee92f72a343827ecaaea07960587c8f442b5cd3/coverage-7.6.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:79cac3390bfa9836bb795be377395f28410811c9066bc4eefd8015258a7578c6", size = 241179 }, + { url = "https://files.pythonhosted.org/packages/ff/8c/566ea92ce2bb7627b0900124e24a99f9244b6c8c92d09ff9f7633eb7c3c8/coverage-7.6.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9b148068e881faa26d878ff63e79650e208e95cf1c22bd3f77c3ca7b1d9821a3", size = 239288 }, + { url = "https://files.pythonhosted.org/packages/7d/e4/869a138e50b622f796782d642c15fb5f25a5870c6d0059a663667a201638/coverage-7.6.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8bec2ac5da793c2685ce5319ca9bcf4eee683b8a1679051f8e6ec04c4f2fd7dc", size = 241032 }, + { url = "https://files.pythonhosted.org/packages/ae/28/a52ff5d62a9f9e9fe9c4f17759b98632edd3a3489fce70154c7d66054dd3/coverage-7.6.12-cp313-cp313-win32.whl", hash = "sha256:200e10beb6ddd7c3ded322a4186313d5ca9e63e33d8fab4faa67ef46d3460af3", size = 211315 }, + { url = "https://files.pythonhosted.org/packages/bc/17/ab849b7429a639f9722fa5628364c28d675c7ff37ebc3268fe9840dda13c/coverage-7.6.12-cp313-cp313-win_amd64.whl", hash = "sha256:2b996819ced9f7dbb812c701485d58f261bef08f9b85304d41219b1496b591ef", size = 212099 }, + { url = "https://files.pythonhosted.org/packages/d2/1c/b9965bf23e171d98505eb5eb4fb4d05c44efd256f2e0f19ad1ba8c3f54b0/coverage-7.6.12-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:299cf973a7abff87a30609879c10df0b3bfc33d021e1adabc29138a48888841e", size = 209511 }, + { url = "https://files.pythonhosted.org/packages/57/b3/119c201d3b692d5e17784fee876a9a78e1b3051327de2709392962877ca8/coverage-7.6.12-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4b467a8c56974bf06e543e69ad803c6865249d7a5ccf6980457ed2bc50312703", size = 209729 }, + { url = "https://files.pythonhosted.org/packages/52/4e/a7feb5a56b266304bc59f872ea07b728e14d5a64f1ad3a2cc01a3259c965/coverage-7.6.12-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2458f275944db8129f95d91aee32c828a408481ecde3b30af31d552c2ce284a0", size = 253988 }, + { url = "https://files.pythonhosted.org/packages/65/19/069fec4d6908d0dae98126aa7ad08ce5130a6decc8509da7740d36e8e8d2/coverage-7.6.12-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a9d8be07fb0832636a0f72b80d2a652fe665e80e720301fb22b191c3434d924", size = 249697 }, + { url = "https://files.pythonhosted.org/packages/1c/da/5b19f09ba39df7c55f77820736bf17bbe2416bbf5216a3100ac019e15839/coverage-7.6.12-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14d47376a4f445e9743f6c83291e60adb1b127607a3618e3185bbc8091f0467b", size = 252033 }, + { url = "https://files.pythonhosted.org/packages/1e/89/4c2750df7f80a7872267f7c5fe497c69d45f688f7b3afe1297e52e33f791/coverage-7.6.12-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b95574d06aa9d2bd6e5cc35a5bbe35696342c96760b69dc4287dbd5abd4ad51d", size = 251535 }, + { url = "https://files.pythonhosted.org/packages/78/3b/6d3ae3c1cc05f1b0460c51e6f6dcf567598cbd7c6121e5ad06643974703c/coverage-7.6.12-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:ecea0c38c9079570163d663c0433a9af4094a60aafdca491c6a3d248c7432827", size = 249192 }, + { url = "https://files.pythonhosted.org/packages/6e/8e/c14a79f535ce41af7d436bbad0d3d90c43d9e38ec409b4770c894031422e/coverage-7.6.12-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2251fabcfee0a55a8578a9d29cecfee5f2de02f11530e7d5c5a05859aa85aee9", size = 250627 }, + { url = "https://files.pythonhosted.org/packages/cb/79/b7cee656cfb17a7f2c1b9c3cee03dd5d8000ca299ad4038ba64b61a9b044/coverage-7.6.12-cp313-cp313t-win32.whl", hash = "sha256:eb5507795caabd9b2ae3f1adc95f67b1104971c22c624bb354232d65c4fc90b3", size = 212033 }, + { url = "https://files.pythonhosted.org/packages/b6/c3/f7aaa3813f1fa9a4228175a7bd368199659d392897e184435a3b66408dd3/coverage-7.6.12-cp313-cp313t-win_amd64.whl", hash = "sha256:f60a297c3987c6c02ffb29effc70eadcbb412fe76947d394a1091a3615948e2f", size = 213240 }, + { url = "https://files.pythonhosted.org/packages/6c/eb/cf062b1c3dbdcafd64a2a154beea2e4aa8e9886c34e41f53fa04925c8b35/coverage-7.6.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e7575ab65ca8399c8c4f9a7d61bbd2d204c8b8e447aab9d355682205c9dd948d", size = 208343 }, + { url = "https://files.pythonhosted.org/packages/95/42/4ebad0ab065228e29869a060644712ab1b0821d8c29bfefa20c2118c9e19/coverage-7.6.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8161d9fbc7e9fe2326de89cd0abb9f3599bccc1287db0aba285cb68d204ce929", size = 208769 }, + { url = "https://files.pythonhosted.org/packages/44/9f/421e84f7f9455eca85ff85546f26cbc144034bb2587e08bfc214dd6e9c8f/coverage-7.6.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a1e465f398c713f1b212400b4e79a09829cd42aebd360362cd89c5bdc44eb87", size = 237553 }, + { url = "https://files.pythonhosted.org/packages/c9/c4/a2c4f274bcb711ed5db2ccc1b851ca1c45f35ed6077aec9d6c61845d80e3/coverage-7.6.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f25d8b92a4e31ff1bd873654ec367ae811b3a943583e05432ea29264782dc32c", size = 235473 }, + { url = "https://files.pythonhosted.org/packages/e0/10/a3d317e38e5627b06debe861d6c511b1611dd9dc0e2a47afbe6257ffd341/coverage-7.6.12-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a936309a65cc5ca80fa9f20a442ff9e2d06927ec9a4f54bcba9c14c066323f2", size = 236575 }, + { url = "https://files.pythonhosted.org/packages/4d/49/51cd991b56257d2e07e3d5cb053411e9de5b0f4e98047167ec05e4e19b55/coverage-7.6.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:aa6f302a3a0b5f240ee201297fff0bbfe2fa0d415a94aeb257d8b461032389bd", size = 235690 }, + { url = "https://files.pythonhosted.org/packages/f7/87/631e5883fe0a80683a1f20dadbd0f99b79e17a9d8ea9aff3a9b4cfe50b93/coverage-7.6.12-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f973643ef532d4f9be71dd88cf7588936685fdb576d93a79fe9f65bc337d9d73", size = 234040 }, + { url = "https://files.pythonhosted.org/packages/7c/34/edd03f6933f766ec97dddd178a7295855f8207bb708dbac03777107ace5b/coverage-7.6.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:78f5243bb6b1060aed6213d5107744c19f9571ec76d54c99cc15938eb69e0e86", size = 235048 }, + { url = "https://files.pythonhosted.org/packages/ee/1e/d45045b7d3012fe518c617a57b9f9396cdaebe6455f1b404858b32c38cdd/coverage-7.6.12-cp39-cp39-win32.whl", hash = "sha256:69e62c5034291c845fc4df7f8155e8544178b6c774f97a99e2734b05eb5bed31", size = 211085 }, + { url = "https://files.pythonhosted.org/packages/df/ea/086cb06af14a84fe773b86aa140892006a906c5ec947e609ceb6a93f6257/coverage-7.6.12-cp39-cp39-win_amd64.whl", hash = "sha256:b01a840ecc25dce235ae4c1b6a0daefb2a203dba0e6e980637ee9c2f6ee0df57", size = 211965 }, + { url = "https://files.pythonhosted.org/packages/7a/7f/05818c62c7afe75df11e0233bd670948d68b36cdbf2a339a095bc02624a8/coverage-7.6.12-pp39.pp310-none-any.whl", hash = "sha256:7e39e845c4d764208e7b8f6a21c541ade741e2c41afabdfa1caa28687a3c98cf", size = 200558 }, + { url = "https://files.pythonhosted.org/packages/fb/b2/f655700e1024dec98b10ebaafd0cedbc25e40e4abe62a3c8e2ceef4f8f0a/coverage-7.6.12-py3-none-any.whl", hash = "sha256:eb8668cfbc279a536c633137deeb9435d2962caec279c3f8cf8b91fff6ff8953", size = 200552 }, ] [package.optional-dependencies] @@ -781,40 +787,44 @@ toml = [ [[package]] name = "cryptography" -version = "44.0.0" +version = "44.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", version = "1.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10' and platform_python_implementation != 'PyPy'" }, { name = "cffi", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/91/4c/45dfa6829acffa344e3967d6006ee4ae8be57af746ae2eba1c431949b32c/cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02", size = 710657 } +sdist = { url = "https://files.pythonhosted.org/packages/c7/67/545c79fe50f7af51dbad56d16b23fe33f63ee6a5d956b3cb68ea110cbe64/cryptography-44.0.1.tar.gz", hash = "sha256:f51f5705ab27898afda1aaa430f34ad90dc117421057782022edf0600bec5f14", size = 710819 } wheels = [ - { url = "https://files.pythonhosted.org/packages/55/09/8cc67f9b84730ad330b3b72cf867150744bf07ff113cda21a15a1c6d2c7c/cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123", size = 6541833 }, - { url = "https://files.pythonhosted.org/packages/7e/5b/3759e30a103144e29632e7cb72aec28cedc79e514b2ea8896bb17163c19b/cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092", size = 3922710 }, - { url = "https://files.pythonhosted.org/packages/5f/58/3b14bf39f1a0cfd679e753e8647ada56cddbf5acebffe7db90e184c76168/cryptography-44.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f", size = 4137546 }, - { url = "https://files.pythonhosted.org/packages/98/65/13d9e76ca19b0ba5603d71ac8424b5694415b348e719db277b5edc985ff5/cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb", size = 3915420 }, - { url = "https://files.pythonhosted.org/packages/b1/07/40fe09ce96b91fc9276a9ad272832ead0fddedcba87f1190372af8e3039c/cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b", size = 4154498 }, - { url = "https://files.pythonhosted.org/packages/75/ea/af65619c800ec0a7e4034207aec543acdf248d9bffba0533342d1bd435e1/cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543", size = 3932569 }, - { url = "https://files.pythonhosted.org/packages/c7/af/d1deb0c04d59612e3d5e54203159e284d3e7a6921e565bb0eeb6269bdd8a/cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e", size = 4016721 }, - { url = "https://files.pythonhosted.org/packages/bd/69/7ca326c55698d0688db867795134bdfac87136b80ef373aaa42b225d6dd5/cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e", size = 4240915 }, - { url = "https://files.pythonhosted.org/packages/ef/d4/cae11bf68c0f981e0413906c6dd03ae7fa864347ed5fac40021df1ef467c/cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053", size = 2757925 }, - { url = "https://files.pythonhosted.org/packages/64/b1/50d7739254d2002acae64eed4fc43b24ac0cc44bf0a0d388d1ca06ec5bb1/cryptography-44.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd", size = 3202055 }, - { url = "https://files.pythonhosted.org/packages/11/18/61e52a3d28fc1514a43b0ac291177acd1b4de00e9301aaf7ef867076ff8a/cryptography-44.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591", size = 6542801 }, - { url = "https://files.pythonhosted.org/packages/1a/07/5f165b6c65696ef75601b781a280fc3b33f1e0cd6aa5a92d9fb96c410e97/cryptography-44.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7", size = 3922613 }, - { url = "https://files.pythonhosted.org/packages/28/34/6b3ac1d80fc174812486561cf25194338151780f27e438526f9c64e16869/cryptography-44.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc", size = 4137925 }, - { url = "https://files.pythonhosted.org/packages/d0/c7/c656eb08fd22255d21bc3129625ed9cd5ee305f33752ef2278711b3fa98b/cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289", size = 3915417 }, - { url = "https://files.pythonhosted.org/packages/ef/82/72403624f197af0db6bac4e58153bc9ac0e6020e57234115db9596eee85d/cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7", size = 4155160 }, - { url = "https://files.pythonhosted.org/packages/a2/cd/2f3c440913d4329ade49b146d74f2e9766422e1732613f57097fea61f344/cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c", size = 3932331 }, - { url = "https://files.pythonhosted.org/packages/7f/df/8be88797f0a1cca6e255189a57bb49237402b1880d6e8721690c5603ac23/cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64", size = 4017372 }, - { url = "https://files.pythonhosted.org/packages/af/36/5ccc376f025a834e72b8e52e18746b927f34e4520487098e283a719c205e/cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285", size = 4239657 }, - { url = "https://files.pythonhosted.org/packages/46/b0/f4f7d0d0bcfbc8dd6296c1449be326d04217c57afb8b2594f017eed95533/cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417", size = 2758672 }, - { url = "https://files.pythonhosted.org/packages/97/9b/443270b9210f13f6ef240eff73fd32e02d381e7103969dc66ce8e89ee901/cryptography-44.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede", size = 3202071 }, - { url = "https://files.pythonhosted.org/packages/77/d4/fea74422326388bbac0c37b7489a0fcb1681a698c3b875959430ba550daa/cryptography-44.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731", size = 3338857 }, - { url = "https://files.pythonhosted.org/packages/1a/aa/ba8a7467c206cb7b62f09b4168da541b5109838627f582843bbbe0235e8e/cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4", size = 3850615 }, - { url = "https://files.pythonhosted.org/packages/89/fa/b160e10a64cc395d090105be14f399b94e617c879efd401188ce0fea39ee/cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756", size = 4081622 }, - { url = "https://files.pythonhosted.org/packages/47/8f/20ff0656bb0cf7af26ec1d01f780c5cfbaa7666736063378c5f48558b515/cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c", size = 3867546 }, - { url = "https://files.pythonhosted.org/packages/38/d9/28edf32ee2fcdca587146bcde90102a7319b2f2c690edfa627e46d586050/cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa", size = 4090937 }, - { url = "https://files.pythonhosted.org/packages/cc/9d/37e5da7519de7b0b070a3fedd4230fe76d50d2a21403e0f2153d70ac4163/cryptography-44.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c", size = 3128774 }, + { url = "https://files.pythonhosted.org/packages/72/27/5e3524053b4c8889da65cf7814a9d0d8514a05194a25e1e34f46852ee6eb/cryptography-44.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf688f615c29bfe9dfc44312ca470989279f0e94bb9f631f85e3459af8efc009", size = 6642022 }, + { url = "https://files.pythonhosted.org/packages/34/b9/4d1fa8d73ae6ec350012f89c3abfbff19fc95fe5420cf972e12a8d182986/cryptography-44.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd7c7e2d71d908dc0f8d2027e1604102140d84b155e658c20e8ad1304317691f", size = 3943865 }, + { url = "https://files.pythonhosted.org/packages/6e/57/371a9f3f3a4500807b5fcd29fec77f418ba27ffc629d88597d0d1049696e/cryptography-44.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887143b9ff6bad2b7570da75a7fe8bbf5f65276365ac259a5d2d5147a73775f2", size = 4162562 }, + { url = "https://files.pythonhosted.org/packages/c5/1d/5b77815e7d9cf1e3166988647f336f87d5634a5ccecec2ffbe08ef8dd481/cryptography-44.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:322eb03ecc62784536bc173f1483e76747aafeb69c8728df48537eb431cd1911", size = 3951923 }, + { url = "https://files.pythonhosted.org/packages/28/01/604508cd34a4024467cd4105887cf27da128cba3edd435b54e2395064bfb/cryptography-44.0.1-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:21377472ca4ada2906bc313168c9dc7b1d7ca417b63c1c3011d0c74b7de9ae69", size = 3685194 }, + { url = "https://files.pythonhosted.org/packages/c6/3d/d3c55d4f1d24580a236a6753902ef6d8aafd04da942a1ee9efb9dc8fd0cb/cryptography-44.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:df978682c1504fc93b3209de21aeabf2375cb1571d4e61907b3e7a2540e83026", size = 4187790 }, + { url = "https://files.pythonhosted.org/packages/ea/a6/44d63950c8588bfa8594fd234d3d46e93c3841b8e84a066649c566afb972/cryptography-44.0.1-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:eb3889330f2a4a148abead555399ec9a32b13b7c8ba969b72d8e500eb7ef84cd", size = 3951343 }, + { url = "https://files.pythonhosted.org/packages/c1/17/f5282661b57301204cbf188254c1a0267dbd8b18f76337f0a7ce1038888c/cryptography-44.0.1-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:8e6a85a93d0642bd774460a86513c5d9d80b5c002ca9693e63f6e540f1815ed0", size = 4187127 }, + { url = "https://files.pythonhosted.org/packages/f3/68/abbae29ed4f9d96596687f3ceea8e233f65c9645fbbec68adb7c756bb85a/cryptography-44.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6f76fdd6fd048576a04c5210d53aa04ca34d2ed63336d4abd306d0cbe298fddf", size = 4070666 }, + { url = "https://files.pythonhosted.org/packages/0f/10/cf91691064a9e0a88ae27e31779200b1505d3aee877dbe1e4e0d73b4f155/cryptography-44.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6c8acf6f3d1f47acb2248ec3ea261171a671f3d9428e34ad0357148d492c7864", size = 4288811 }, + { url = "https://files.pythonhosted.org/packages/38/78/74ea9eb547d13c34e984e07ec8a473eb55b19c1451fe7fc8077c6a4b0548/cryptography-44.0.1-cp37-abi3-win32.whl", hash = "sha256:24979e9f2040c953a94bf3c6782e67795a4c260734e5264dceea65c8f4bae64a", size = 2771882 }, + { url = "https://files.pythonhosted.org/packages/cf/6c/3907271ee485679e15c9f5e93eac6aa318f859b0aed8d369afd636fafa87/cryptography-44.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:fd0ee90072861e276b0ff08bd627abec29e32a53b2be44e41dbcdf87cbee2b00", size = 3206989 }, + { url = "https://files.pythonhosted.org/packages/9f/f1/676e69c56a9be9fd1bffa9bc3492366901f6e1f8f4079428b05f1414e65c/cryptography-44.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a2d8a7045e1ab9b9f803f0d9531ead85f90c5f2859e653b61497228b18452008", size = 6643714 }, + { url = "https://files.pythonhosted.org/packages/ba/9f/1775600eb69e72d8f9931a104120f2667107a0ee478f6ad4fe4001559345/cryptography-44.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8272f257cf1cbd3f2e120f14c68bff2b6bdfcc157fafdee84a1b795efd72862", size = 3943269 }, + { url = "https://files.pythonhosted.org/packages/25/ba/e00d5ad6b58183829615be7f11f55a7b6baa5a06910faabdc9961527ba44/cryptography-44.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e8d181e90a777b63f3f0caa836844a1182f1f265687fac2115fcf245f5fbec3", size = 4166461 }, + { url = "https://files.pythonhosted.org/packages/b3/45/690a02c748d719a95ab08b6e4decb9d81e0ec1bac510358f61624c86e8a3/cryptography-44.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:436df4f203482f41aad60ed1813811ac4ab102765ecae7a2bbb1dbb66dcff5a7", size = 3950314 }, + { url = "https://files.pythonhosted.org/packages/e6/50/bf8d090911347f9b75adc20f6f6569ed6ca9b9bff552e6e390f53c2a1233/cryptography-44.0.1-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4f422e8c6a28cf8b7f883eb790695d6d45b0c385a2583073f3cec434cc705e1a", size = 3686675 }, + { url = "https://files.pythonhosted.org/packages/e1/e7/cfb18011821cc5f9b21efb3f94f3241e3a658d267a3bf3a0f45543858ed8/cryptography-44.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:72198e2b5925155497a5a3e8c216c7fb3e64c16ccee11f0e7da272fa93b35c4c", size = 4190429 }, + { url = "https://files.pythonhosted.org/packages/07/ef/77c74d94a8bfc1a8a47b3cafe54af3db537f081742ee7a8a9bd982b62774/cryptography-44.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:2a46a89ad3e6176223b632056f321bc7de36b9f9b93b2cc1cccf935a3849dc62", size = 3950039 }, + { url = "https://files.pythonhosted.org/packages/6d/b9/8be0ff57c4592382b77406269b1e15650c9f1a167f9e34941b8515b97159/cryptography-44.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:53f23339864b617a3dfc2b0ac8d5c432625c80014c25caac9082314e9de56f41", size = 4189713 }, + { url = "https://files.pythonhosted.org/packages/78/e1/4b6ac5f4100545513b0847a4d276fe3c7ce0eacfa73e3b5ebd31776816ee/cryptography-44.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:888fcc3fce0c888785a4876ca55f9f43787f4c5c1cc1e2e0da71ad481ff82c5b", size = 4071193 }, + { url = "https://files.pythonhosted.org/packages/3d/cb/afff48ceaed15531eab70445abe500f07f8f96af2bb35d98af6bfa89ebd4/cryptography-44.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:00918d859aa4e57db8299607086f793fa7813ae2ff5a4637e318a25ef82730f7", size = 4289566 }, + { url = "https://files.pythonhosted.org/packages/30/6f/4eca9e2e0f13ae459acd1ca7d9f0257ab86e68f44304847610afcb813dc9/cryptography-44.0.1-cp39-abi3-win32.whl", hash = "sha256:9b336599e2cb77b1008cb2ac264b290803ec5e8e89d618a5e978ff5eb6f715d9", size = 2772371 }, + { url = "https://files.pythonhosted.org/packages/d2/05/5533d30f53f10239616a357f080892026db2d550a40c393d0a8a7af834a9/cryptography-44.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:e403f7f766ded778ecdb790da786b418a9f2394f36e8cc8b796cc056ab05f44f", size = 3207303 }, + { url = "https://files.pythonhosted.org/packages/15/06/507bfb5c7e048114a0185dd65f7814677a2ba285d15705c3d69e660c21d7/cryptography-44.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1f9a92144fa0c877117e9748c74501bea842f93d21ee00b0cf922846d9d0b183", size = 3380782 }, + { url = "https://files.pythonhosted.org/packages/e0/f1/7fb4982d59aa86e1a116c812b545e7fc045352be07738ae3fb278835a9a4/cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:610a83540765a8d8ce0f351ce42e26e53e1f774a6efb71eb1b41eb01d01c3d12", size = 3888155 }, + { url = "https://files.pythonhosted.org/packages/60/7b/cbc203838d3092203493d18b923fbbb1de64e0530b332a713ba376905b0b/cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5fed5cd6102bb4eb843e3315d2bf25fede494509bddadb81e03a859c1bc17b83", size = 4106417 }, + { url = "https://files.pythonhosted.org/packages/12/c7/2fe59fb085ab418acc82e91e040a6acaa7b1696fcc1c1055317537fbf0d3/cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f4daefc971c2d1f82f03097dc6f216744a6cd2ac0f04c68fb935ea2ba2a0d420", size = 3887540 }, + { url = "https://files.pythonhosted.org/packages/48/89/09fc7b115f60f5bd970b80e32244f8e9aeeb9244bf870b63420cec3b5cd5/cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94f99f2b943b354a5b6307d7e8d19f5c423a794462bde2bf310c770ba052b1c4", size = 4106040 }, + { url = "https://files.pythonhosted.org/packages/2e/38/3fd83c4690dc7d753a442a284b3826ea5e5c380a411443c66421cd823898/cryptography-44.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d9c5b9f698a83c8bd71e0f4d3f9f839ef244798e5ffe96febfa9714717db7af7", size = 3134657 }, ] [[package]] @@ -897,50 +907,50 @@ wheels = [ [[package]] name = "duckdb" -version = "1.1.3" +version = "1.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a0/d7/ec014b351b6bb026d5f473b1d0ec6bd6ba40786b9abbf530b4c9041d9895/duckdb-1.1.3.tar.gz", hash = "sha256:68c3a46ab08836fe041d15dcbf838f74a990d551db47cb24ab1c4576fc19351c", size = 12240672 } +sdist = { url = "https://files.pythonhosted.org/packages/e3/e2/5e6820ec8cc50c4ab6172debea68e2236ea6a5d9caa56297cfb42fca1fa2/duckdb-1.2.0.tar.gz", hash = "sha256:a5ce81828e6d1c3f06836d3bda38eef8355765f08ad5ce239abd6f56934dd1f8", size = 11586759 } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/7e/aef0fa22a80939edb04f66152a1fd5ce7257931576be192a8068e74f0892/duckdb-1.1.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:1c0226dc43e2ee4cc3a5a4672fddb2d76fd2cf2694443f395c02dd1bea0b7fce", size = 15469781 }, - { url = "https://files.pythonhosted.org/packages/38/22/df548714ddd915929ebbba9699e8614655ed93cd367f5849f6dbd1b3e160/duckdb-1.1.3-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:7c71169fa804c0b65e49afe423ddc2dc83e198640e3b041028da8110f7cd16f7", size = 32313005 }, - { url = "https://files.pythonhosted.org/packages/9f/38/8de640857f4c55df870faf025835e09c69222d365dc773507e934cee3376/duckdb-1.1.3-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:872d38b65b66e3219d2400c732585c5b4d11b13d7a36cd97908d7981526e9898", size = 16931481 }, - { url = "https://files.pythonhosted.org/packages/41/9b/87fff1341a9f57ab75284d79f902fee8cd6ef3a9135af4c723c90384d307/duckdb-1.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25fb02629418c0d4d94a2bc1776edaa33f6f6ccaa00bd84eb96ecb97ae4b50e9", size = 18491670 }, - { url = "https://files.pythonhosted.org/packages/3e/ee/8f74ccecbafd14e257c634f0f2cdebbc35634d9d74f04bb7ad8a0e142bf8/duckdb-1.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3f5cd604e7c39527e6060f430769b72234345baaa0987f9500988b2814f5e4", size = 20144774 }, - { url = "https://files.pythonhosted.org/packages/36/7b/edffb833b8569a7fc1799ceb4392911e0082f18a6076225441e954a95853/duckdb-1.1.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08935700e49c187fe0e9b2b86b5aad8a2ccd661069053e38bfaed3b9ff795efd", size = 18287084 }, - { url = "https://files.pythonhosted.org/packages/a9/ab/6367e8c98b3331260bb4389c6b80deef96614c1e21edcdba23a882e45ab0/duckdb-1.1.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f9b47036945e1db32d70e414a10b1593aec641bd4c5e2056873d971cc21e978b", size = 21614877 }, - { url = "https://files.pythonhosted.org/packages/03/d8/89b1c5f1dbd16342640742f6f6d3f1c827d1a1b966d674774ddfe6a385e2/duckdb-1.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:35c420f58abc79a68a286a20fd6265636175fadeca1ce964fc8ef159f3acc289", size = 10954044 }, - { url = "https://files.pythonhosted.org/packages/57/d0/96127582230183dc36f1209d5e8e67f54b3459b3b9794603305d816f350a/duckdb-1.1.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:4f0e2e5a6f5a53b79aee20856c027046fba1d73ada6178ed8467f53c3877d5e0", size = 15469495 }, - { url = "https://files.pythonhosted.org/packages/70/07/b78b435f8fe85c23ee2d49a01dc9599bb4a272c40f2a6bf67ff75958bdad/duckdb-1.1.3-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:911d58c22645bfca4a5a049ff53a0afd1537bc18fedb13bc440b2e5af3c46148", size = 32318595 }, - { url = "https://files.pythonhosted.org/packages/6c/d8/253b3483fc554daf72503ba0f112404f75be6bbd7ca7047e804873cbb182/duckdb-1.1.3-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:c443d3d502335e69fc1e35295fcfd1108f72cb984af54c536adfd7875e79cee5", size = 16934057 }, - { url = "https://files.pythonhosted.org/packages/f8/11/908a8fb73cef8304d3f4eab7f27cc489f6fd675f921d382c83c55253be86/duckdb-1.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a55169d2d2e2e88077d91d4875104b58de45eff6a17a59c7dc41562c73df4be", size = 18498214 }, - { url = "https://files.pythonhosted.org/packages/bf/56/f627b6fcd4aa34015a15449d852ccb78d7cc6eda654aa20c1d378e99fa76/duckdb-1.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d0767ada9f06faa5afcf63eb7ba1befaccfbcfdac5ff86f0168c673dd1f47aa", size = 20149376 }, - { url = "https://files.pythonhosted.org/packages/b5/1d/c318dada688119b9ca975d431f9b38bde8dda41b6d18cc06e0dc52123788/duckdb-1.1.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51c6d79e05b4a0933672b1cacd6338f882158f45ef9903aef350c4427d9fc898", size = 18293289 }, - { url = "https://files.pythonhosted.org/packages/37/8e/fd346444b270ffe52e06c1af1243eaae30ab651c1d59f51711e3502fd060/duckdb-1.1.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:183ac743f21c6a4d6adfd02b69013d5fd78e5e2cd2b4db023bc8a95457d4bc5d", size = 21622129 }, - { url = "https://files.pythonhosted.org/packages/18/aa/804c1cf5077b6f17d752b23637d9ef53eaad77ea73ee43d4c12bff480e36/duckdb-1.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:a30dd599b8090ea6eafdfb5a9f1b872d78bac318b6914ada2d35c7974d643640", size = 10954756 }, - { url = "https://files.pythonhosted.org/packages/9b/ff/7ee500f4cff0d2a581c1afdf2c12f70ee3bf1a61041fea4d88934a35a7a3/duckdb-1.1.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:a433ae9e72c5f397c44abdaa3c781d94f94f4065bcbf99ecd39433058c64cb38", size = 15482881 }, - { url = "https://files.pythonhosted.org/packages/28/16/dda10da6bde54562c3cb0002ca3b7678e3108fa73ac9b7509674a02c5249/duckdb-1.1.3-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:d08308e0a46c748d9c30f1d67ee1143e9c5ea3fbcccc27a47e115b19e7e78aa9", size = 32349440 }, - { url = "https://files.pythonhosted.org/packages/2e/c2/06f7f7a51a1843c9384e1637abb6bbebc29367710ffccc7e7e52d72b3dd9/duckdb-1.1.3-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:5d57776539211e79b11e94f2f6d63de77885f23f14982e0fac066f2885fcf3ff", size = 16953473 }, - { url = "https://files.pythonhosted.org/packages/1a/84/9991221ef7dde79d85231f20646e1b12d645490cd8be055589276f62847e/duckdb-1.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e59087dbbb63705f2483544e01cccf07d5b35afa58be8931b224f3221361d537", size = 18491915 }, - { url = "https://files.pythonhosted.org/packages/aa/76/330fe16f12b7ddda0c664ba9869f3afbc8773dbe17ae750121d407dc0f37/duckdb-1.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ebf5f60ddbd65c13e77cddb85fe4af671d31b851f125a4d002a313696af43f1", size = 20150288 }, - { url = "https://files.pythonhosted.org/packages/c4/88/e4b08b7a5d08c0f65f6c7a6594de64431ce7df38d7258511417ba7989ad3/duckdb-1.1.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4ef7ba97a65bd39d66f2a7080e6fb60e7c3e41d4c1e19245f90f53b98e3ac32", size = 18296560 }, - { url = "https://files.pythonhosted.org/packages/1a/32/011e6e3ce14375a1ba01a588c119ad82be757f847c6b60207e0762d9ec3a/duckdb-1.1.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f58db1b65593ff796c8ea6e63e2e144c944dd3d51c8d8e40dffa7f41693d35d3", size = 21635270 }, - { url = "https://files.pythonhosted.org/packages/f2/eb/58d4e0eccdc7b3523c062d008ad9eef28edccf88591d1a78659c809fe6e8/duckdb-1.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:e86006958e84c5c02f08f9b96f4bc26990514eab329b1b4f71049b3727ce5989", size = 10955715 }, - { url = "https://files.pythonhosted.org/packages/81/d1/2462492531d4715b2ede272a26519b37f21cf3f8c85b3eb88da5b7be81d8/duckdb-1.1.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:0897f83c09356206ce462f62157ce064961a5348e31ccb2a557a7531d814e70e", size = 15483282 }, - { url = "https://files.pythonhosted.org/packages/af/a5/ec595aa223b911a62f24393908a8eaf8e0ed1c7c07eca5008f22aab070bc/duckdb-1.1.3-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:cddc6c1a3b91dcc5f32493231b3ba98f51e6d3a44fe02839556db2b928087378", size = 32350342 }, - { url = "https://files.pythonhosted.org/packages/08/27/e35116ab1ada5e54e52424e52d16ee9ae82db129025294e19c1d48a8b2b1/duckdb-1.1.3-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:1d9ab6143e73bcf17d62566e368c23f28aa544feddfd2d8eb50ef21034286f24", size = 16953863 }, - { url = "https://files.pythonhosted.org/packages/0d/ac/f2db3969a56cd96a3ba78b0fd161939322fb134bd07c98ecc7a7015d3efa/duckdb-1.1.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f073d15d11a328f2e6d5964a704517e818e930800b7f3fa83adea47f23720d3", size = 18494301 }, - { url = "https://files.pythonhosted.org/packages/cf/66/d0be7c9518b1b92185018bacd851f977a101c9818686f667bbf884abcfbc/duckdb-1.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5724fd8a49e24d730be34846b814b98ba7c304ca904fbdc98b47fa95c0b0cee", size = 20150992 }, - { url = "https://files.pythonhosted.org/packages/47/ae/c2df66e3716705f48775e692a1b8accbf3dc6e2c27a0ae307fb4b063e115/duckdb-1.1.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51e7dbd968b393343b226ab3f3a7b5a68dee6d3fe59be9d802383bf916775cb8", size = 18297818 }, - { url = "https://files.pythonhosted.org/packages/8e/7e/10310b754b7ec3349c411a0a88ecbf327c49b5714e3d35200e69c13fb093/duckdb-1.1.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00cca22df96aa3473fe4584f84888e2cf1c516e8c2dd837210daec44eadba586", size = 21635169 }, - { url = "https://files.pythonhosted.org/packages/83/be/46c0b89c9d4e1ba90af9bc184e88672c04d420d41342e4dc359c78d05981/duckdb-1.1.3-cp313-cp313-win_amd64.whl", hash = "sha256:77f26884c7b807c7edd07f95cf0b00e6d47f0de4a534ac1706a58f8bc70d0d31", size = 10955826 }, - { url = "https://files.pythonhosted.org/packages/e5/c4/8a0f629aadfa8e09574e70ceb2d4fa2e81dc36b67d353806e14474983403/duckdb-1.1.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:09c68522c30fc38fc972b8a75e9201616b96ae6da3444585f14cf0d116008c95", size = 15470008 }, - { url = "https://files.pythonhosted.org/packages/be/0c/9f85e133c2b84f87c70fc29cf89289f65602494f15304b392d82cb76aec4/duckdb-1.1.3-cp39-cp39-macosx_12_0_universal2.whl", hash = "sha256:8ee97ec337794c162c0638dda3b4a30a483d0587deda22d45e1909036ff0b739", size = 32312989 }, - { url = "https://files.pythonhosted.org/packages/1a/ff/6abd85726dcb4df11c405f80038c0959df3a08d1c4dd6f36c046c8587e10/duckdb-1.1.3-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:a1f83c7217c188b7ab42e6a0963f42070d9aed114f6200e3c923c8899c090f16", size = 16931410 }, - { url = "https://files.pythonhosted.org/packages/13/b1/478ceb0228fab92c1f6dd24c7bf0dcbbfd5c5ed690eb0492e72edc2cda0f/duckdb-1.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1aa3abec8e8995a03ff1a904b0e66282d19919f562dd0a1de02f23169eeec461", size = 18492142 }, - { url = "https://files.pythonhosted.org/packages/e3/9e/e3995491d4c3bc6b3e3e0f3bad55902225c09f571e296c1eb093f33c5c75/duckdb-1.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80158f4c7c7ada46245837d5b6869a336bbaa28436fbb0537663fa324a2750cd", size = 20144252 }, - { url = "https://files.pythonhosted.org/packages/53/16/c79fe2111451f85c4c08b1d3e09da4e0b0bf67095fb5908da497ed1e87d8/duckdb-1.1.3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:647f17bd126170d96a38a9a6f25fca47ebb0261e5e44881e3782989033c94686", size = 18288990 }, - { url = "https://files.pythonhosted.org/packages/5a/ce/6cd14acc799501c44bbc0617a8fbc6769acd145a6aef0fc49bba9399fd8b/duckdb-1.1.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:252d9b17d354beb9057098d4e5d5698e091a4f4a0d38157daeea5fc0ec161670", size = 21599071 }, - { url = "https://files.pythonhosted.org/packages/13/31/071c1ee0457caa93414b12c4204059823cbc20cf8ed4099a3e54919ea015/duckdb-1.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:eeacb598120040e9591f5a4edecad7080853aa8ac27e62d280f151f8c862afa3", size = 10988880 }, + { url = "https://files.pythonhosted.org/packages/94/07/21180c41ac06a7d4bf015193c79c7604bc40842e1011e267d0f5028fc4bb/duckdb-1.2.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:7452d3655063cc3062504b5b22f8968acb96ffcdc6c2b8207bbec9da1de1f884", size = 15231764 }, + { url = "https://files.pythonhosted.org/packages/86/ab/bd5227772167c1a04584deabb91de684e71d1949cb1ed61a8aadcdf86b63/duckdb-1.2.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:28d40a269212270e08b8541ea0922c3a893407897481cd484ad896bc2ba77a00", size = 31890664 }, + { url = "https://files.pythonhosted.org/packages/a1/8f/05bdfd5bac1d487b94f33b973cfea76961fec24fb54308cab120e3f3931d/duckdb-1.2.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:ed4586aa441a57f68e5fa5655b8a86509e1c3b6521ad4d40455ae4594e18cd59", size = 16761345 }, + { url = "https://files.pythonhosted.org/packages/bb/c6/1762972e6480df04e9c87d3639a10334a1d84a946430b66722419577a67b/duckdb-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07823a485bc656cf2f63020117fec5245aa7fb8d085a43700208ac8b7e728866", size = 18706369 }, + { url = "https://files.pythonhosted.org/packages/5d/aa/85e5fba03ae0b717d7aba6cc55c769c47a17e470dcd9243a2f29e4cc7020/duckdb-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3b86475373cbd000035f34ba02420bc8ff432eaa646b09c5de975610120155d", size = 20168319 }, + { url = "https://files.pythonhosted.org/packages/e3/35/557d5d1fb2203d2740c2fcd8457efc0d400d8951238269c0e0caaac8bb0d/duckdb-1.2.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be7a14d1380ea8345b27bf5bbe77209c14ee0277c7401f504a2519936f9d087e", size = 18359562 }, + { url = "https://files.pythonhosted.org/packages/db/7a/82a7dd0858abe62faff35e0aaf2a4c5cf18c9bc57a63ffcb239307bfd073/duckdb-1.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c491485a14f806d12407d85510da8f09ad5d9a079ec449b7bff75eea5f9431c3", size = 21675852 }, + { url = "https://files.pythonhosted.org/packages/55/35/73663d33229a41ae95f0806ffcbc5a7322600eee6b6191e9a031927051df/duckdb-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:c8f6c09c939deb0bccaa6485798dacef0969046d1aa845ef10063558c8ee14e0", size = 11351568 }, + { url = "https://files.pythonhosted.org/packages/5a/80/09a9901a8c9d87727c464f25a0035325ecfceef70563e680072b39dde433/duckdb-1.2.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:970a396b133608b5acb297cc172097866abbbce6cc57a2ec6b128b4f99a63ecd", size = 15237624 }, + { url = "https://files.pythonhosted.org/packages/26/72/0cbed5f9a7cbfc5362a190700f533bd61935a00ec6175455811858a36cd0/duckdb-1.2.0-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:ecd713a8388c1e173ef04aa5545873e93d44cb950c2af5459b44668676abc873", size = 31895156 }, + { url = "https://files.pythonhosted.org/packages/97/45/bbc024b73e64762b43b41d32f68398a7901b71ee294ebb5840b726edc345/duckdb-1.2.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:9e1323ab11ca9ee72bb3c54dfb4919add4b2aa524085bac80c2a888ce673cdf0", size = 16764343 }, + { url = "https://files.pythonhosted.org/packages/9d/24/3aa96f24078613b1166ec95cdd99835fd70411980910f4508ee79084718e/duckdb-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c22e4ddcf1a76b4cf90cac23de06910557b239b4ba783e6dec1e04210de897e9", size = 18709384 }, + { url = "https://files.pythonhosted.org/packages/88/7e/00a6b7fc88b98deded4c08f51a30711b1d5b6518b867840c5679f66e62ce/duckdb-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55f2b0fbe63786061b028f48e41efcecfdcf3d5f8cb5ce415ee1d5885691c19f", size = 20171009 }, + { url = "https://files.pythonhosted.org/packages/60/e0/9f3d528bf843c15996caa9454ea2437d50c657715ee525115fa6d0ffa45f/duckdb-1.2.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d6dc9fd4c6f3505d7d69eed05d26a345d9652a4dab791b6d95ac18d6cdda2041", size = 18365090 }, + { url = "https://files.pythonhosted.org/packages/f9/0c/8e949652c2378383d2ea6771ffef1cb3bb29d1f4822310fd3ff4f90e16ed/duckdb-1.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4788c1f6d588be232b4a9dbc2c4a3546cd1ced945a1182d785cf913a5bd122a3", size = 21678264 }, + { url = "https://files.pythonhosted.org/packages/ef/79/6093ddd297c0f39943b42bcb5b74d8f4f1ad4489ff615af2a204f4f27723/duckdb-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:eeb5a517445d18949610cd30da1215303693cdae2942e6b1b7661314380f715e", size = 11351100 }, + { url = "https://files.pythonhosted.org/packages/06/0d/eb787bc4f01603db350974299eadd5439a5a4b7c93abbf2ef8570b61ae43/duckdb-1.2.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:c0427501908d3b4fe464913b0ae2418ff52d1fa24b3982d864169b1d54b6bbee", size = 15253269 }, + { url = "https://files.pythonhosted.org/packages/c6/c5/0a44aab15bee5ae5cb26d4eff62cde294ab30008e7d79c20ae3506806642/duckdb-1.2.0-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:33df2430f35e68739fd9fb6bbe1a5f86f4f46b362c9abb3a3f74a989560ef597", size = 31928134 }, + { url = "https://files.pythonhosted.org/packages/36/42/7b009c605f7e14aae2e97ae5a13ab732e48c013f66b2ef634d9eac1d106d/duckdb-1.2.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:fd8ca2910efb85f0dd0d50383eaed9b6b7e86e6cacb032c36712e84265855e58", size = 16785162 }, + { url = "https://files.pythonhosted.org/packages/af/37/dea4aaf505d8893873719342a69b61318188287fc63ad669031012be62f3/duckdb-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9747d3d2a3290c795c0343eb927dbc75ca78d0440726824c2a39d9634fba9394", size = 18708026 }, + { url = "https://files.pythonhosted.org/packages/d6/73/0f019556ea1558c3c7d376554bf77956bef9a7fef605bba1ba29b3092adb/duckdb-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91704accb74223267ae226f3470d71f7ad824549482b3f7fc91710a9fe5a1152", size = 20182548 }, + { url = "https://files.pythonhosted.org/packages/f4/96/34d14a62835983f92c0a492ad39ab28ccf79e61a71edd7c95f8f94776fb5/duckdb-1.2.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9357737c6699b1f57e1d02b299371b2634bf08927d4e8386146ec5e4d1ebb31", size = 18378723 }, + { url = "https://files.pythonhosted.org/packages/70/6c/ddd22889033e9bb60ac216fb43c82796440491fa6d764eed34aae0496cc9/duckdb-1.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8d61ba5272dd1bf772b7a74f4964e83080602f8f6e9a46a0fa7203a4e0e05249", size = 21707163 }, + { url = "https://files.pythonhosted.org/packages/31/bc/65f19868c927285dd0ca50646861915e3e5f92a0d05e9e7d9e9faed2f16e/duckdb-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:f317cfa2f6ff3bc209985715669f4b8dd601faa69e46a206163e53b8db61a1d1", size = 11351204 }, + { url = "https://files.pythonhosted.org/packages/4f/bf/6323895862cb696fd7cee3825204ad2f41db53cecadfc93068448492ec7a/duckdb-1.2.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7feaaf185e89138e3d0f4dc9bf647767df1a3f080b4be719837613cb9288b79e", size = 15253479 }, + { url = "https://files.pythonhosted.org/packages/10/7e/0d5d4a9c46f9f3c1b95abc39466452a34168ef465338671d625213e175f6/duckdb-1.2.0-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:a52bb5991656cab0b90537c5e05746019be09c5f63535db03ddbff6f65b2ccb3", size = 31927430 }, + { url = "https://files.pythonhosted.org/packages/35/31/e3bf34ff89b111763b180315ebafa8ec1e12ffc82ca7def77dd79a356129/duckdb-1.2.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:4d10d5596667f82812b130f3e7fffb282a31c05525ee2f8adddfaa1a07529fe9", size = 16784897 }, + { url = "https://files.pythonhosted.org/packages/9d/e3/ece712e8b7aba4d463bc4222620ba8d6d3e599e89cbf69bc96b2d10d0671/duckdb-1.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436b7c0cd40a63fdce8477b03868026b60b2376cf155812be07392213b707874", size = 18708962 }, + { url = "https://files.pythonhosted.org/packages/5e/17/fb5bbcbc7f2441f21ae2aa74693dbca67219f5dfdeb57bad7af06d21ac4d/duckdb-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c6b8464d9bd5770071d4a00a457b4c09974b930ccb1fe99991cfa8ddda0b905", size = 20181906 }, + { url = "https://files.pythonhosted.org/packages/69/42/6fa3c0899b10d16206a4d26640c423572d299025fec3249ac4fa37a39ae7/duckdb-1.2.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2835bc4828d2e1f8ad58f8ef946815af8beb55f9697e6e9d5a028b81abc02c62", size = 18377184 }, + { url = "https://files.pythonhosted.org/packages/e3/6d/d3bcf9b5bd6d0a98c509c31b833776869407e6d6a000e25d6661070013a2/duckdb-1.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b35284599ac6bf6a09ffd334bc7f4d5df47126bce054a0f73b53f3eac1a5688e", size = 21703527 }, + { url = "https://files.pythonhosted.org/packages/22/2c/95dada2a1ebd52d49c79d8ac869c3503d609caa11d775b009bce542783f1/duckdb-1.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:5cf770fdd5244e47b3cbca6dd4ef2d13b6b9a6071f3fc7b55487e9ddff19e9cd", size = 11351098 }, + { url = "https://files.pythonhosted.org/packages/ce/24/9f4cec184cd0b51309a340d068fba139c6ae711856dba4a74874c66aadf8/duckdb-1.2.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f802ddf4d87d319fd957d5dbc283db750c970909b6456bd3e3a51f61e153b524", size = 15232621 }, + { url = "https://files.pythonhosted.org/packages/4c/79/469bcc68fc1c959a6dfc1ad8032f6cbad03e5c8d642a42dbde331825357a/duckdb-1.2.0-cp39-cp39-macosx_12_0_universal2.whl", hash = "sha256:238093c290e63f010684a970e1af0780f8974b3a812b4f6a734d78a73658bd3d", size = 31890590 }, + { url = "https://files.pythonhosted.org/packages/d6/dd/084d038d948b240d482718eedf1297d3b63a0e2c890d6c4abc93a0fcd7db/duckdb-1.2.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:a7d2577229c699431f620bdd1e97175e558f8bfd0f56fa6bcc41f13841148b91", size = 16760665 }, + { url = "https://files.pythonhosted.org/packages/c0/44/efbbe3a35d55a86fe23f55d207309cadfb626f793d559145210f2851a989/duckdb-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8336c9e4c66ab7fd1ba8786a2551f96f2bbc9a8d6d86f109c5d4c86634635e4f", size = 18707133 }, + { url = "https://files.pythonhosted.org/packages/55/e6/aea827ebc97947ea127f1bbc5cbe00529e08622b20c58a42eb19ab724fd4/duckdb-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d01a72a4c6ba78882bc5d184b0768c9ac4351406af3e43a9da5810400acbdee", size = 20167222 }, + { url = "https://files.pythonhosted.org/packages/c6/3c/9d33d6d3b67b45dd3a80e0f2d34dd2714ee615b28b9f5bde05b52cd8cf64/duckdb-1.2.0-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5b4d0b997702f74669ffb43283f3291ee05ca464b68deabee9a365cd40fc729e", size = 18351773 }, + { url = "https://files.pythonhosted.org/packages/ea/89/42c1efb65ac2c338de06dac4cd63081a7af81d7c4a5098e35ea8f6fe92d2/duckdb-1.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:69ce703855e30aa253bf47a4002ee35a7c63ff970306879ae76ab355bfe03632", size = 21663190 }, + { url = "https://files.pythonhosted.org/packages/53/41/8a60a13a3bc0a396e563f132e94e761fc905e32ef08c10db65e88ddd006b/duckdb-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:a58c0763068fac7cf202a5ac9c0f85c0b6044a98185d73b5f049f955fd10b4e8", size = 11384877 }, ] [[package]] @@ -1237,7 +1247,7 @@ grpc = [ [[package]] name = "google-api-python-client" -version = "2.160.0" +version = "2.161.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "google-api-core" }, @@ -1246,9 +1256,9 @@ dependencies = [ { name = "httplib2" }, { name = "uritemplate" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/af/42/cbf81242376c99d6e5248e62aa4376bfde5bbefbe0a69b1b06fd4b73ab25/google_api_python_client-2.160.0.tar.gz", hash = "sha256:a8ccafaecfa42d15d5b5c3134ced8de08380019717fc9fb1ed510ca58eca3b7e", size = 12304236 } +sdist = { url = "https://files.pythonhosted.org/packages/0a/50/c8d2d3c4e65e081c4c07b15e4fe35671676c5ecdb3674a167229e83ce49a/google_api_python_client-2.161.0.tar.gz", hash = "sha256:324c0cce73e9ea0a0d2afd5937e01b7c2d6a4d7e2579cdb6c384f9699d6c9f37", size = 12358839 } wheels = [ - { url = "https://files.pythonhosted.org/packages/49/35/41623ac3b581781169eed7f5fcd24bc114c774dc491fab5c05d8eb81af36/google_api_python_client-2.160.0-py2.py3-none-any.whl", hash = "sha256:63d61fb3e4cf3fb31a70a87f45567c22f6dfe87bbfa27252317e3e2c42900db4", size = 12814302 }, + { url = "https://files.pythonhosted.org/packages/9c/e8/ca1efe224166a4c77ac92b4314b90f2fb70fdde1f763c1613ba3b9f50752/google_api_python_client-2.161.0-py2.py3-none-any.whl", hash = "sha256:9476a5a4f200bae368140453df40f9cda36be53fa7d0e9a9aac4cdb859a26448", size = 12869974 }, ] [[package]] @@ -1280,7 +1290,7 @@ wheels = [ [[package]] name = "google-cloud-aiplatform" -version = "1.79.0" +version = "1.80.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docstring-parser" }, @@ -1296,9 +1306,9 @@ dependencies = [ { name = "shapely" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a5/8e/93e9f5a7059883c21a82adf8687248c6615d4b833b3bf665631a768b8ebd/google_cloud_aiplatform-1.79.0.tar.gz", hash = "sha256:362bfd16716dcfb6c131736f25246790002b29c99a246fcf4c08a7c71bd2301f", size = 8455732 } +sdist = { url = "https://files.pythonhosted.org/packages/f0/88/d36384280cc4653e190a4a30025e66b285fbaef06024f68a4264cc588a33/google_cloud_aiplatform-1.80.0.tar.gz", hash = "sha256:bcaa4570a6fb56d3d29cb6b8f92588d4d1a1931de5f90cf07761853dab4c76fd", size = 8459480 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/df/a7629fc1c405ead82249a70903068992932cc5a8c494c396e22995b4429d/google_cloud_aiplatform-1.79.0-py2.py3-none-any.whl", hash = "sha256:e52d518c386ce2b4ce57f1b73b46c57531d9a6ccd70c21a37b349f428bfc1c3f", size = 7086167 }, + { url = "https://files.pythonhosted.org/packages/b5/57/5e761e7a8b03efc8e7faa4c0b2775991177bbd4dae7a6656a60dfd092ca8/google_cloud_aiplatform-1.80.0-py2.py3-none-any.whl", hash = "sha256:45d2a170f22431dae977551eccb740400bdb899807d0c8d4c16c53b2c1dbc6a5", size = 7089949 }, ] [[package]] @@ -1431,14 +1441,14 @@ wheels = [ [[package]] name = "googleapis-common-protos" -version = "1.66.0" +version = "1.67.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ff/a7/8e9cccdb1c49870de6faea2a2764fa23f627dd290633103540209f03524c/googleapis_common_protos-1.66.0.tar.gz", hash = "sha256:c3e7b33d15fdca5374cc0a7346dd92ffa847425cc4ea941d970f13680052ec8c", size = 114376 } +sdist = { url = "https://files.pythonhosted.org/packages/31/e1/fbffb85a624f1404133b5bb624834e77e0f549e2b8548146fe18c56e1411/googleapis_common_protos-1.67.0.tar.gz", hash = "sha256:21398025365f138be356d5923e9168737d94d46a72aefee4a6110a1f23463c86", size = 57344 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/0f/c0713fb2b3d28af4b2fded3291df1c4d4f79a00d15c2374a9e010870016c/googleapis_common_protos-1.66.0-py2.py3-none-any.whl", hash = "sha256:d7abcd75fabb2e0ec9f74466401f6c119a0b498e27370e9be4c94cb7e382b8ed", size = 221682 }, + { url = "https://files.pythonhosted.org/packages/89/30/2bd0eb03a7dee7727cd2ec643d1e992979e62d5e7443507381cce0455132/googleapis_common_protos-1.67.0-py2.py3-none-any.whl", hash = "sha256:579de760800d13616f51cf8be00c876f00a9f146d3e6510e19d1f4111758b741", size = 164985 }, ] [package.optional-dependencies] @@ -1509,7 +1519,7 @@ wheels = [ [[package]] name = "groq" -version = "0.16.0" +version = "0.18.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1519,9 +1529,9 @@ dependencies = [ { name = "sniffio" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/80/95/44d8a1220239865f4a7c9515e879a19ee45284529b5a5dc2d2bd1cfc6b6b/groq-0.16.0.tar.gz", hash = "sha256:127cf364504d9e9f2b1b35ee64693e4740b785d54957d05bf5494cf26196044e", size = 111511 } +sdist = { url = "https://files.pythonhosted.org/packages/40/8c/e72c164474a88dfed6c7327ad53cb87ff11566b74b3a76d41dc7b94fc51c/groq-0.18.0.tar.gz", hash = "sha256:8e2ccfea406d68b3525af4b7c0e321fcb3d2a73fc60bb70b4156e6cd88c72f03", size = 117322 } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/2a/a96b0a1bba13474364fdabdc086da2866324bebfa4a4e51bcf8318831d3b/groq-0.16.0-py3-none-any.whl", hash = "sha256:74a4d2ea2d122eb272f44991bc82f5fdca975cc4374d0d09c5494337faccc05f", size = 109690 }, + { url = "https://files.pythonhosted.org/packages/b0/6c/5a53d632b44ef7655ac8d9b34432e13160917f9307c94b1467efd34e336e/groq-0.18.0-py3-none-any.whl", hash = "sha256:81d5ac00057a45d8ce559d23ab5d3b3893011d1f12c35187ab35a9182d826ea6", size = 121911 }, ] [[package]] @@ -1783,8 +1793,8 @@ version = "8.32.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_python_implementation != 'PyPy'", @@ -2092,10 +2102,11 @@ wheels = [ [[package]] name = "jupyter-events" -version = "0.11.0" +version = "0.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jsonschema", extra = ["format-nongpl"] }, + { name = "packaging" }, { name = "python-json-logger" }, { name = "pyyaml" }, { name = "referencing" }, @@ -2103,9 +2114,9 @@ dependencies = [ { name = "rfc3986-validator" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/65/5791c8a979b5646ca29ea50e42b6708908b789f7ff389d1a03c1b93a1c54/jupyter_events-0.11.0.tar.gz", hash = "sha256:c0bc56a37aac29c1fbc3bcfbddb8c8c49533f9cf11f1c4e6adadba936574ab90", size = 62039 } +sdist = { url = "https://files.pythonhosted.org/packages/9d/c3/306d090461e4cf3cd91eceaff84bede12a8e52cd821c2d20c9a4fd728385/jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b", size = 62196 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/8c/9b65cb2cd4ea32d885993d5542244641590530836802a2e8c7449a4c61c9/jupyter_events-0.11.0-py3-none-any.whl", hash = "sha256:36399b41ce1ca45fe8b8271067d6a140ffa54cec4028e95491c93b78a855cacf", size = 19423 }, + { url = "https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb", size = 19430 }, ] [[package]] @@ -2238,7 +2249,7 @@ dependencies = [ { name = "langchain-text-splitters" }, { name = "langsmith" }, { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "numpy", version = "2.2.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "pydantic" }, { name = "pyyaml" }, { name = "requests" }, @@ -2364,7 +2375,7 @@ requires-dist = [ { name = "langchain-aws", marker = "extra == 'aws'" }, { name = "langchain-cohere", marker = "extra == 'cohere'" }, { name = "langchain-community", marker = "extra == 'community'" }, - { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, + { name = "langchain-core", editable = "../core" }, { name = "langchain-deepseek", marker = "extra == 'deepseek'" }, { name = "langchain-fireworks", marker = "extra == 'fireworks'" }, { name = "langchain-google-genai", marker = "extra == 'google-genai'" }, @@ -2373,8 +2384,8 @@ requires-dist = [ { name = "langchain-huggingface", marker = "extra == 'huggingface'" }, { name = "langchain-mistralai", marker = "extra == 'mistralai'" }, { name = "langchain-ollama", marker = "extra == 'ollama'" }, - { name = "langchain-openai", marker = "extra == 'openai'" }, - { name = "langchain-text-splitters", specifier = ">=0.3.6,<1.0.0" }, + { name = "langchain-openai", marker = "extra == 'openai'", editable = "../partners/openai" }, + { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "langchain-together", marker = "extra == 'together'" }, { name = "langsmith", specifier = ">=0.1.17,<0.4" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.26.4,<2" }, @@ -2390,8 +2401,8 @@ requires-dist = [ codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "../core" }, + { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "playwright", specifier = ">=1.28.0,<2.0.0" }, { name = "setuptools", specifier = ">=67.6.1,<68.0.0" }, ] @@ -2406,10 +2417,10 @@ test = [ { name = "cffi", marker = "python_full_version >= '3.10'" }, { name = "duckdb-engine", specifier = ">=0.9.2,<1.0.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-openai", directory = "../partners/openai" }, - { name = "langchain-tests", directory = "../standard-tests" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "../core" }, + { name = "langchain-openai", editable = "../partners/openai" }, + { name = "langchain-tests", editable = "../standard-tests" }, + { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "lark", specifier = ">=1.1.5,<2.0.0" }, { name = "packaging", specifier = ">=24.2" }, { name = "pandas", specifier = ">=2.0.0,<3.0.0" }, @@ -2428,8 +2439,8 @@ test = [ ] test-integration = [ { name = "cassio", specifier = ">=0.1.0,<1.0.0" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "../core" }, + { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "langchainhub", specifier = ">=0.1.16,<1.0.0" }, { name = "pytest-vcr", specifier = ">=1.0.2,<2.0.0" }, { name = "python-dotenv", specifier = ">=1.0.0,<2.0.0" }, @@ -2437,8 +2448,8 @@ test-integration = [ { name = "wrapt", specifier = ">=1.15.0,<2.0.0" }, ] typing = [ - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "../core" }, + { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "mypy-protobuf", specifier = ">=3.0.0,<4.0.0" }, { name = "types-chardet", specifier = ">=5.0.4.6,<6.0.0.0" }, @@ -2471,7 +2482,7 @@ dependencies = [ { name = "boto3" }, { name = "langchain-core" }, { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "numpy", version = "2.2.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "pydantic" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/e8/7b6adbf0d922889da98905a6052819d17dd6501e370b6f115e0e4e074452/langchain_aws-0.2.12.tar.gz", hash = "sha256:98122987923b5f7933d62611efa632465de1ba335736e67ff09a6f9f18f285f8", size = 80069 } @@ -2497,7 +2508,7 @@ wheels = [ [[package]] name = "langchain-community" -version = "0.3.16" +version = "0.3.17" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -2507,22 +2518,22 @@ dependencies = [ { name = "langchain-core" }, { name = "langsmith" }, { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "numpy", version = "2.2.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "pydantic-settings" }, { name = "pyyaml" }, { name = "requests" }, { name = "sqlalchemy" }, { name = "tenacity" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/64/10/981e8980538d622cec2ce312ab5f307bc9b5dc43cf986be89273d6c24ede/langchain_community-0.3.16.tar.gz", hash = "sha256:825709bc328e294942b045d0b7f55053e8e88f7f943576306d778cf56417126c", size = 1729980 } +sdist = { url = "https://files.pythonhosted.org/packages/0a/e6/03df441525516f351a56aa2f156c8636daa4849f479032706680d8121e86/langchain_community-0.3.17.tar.gz", hash = "sha256:d8547a3d4f8307950be88ca638cd6ab1abe2440d0012e401a172ba4a39aa8044", size = 33213782 } wheels = [ - { url = "https://files.pythonhosted.org/packages/23/04/ba77fbbb408b233ac82eeea57ba4d988da67dcf60ad10a165691406f7de6/langchain_community-0.3.16-py3-none-any.whl", hash = "sha256:a702c577b048d48882a46708bb3e08ca9aec79657c421c3241a305409040c0d6", size = 2513021 }, + { url = "https://files.pythonhosted.org/packages/7e/31/39c30cab465774835e2c18d3746587e6fd0c9f7265b1c6b1fcd2e1684dd2/langchain_community-0.3.17-py3-none-any.whl", hash = "sha256:13bbd87d681b0df67bafa294321613b13ac524f173c92f11048d40c74e585f0b", size = 2516904 }, ] [[package]] name = "langchain-core" -version = "0.3.34" -source = { directory = "../core" } +version = "0.3.35" +source = { editable = "../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -2579,15 +2590,15 @@ typing = [ [[package]] name = "langchain-deepseek" -version = "0.1.1" +version = "0.1.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, { name = "langchain-openai" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/b8/e1fe19a6bb0e2a8e715bda6b0ac719f7e5b8137bb094fd591b9f62f237a3/langchain_deepseek-0.1.1.tar.gz", hash = "sha256:51bfd441d35029451921d9aebc9e66609d7cbbf5c9012c50391f78e1d74b6e97", size = 4550 } +sdist = { url = "https://files.pythonhosted.org/packages/76/50/53c67820df28cd15b53eb4bd6b8e212bf74ea50448637bd9c057897884db/langchain_deepseek-0.1.2.tar.gz", hash = "sha256:0ccb482d1241ed16a5578dcb7606b847d923b7dd56737e7e5ba20be635d0ca34", size = 5437 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/c9/5e2aae41ed670b13115b2a47a04c7b652c54664bf3e5677f5c6d81ef52f2/langchain_deepseek-0.1.1-py3-none-any.whl", hash = "sha256:6443bbb0e0789bd9ec5120aef05a0e579fe35f385b58f26e6d35507a67b7d519", size = 5234 }, + { url = "https://files.pythonhosted.org/packages/43/94/8a7b5629a784e40024ae9e352c656f63a8c94184f4477b60a6c2a42bac7d/langchain_deepseek-0.1.2-py3-none-any.whl", hash = "sha256:6ec76c621670afa763671eba8a54ff356b1772f3779fea4ea963cf01e5119145", size = 5627 }, ] [[package]] @@ -2698,8 +2709,8 @@ wheels = [ [[package]] name = "langchain-openai" -version = "0.3.4" -source = { directory = "../partners/openai" } +version = "0.3.5" +source = { editable = "../partners/openai" } dependencies = [ { name = "langchain-core" }, { name = "openai" }, @@ -2708,19 +2719,19 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, + { name = "langchain-core", editable = "../core" }, { name = "openai", specifier = ">=1.58.1,<2.0.0" }, { name = "tiktoken", specifier = ">=0.7,<1" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "../core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "../core" }, + { name = "langchain-tests", editable = "../standard-tests" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1,<2" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.0,<2.0.0" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, @@ -2739,7 +2750,7 @@ test-integration = [ { name = "pillow", specifier = ">=10.3.0,<11.0.0" }, ] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "types-tqdm", specifier = ">=4.66.0.5,<5.0.0.0" }, ] @@ -2747,12 +2758,12 @@ typing = [ [[package]] name = "langchain-tests" version = "0.3.11" -source = { directory = "../standard-tests" } +source = { editable = "../standard-tests" } dependencies = [ { name = "httpx" }, { name = "langchain-core" }, { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "numpy", version = "2.2.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "pytest" }, { name = "pytest-asyncio" }, { name = "pytest-socket" }, @@ -2762,7 +2773,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "httpx", specifier = ">=0.25.0,<1" }, - { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, + { name = "langchain-core", editable = "../core" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, { name = "pytest", specifier = ">=7,<9" }, @@ -2774,36 +2785,36 @@ requires-dist = [ [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] lint = [{ name = "ruff", specifier = ">=0.9.2,<1.0.0" }] -test = [{ name = "langchain-core", directory = "../core" }] +test = [{ name = "langchain-core", editable = "../core" }] test-integration = [] typing = [ - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../core" }, { name = "mypy", specifier = ">=1,<2" }, ] [[package]] name = "langchain-text-splitters" version = "0.3.6" -source = { directory = "../text-splitters" } +source = { editable = "../text-splitters" } dependencies = [ { name = "langchain-core" }, ] [package.metadata] -requires-dist = [{ name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }] +requires-dist = [{ name = "langchain-core", editable = "../core" }] [package.metadata.requires-dev] dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../core" }, ] lint = [ - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../core" }, { name = "ruff", specifier = ">=0.9.2,<1.0.0" }, ] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../core" }, { name = "pytest", specifier = ">=8,<9" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, @@ -2857,7 +2868,7 @@ wheels = [ [[package]] name = "langsmith" -version = "0.3.4" +version = "0.3.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, @@ -2867,9 +2878,9 @@ dependencies = [ { name = "requests-toolbelt" }, { name = "zstandard" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/04/246f077cfcece99f1f091fbc4866492e37a13fb1a98bc61d7a290cda12ba/langsmith-0.3.4.tar.gz", hash = "sha256:79fd516e68bbc30f408ab0b30a92175e5be0f5c21002e30a7804c59cb72cfe1a", size = 321953 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/1a/974b66a9e7c43f41bec067e1f393a296803aee48fafcf183941c31295b59/langsmith-0.3.8.tar.gz", hash = "sha256:97f9bebe0b7cb0a4f278e6ff30ae7d5ededff3883b014442ec6d7d575b02a0f1", size = 321394 } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/3b/02313e378f6328ada43ee43ecc81a398b4f68e207c94770d1ed6aac6cca2/langsmith-0.3.4-py3-none-any.whl", hash = "sha256:f3b818ce31dc3bdf1f797e75bf32a8a7b062a411f146bd4ffdfc2be0b4b03233", size = 333291 }, + { url = "https://files.pythonhosted.org/packages/8b/e4/5380e8229c442e406404977d2ec71a9db6a3e6a89fce7791c6ad7cd2bdbe/langsmith-0.3.8-py3-none-any.whl", hash = "sha256:fbb9dd97b0f090219447fca9362698d07abaeda1da85aa7cc6ec6517b36581b1", size = 332800 }, ] [[package]] @@ -3083,46 +3094,46 @@ wheels = [ [[package]] name = "mypy" -version = "1.14.1" +version = "1.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/eb/2c92d8ea1e684440f54fa49ac5d9a5f19967b7b472a281f419e69a8d228e/mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6", size = 3216051 } +sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/7a/87ae2adb31d68402da6da1e5f30c07ea6063e9f09b5e7cfc9dfa44075e74/mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb", size = 11211002 }, - { url = "https://files.pythonhosted.org/packages/e1/23/eada4c38608b444618a132be0d199b280049ded278b24cbb9d3fc59658e4/mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0", size = 10358400 }, - { url = "https://files.pythonhosted.org/packages/43/c9/d6785c6f66241c62fd2992b05057f404237deaad1566545e9f144ced07f5/mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d", size = 12095172 }, - { url = "https://files.pythonhosted.org/packages/c3/62/daa7e787770c83c52ce2aaf1a111eae5893de9e004743f51bfcad9e487ec/mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b", size = 12828732 }, - { url = "https://files.pythonhosted.org/packages/1b/a2/5fb18318a3637f29f16f4e41340b795da14f4751ef4f51c99ff39ab62e52/mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427", size = 13012197 }, - { url = "https://files.pythonhosted.org/packages/28/99/e153ce39105d164b5f02c06c35c7ba958aaff50a2babba7d080988b03fe7/mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f", size = 9780836 }, - { url = "https://files.pythonhosted.org/packages/da/11/a9422850fd506edbcdc7f6090682ecceaf1f87b9dd847f9df79942da8506/mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c", size = 11120432 }, - { url = "https://files.pythonhosted.org/packages/b6/9e/47e450fd39078d9c02d620545b2cb37993a8a8bdf7db3652ace2f80521ca/mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1", size = 10279515 }, - { url = "https://files.pythonhosted.org/packages/01/b5/6c8d33bd0f851a7692a8bfe4ee75eb82b6983a3cf39e5e32a5d2a723f0c1/mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8", size = 12025791 }, - { url = "https://files.pythonhosted.org/packages/f0/4c/e10e2c46ea37cab5c471d0ddaaa9a434dc1d28650078ac1b56c2d7b9b2e4/mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f", size = 12749203 }, - { url = "https://files.pythonhosted.org/packages/88/55/beacb0c69beab2153a0f57671ec07861d27d735a0faff135a494cd4f5020/mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1", size = 12885900 }, - { url = "https://files.pythonhosted.org/packages/a2/75/8c93ff7f315c4d086a2dfcde02f713004357d70a163eddb6c56a6a5eff40/mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae", size = 9777869 }, - { url = "https://files.pythonhosted.org/packages/43/1b/b38c079609bb4627905b74fc6a49849835acf68547ac33d8ceb707de5f52/mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14", size = 11266668 }, - { url = "https://files.pythonhosted.org/packages/6b/75/2ed0d2964c1ffc9971c729f7a544e9cd34b2cdabbe2d11afd148d7838aa2/mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9", size = 10254060 }, - { url = "https://files.pythonhosted.org/packages/a1/5f/7b8051552d4da3c51bbe8fcafffd76a6823779101a2b198d80886cd8f08e/mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11", size = 11933167 }, - { url = "https://files.pythonhosted.org/packages/04/90/f53971d3ac39d8b68bbaab9a4c6c58c8caa4d5fd3d587d16f5927eeeabe1/mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e", size = 12864341 }, - { url = "https://files.pythonhosted.org/packages/03/d2/8bc0aeaaf2e88c977db41583559319f1821c069e943ada2701e86d0430b7/mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89", size = 12972991 }, - { url = "https://files.pythonhosted.org/packages/6f/17/07815114b903b49b0f2cf7499f1c130e5aa459411596668267535fe9243c/mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b", size = 9879016 }, - { url = "https://files.pythonhosted.org/packages/9e/15/bb6a686901f59222275ab228453de741185f9d54fecbaacec041679496c6/mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255", size = 11252097 }, - { url = "https://files.pythonhosted.org/packages/f8/b3/8b0f74dfd072c802b7fa368829defdf3ee1566ba74c32a2cb2403f68024c/mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34", size = 10239728 }, - { url = "https://files.pythonhosted.org/packages/c5/9b/4fd95ab20c52bb5b8c03cc49169be5905d931de17edfe4d9d2986800b52e/mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a", size = 11924965 }, - { url = "https://files.pythonhosted.org/packages/56/9d/4a236b9c57f5d8f08ed346914b3f091a62dd7e19336b2b2a0d85485f82ff/mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9", size = 12867660 }, - { url = "https://files.pythonhosted.org/packages/40/88/a61a5497e2f68d9027de2bb139c7bb9abaeb1be1584649fa9d807f80a338/mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd", size = 12969198 }, - { url = "https://files.pythonhosted.org/packages/54/da/3d6fc5d92d324701b0c23fb413c853892bfe0e1dbe06c9138037d459756b/mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107", size = 9885276 }, - { url = "https://files.pythonhosted.org/packages/ca/1f/186d133ae2514633f8558e78cd658070ba686c0e9275c5a5c24a1e1f0d67/mypy-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3888a1816d69f7ab92092f785a462944b3ca16d7c470d564165fe703b0970c35", size = 11200493 }, - { url = "https://files.pythonhosted.org/packages/af/fc/4842485d034e38a4646cccd1369f6b1ccd7bc86989c52770d75d719a9941/mypy-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46c756a444117c43ee984bd055db99e498bc613a70bbbc120272bd13ca579fbc", size = 10357702 }, - { url = "https://files.pythonhosted.org/packages/b4/e6/457b83f2d701e23869cfec013a48a12638f75b9d37612a9ddf99072c1051/mypy-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27fc248022907e72abfd8e22ab1f10e903915ff69961174784a3900a8cba9ad9", size = 12091104 }, - { url = "https://files.pythonhosted.org/packages/f1/bf/76a569158db678fee59f4fd30b8e7a0d75bcbaeef49edd882a0d63af6d66/mypy-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:499d6a72fb7e5de92218db961f1a66d5f11783f9ae549d214617edab5d4dbdbb", size = 12830167 }, - { url = "https://files.pythonhosted.org/packages/43/bc/0bc6b694b3103de9fed61867f1c8bd33336b913d16831431e7cb48ef1c92/mypy-1.14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57961db9795eb566dc1d1b4e9139ebc4c6b0cb6e7254ecde69d1552bf7613f60", size = 13013834 }, - { url = "https://files.pythonhosted.org/packages/b0/79/5f5ec47849b6df1e6943d5fd8e6632fbfc04b4fd4acfa5a5a9535d11b4e2/mypy-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:07ba89fdcc9451f2ebb02853deb6aaaa3d2239a236669a63ab3801bbf923ef5c", size = 9781231 }, - { url = "https://files.pythonhosted.org/packages/a0/b5/32dd67b69a16d088e533962e5044e51004176a9952419de0370cdaead0f8/mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1", size = 2752905 }, + { url = "https://files.pythonhosted.org/packages/68/f8/65a7ce8d0e09b6329ad0c8d40330d100ea343bd4dd04c4f8ae26462d0a17/mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13", size = 10738433 }, + { url = "https://files.pythonhosted.org/packages/b4/95/9c0ecb8eacfe048583706249439ff52105b3f552ea9c4024166c03224270/mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559", size = 9861472 }, + { url = "https://files.pythonhosted.org/packages/84/09/9ec95e982e282e20c0d5407bc65031dfd0f0f8ecc66b69538296e06fcbee/mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b", size = 11611424 }, + { url = "https://files.pythonhosted.org/packages/78/13/f7d14e55865036a1e6a0a69580c240f43bc1f37407fe9235c0d4ef25ffb0/mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3", size = 12365450 }, + { url = "https://files.pythonhosted.org/packages/48/e1/301a73852d40c241e915ac6d7bcd7fedd47d519246db2d7b86b9d7e7a0cb/mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b", size = 12551765 }, + { url = "https://files.pythonhosted.org/packages/77/ba/c37bc323ae5fe7f3f15a28e06ab012cd0b7552886118943e90b15af31195/mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828", size = 9274701 }, + { url = "https://files.pythonhosted.org/packages/03/bc/f6339726c627bd7ca1ce0fa56c9ae2d0144604a319e0e339bdadafbbb599/mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f", size = 10662338 }, + { url = "https://files.pythonhosted.org/packages/e2/90/8dcf506ca1a09b0d17555cc00cd69aee402c203911410136cd716559efe7/mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5", size = 9787540 }, + { url = "https://files.pythonhosted.org/packages/05/05/a10f9479681e5da09ef2f9426f650d7b550d4bafbef683b69aad1ba87457/mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e", size = 11538051 }, + { url = "https://files.pythonhosted.org/packages/e9/9a/1f7d18b30edd57441a6411fcbc0c6869448d1a4bacbaee60656ac0fc29c8/mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c", size = 12286751 }, + { url = "https://files.pythonhosted.org/packages/72/af/19ff499b6f1dafcaf56f9881f7a965ac2f474f69f6f618b5175b044299f5/mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f", size = 12421783 }, + { url = "https://files.pythonhosted.org/packages/96/39/11b57431a1f686c1aed54bf794870efe0f6aeca11aca281a0bd87a5ad42c/mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f", size = 9265618 }, + { url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981 }, + { url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175 }, + { url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675 }, + { url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020 }, + { url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582 }, + { url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614 }, + { url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592 }, + { url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611 }, + { url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443 }, + { url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541 }, + { url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348 }, + { url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648 }, + { url = "https://files.pythonhosted.org/packages/5a/fa/79cf41a55b682794abe71372151dbbf856e3008f6767057229e6649d294a/mypy-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e601a7fa172c2131bff456bb3ee08a88360760d0d2f8cbd7a75a65497e2df078", size = 10737129 }, + { url = "https://files.pythonhosted.org/packages/d3/33/dd8feb2597d648de29e3da0a8bf4e1afbda472964d2a4a0052203a6f3594/mypy-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:712e962a6357634fef20412699a3655c610110e01cdaa6180acec7fc9f8513ba", size = 9856335 }, + { url = "https://files.pythonhosted.org/packages/e4/b5/74508959c1b06b96674b364ffeb7ae5802646b32929b7701fc6b18447592/mypy-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95579473af29ab73a10bada2f9722856792a36ec5af5399b653aa28360290a5", size = 11611935 }, + { url = "https://files.pythonhosted.org/packages/6c/53/da61b9d9973efcd6507183fdad96606996191657fe79701b2c818714d573/mypy-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f8722560a14cde92fdb1e31597760dc35f9f5524cce17836c0d22841830fd5b", size = 12365827 }, + { url = "https://files.pythonhosted.org/packages/c1/72/965bd9ee89540c79a25778cc080c7e6ef40aa1eeac4d52cec7eae6eb5228/mypy-1.15.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fbb8da62dc352133d7d7ca90ed2fb0e9d42bb1a32724c287d3c76c58cbaa9c2", size = 12541924 }, + { url = "https://files.pythonhosted.org/packages/46/d0/f41645c2eb263e6c77ada7d76f894c580c9ddb20d77f0c24d34273a4dab2/mypy-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:d10d994b41fb3497719bbf866f227b3489048ea4bbbb5015357db306249f7980", size = 9271176 }, + { url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777 }, ] [[package]] @@ -3231,8 +3242,8 @@ version = "3.4.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_python_implementation != 'PyPy'", @@ -3327,72 +3338,72 @@ wheels = [ [[package]] name = "numpy" -version = "2.2.2" +version = "2.2.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_python_implementation != 'PyPy'", ] -sdist = { url = "https://files.pythonhosted.org/packages/ec/d0/c12ddfd3a02274be06ffc71f3efc6d0e457b0409c4481596881e748cb264/numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f", size = 20233295 } +sdist = { url = "https://files.pythonhosted.org/packages/fb/90/8956572f5c4ae52201fdec7ba2044b2c882832dcec7d5d0922c9e9acf2de/numpy-2.2.3.tar.gz", hash = "sha256:dbdc15f0c81611925f382dfa97b3bd0bc2c1ce19d4fe50482cb0ddc12ba30020", size = 20262700 } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/2a/69033dc22d981ad21325314f8357438078f5c28310a6d89fb3833030ec8a/numpy-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7079129b64cb78bdc8d611d1fd7e8002c0a2565da6a47c4df8062349fee90e3e", size = 21215825 }, - { url = "https://files.pythonhosted.org/packages/31/2c/39f91e00bbd3d5639b027ac48c55dc5f2992bd2b305412d26be4c830862a/numpy-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ec6c689c61df613b783aeb21f945c4cbe6c51c28cb70aae8430577ab39f163e", size = 14354996 }, - { url = "https://files.pythonhosted.org/packages/0a/2c/d468ebd253851af10de5b3e8f3418ebabfaab5f0337a75299fbeb8b8c17a/numpy-2.2.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:40c7ff5da22cd391944a28c6a9c638a5eef77fcf71d6e3a79e1d9d9e82752715", size = 5393621 }, - { url = "https://files.pythonhosted.org/packages/7f/f4/3d8a5a0da297034106c5de92be881aca7079cde6058934215a1de91334f6/numpy-2.2.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:995f9e8181723852ca458e22de5d9b7d3ba4da3f11cc1cb113f093b271d7965a", size = 6928931 }, - { url = "https://files.pythonhosted.org/packages/47/a7/029354ab56edd43dd3f5efbfad292b8844f98b93174f322f82353fa46efa/numpy-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78ea78450fd96a498f50ee096f69c75379af5138f7881a51355ab0e11286c97", size = 14333157 }, - { url = "https://files.pythonhosted.org/packages/e3/d7/11fc594838d35c43519763310c316d4fd56f8600d3fc80a8e13e325b5c5c/numpy-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fbe72d347fbc59f94124125e73fc4976a06927ebc503ec5afbfb35f193cd957", size = 16381794 }, - { url = "https://files.pythonhosted.org/packages/af/d4/dd9b19cd4aff9c79d3f54d17f8be815407520d3116004bc574948336981b/numpy-2.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8e6da5cffbbe571f93588f562ed130ea63ee206d12851b60819512dd3e1ba50d", size = 15543990 }, - { url = "https://files.pythonhosted.org/packages/30/97/ab96b7650f27f684a9b1e46757a7294ecc50cab27701d05f146e9f779627/numpy-2.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:09d6a2032faf25e8d0cadde7fd6145118ac55d2740132c1d845f98721b5ebcfd", size = 18170896 }, - { url = "https://files.pythonhosted.org/packages/81/9b/bae9618cab20db67a2ca9d711795cad29b2ca4b73034dd3b5d05b962070a/numpy-2.2.2-cp310-cp310-win32.whl", hash = "sha256:159ff6ee4c4a36a23fe01b7c3d07bd8c14cc433d9720f977fcd52c13c0098160", size = 6573458 }, - { url = "https://files.pythonhosted.org/packages/92/9b/95678092febd14070cfb7906ea7932e71e9dd5a6ab3ee948f9ed975e905d/numpy-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:64bd6e1762cd7f0986a740fee4dff927b9ec2c5e4d9a28d056eb17d332158014", size = 12915812 }, - { url = "https://files.pythonhosted.org/packages/21/67/32c68756eed84df181c06528ff57e09138f893c4653448c4967311e0f992/numpy-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:642199e98af1bd2b6aeb8ecf726972d238c9877b0f6e8221ee5ab945ec8a2189", size = 21220002 }, - { url = "https://files.pythonhosted.org/packages/3b/89/f43bcad18f2b2e5814457b1c7f7b0e671d0db12c8c0e43397ab8cb1831ed/numpy-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6d9fc9d812c81e6168b6d405bf00b8d6739a7f72ef22a9214c4241e0dc70b323", size = 14391215 }, - { url = "https://files.pythonhosted.org/packages/9c/e6/efb8cd6122bf25e86e3dd89d9dbfec9e6861c50e8810eed77d4be59b51c6/numpy-2.2.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:c7d1fd447e33ee20c1f33f2c8e6634211124a9aabde3c617687d8b739aa69eac", size = 5391918 }, - { url = "https://files.pythonhosted.org/packages/47/e2/fccf89d64d9b47ffb242823d4e851fc9d36fa751908c9aac2807924d9b4e/numpy-2.2.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:451e854cfae0febe723077bd0cf0a4302a5d84ff25f0bfece8f29206c7bed02e", size = 6933133 }, - { url = "https://files.pythonhosted.org/packages/34/22/5ece749c0e5420a9380eef6fbf83d16a50010bd18fef77b9193d80a6760e/numpy-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd249bc894af67cbd8bad2c22e7cbcd46cf87ddfca1f1289d1e7e54868cc785c", size = 14338187 }, - { url = "https://files.pythonhosted.org/packages/5b/86/caec78829311f62afa6fa334c8dfcd79cffb4d24bcf96ee02ae4840d462b/numpy-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02935e2c3c0c6cbe9c7955a8efa8908dd4221d7755644c59d1bba28b94fd334f", size = 16393429 }, - { url = "https://files.pythonhosted.org/packages/c8/4e/0c25f74c88239a37924577d6ad780f3212a50f4b4b5f54f5e8c918d726bd/numpy-2.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a972cec723e0563aa0823ee2ab1df0cb196ed0778f173b381c871a03719d4826", size = 15559103 }, - { url = "https://files.pythonhosted.org/packages/d4/bd/d557f10fa50dc4d5871fb9606af563249b66af2fc6f99041a10e8757c6f1/numpy-2.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6d6a0910c3b4368d89dde073e630882cdb266755565155bc33520283b2d9df8", size = 18182967 }, - { url = "https://files.pythonhosted.org/packages/30/e9/66cc0f66386d78ed89e45a56e2a1d051e177b6e04477c4a41cd590ef4017/numpy-2.2.2-cp311-cp311-win32.whl", hash = "sha256:860fd59990c37c3ef913c3ae390b3929d005243acca1a86facb0773e2d8d9e50", size = 6571499 }, - { url = "https://files.pythonhosted.org/packages/66/a3/4139296b481ae7304a43581046b8f0a20da6a0dfe0ee47a044cade796603/numpy-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:da1eeb460ecce8d5b8608826595c777728cdf28ce7b5a5a8c8ac8d949beadcf2", size = 12919805 }, - { url = "https://files.pythonhosted.org/packages/0c/e6/847d15770ab7a01e807bdfcd4ead5bdae57c0092b7dc83878171b6af97bb/numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467", size = 20912636 }, - { url = "https://files.pythonhosted.org/packages/d1/af/f83580891577b13bd7e261416120e036d0d8fb508c8a43a73e38928b794b/numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a", size = 14098403 }, - { url = "https://files.pythonhosted.org/packages/2b/86/d019fb60a9d0f1d4cf04b014fe88a9135090adfadcc31c1fadbb071d7fa7/numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825", size = 5128938 }, - { url = "https://files.pythonhosted.org/packages/7a/1b/50985edb6f1ec495a1c36452e860476f5b7ecdc3fc59ea89ccad3c4926c5/numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37", size = 6661937 }, - { url = "https://files.pythonhosted.org/packages/f4/1b/17efd94cad1b9d605c3f8907fb06bcffc4ce4d1d14d46b95316cccccf2b9/numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748", size = 14049518 }, - { url = "https://files.pythonhosted.org/packages/5b/73/65d2f0b698df1731e851e3295eb29a5ab8aa06f763f7e4188647a809578d/numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0", size = 16099146 }, - { url = "https://files.pythonhosted.org/packages/d5/69/308f55c0e19d4b5057b5df286c5433822e3c8039ede06d4051d96f1c2c4e/numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278", size = 15246336 }, - { url = "https://files.pythonhosted.org/packages/f0/d8/d8d333ad0d8518d077a21aeea7b7c826eff766a2b1ce1194dea95ca0bacf/numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba", size = 17863507 }, - { url = "https://files.pythonhosted.org/packages/82/6e/0b84ad3103ffc16d6673e63b5acbe7901b2af96c2837174c6318c98e27ab/numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283", size = 6276491 }, - { url = "https://files.pythonhosted.org/packages/fc/84/7f801a42a67b9772a883223a0a1e12069a14626c81a732bd70aac57aebc1/numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb", size = 12616372 }, - { url = "https://files.pythonhosted.org/packages/e1/fe/df5624001f4f5c3e0b78e9017bfab7fdc18a8d3b3d3161da3d64924dd659/numpy-2.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc", size = 20899188 }, - { url = "https://files.pythonhosted.org/packages/a9/80/d349c3b5ed66bd3cb0214be60c27e32b90a506946857b866838adbe84040/numpy-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369", size = 14113972 }, - { url = "https://files.pythonhosted.org/packages/9d/50/949ec9cbb28c4b751edfa64503f0913cbfa8d795b4a251e7980f13a8a655/numpy-2.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd", size = 5114294 }, - { url = "https://files.pythonhosted.org/packages/8d/f3/399c15629d5a0c68ef2aa7621d430b2be22034f01dd7f3c65a9c9666c445/numpy-2.2.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be", size = 6648426 }, - { url = "https://files.pythonhosted.org/packages/2c/03/c72474c13772e30e1bc2e558cdffd9123c7872b731263d5648b5c49dd459/numpy-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84", size = 14045990 }, - { url = "https://files.pythonhosted.org/packages/83/9c/96a9ab62274ffafb023f8ee08c88d3d31ee74ca58869f859db6845494fa6/numpy-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff", size = 16096614 }, - { url = "https://files.pythonhosted.org/packages/d5/34/cd0a735534c29bec7093544b3a509febc9b0df77718a9b41ffb0809c9f46/numpy-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0", size = 15242123 }, - { url = "https://files.pythonhosted.org/packages/5e/6d/541717a554a8f56fa75e91886d9b79ade2e595918690eb5d0d3dbd3accb9/numpy-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de", size = 17859160 }, - { url = "https://files.pythonhosted.org/packages/b9/a5/fbf1f2b54adab31510728edd06a05c1b30839f37cf8c9747cb85831aaf1b/numpy-2.2.2-cp313-cp313-win32.whl", hash = "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9", size = 6273337 }, - { url = "https://files.pythonhosted.org/packages/56/e5/01106b9291ef1d680f82bc47d0c5b5e26dfed15b0754928e8f856c82c881/numpy-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369", size = 12609010 }, - { url = "https://files.pythonhosted.org/packages/9f/30/f23d9876de0f08dceb707c4dcf7f8dd7588266745029debb12a3cdd40be6/numpy-2.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391", size = 20924451 }, - { url = "https://files.pythonhosted.org/packages/6a/ec/6ea85b2da9d5dfa1dbb4cb3c76587fc8ddcae580cb1262303ab21c0926c4/numpy-2.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39", size = 14122390 }, - { url = "https://files.pythonhosted.org/packages/68/05/bfbdf490414a7dbaf65b10c78bc243f312c4553234b6d91c94eb7c4b53c2/numpy-2.2.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317", size = 5156590 }, - { url = "https://files.pythonhosted.org/packages/f7/ec/fe2e91b2642b9d6544518388a441bcd65c904cea38d9ff998e2e8ebf808e/numpy-2.2.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49", size = 6671958 }, - { url = "https://files.pythonhosted.org/packages/b1/6f/6531a78e182f194d33ee17e59d67d03d0d5a1ce7f6be7343787828d1bd4a/numpy-2.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2", size = 14019950 }, - { url = "https://files.pythonhosted.org/packages/e1/fb/13c58591d0b6294a08cc40fcc6b9552d239d773d520858ae27f39997f2ae/numpy-2.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7", size = 16079759 }, - { url = "https://files.pythonhosted.org/packages/2c/f2/f2f8edd62abb4b289f65a7f6d1f3650273af00b91b7267a2431be7f1aec6/numpy-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb", size = 15226139 }, - { url = "https://files.pythonhosted.org/packages/aa/29/14a177f1a90b8ad8a592ca32124ac06af5eff32889874e53a308f850290f/numpy-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648", size = 17856316 }, - { url = "https://files.pythonhosted.org/packages/95/03/242ae8d7b97f4e0e4ab8dd51231465fb23ed5e802680d629149722e3faf1/numpy-2.2.2-cp313-cp313t-win32.whl", hash = "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4", size = 6329134 }, - { url = "https://files.pythonhosted.org/packages/80/94/cd9e9b04012c015cb6320ab3bf43bc615e248dddfeb163728e800a5d96f0/numpy-2.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576", size = 12696208 }, - { url = "https://files.pythonhosted.org/packages/96/7e/1dd770ee68916ed358991ab62c2cc353ffd98d0b75b901d52183ca28e8bb/numpy-2.2.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b0531f0b0e07643eb089df4c509d30d72c9ef40defa53e41363eca8a8cc61495", size = 21047291 }, - { url = "https://files.pythonhosted.org/packages/d1/3c/ccd08578dc532a8e6927952339d4a02682b776d5e85be49ed0760308433e/numpy-2.2.2-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:e9e82dcb3f2ebbc8cb5ce1102d5f1c5ed236bf8a11730fb45ba82e2841ec21df", size = 6792494 }, - { url = "https://files.pythonhosted.org/packages/7c/28/8754b9aee4f97199f9a047f73bb644b5a2014994a6d7b061ba67134a42de/numpy-2.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0d4142eb40ca6f94539e4db929410f2a46052a0fe7a2c1c59f6179c39938d2a", size = 16197312 }, - { url = "https://files.pythonhosted.org/packages/26/96/deb93f871f401045a684ca08a009382b247d14996d7a94fea6aa43c67b94/numpy-2.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:356ca982c188acbfa6af0d694284d8cf20e95b1c3d0aefa8929376fea9146f60", size = 12822674 }, + { url = "https://files.pythonhosted.org/packages/5e/e1/1816d5d527fa870b260a1c2c5904d060caad7515637bd54f495a5ce13ccd/numpy-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cbc6472e01952d3d1b2772b720428f8b90e2deea8344e854df22b0618e9cce71", size = 21232911 }, + { url = "https://files.pythonhosted.org/packages/29/46/9f25dc19b359f10c0e52b6bac25d3181eb1f4b4d04c9846a32cf5ea52762/numpy-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdfe0c22692a30cd830c0755746473ae66c4a8f2e7bd508b35fb3b6a0813d787", size = 14371955 }, + { url = "https://files.pythonhosted.org/packages/72/d7/de941296e6b09a5c81d3664ad912f1496a0ecdd2f403318e5e35604ff70f/numpy-2.2.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:e37242f5324ffd9f7ba5acf96d774f9276aa62a966c0bad8dae692deebec7716", size = 5410476 }, + { url = "https://files.pythonhosted.org/packages/36/ce/55f685995110f8a268fdca0f198c9a84fa87b39512830965cc1087af6391/numpy-2.2.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:95172a21038c9b423e68be78fd0be6e1b97674cde269b76fe269a5dfa6fadf0b", size = 6945730 }, + { url = "https://files.pythonhosted.org/packages/4f/84/abdb9f6e22576d89c259401c3234d4755b322539491bbcffadc8bcb120d3/numpy-2.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5b47c440210c5d1d67e1cf434124e0b5c395eee1f5806fdd89b553ed1acd0a3", size = 14350752 }, + { url = "https://files.pythonhosted.org/packages/e9/88/3870cfa9bef4dffb3a326507f430e6007eeac258ebeef6b76fc542aef66d/numpy-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0391ea3622f5c51a2e29708877d56e3d276827ac5447d7f45e9bc4ade8923c52", size = 16399386 }, + { url = "https://files.pythonhosted.org/packages/02/10/3f629682dd0b457525c131945329c4e81e2dadeb11256e6ce4c9a1a6fb41/numpy-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f6b3dfc7661f8842babd8ea07e9897fe3d9b69a1d7e5fbb743e4160f9387833b", size = 15561826 }, + { url = "https://files.pythonhosted.org/packages/da/18/fd35673ba9751eba449d4ce5d24d94e3b612cdbfba79348da71488c0b7ac/numpy-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1ad78ce7f18ce4e7df1b2ea4019b5817a2f6a8a16e34ff2775f646adce0a5027", size = 18188593 }, + { url = "https://files.pythonhosted.org/packages/ce/4c/c0f897b580ea59484b4cc96a441fea50333b26675a60a1421bc912268b5f/numpy-2.2.3-cp310-cp310-win32.whl", hash = "sha256:5ebeb7ef54a7be11044c33a17b2624abe4307a75893c001a4800857956b41094", size = 6590421 }, + { url = "https://files.pythonhosted.org/packages/e5/5b/aaabbfc7060c5c8f0124c5deb5e114a3b413a548bbc64e372c5b5db36165/numpy-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:596140185c7fa113563c67c2e894eabe0daea18cf8e33851738c19f70ce86aeb", size = 12925667 }, + { url = "https://files.pythonhosted.org/packages/96/86/453aa3949eab6ff54e2405f9cb0c01f756f031c3dc2a6d60a1d40cba5488/numpy-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:16372619ee728ed67a2a606a614f56d3eabc5b86f8b615c79d01957062826ca8", size = 21237256 }, + { url = "https://files.pythonhosted.org/packages/20/c3/93ecceadf3e155d6a9e4464dd2392d8d80cf436084c714dc8535121c83e8/numpy-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5521a06a3148686d9269c53b09f7d399a5725c47bbb5b35747e1cb76326b714b", size = 14408049 }, + { url = "https://files.pythonhosted.org/packages/8d/29/076999b69bd9264b8df5e56f2be18da2de6b2a2d0e10737e5307592e01de/numpy-2.2.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:7c8dde0ca2f77828815fd1aedfdf52e59071a5bae30dac3b4da2a335c672149a", size = 5408655 }, + { url = "https://files.pythonhosted.org/packages/e2/a7/b14f0a73eb0fe77cb9bd5b44534c183b23d4229c099e339c522724b02678/numpy-2.2.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:77974aba6c1bc26e3c205c2214f0d5b4305bdc719268b93e768ddb17e3fdd636", size = 6949996 }, + { url = "https://files.pythonhosted.org/packages/72/2f/8063da0616bb0f414b66dccead503bd96e33e43685c820e78a61a214c098/numpy-2.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d42f9c36d06440e34226e8bd65ff065ca0963aeecada587b937011efa02cdc9d", size = 14355789 }, + { url = "https://files.pythonhosted.org/packages/e6/d7/3cd47b00b8ea95ab358c376cf5602ad21871410950bc754cf3284771f8b6/numpy-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2712c5179f40af9ddc8f6727f2bd910ea0eb50206daea75f58ddd9fa3f715bb", size = 16411356 }, + { url = "https://files.pythonhosted.org/packages/27/c0/a2379e202acbb70b85b41483a422c1e697ff7eee74db642ca478de4ba89f/numpy-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c8b0451d2ec95010d1db8ca733afc41f659f425b7f608af569711097fd6014e2", size = 15576770 }, + { url = "https://files.pythonhosted.org/packages/bc/63/a13ee650f27b7999e5b9e1964ae942af50bb25606d088df4229283eda779/numpy-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9b4a8148c57ecac25a16b0e11798cbe88edf5237b0df99973687dd866f05e1b", size = 18200483 }, + { url = "https://files.pythonhosted.org/packages/4c/87/e71f89935e09e8161ac9c590c82f66d2321eb163893a94af749dfa8a3cf8/numpy-2.2.3-cp311-cp311-win32.whl", hash = "sha256:1f45315b2dc58d8a3e7754fe4e38b6fce132dab284a92851e41b2b344f6441c5", size = 6588415 }, + { url = "https://files.pythonhosted.org/packages/b9/c6/cd4298729826af9979c5f9ab02fcaa344b82621e7c49322cd2d210483d3f/numpy-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f48ba6f6c13e5e49f3d3efb1b51c8193215c42ac82610a04624906a9270be6f", size = 12929604 }, + { url = "https://files.pythonhosted.org/packages/43/ec/43628dcf98466e087812142eec6d1c1a6c6bdfdad30a0aa07b872dc01f6f/numpy-2.2.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12c045f43b1d2915eca6b880a7f4a256f59d62df4f044788c8ba67709412128d", size = 20929458 }, + { url = "https://files.pythonhosted.org/packages/9b/c0/2f4225073e99a5c12350954949ed19b5d4a738f541d33e6f7439e33e98e4/numpy-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:87eed225fd415bbae787f93a457af7f5990b92a334e346f72070bf569b9c9c95", size = 14115299 }, + { url = "https://files.pythonhosted.org/packages/ca/fa/d2c5575d9c734a7376cc1592fae50257ec95d061b27ee3dbdb0b3b551eb2/numpy-2.2.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:712a64103d97c404e87d4d7c47fb0c7ff9acccc625ca2002848e0d53288b90ea", size = 5145723 }, + { url = "https://files.pythonhosted.org/packages/eb/dc/023dad5b268a7895e58e791f28dc1c60eb7b6c06fcbc2af8538ad069d5f3/numpy-2.2.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a5ae282abe60a2db0fd407072aff4599c279bcd6e9a2475500fc35b00a57c532", size = 6678797 }, + { url = "https://files.pythonhosted.org/packages/3f/19/bcd641ccf19ac25abb6fb1dcd7744840c11f9d62519d7057b6ab2096eb60/numpy-2.2.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5266de33d4c3420973cf9ae3b98b54a2a6d53a559310e3236c4b2b06b9c07d4e", size = 14067362 }, + { url = "https://files.pythonhosted.org/packages/39/04/78d2e7402fb479d893953fb78fa7045f7deb635ec095b6b4f0260223091a/numpy-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b787adbf04b0db1967798dba8da1af07e387908ed1553a0d6e74c084d1ceafe", size = 16116679 }, + { url = "https://files.pythonhosted.org/packages/d0/a1/e90f7aa66512be3150cb9d27f3d9995db330ad1b2046474a13b7040dfd92/numpy-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:34c1b7e83f94f3b564b35f480f5652a47007dd91f7c839f404d03279cc8dd021", size = 15264272 }, + { url = "https://files.pythonhosted.org/packages/dc/b6/50bd027cca494de4fa1fc7bf1662983d0ba5f256fa0ece2c376b5eb9b3f0/numpy-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4d8335b5f1b6e2bce120d55fb17064b0262ff29b459e8493d1785c18ae2553b8", size = 17880549 }, + { url = "https://files.pythonhosted.org/packages/96/30/f7bf4acb5f8db10a96f73896bdeed7a63373137b131ca18bd3dab889db3b/numpy-2.2.3-cp312-cp312-win32.whl", hash = "sha256:4d9828d25fb246bedd31e04c9e75714a4087211ac348cb39c8c5f99dbb6683fe", size = 6293394 }, + { url = "https://files.pythonhosted.org/packages/42/6e/55580a538116d16ae7c9aa17d4edd56e83f42126cb1dfe7a684da7925d2c/numpy-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:83807d445817326b4bcdaaaf8e8e9f1753da04341eceec705c001ff342002e5d", size = 12626357 }, + { url = "https://files.pythonhosted.org/packages/0e/8b/88b98ed534d6a03ba8cddb316950fe80842885709b58501233c29dfa24a9/numpy-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bfdb06b395385ea9b91bf55c1adf1b297c9fdb531552845ff1d3ea6e40d5aba", size = 20916001 }, + { url = "https://files.pythonhosted.org/packages/d9/b4/def6ec32c725cc5fbd8bdf8af80f616acf075fe752d8a23e895da8c67b70/numpy-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:23c9f4edbf4c065fddb10a4f6e8b6a244342d95966a48820c614891e5059bb50", size = 14130721 }, + { url = "https://files.pythonhosted.org/packages/20/60/70af0acc86495b25b672d403e12cb25448d79a2b9658f4fc45e845c397a8/numpy-2.2.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:a0c03b6be48aaf92525cccf393265e02773be8fd9551a2f9adbe7db1fa2b60f1", size = 5130999 }, + { url = "https://files.pythonhosted.org/packages/2e/69/d96c006fb73c9a47bcb3611417cf178049aae159afae47c48bd66df9c536/numpy-2.2.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:2376e317111daa0a6739e50f7ee2a6353f768489102308b0d98fcf4a04f7f3b5", size = 6665299 }, + { url = "https://files.pythonhosted.org/packages/5a/3f/d8a877b6e48103733ac224ffa26b30887dc9944ff95dffdfa6c4ce3d7df3/numpy-2.2.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fb62fe3d206d72fe1cfe31c4a1106ad2b136fcc1606093aeab314f02930fdf2", size = 14064096 }, + { url = "https://files.pythonhosted.org/packages/e4/43/619c2c7a0665aafc80efca465ddb1f260287266bdbdce517396f2f145d49/numpy-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52659ad2534427dffcc36aac76bebdd02b67e3b7a619ac67543bc9bfe6b7cdb1", size = 16114758 }, + { url = "https://files.pythonhosted.org/packages/d9/79/ee4fe4f60967ccd3897aa71ae14cdee9e3c097e3256975cc9575d393cb42/numpy-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b416af7d0ed3271cad0f0a0d0bee0911ed7eba23e66f8424d9f3dfcdcae1304", size = 15259880 }, + { url = "https://files.pythonhosted.org/packages/fb/c8/8b55cf05db6d85b7a7d414b3d1bd5a740706df00bfa0824a08bf041e52ee/numpy-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1402da8e0f435991983d0a9708b779f95a8c98c6b18a171b9f1be09005e64d9d", size = 17876721 }, + { url = "https://files.pythonhosted.org/packages/21/d6/b4c2f0564b7dcc413117b0ffbb818d837e4b29996b9234e38b2025ed24e7/numpy-2.2.3-cp313-cp313-win32.whl", hash = "sha256:136553f123ee2951bfcfbc264acd34a2fc2f29d7cdf610ce7daf672b6fbaa693", size = 6290195 }, + { url = "https://files.pythonhosted.org/packages/97/e7/7d55a86719d0de7a6a597949f3febefb1009435b79ba510ff32f05a8c1d7/numpy-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5b732c8beef1d7bc2d9e476dbba20aaff6167bf205ad9aa8d30913859e82884b", size = 12619013 }, + { url = "https://files.pythonhosted.org/packages/a6/1f/0b863d5528b9048fd486a56e0b97c18bf705e88736c8cea7239012119a54/numpy-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:435e7a933b9fda8126130b046975a968cc2d833b505475e588339e09f7672890", size = 20944621 }, + { url = "https://files.pythonhosted.org/packages/aa/99/b478c384f7a0a2e0736177aafc97dc9152fc036a3fdb13f5a3ab225f1494/numpy-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7678556eeb0152cbd1522b684dcd215250885993dd00adb93679ec3c0e6e091c", size = 14142502 }, + { url = "https://files.pythonhosted.org/packages/fb/61/2d9a694a0f9cd0a839501d362de2a18de75e3004576a3008e56bdd60fcdb/numpy-2.2.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2e8da03bd561504d9b20e7a12340870dfc206c64ea59b4cfee9fceb95070ee94", size = 5176293 }, + { url = "https://files.pythonhosted.org/packages/33/35/51e94011b23e753fa33f891f601e5c1c9a3d515448659b06df9d40c0aa6e/numpy-2.2.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:c9aa4496fd0e17e3843399f533d62857cef5900facf93e735ef65aa4bbc90ef0", size = 6691874 }, + { url = "https://files.pythonhosted.org/packages/ff/cf/06e37619aad98a9d03bd8d65b8e3041c3a639be0f5f6b0a0e2da544538d4/numpy-2.2.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4ca91d61a4bf61b0f2228f24bbfa6a9facd5f8af03759fe2a655c50ae2c6610", size = 14036826 }, + { url = "https://files.pythonhosted.org/packages/0c/93/5d7d19955abd4d6099ef4a8ee006f9ce258166c38af259f9e5558a172e3e/numpy-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:deaa09cd492e24fd9b15296844c0ad1b3c976da7907e1c1ed3a0ad21dded6f76", size = 16096567 }, + { url = "https://files.pythonhosted.org/packages/af/53/d1c599acf7732d81f46a93621dab6aa8daad914b502a7a115b3f17288ab2/numpy-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:246535e2f7496b7ac85deffe932896a3577be7af8fb7eebe7146444680297e9a", size = 15242514 }, + { url = "https://files.pythonhosted.org/packages/53/43/c0f5411c7b3ea90adf341d05ace762dad8cb9819ef26093e27b15dd121ac/numpy-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:daf43a3d1ea699402c5a850e5313680ac355b4adc9770cd5cfc2940e7861f1bf", size = 17872920 }, + { url = "https://files.pythonhosted.org/packages/5b/57/6dbdd45ab277aff62021cafa1e15f9644a52f5b5fc840bc7591b4079fb58/numpy-2.2.3-cp313-cp313t-win32.whl", hash = "sha256:cf802eef1f0134afb81fef94020351be4fe1d6681aadf9c5e862af6602af64ef", size = 6346584 }, + { url = "https://files.pythonhosted.org/packages/97/9b/484f7d04b537d0a1202a5ba81c6f53f1846ae6c63c2127f8df869ed31342/numpy-2.2.3-cp313-cp313t-win_amd64.whl", hash = "sha256:aee2512827ceb6d7f517c8b85aa5d3923afe8fc7a57d028cffcd522f1c6fd082", size = 12706784 }, + { url = "https://files.pythonhosted.org/packages/0a/b5/a7839f5478be8f859cb880f13d90fcfe4b0ec7a9ebaff2bcc30d96760596/numpy-2.2.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3c2ec8a0f51d60f1e9c0c5ab116b7fc104b165ada3f6c58abf881cb2eb16044d", size = 21064244 }, + { url = "https://files.pythonhosted.org/packages/29/e8/5da32ffcaa7a72f7ecd82f90c062140a061eb823cb88e90279424e515cf4/numpy-2.2.3-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:ed2cf9ed4e8ebc3b754d398cba12f24359f018b416c380f577bbae112ca52fc9", size = 6809418 }, + { url = "https://files.pythonhosted.org/packages/a8/a9/68aa7076c7656a7308a0f73d0a2ced8c03f282c9fd98fa7ce21c12634087/numpy-2.2.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39261798d208c3095ae4f7bc8eaeb3481ea8c6e03dc48028057d3cbdbdb8937e", size = 16215461 }, + { url = "https://files.pythonhosted.org/packages/17/7f/d322a4125405920401450118dbdc52e0384026bd669939484670ce8b2ab9/numpy-2.2.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:783145835458e60fa97afac25d511d00a1eca94d4a8f3ace9fe2043003c678e4", size = 12839607 }, ] [[package]] @@ -3528,7 +3539,7 @@ wheels = [ [[package]] name = "openai" -version = "1.61.0" +version = "1.63.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -3540,9 +3551,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/32/2a/b3fa8790be17d632f59d4f50257b909a3f669036e5195c1ae55737274620/openai-1.61.0.tar.gz", hash = "sha256:216f325a24ed8578e929b0f1b3fb2052165f3b04b0461818adaa51aa29c71f8a", size = 350174 } +sdist = { url = "https://files.pythonhosted.org/packages/4f/32/2049e973a646801df425aecdf88c6504ca878bdb3951fe12076fc30f2977/openai-1.63.0.tar.gz", hash = "sha256:597d7a1b35b113e5a09fcb953bdb1eef44f404a39985f3d7573b3ab09221fd66", size = 356710 } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/76/70c5ad6612b3e4c89fa520266bbf2430a89cae8bd87c1e2284698af5927e/openai-1.61.0-py3-none-any.whl", hash = "sha256:e8c512c0743accbdbe77f3429a1490d862f8352045de8dc81969301eb4a4f666", size = 460623 }, + { url = "https://files.pythonhosted.org/packages/67/a0/e1fe4e87218639fc0a0927da5266c2978eaa0e2eb5437479ee64a11535bb/openai-1.63.0-py3-none-any.whl", hash = "sha256:a664dfc78f0a05ca46c3e21f344f840cf6bf7174f13cfa9de214ed28bfca1dda", size = 472282 }, ] [[package]] @@ -3642,7 +3653,7 @@ version = "2.2.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "numpy", version = "2.2.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "python-dateutil" }, { name = "pytz" }, { name = "tzdata" }, @@ -4276,9 +4287,8 @@ version = "1.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, - { name = "vcrpy", version = "4.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "vcrpy", version = "5.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and platform_python_implementation == 'PyPy'" }, - { name = "vcrpy", version = "7.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and platform_python_implementation != 'PyPy'" }, + { name = "vcrpy", version = "7.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10' or platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1a/60/104c619483c1a42775d3f8b27293f1ecfc0728014874d065e68cb9702d49/pytest-vcr-1.0.2.tar.gz", hash = "sha256:23ee51b75abbcc43d926272773aae4f39f93aceb75ed56852d0bf618f92e1896", size = 3810 } wheels = [ @@ -4376,15 +4386,16 @@ wheels = [ [[package]] name = "pywinpty" -version = "2.0.14" +version = "2.0.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/82/90f8750423cba4b9b6c842df227609fb60704482d7abf6dd47e2babc055a/pywinpty-2.0.14.tar.gz", hash = "sha256:18bd9529e4a5daf2d9719aa17788ba6013e594ae94c5a0c27e83df3278b0660e", size = 27769 } +sdist = { url = "https://files.pythonhosted.org/packages/2d/7c/917f9c4681bb8d34bfbe0b79d36bbcd902651aeab48790df3d30ba0202fb/pywinpty-2.0.15.tar.gz", hash = "sha256:312cf39153a8736c617d45ce8b6ad6cd2107de121df91c455b10ce6bba7a39b2", size = 29017 } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/09/56376af256eab8cc5f8982a3b138d387136eca27fa1a8a68660e8ed59e4b/pywinpty-2.0.14-cp310-none-win_amd64.whl", hash = "sha256:0b149c2918c7974f575ba79f5a4aad58bd859a52fa9eb1296cc22aa412aa411f", size = 1397115 }, - { url = "https://files.pythonhosted.org/packages/be/e2/af1a99c0432e4e58c9ac8e334ee191790ec9793d33559189b9d2069bdc1d/pywinpty-2.0.14-cp311-none-win_amd64.whl", hash = "sha256:cf2a43ac7065b3e0dc8510f8c1f13a75fb8fde805efa3b8cff7599a1ef497bc7", size = 1397223 }, - { url = "https://files.pythonhosted.org/packages/ad/79/759ae767a3b78d340446efd54dd1fe4f7dafa4fc7be96ed757e44bcdba54/pywinpty-2.0.14-cp312-none-win_amd64.whl", hash = "sha256:55dad362ef3e9408ade68fd173e4f9032b3ce08f68cfe7eacb2c263ea1179737", size = 1397207 }, - { url = "https://files.pythonhosted.org/packages/7d/34/b77b3c209bf2eaa6455390c8d5449241637f5957f41636a2204065d52bfa/pywinpty-2.0.14-cp313-none-win_amd64.whl", hash = "sha256:074fb988a56ec79ca90ed03a896d40707131897cefb8f76f926e3834227f2819", size = 1396698 }, - { url = "https://files.pythonhosted.org/packages/d8/ef/85e1b0ef7864fa2c579b1c1efce92c5f6fa238c8e73cf9f53deee08f8605/pywinpty-2.0.14-cp39-none-win_amd64.whl", hash = "sha256:5725fd56f73c0531ec218663bd8c8ff5acc43c78962fab28564871b5fce053fd", size = 1397396 }, + { url = "https://files.pythonhosted.org/packages/a6/b7/855db919ae526d2628f3f2e6c281c4cdff7a9a8af51bb84659a9f07b1861/pywinpty-2.0.15-cp310-cp310-win_amd64.whl", hash = "sha256:8e7f5de756a615a38b96cd86fa3cd65f901ce54ce147a3179c45907fa11b4c4e", size = 1405161 }, + { url = "https://files.pythonhosted.org/packages/5e/ac/6884dcb7108af66ad53f73ef4dad096e768c9203a6e6ce5e6b0c4a46e238/pywinpty-2.0.15-cp311-cp311-win_amd64.whl", hash = "sha256:9a6bcec2df2707aaa9d08b86071970ee32c5026e10bcc3cc5f6f391d85baf7ca", size = 1405249 }, + { url = "https://files.pythonhosted.org/packages/88/e5/9714def18c3a411809771a3fbcec70bffa764b9675afb00048a620fca604/pywinpty-2.0.15-cp312-cp312-win_amd64.whl", hash = "sha256:83a8f20b430bbc5d8957249f875341a60219a4e971580f2ba694fbfb54a45ebc", size = 1405243 }, + { url = "https://files.pythonhosted.org/packages/fb/16/2ab7b3b7f55f3c6929e5f629e1a68362981e4e5fed592a2ed1cb4b4914a5/pywinpty-2.0.15-cp313-cp313-win_amd64.whl", hash = "sha256:ab5920877dd632c124b4ed17bc6dd6ef3b9f86cd492b963ffdb1a67b85b0f408", size = 1405020 }, + { url = "https://files.pythonhosted.org/packages/7c/16/edef3515dd2030db2795dbfbe392232c7a0f3dc41b98e92b38b42ba497c7/pywinpty-2.0.15-cp313-cp313t-win_amd64.whl", hash = "sha256:a4560ad8c01e537708d2790dbe7da7d986791de805d89dd0d3697ca59e9e4901", size = 1404151 }, + { url = "https://files.pythonhosted.org/packages/47/96/90fa02f19b1eff7469ad7bf0ef8efca248025de9f1d0a0b25682d2aacf68/pywinpty-2.0.15-cp39-cp39-win_amd64.whl", hash = "sha256:d261cd88fcd358cfb48a7ca0700db3e1c088c9c10403c9ebc0d8a8b57aa6a117", size = 1405302 }, ] [[package]] @@ -4830,27 +4841,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.9.4" +version = "0.9.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c0/17/529e78f49fc6f8076f50d985edd9a2cf011d1dbadb1cdeacc1d12afc1d26/ruff-0.9.4.tar.gz", hash = "sha256:6907ee3529244bb0ed066683e075f09285b38dd5b4039370df6ff06041ca19e7", size = 3599458 } +sdist = { url = "https://files.pythonhosted.org/packages/2a/e1/e265aba384343dd8ddd3083f5e33536cd17e1566c41453a5517b5dd443be/ruff-0.9.6.tar.gz", hash = "sha256:81761592f72b620ec8fa1068a6fd00e98a5ebee342a3642efd84454f3031dca9", size = 3639454 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/f8/3fafb7804d82e0699a122101b5bee5f0d6e17c3a806dcbc527bb7d3f5b7a/ruff-0.9.4-py3-none-linux_armv6l.whl", hash = "sha256:64e73d25b954f71ff100bb70f39f1ee09e880728efb4250c632ceed4e4cdf706", size = 11668400 }, - { url = "https://files.pythonhosted.org/packages/2e/a6/2efa772d335da48a70ab2c6bb41a096c8517ca43c086ea672d51079e3d1f/ruff-0.9.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6ce6743ed64d9afab4fafeaea70d3631b4d4b28b592db21a5c2d1f0ef52934bf", size = 11628395 }, - { url = "https://files.pythonhosted.org/packages/dc/d7/cd822437561082f1c9d7225cc0d0fbb4bad117ad7ac3c41cd5d7f0fa948c/ruff-0.9.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54499fb08408e32b57360f6f9de7157a5fec24ad79cb3f42ef2c3f3f728dfe2b", size = 11090052 }, - { url = "https://files.pythonhosted.org/packages/9e/67/3660d58e893d470abb9a13f679223368ff1684a4ef40f254a0157f51b448/ruff-0.9.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37c892540108314a6f01f105040b5106aeb829fa5fb0561d2dcaf71485021137", size = 11882221 }, - { url = "https://files.pythonhosted.org/packages/79/d1/757559995c8ba5f14dfec4459ef2dd3fcea82ac43bc4e7c7bf47484180c0/ruff-0.9.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de9edf2ce4b9ddf43fd93e20ef635a900e25f622f87ed6e3047a664d0e8f810e", size = 11424862 }, - { url = "https://files.pythonhosted.org/packages/c0/96/7915a7c6877bb734caa6a2af424045baf6419f685632469643dbd8eb2958/ruff-0.9.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87c90c32357c74f11deb7fbb065126d91771b207bf9bfaaee01277ca59b574ec", size = 12626735 }, - { url = "https://files.pythonhosted.org/packages/0e/cc/dadb9b35473d7cb17c7ffe4737b4377aeec519a446ee8514123ff4a26091/ruff-0.9.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:56acd6c694da3695a7461cc55775f3a409c3815ac467279dfa126061d84b314b", size = 13255976 }, - { url = "https://files.pythonhosted.org/packages/5f/c3/ad2dd59d3cabbc12df308cced780f9c14367f0321e7800ca0fe52849da4c/ruff-0.9.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0c93e7d47ed951b9394cf352d6695b31498e68fd5782d6cbc282425655f687a", size = 12752262 }, - { url = "https://files.pythonhosted.org/packages/c7/17/5f1971e54bd71604da6788efd84d66d789362b1105e17e5ccc53bba0289b/ruff-0.9.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d4c8772670aecf037d1bf7a07c39106574d143b26cfe5ed1787d2f31e800214", size = 14401648 }, - { url = "https://files.pythonhosted.org/packages/30/24/6200b13ea611b83260501b6955b764bb320e23b2b75884c60ee7d3f0b68e/ruff-0.9.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfc5f1d7afeda8d5d37660eeca6d389b142d7f2b5a1ab659d9214ebd0e025231", size = 12414702 }, - { url = "https://files.pythonhosted.org/packages/34/cb/f5d50d0c4ecdcc7670e348bd0b11878154bc4617f3fdd1e8ad5297c0d0ba/ruff-0.9.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:faa935fc00ae854d8b638c16a5f1ce881bc3f67446957dd6f2af440a5fc8526b", size = 11859608 }, - { url = "https://files.pythonhosted.org/packages/d6/f4/9c8499ae8426da48363bbb78d081b817b0f64a9305f9b7f87eab2a8fb2c1/ruff-0.9.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a6c634fc6f5a0ceae1ab3e13c58183978185d131a29c425e4eaa9f40afe1e6d6", size = 11485702 }, - { url = "https://files.pythonhosted.org/packages/18/59/30490e483e804ccaa8147dd78c52e44ff96e1c30b5a95d69a63163cdb15b/ruff-0.9.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:433dedf6ddfdec7f1ac7575ec1eb9844fa60c4c8c2f8887a070672b8d353d34c", size = 12067782 }, - { url = "https://files.pythonhosted.org/packages/3d/8c/893fa9551760b2f8eb2a351b603e96f15af167ceaf27e27ad873570bc04c/ruff-0.9.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d612dbd0f3a919a8cc1d12037168bfa536862066808960e0cc901404b77968f0", size = 12483087 }, - { url = "https://files.pythonhosted.org/packages/23/15/f6751c07c21ca10e3f4a51ea495ca975ad936d780c347d9808bcedbd7182/ruff-0.9.4-py3-none-win32.whl", hash = "sha256:db1192ddda2200671f9ef61d9597fcef89d934f5d1705e571a93a67fb13a4402", size = 9852302 }, - { url = "https://files.pythonhosted.org/packages/12/41/2d2d2c6a72e62566f730e49254f602dfed23019c33b5b21ea8f8917315a1/ruff-0.9.4-py3-none-win_amd64.whl", hash = "sha256:05bebf4cdbe3ef75430d26c375773978950bbf4ee3c95ccb5448940dc092408e", size = 10850051 }, - { url = "https://files.pythonhosted.org/packages/c6/e6/3d6ec3bc3d254e7f005c543a661a41c3e788976d0e52a1ada195bd664344/ruff-0.9.4-py3-none-win_arm64.whl", hash = "sha256:585792f1e81509e38ac5123492f8875fbc36f3ede8185af0a26df348e5154f41", size = 10078251 }, + { url = "https://files.pythonhosted.org/packages/76/e3/3d2c022e687e18cf5d93d6bfa2722d46afc64eaa438c7fbbdd603b3597be/ruff-0.9.6-py3-none-linux_armv6l.whl", hash = "sha256:2f218f356dd2d995839f1941322ff021c72a492c470f0b26a34f844c29cdf5ba", size = 11714128 }, + { url = "https://files.pythonhosted.org/packages/e1/22/aff073b70f95c052e5c58153cba735748c9e70107a77d03420d7850710a0/ruff-0.9.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b908ff4df65dad7b251c9968a2e4560836d8f5487c2f0cc238321ed951ea0504", size = 11682539 }, + { url = "https://files.pythonhosted.org/packages/75/a7/f5b7390afd98a7918582a3d256cd3e78ba0a26165a467c1820084587cbf9/ruff-0.9.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b109c0ad2ececf42e75fa99dc4043ff72a357436bb171900714a9ea581ddef83", size = 11132512 }, + { url = "https://files.pythonhosted.org/packages/a6/e3/45de13ef65047fea2e33f7e573d848206e15c715e5cd56095589a7733d04/ruff-0.9.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1de4367cca3dac99bcbd15c161404e849bb0bfd543664db39232648dc00112dc", size = 11929275 }, + { url = "https://files.pythonhosted.org/packages/7d/f2/23d04cd6c43b2e641ab961ade8d0b5edb212ecebd112506188c91f2a6e6c/ruff-0.9.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3ee4d7c2c92ddfdaedf0bf31b2b176fa7aa8950efc454628d477394d35638b", size = 11466502 }, + { url = "https://files.pythonhosted.org/packages/b5/6f/3a8cf166f2d7f1627dd2201e6cbc4cb81f8b7d58099348f0c1ff7b733792/ruff-0.9.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dc1edd1775270e6aa2386119aea692039781429f0be1e0949ea5884e011aa8e", size = 12676364 }, + { url = "https://files.pythonhosted.org/packages/f5/c4/db52e2189983c70114ff2b7e3997e48c8318af44fe83e1ce9517570a50c6/ruff-0.9.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:4a091729086dffa4bd070aa5dab7e39cc6b9d62eb2bef8f3d91172d30d599666", size = 13335518 }, + { url = "https://files.pythonhosted.org/packages/66/44/545f8a4d136830f08f4d24324e7db957c5374bf3a3f7a6c0bc7be4623a37/ruff-0.9.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1bbc6808bf7b15796cef0815e1dfb796fbd383e7dbd4334709642649625e7c5", size = 12823287 }, + { url = "https://files.pythonhosted.org/packages/c5/26/8208ef9ee7431032c143649a9967c3ae1aae4257d95e6f8519f07309aa66/ruff-0.9.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:589d1d9f25b5754ff230dce914a174a7c951a85a4e9270613a2b74231fdac2f5", size = 14592374 }, + { url = "https://files.pythonhosted.org/packages/31/70/e917781e55ff39c5b5208bda384fd397ffd76605e68544d71a7e40944945/ruff-0.9.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc61dd5131742e21103fbbdcad683a8813be0e3c204472d520d9a5021ca8b217", size = 12500173 }, + { url = "https://files.pythonhosted.org/packages/84/f5/e4ddee07660f5a9622a9c2b639afd8f3104988dc4f6ba0b73ffacffa9a8c/ruff-0.9.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5e2d9126161d0357e5c8f30b0bd6168d2c3872372f14481136d13de9937f79b6", size = 11906555 }, + { url = "https://files.pythonhosted.org/packages/f1/2b/6ff2fe383667075eef8656b9892e73dd9b119b5e3add51298628b87f6429/ruff-0.9.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:68660eab1a8e65babb5229a1f97b46e3120923757a68b5413d8561f8a85d4897", size = 11538958 }, + { url = "https://files.pythonhosted.org/packages/3c/db/98e59e90de45d1eb46649151c10a062d5707b5b7f76f64eb1e29edf6ebb1/ruff-0.9.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c4cae6c4cc7b9b4017c71114115db0445b00a16de3bcde0946273e8392856f08", size = 12117247 }, + { url = "https://files.pythonhosted.org/packages/ec/bc/54e38f6d219013a9204a5a2015c09e7a8c36cedcd50a4b01ac69a550b9d9/ruff-0.9.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:19f505b643228b417c1111a2a536424ddde0db4ef9023b9e04a46ed8a1cb4656", size = 12554647 }, + { url = "https://files.pythonhosted.org/packages/a5/7d/7b461ab0e2404293c0627125bb70ac642c2e8d55bf590f6fce85f508f1b2/ruff-0.9.6-py3-none-win32.whl", hash = "sha256:194d8402bceef1b31164909540a597e0d913c0e4952015a5b40e28c146121b5d", size = 9949214 }, + { url = "https://files.pythonhosted.org/packages/ee/30/c3cee10f915ed75a5c29c1e57311282d1a15855551a64795c1b2bbe5cf37/ruff-0.9.6-py3-none-win_amd64.whl", hash = "sha256:03482d5c09d90d4ee3f40d97578423698ad895c87314c4de39ed2af945633caa", size = 10999914 }, + { url = "https://files.pythonhosted.org/packages/e8/a8/d71f44b93e3aa86ae232af1f2126ca7b95c0f515ec135462b3e1f351441c/ruff-0.9.6-py3-none-win_arm64.whl", hash = "sha256:0e2bb706a2be7ddfea4a4af918562fdc1bcb16df255e5fa595bbd800ce322a5a", size = 10177499 }, ] [[package]] @@ -4894,7 +4905,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "joblib" }, { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "numpy", version = "2.2.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "scipy", version = "1.13.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "scipy", version = "1.15.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "threadpoolctl" }, @@ -4977,8 +4988,8 @@ version = "1.15.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_python_implementation != 'PyPy'", @@ -4989,7 +5000,7 @@ resolution-markers = [ ] dependencies = [ { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and python_full_version < '3.12'" }, - { name = "numpy", version = "2.2.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/76/c6/8eb0654ba0c7d0bb1bf67bf8fbace101a8e4f250f7722371105e8b6f68fc/scipy-1.15.1.tar.gz", hash = "sha256:033a75ddad1463970c96a88063a1df87ccfddd526437136b6ee81ff0312ebdf6", size = 59407493 } wheels = [ @@ -5077,7 +5088,7 @@ version = "2.0.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "numpy", version = "2.2.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/21/c0/a911d1fd765d07a2b6769ce155219a281bfbe311584ebe97340d75c5bdb1/shapely-2.0.7.tar.gz", hash = "sha256:28fe2997aab9a9dc026dc6a355d04e85841546b2a5d232ed953e3321ab958ee5", size = 283413 } wheels = [ @@ -5142,55 +5153,55 @@ wheels = [ [[package]] name = "sqlalchemy" -version = "2.0.37" +version = "2.0.38" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3b/20/93ea2518df4d7a14ebe9ace9ab8bb92aaf7df0072b9007644de74172b06c/sqlalchemy-2.0.37.tar.gz", hash = "sha256:12b28d99a9c14eaf4055810df1001557176716de0167b91026e648e65229bffb", size = 9626249 } +sdist = { url = "https://files.pythonhosted.org/packages/e4/08/9a90962ea72acd532bda71249a626344d855c4032603924b1b547694b837/sqlalchemy-2.0.38.tar.gz", hash = "sha256:e5a4d82bdb4bf1ac1285a68eab02d253ab73355d9f0fe725a97e1e0fa689decb", size = 9634782 } wheels = [ - { url = "https://files.pythonhosted.org/packages/80/21/aaf0cd2e7ee56e464af7cba38a54f9c1203570181ec5d847711f33c9f520/SQLAlchemy-2.0.37-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da36c3b0e891808a7542c5c89f224520b9a16c7f5e4d6a1156955605e54aef0e", size = 2102915 }, - { url = "https://files.pythonhosted.org/packages/fd/01/6615256759515f13bb7d7b49981326f1f4e80ff1bd92dccd53f99dab79ea/SQLAlchemy-2.0.37-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e7402ff96e2b073a98ef6d6142796426d705addd27b9d26c3b32dbaa06d7d069", size = 2094095 }, - { url = "https://files.pythonhosted.org/packages/6a/f2/400252bda1bd67da7a35bb2ab84d10a8ad43975d42f15b207a9efb765446/SQLAlchemy-2.0.37-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6f5d254a22394847245f411a2956976401e84da4288aa70cbcd5190744062c1", size = 3076482 }, - { url = "https://files.pythonhosted.org/packages/40/c6/e7e8e894c8f065f96ca202cdb00454d60d4962279b3eb5a81b8766dfa836/SQLAlchemy-2.0.37-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41296bbcaa55ef5fdd32389a35c710133b097f7b2609d8218c0eabded43a1d84", size = 3084750 }, - { url = "https://files.pythonhosted.org/packages/d6/ee/1cdab04b7760e48273f2592037df156afae044e2e6589157673bd2a830c0/SQLAlchemy-2.0.37-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bedee60385c1c0411378cbd4dc486362f5ee88deceea50002772912d798bb00f", size = 3040575 }, - { url = "https://files.pythonhosted.org/packages/4d/af/2dd456bfd8d4b9750792ceedd828bddf83860f2420545e5effbaf722dae5/SQLAlchemy-2.0.37-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6c67415258f9f3c69867ec02fea1bf6508153709ecbd731a982442a590f2b7e4", size = 3066113 }, - { url = "https://files.pythonhosted.org/packages/dd/d7/ad997559574f94d7bd895a8a63996afef518d07e9eaf5a2a9cbbcb877c16/SQLAlchemy-2.0.37-cp310-cp310-win32.whl", hash = "sha256:650dcb70739957a492ad8acff65d099a9586b9b8920e3507ca61ec3ce650bb72", size = 2075239 }, - { url = "https://files.pythonhosted.org/packages/d0/82/141fbed705a21af2d825068831da1d80d720945df60c2b97ddc5133b3714/SQLAlchemy-2.0.37-cp310-cp310-win_amd64.whl", hash = "sha256:93d1543cd8359040c02b6614421c8e10cd7a788c40047dbc507ed46c29ae5636", size = 2099307 }, - { url = "https://files.pythonhosted.org/packages/7c/37/4915290c1849337be6d24012227fb3c30c575151eec2b182ee5f45e96ce7/SQLAlchemy-2.0.37-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:78361be6dc9073ed17ab380985d1e45e48a642313ab68ab6afa2457354ff692c", size = 2104098 }, - { url = "https://files.pythonhosted.org/packages/4c/f5/8cce9196434014a24cc65f6c68faa9a887080932361ee285986c0a35892d/SQLAlchemy-2.0.37-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b661b49d0cb0ab311a189b31e25576b7ac3e20783beb1e1817d72d9d02508bf5", size = 2094492 }, - { url = "https://files.pythonhosted.org/packages/9c/54/2df4b3d0d11b384b6e9a8788d0f1123243f2d2356e2ccf626f93dcc1a09f/SQLAlchemy-2.0.37-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d57bafbab289e147d064ffbd5cca2d7b1394b63417c0636cea1f2e93d16eb9e8", size = 3212789 }, - { url = "https://files.pythonhosted.org/packages/57/4f/e1db9475f940f1c54c365ed02d4f6390f884fc95a6a4022ece7725956664/SQLAlchemy-2.0.37-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fa2c0913f02341d25fb858e4fb2031e6b0813494cca1ba07d417674128ce11b", size = 3212784 }, - { url = "https://files.pythonhosted.org/packages/89/57/d93212e827d1f03a6cd4d0ea13775957c2a95161330fa47449b91153bd09/SQLAlchemy-2.0.37-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9df21b8d9e5c136ea6cde1c50d2b1c29a2b5ff2b1d610165c23ff250e0704087", size = 3149616 }, - { url = "https://files.pythonhosted.org/packages/5f/c2/759347419f69cf0bbb76d330fbdbd24cefb15842095fe86bca623759b9e8/SQLAlchemy-2.0.37-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db18ff6b8c0f1917f8b20f8eca35c28bbccb9f83afa94743e03d40203ed83de9", size = 3169944 }, - { url = "https://files.pythonhosted.org/packages/22/04/a19ecb53aa19bb8cf491ecdb6bf8c1ac74959cd4962e119e91d4e2b8ecaa/SQLAlchemy-2.0.37-cp311-cp311-win32.whl", hash = "sha256:46954173612617a99a64aee103bcd3f078901b9a8dcfc6ae80cbf34ba23df989", size = 2074686 }, - { url = "https://files.pythonhosted.org/packages/7b/9d/6e030cc2c675539dbc5ef73aa97a3cbe09341e27ad38caed2b70c4273aff/SQLAlchemy-2.0.37-cp311-cp311-win_amd64.whl", hash = "sha256:7b7e772dc4bc507fdec4ee20182f15bd60d2a84f1e087a8accf5b5b7a0dcf2ba", size = 2099891 }, - { url = "https://files.pythonhosted.org/packages/86/62/e5de4a5e0c4f5ceffb2b461aaa2378c0ee00642930a8c38e5b80338add0f/SQLAlchemy-2.0.37-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2952748ecd67ed3b56773c185e85fc084f6bdcdec10e5032a7c25a6bc7d682ef", size = 2102692 }, - { url = "https://files.pythonhosted.org/packages/01/44/3b65f4f16abeffd611da0ebab9e3aadfca45d041a78a67835c41c6d28289/SQLAlchemy-2.0.37-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3151822aa1db0eb5afd65ccfafebe0ef5cda3a7701a279c8d0bf17781a793bb4", size = 2093079 }, - { url = "https://files.pythonhosted.org/packages/a4/d8/e3a6622e86e3ae3a41ba470d1bb095c1f2dedf6b71feae0b4b94b5951017/SQLAlchemy-2.0.37-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaa8039b6d20137a4e02603aba37d12cd2dde7887500b8855356682fc33933f4", size = 3242509 }, - { url = "https://files.pythonhosted.org/packages/3a/ef/5a53a6a60ac5a5d4ed28959317dac1ff72bc16773ccd9b3fe79713fe27f3/SQLAlchemy-2.0.37-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cdba1f73b64530c47b27118b7053b8447e6d6f3c8104e3ac59f3d40c33aa9fd", size = 3253368 }, - { url = "https://files.pythonhosted.org/packages/67/f2/30f5012379031cd5389eb06455282f926a4f99258e5ee5ccdcea27f30d67/SQLAlchemy-2.0.37-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1b2690456528a87234a75d1a1644cdb330a6926f455403c8e4f6cad6921f9098", size = 3188655 }, - { url = "https://files.pythonhosted.org/packages/fe/df/905499aa051605aeda62c1faf33d941ffb7fda291159ab1c24ef5207a079/SQLAlchemy-2.0.37-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf5ae8a9dcf657fd72144a7fd01f243236ea39e7344e579a121c4205aedf07bb", size = 3215281 }, - { url = "https://files.pythonhosted.org/packages/94/54/f2769e7e356520f75016d82ca43ed85e47ba50e636a34124db4625ae5976/SQLAlchemy-2.0.37-cp312-cp312-win32.whl", hash = "sha256:ea308cec940905ba008291d93619d92edaf83232ec85fbd514dcb329f3192761", size = 2072972 }, - { url = "https://files.pythonhosted.org/packages/c2/7f/241f059e0b7edb85845368f43964d6b0b41733c2f7fffaa993f8e66548a5/SQLAlchemy-2.0.37-cp312-cp312-win_amd64.whl", hash = "sha256:635d8a21577341dfe4f7fa59ec394b346da12420b86624a69e466d446de16aff", size = 2098597 }, - { url = "https://files.pythonhosted.org/packages/45/d1/e63e56ceab148e69f545703a74b90c8c6dc0a04a857e4e63a4c07a23cf91/SQLAlchemy-2.0.37-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8c4096727193762e72ce9437e2a86a110cf081241919ce3fab8e89c02f6b6658", size = 2097968 }, - { url = "https://files.pythonhosted.org/packages/fd/e5/93ce63310347062bd42aaa8b6785615c78539787ef4380252fcf8e2dcee3/SQLAlchemy-2.0.37-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e4fb5ac86d8fe8151966814f6720996430462e633d225497566b3996966b9bdb", size = 2088445 }, - { url = "https://files.pythonhosted.org/packages/1b/8c/d0e0081c09188dd26040fc8a09c7d87f539e1964df1ac60611b98ff2985a/SQLAlchemy-2.0.37-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e56a139bfe136a22c438478a86f8204c1eb5eed36f4e15c4224e4b9db01cb3e4", size = 3174880 }, - { url = "https://files.pythonhosted.org/packages/79/f7/3396038d8d4ea92c72f636a007e2fac71faae0b59b7e21af46b635243d09/SQLAlchemy-2.0.37-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f95fc8e3f34b5f6b3effb49d10ac97c569ec8e32f985612d9b25dd12d0d2e94", size = 3188226 }, - { url = "https://files.pythonhosted.org/packages/ef/33/7a1d85716b29c86a744ed43690e243cb0e9c32e3b68a67a97eaa6b49ef66/SQLAlchemy-2.0.37-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c505edd429abdfe3643fa3b2e83efb3445a34a9dc49d5f692dd087be966020e0", size = 3121425 }, - { url = "https://files.pythonhosted.org/packages/27/11/fa63a77c88eb2f79bb8b438271fbacd66a546a438e4eaba32d62f11298e2/SQLAlchemy-2.0.37-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:12b0f1ec623cccf058cf21cb544f0e74656618165b083d78145cafde156ea7b6", size = 3149589 }, - { url = "https://files.pythonhosted.org/packages/b6/04/fcdd103b6871f2110460b8275d1c4828daa806997b0fa5a01c1cd7fd522d/SQLAlchemy-2.0.37-cp313-cp313-win32.whl", hash = "sha256:293f9ade06b2e68dd03cfb14d49202fac47b7bb94bffcff174568c951fbc7af2", size = 2070746 }, - { url = "https://files.pythonhosted.org/packages/d4/7c/e024719205bdc1465b7b7d3d22ece8e1ad57bc7d76ef6ed78bb5f812634a/SQLAlchemy-2.0.37-cp313-cp313-win_amd64.whl", hash = "sha256:d70f53a0646cc418ca4853da57cf3ddddbccb8c98406791f24426f2dd77fd0e2", size = 2094612 }, - { url = "https://files.pythonhosted.org/packages/70/c9/f199edc09a630ac62079977cbb8a50888cb920c1f635ce254cb4d61e1dda/SQLAlchemy-2.0.37-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:648ec5acf95ad59255452ef759054f2176849662af4521db6cb245263ae4aa33", size = 2105789 }, - { url = "https://files.pythonhosted.org/packages/e7/cc/9286318598bb26af535f480636ed6cf368794f2b483122ce7f2a56acef57/SQLAlchemy-2.0.37-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:35bd2df269de082065d4b23ae08502a47255832cc3f17619a5cea92ce478b02b", size = 2097013 }, - { url = "https://files.pythonhosted.org/packages/db/41/efaa216b3ebe2989f233ac72abed7281c8fe45a40a2cae7a06c3b1cef870/SQLAlchemy-2.0.37-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f581d365af9373a738c49e0c51e8b18e08d8a6b1b15cc556773bcd8a192fa8b", size = 3090933 }, - { url = "https://files.pythonhosted.org/packages/65/ee/b99bb446b0dc8fa5e2dbd47bf379bc62c5f2823681732fd3a253b1c49a6e/SQLAlchemy-2.0.37-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82df02816c14f8dc9f4d74aea4cb84a92f4b0620235daa76dde002409a3fbb5a", size = 3098730 }, - { url = "https://files.pythonhosted.org/packages/dd/61/a9eac6696ca4791895784871f79b32bcf1b0dd17614479734558036af8d8/SQLAlchemy-2.0.37-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94b564e38b344d3e67d2e224f0aec6ba09a77e4582ced41e7bfd0f757d926ec9", size = 3057751 }, - { url = "https://files.pythonhosted.org/packages/95/be/d70fa8a42287976dad0d590f75633ec203694d2f9bafd1cdba41d8e4db55/SQLAlchemy-2.0.37-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:955a2a765aa1bd81aafa69ffda179d4fe3e2a3ad462a736ae5b6f387f78bfeb8", size = 3084290 }, - { url = "https://files.pythonhosted.org/packages/18/e9/a00e73a7e8eb620ea030592c7d3a9b66c31bc6b36effdf04f10c7ada8dc1/SQLAlchemy-2.0.37-cp39-cp39-win32.whl", hash = "sha256:03f0528c53ca0b67094c4764523c1451ea15959bbf0a8a8a3096900014db0278", size = 2077561 }, - { url = "https://files.pythonhosted.org/packages/2a/52/f3fff9216b9df07e8142001e638d5ba8c298299a2a9006b9ab3b068fb0f1/SQLAlchemy-2.0.37-cp39-cp39-win_amd64.whl", hash = "sha256:4b12885dc85a2ab2b7d00995bac6d967bffa8594123b02ed21e8eb2205a7584b", size = 2101760 }, - { url = "https://files.pythonhosted.org/packages/3b/36/59cc97c365f2f79ac9f3f51446cae56dfd82c4f2dd98497e6be6de20fb91/SQLAlchemy-2.0.37-py3-none-any.whl", hash = "sha256:a8998bf9f8658bd3839cbc44ddbe982955641863da0c1efe5b00c1ab4f5c16b1", size = 1894113 }, + { url = "https://files.pythonhosted.org/packages/78/10/16ed1503e18c0ec4e17a1819ff44604368607eed3db1e1d89d33269fe5b9/SQLAlchemy-2.0.38-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5e1d9e429028ce04f187a9f522818386c8b076723cdbe9345708384f49ebcec6", size = 2105151 }, + { url = "https://files.pythonhosted.org/packages/79/e5/2e9a0807cba2e625204d04bc39a18a47478e4bacae353ae8a7f2e784c341/SQLAlchemy-2.0.38-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b87a90f14c68c925817423b0424381f0e16d80fc9a1a1046ef202ab25b19a444", size = 2096335 }, + { url = "https://files.pythonhosted.org/packages/c1/97/8fa5cc6ed994eab611dcf0bc431161308f297c6f896f02a3ebb8d8aa06ea/SQLAlchemy-2.0.38-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:402c2316d95ed90d3d3c25ad0390afa52f4d2c56b348f212aa9c8d072a40eee5", size = 3078705 }, + { url = "https://files.pythonhosted.org/packages/a9/99/505feb8a9bc7027addaa2b312b8b306319cacbbd8a5231c4123ca1fa082a/SQLAlchemy-2.0.38-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6493bc0eacdbb2c0f0d260d8988e943fee06089cd239bd7f3d0c45d1657a70e2", size = 3086958 }, + { url = "https://files.pythonhosted.org/packages/39/26/fb7cef8198bb2627ac527b2cf6c576588db09856d634d4f1017280f8ab64/SQLAlchemy-2.0.38-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0561832b04c6071bac3aad45b0d3bb6d2c4f46a8409f0a7a9c9fa6673b41bc03", size = 3042798 }, + { url = "https://files.pythonhosted.org/packages/cc/7c/b6f9e0ee4e8e993fdce42477f9290b2b8373e672fb1dc0272179f0aeafb4/SQLAlchemy-2.0.38-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:49aa2cdd1e88adb1617c672a09bf4ebf2f05c9448c6dbeba096a3aeeb9d4d443", size = 3068318 }, + { url = "https://files.pythonhosted.org/packages/e6/22/903497e8202960c4249ffc340ec8de63f7fbdd4856bdfe854f617e124e90/SQLAlchemy-2.0.38-cp310-cp310-win32.whl", hash = "sha256:64aa8934200e222f72fcfd82ee71c0130a9c07d5725af6fe6e919017d095b297", size = 2077434 }, + { url = "https://files.pythonhosted.org/packages/20/a8/08f6ceccff5e0abb4a22e2e91c44b0e39911fda06b5d0c905dfc642de57a/SQLAlchemy-2.0.38-cp310-cp310-win_amd64.whl", hash = "sha256:c57b8e0841f3fce7b703530ed70c7c36269c6d180ea2e02e36b34cb7288c50c7", size = 2101608 }, + { url = "https://files.pythonhosted.org/packages/00/6c/9d3a638f297fce288ba12a4e5dbd08ef1841d119abee9300c100eba00217/SQLAlchemy-2.0.38-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bf89e0e4a30714b357f5d46b6f20e0099d38b30d45fa68ea48589faf5f12f62d", size = 2106330 }, + { url = "https://files.pythonhosted.org/packages/0e/57/d5fdee56f418491267701965795805662b1744de40915d4764451390536d/SQLAlchemy-2.0.38-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8455aa60da49cb112df62b4721bd8ad3654a3a02b9452c783e651637a1f21fa2", size = 2096730 }, + { url = "https://files.pythonhosted.org/packages/42/84/205f423f8b28329c47237b7e130a7f93c234a49fab20b4534bd1ff26a06a/SQLAlchemy-2.0.38-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f53c0d6a859b2db58332e0e6a921582a02c1677cc93d4cbb36fdf49709b327b2", size = 3215023 }, + { url = "https://files.pythonhosted.org/packages/77/41/94a558d47bffae5a361b0cfb3721324ea4154829dd5432f80bd4cfeecbc9/SQLAlchemy-2.0.38-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3c4817dff8cef5697f5afe5fec6bc1783994d55a68391be24cb7d80d2dbc3a6", size = 3214991 }, + { url = "https://files.pythonhosted.org/packages/74/a0/cc3c030e7440bd17ce67c1875f50edb41d0ef17b9c76fbc290ef27bbe37f/SQLAlchemy-2.0.38-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9cea5b756173bb86e2235f2f871b406a9b9d722417ae31e5391ccaef5348f2c", size = 3151854 }, + { url = "https://files.pythonhosted.org/packages/24/ab/8ba2588c2eb1d092944551354d775ef4fc0250badede324d786a4395d10e/SQLAlchemy-2.0.38-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40e9cdbd18c1f84631312b64993f7d755d85a3930252f6276a77432a2b25a2f3", size = 3172158 }, + { url = "https://files.pythonhosted.org/packages/e0/73/2a3d6217e8e6abb553ed410ce5adc0bdec7effd684716f0fbaee5831d677/SQLAlchemy-2.0.38-cp311-cp311-win32.whl", hash = "sha256:cb39ed598aaf102251483f3e4675c5dd6b289c8142210ef76ba24aae0a8f8aba", size = 2076965 }, + { url = "https://files.pythonhosted.org/packages/a4/17/364a99c8c5698492c7fa40fc463bf388f05b0b03b74028828b71a79dc89d/SQLAlchemy-2.0.38-cp311-cp311-win_amd64.whl", hash = "sha256:f9d57f1b3061b3e21476b0ad5f0397b112b94ace21d1f439f2db472e568178ae", size = 2102169 }, + { url = "https://files.pythonhosted.org/packages/5a/f8/6d0424af1442c989b655a7b5f608bc2ae5e4f94cdf6df9f6054f629dc587/SQLAlchemy-2.0.38-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12d5b06a1f3aeccf295a5843c86835033797fea292c60e72b07bcb5d820e6dd3", size = 2104927 }, + { url = "https://files.pythonhosted.org/packages/25/80/fc06e65fca0a19533e2bfab633a5633ed8b6ee0b9c8d580acf84609ce4da/SQLAlchemy-2.0.38-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e036549ad14f2b414c725349cce0772ea34a7ab008e9cd67f9084e4f371d1f32", size = 2095317 }, + { url = "https://files.pythonhosted.org/packages/98/2d/5d66605f76b8e344813237dc160a01f03b987201e974b46056a7fb94a874/SQLAlchemy-2.0.38-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3bee874cb1fadee2ff2b79fc9fc808aa638670f28b2145074538d4a6a5028e", size = 3244735 }, + { url = "https://files.pythonhosted.org/packages/73/8d/b0539e8dce90861efc38fea3eefb15a5d0cfeacf818614762e77a9f192f9/SQLAlchemy-2.0.38-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e185ea07a99ce8b8edfc788c586c538c4b1351007e614ceb708fd01b095ef33e", size = 3255581 }, + { url = "https://files.pythonhosted.org/packages/ac/a5/94e1e44bf5bdffd1782807fcc072542b110b950f0be53f49e68b5f5eca1b/SQLAlchemy-2.0.38-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b79ee64d01d05a5476d5cceb3c27b5535e6bb84ee0f872ba60d9a8cd4d0e6579", size = 3190877 }, + { url = "https://files.pythonhosted.org/packages/91/13/f08b09996dce945aec029c64f61c13b4788541ac588d9288e31e0d3d8850/SQLAlchemy-2.0.38-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:afd776cf1ebfc7f9aa42a09cf19feadb40a26366802d86c1fba080d8e5e74bdd", size = 3217485 }, + { url = "https://files.pythonhosted.org/packages/13/8f/8cfe2ba5ba6d8090f4de0e658330c53be6b7bf430a8df1b141c2b180dcdf/SQLAlchemy-2.0.38-cp312-cp312-win32.whl", hash = "sha256:a5645cd45f56895cfe3ca3459aed9ff2d3f9aaa29ff7edf557fa7a23515a3725", size = 2075254 }, + { url = "https://files.pythonhosted.org/packages/c2/5c/e3c77fae41862be1da966ca98eec7fbc07cdd0b00f8b3e1ef2a13eaa6cca/SQLAlchemy-2.0.38-cp312-cp312-win_amd64.whl", hash = "sha256:1052723e6cd95312f6a6eff9a279fd41bbae67633415373fdac3c430eca3425d", size = 2100865 }, + { url = "https://files.pythonhosted.org/packages/21/77/caa875a1f5a8a8980b564cc0e6fee1bc992d62d29101252561d0a5e9719c/SQLAlchemy-2.0.38-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ecef029b69843b82048c5b347d8e6049356aa24ed644006c9a9d7098c3bd3bfd", size = 2100201 }, + { url = "https://files.pythonhosted.org/packages/f4/ec/94bb036ec78bf9a20f8010c807105da9152dd84f72e8c51681ad2f30b3fd/SQLAlchemy-2.0.38-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c8bcad7fc12f0cc5896d8e10fdf703c45bd487294a986903fe032c72201596b", size = 2090678 }, + { url = "https://files.pythonhosted.org/packages/7b/61/63ff1893f146e34d3934c0860209fdd3925c25ee064330e6c2152bacc335/SQLAlchemy-2.0.38-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a0ef3f98175d77180ffdc623d38e9f1736e8d86b6ba70bff182a7e68bed7727", size = 3177107 }, + { url = "https://files.pythonhosted.org/packages/a9/4f/b933bea41a602b5f274065cc824fae25780ed38664d735575192490a021b/SQLAlchemy-2.0.38-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b0ac78898c50e2574e9f938d2e5caa8fe187d7a5b69b65faa1ea4648925b096", size = 3190435 }, + { url = "https://files.pythonhosted.org/packages/f5/23/9e654b4059e385988de08c5d3b38a369ea042f4c4d7c8902376fd737096a/SQLAlchemy-2.0.38-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9eb4fa13c8c7a2404b6a8e3772c17a55b1ba18bc711e25e4d6c0c9f5f541b02a", size = 3123648 }, + { url = "https://files.pythonhosted.org/packages/83/59/94c6d804e76ebc6412a08d2b086a8cb3e5a056cd61508e18ddaf3ec70100/SQLAlchemy-2.0.38-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5dba1cdb8f319084f5b00d41207b2079822aa8d6a4667c0f369fce85e34b0c86", size = 3151789 }, + { url = "https://files.pythonhosted.org/packages/b2/27/17f143013aabbe1256dce19061eafdce0b0142465ce32168cdb9a18c04b1/SQLAlchemy-2.0.38-cp313-cp313-win32.whl", hash = "sha256:eae27ad7580529a427cfdd52c87abb2dfb15ce2b7a3e0fc29fbb63e2ed6f8120", size = 2073023 }, + { url = "https://files.pythonhosted.org/packages/e2/3e/259404b03c3ed2e7eee4c179e001a07d9b61070334be91124cf4ad32eec7/SQLAlchemy-2.0.38-cp313-cp313-win_amd64.whl", hash = "sha256:b335a7c958bc945e10c522c069cd6e5804f4ff20f9a744dd38e748eb602cbbda", size = 2096908 }, + { url = "https://files.pythonhosted.org/packages/7a/c0/5d5b40989820eb8a3d05ca044d6ff81c423cae6bacd1f76e8f59aa6fa7bb/SQLAlchemy-2.0.38-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07258341402a718f166618470cde0c34e4cec85a39767dce4e24f61ba5e667ea", size = 2108025 }, + { url = "https://files.pythonhosted.org/packages/f5/76/297c532ea77c90e858a2967ba8ed62e8d9c503edc968b0c875361631cf1f/SQLAlchemy-2.0.38-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a826f21848632add58bef4f755a33d45105d25656a0c849f2dc2df1c71f6f50", size = 2099245 }, + { url = "https://files.pythonhosted.org/packages/41/f5/61a73cb8df1a4308f05d2a78e583863735167f66a1a3bea8e85a35effd7c/SQLAlchemy-2.0.38-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:386b7d136919bb66ced64d2228b92d66140de5fefb3c7df6bd79069a269a7b06", size = 3093159 }, + { url = "https://files.pythonhosted.org/packages/7b/fe/43934748895becbcac4d173aaf6e05d3a35d683cdda4ced78acfd71706ed/SQLAlchemy-2.0.38-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f2951dc4b4f990a4b394d6b382accb33141d4d3bd3ef4e2b27287135d6bdd68", size = 3100942 }, + { url = "https://files.pythonhosted.org/packages/40/18/79beffa9d7ffab30df7390fbe746dd485d2ea097eb460e37ff7d2e3d467d/SQLAlchemy-2.0.38-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8bf312ed8ac096d674c6aa9131b249093c1b37c35db6a967daa4c84746bc1bc9", size = 3059984 }, + { url = "https://files.pythonhosted.org/packages/ed/96/4c0e8e963688b200bee5f38c1ef948245ee9503a1419c0a1be35da543aff/SQLAlchemy-2.0.38-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6db316d6e340f862ec059dc12e395d71f39746a20503b124edc255973977b728", size = 3086499 }, + { url = "https://files.pythonhosted.org/packages/42/d5/20a6c93c50f6c6b388e8d85fbba1c960ae00ed820ec1a31ae58f35f62f74/SQLAlchemy-2.0.38-cp39-cp39-win32.whl", hash = "sha256:c09a6ea87658695e527104cf857c70f79f14e9484605e205217aae0ec27b45fc", size = 2079838 }, + { url = "https://files.pythonhosted.org/packages/24/2d/efbefd0b8206a3a811328bfa24ed3c96f7b0b6c3bfc5a2a29613e23a9d30/SQLAlchemy-2.0.38-cp39-cp39-win_amd64.whl", hash = "sha256:12f5c9ed53334c3ce719155424dc5407aaa4f6cadeb09c5b627e06abb93933a1", size = 2104028 }, + { url = "https://files.pythonhosted.org/packages/aa/e4/592120713a314621c692211eba034d09becaf6bc8848fabc1dc2a54d8c16/SQLAlchemy-2.0.38-py3-none-any.whl", hash = "sha256:63178c675d4c80def39f1febd625a6333f44c0ba269edd8a468b156394b27753", size = 1896347 }, ] [[package]] @@ -5482,13 +5493,13 @@ wheels = [ [[package]] name = "transformers" -version = "4.48.2" +version = "4.48.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, { name = "huggingface-hub" }, { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "numpy", version = "2.2.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "packaging" }, { name = "pyyaml" }, { name = "regex" }, @@ -5497,9 +5508,9 @@ dependencies = [ { name = "tokenizers" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/cf/1093586e09c8d889d2f6b8ffe6a1369e1e179eb7b8e732fc0f348a8fe58f/transformers-4.48.2.tar.gz", hash = "sha256:dcfb73473e61f22fb3366fe2471ed2e42779ecdd49527a1bdf1937574855d516", size = 8370945 } +sdist = { url = "https://files.pythonhosted.org/packages/e3/82/cebeb7af5e64440f1638f18c4ed0f89156d0eeaa6290d98da8ca93ac3872/transformers-4.48.3.tar.gz", hash = "sha256:a5e8f1e9a6430aa78215836be70cecd3f872d99eeda300f41ad6cc841724afdb", size = 8373458 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/40/902c95a2a6f5d2d120c940ac4bd1f937c01035af529803c13d65ca33c2d1/transformers-4.48.2-py3-none-any.whl", hash = "sha256:493bc5b0268b116eff305edf6656367fc89cf570e7a9d5891369e04751db698a", size = 9667774 }, + { url = "https://files.pythonhosted.org/packages/b6/1a/efeecb8d83705f2f4beac98d46f2148c95ecd7babfb31b5c0f1e7017e83d/transformers-4.48.3-py3-none-any.whl", hash = "sha256:78697f990f5ef350c23b46bf86d5081ce96b49479ab180b2de7687267de8fd36", size = 9669412 }, ] [[package]] @@ -5537,11 +5548,11 @@ wheels = [ [[package]] name = "types-protobuf" -version = "5.29.1.20241207" +version = "5.29.1.20250208" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/70/89/b661a447139f665ccea8e39bfdd52a92f803df4b5de0e6001a3537feaacb/types_protobuf-5.29.1.20241207.tar.gz", hash = "sha256:2ebcadb8ab3ef2e3e2f067e0882906d64ba0dc65fc5b0fd7a8b692315b4a0be9", size = 59190 } +sdist = { url = "https://files.pythonhosted.org/packages/ff/75/8effaebae86ae9e489d4d453b30c6da728e8a9267a261418d476c5c2fbe6/types_protobuf-5.29.1.20250208.tar.gz", hash = "sha256:c1acd6a59ab554dbe09b5d1fa7dd701e2fcfb2212937a3af1c03b736060b792a", size = 59330 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/6e/cdf152187019d6f6d04066b23e48659d961b527e9c6d43b48459d160e332/types_protobuf-5.29.1.20241207-py3-none-any.whl", hash = "sha256:92893c42083e9b718c678badc0af7a9a1307b92afe1599e5cba5f3d35b668b2f", size = 73902 }, + { url = "https://files.pythonhosted.org/packages/96/e9/095c36efdc9dbb1df75ce42f37c0de6a6879aad937a08f0b97942b7c5968/types_protobuf-5.29.1.20250208-py3-none-any.whl", hash = "sha256:c5f8bfb4afdc1b5cbca1848f2c8b361a2090add7401f410b22b599ef647bf483", size = 73925 }, ] [[package]] @@ -5619,8 +5630,8 @@ version = "2.32.0.20241016" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_python_implementation != 'PyPy'", @@ -5639,11 +5650,11 @@ wheels = [ [[package]] name = "types-setuptools" -version = "75.8.0.20250110" +version = "75.8.0.20250210" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f7/42/5713e90d4f9683f2301d900f33e4fc2405ad8ac224dda30f6cb7f4cd215b/types_setuptools-75.8.0.20250110.tar.gz", hash = "sha256:96f7ec8bbd6e0a54ea180d66ad68ad7a1d7954e7281a710ea2de75e355545271", size = 48185 } +sdist = { url = "https://files.pythonhosted.org/packages/c3/20/794589df23b1e7d3c1a1f86285e749f2a83ef845d90f2461bc2912b8f989/types_setuptools-75.8.0.20250210.tar.gz", hash = "sha256:c1547361b2441f07c94e25dce8a068e18c611593ad4b6fdd727b1a8f5d1fda33", size = 48240 } wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/a3/dbfd106751b11c728cec21cc62cbfe7ff7391b935c4b6e8f0bdc2e6fd541/types_setuptools-75.8.0.20250110-py3-none-any.whl", hash = "sha256:a9f12980bbf9bcdc23ecd80755789085bad6bfce4060c2275bc2b4ca9f2bc480", size = 71521 }, + { url = "https://files.pythonhosted.org/packages/2d/b4/5978a63dac80d9a653fdb73f58e08b208486d303f9a3ee481f0c807630de/types_setuptools-75.8.0.20250210-py3-none-any.whl", hash = "sha256:a217d7b4d59be04c29e23d142c959a0f85e71292fd3fc4313f016ca11f0b56dc", size = 71535 }, ] [[package]] @@ -5732,8 +5743,8 @@ version = "2.3.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.12.4' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_python_implementation == 'PyPy'", "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_python_implementation != 'PyPy'", @@ -5747,25 +5758,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, ] -[[package]] -name = "vcrpy" -version = "4.3.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10' and platform_python_implementation == 'PyPy'", - "python_full_version < '3.10' and platform_python_implementation != 'PyPy'", -] -dependencies = [ - { name = "pyyaml", marker = "python_full_version < '3.10'" }, - { name = "six", marker = "python_full_version < '3.10'" }, - { name = "wrapt", marker = "python_full_version < '3.10'" }, - { name = "yarl", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c4/ef/0adac7ae234126b7ce90c4f45cf3750ea7d21320ad472a45fc2e13625245/vcrpy-4.3.0.tar.gz", hash = "sha256:49c270ce67e826dba027d83e20d25b67a5885487697e97bca6dbdf53d750a0ac", size = 80891 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/42/463fb8e4da067708299264c09b3c8ce68051e8e4850df2379dc0f49f6968/vcrpy-4.3.0-py2.py3-none-any.whl", hash = "sha256:8fbd4be412e8a7f35f623dd61034e6380a1c8dbd0edf6e87277a3289f6e98093", size = 40580 }, -] - [[package]] name = "vcrpy" version = "5.1.0" @@ -5797,12 +5789,15 @@ resolution-markers = [ "python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_python_implementation != 'PyPy'", "python_full_version == '3.11.*' and platform_python_implementation != 'PyPy'", "python_full_version == '3.10.*' and platform_python_implementation != 'PyPy'", + "python_full_version < '3.10' and platform_python_implementation == 'PyPy'", + "python_full_version < '3.10' and platform_python_implementation != 'PyPy'", ] dependencies = [ - { name = "pyyaml", marker = "python_full_version >= '3.10' and platform_python_implementation != 'PyPy'" }, + { name = "pyyaml", marker = "python_full_version < '3.10' or platform_python_implementation != 'PyPy'" }, + { name = "urllib3", version = "1.26.20", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "urllib3", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and platform_python_implementation != 'PyPy'" }, - { name = "wrapt", marker = "python_full_version >= '3.10' and platform_python_implementation != 'PyPy'" }, - { name = "yarl", marker = "python_full_version >= '3.10' and platform_python_implementation != 'PyPy'" }, + { name = "wrapt", marker = "python_full_version < '3.10' or platform_python_implementation != 'PyPy'" }, + { name = "yarl", marker = "python_full_version < '3.10' or platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/25/d3/856e06184d4572aada1dd559ddec3bedc46df1f2edc5ab2c91121a2cccdb/vcrpy-7.0.0.tar.gz", hash = "sha256:176391ad0425edde1680c5b20738ea3dc7fb942520a48d2993448050986b3a50", size = 85502 } wheels = [ diff --git a/libs/partners/anthropic/pyproject.toml b/libs/partners/anthropic/pyproject.toml index 00d19032d23..c8cc0a6c104 100644 --- a/libs/partners/anthropic/pyproject.toml +++ b/libs/partners/anthropic/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "pdm.backend" [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<4.0,>=3.9" dependencies = [ "anthropic<1,>=0.45.0", @@ -32,29 +32,24 @@ test = [ "defusedxml<1.0.0,>=0.7.1", "pytest-timeout<3.0.0,>=2.3.1", "pytest-socket<1.0.0,>=0.7.0", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", - "langchain-tests @ file:///${PROJECT_ROOT}/../../standard-tests", -] -codespell = [ - "codespell<3.0.0,>=2.2.0", -] -lint = [ - "ruff<1.0,>=0.5", -] -dev = [ - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] -test_integration = [ - "requests<3.0.0,>=2.32.3", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", + "langchain-core", + "langchain-tests", ] +codespell = ["codespell<3.0.0,>=2.2.0"] +lint = ["ruff<1.0,>=0.5"] +dev = ["langchain-core"] +test_integration = ["requests<3.0.0,>=2.32.3", "langchain-core"] typing = [ "mypy<2.0,>=1.10", "types-requests<3.0.0.0,>=2.32.0.20241016", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", + "langchain-core", ] +[tool.uv.sources] +langchain-core = { path = "../../core", editable = true } +langchain-tests = { path = "../../standard-tests", editable = true } + [tool.mypy] disallow_untyped_defs = "True" plugins = ['pydantic.mypy'] diff --git a/libs/partners/anthropic/uv.lock b/libs/partners/anthropic/uv.lock index cdea22d164e..bea9390d0c4 100644 --- a/libs/partners/anthropic/uv.lock +++ b/libs/partners/anthropic/uv.lock @@ -450,19 +450,19 @@ typing = [ [package.metadata] requires-dist = [ { name = "anthropic", specifier = ">=0.45.0,<1" }, - { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "pydantic", specifier = ">=2.7.4,<3.0.0" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "../../core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ { name = "defusedxml", specifier = ">=0.7.1,<1.0.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-tests", editable = "../../standard-tests" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, @@ -472,19 +472,19 @@ test = [ { name = "syrupy", specifier = ">=4.0.2,<5.0.0" }, ] test-integration = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "requests", specifier = ">=2.32.3,<3.0.0" }, ] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "types-requests", specifier = ">=2.32.0.20241016,<3.0.0.0" }, ] [[package]] name = "langchain-core" -version = "0.3.34" -source = { directory = "../../core" } +version = "0.3.35" +source = { editable = "../../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -542,7 +542,7 @@ typing = [ [[package]] name = "langchain-tests" version = "0.3.11" -source = { directory = "../../standard-tests" } +source = { editable = "../../standard-tests" } dependencies = [ { name = "httpx" }, { name = "langchain-core" }, @@ -557,7 +557,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "httpx", specifier = ">=0.25.0,<1" }, - { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, { name = "pytest", specifier = ">=7,<9" }, @@ -569,10 +569,10 @@ requires-dist = [ [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] lint = [{ name = "ruff", specifier = ">=0.9.2,<1.0.0" }] -test = [{ name = "langchain-core", directory = "../core" }] +test = [{ name = "langchain-core", editable = "../../core" }] test-integration = [] typing = [ - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1,<2" }, ] diff --git a/libs/partners/chroma/pyproject.toml b/libs/partners/chroma/pyproject.toml index e8f4a164335..9f6124ec4f3 100644 --- a/libs/partners/chroma/pyproject.toml +++ b/libs/partners/chroma/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "pdm.backend" [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<4,>=3.9" dependencies = [ "langchain-core!=0.3.0,!=0.3.1,!=0.3.10,!=0.3.11,!=0.3.12,!=0.3.13,!=0.3.14,!=0.3.2,!=0.3.3,!=0.3.4,!=0.3.5,!=0.3.6,!=0.3.7,!=0.3.8,!=0.3.9,<0.4.0,>=0.2.43", @@ -33,31 +33,28 @@ test = [ "onnxruntime<1.20; python_version < \"3.10\"", "onnxruntime; python_version >= \"3.10\"", "pytest-socket<1.0.0,>=0.7.0", - "langchain-core @ file:///${PROJECT_ROOT}/../../core ; python_version >= \"3.9\"", - "langchain-core<0.3,>=0.1.40; python_version < \"3.9\"", - "langchain-tests @ file:///${PROJECT_ROOT}/../../standard-tests", -] -codespell = [ - "codespell<3.0.0,>=2.2.0", + "langchain-core", + "langchain-tests", ] +codespell = ["codespell<3.0.0,>=2.2.0"] test_integration = [] lint = [ "ruff<1.0,>=0.5", "onnxruntime<1.20; python_version < \"3.10\"", "onnxruntime; python_version >= \"3.10\"", ] -dev = [ - "langchain-core @ file:///${PROJECT_ROOT}/../../core ; python_version >= \"3.9\"", - "langchain-core<0.3,>=0.1.40; python_version < \"3.9\"", -] +dev = ["langchain-core"] typing = [ "mypy<2.0,>=1.10", "types-requests<3.0.0.0,>=2.31.0.20240406", - "langchain-core @ file:///${PROJECT_ROOT}/../../core ; python_version >= \"3.9\"", - "langchain-core<0.3,>=0.1.40; python_version < \"3.9\"", + "langchain-core", ] +[tool.uv.sources] +langchain-core = { path = "../../core", editable = true } +langchain-tests = { path = "../../standard-tests", editable = true } + [tool.mypy] disallow_untyped_defs = true diff --git a/libs/partners/chroma/uv.lock b/libs/partners/chroma/uv.lock index 4e6a4de0193..f182e936542 100644 --- a/libs/partners/chroma/uv.lock +++ b/libs/partners/chroma/uv.lock @@ -774,17 +774,14 @@ typing = [ [package.metadata] requires-dist = [ { name = "chromadb", specifier = ">=0.4.0,!=0.5.4,!=0.5.5,!=0.5.7,!=0.5.9,!=0.5.10,!=0.5.11,!=0.5.12,<0.7.0" }, - { name = "langchain-core", specifier = ">=0.2.43,!=0.3.0,!=0.3.1,!=0.3.2,!=0.3.3,!=0.3.4,!=0.3.5,!=0.3.6,!=0.3.7,!=0.3.8,!=0.3.9,!=0.3.10,!=0.3.11,!=0.3.12,!=0.3.13,!=0.3.14,<0.4.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.22.4,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<2.0.0" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [ - { name = "langchain-core", marker = "python_full_version < '3.9'", specifier = ">=0.1.40,<0.3" }, - { name = "langchain-core", marker = "python_full_version >= '3.9'", directory = "../../core" }, -] +dev = [{ name = "langchain-core", editable = "../../core" }] lint = [ { name = "onnxruntime", marker = "python_full_version < '3.10'", specifier = "<1.20" }, { name = "onnxruntime", marker = "python_full_version >= '3.10'" }, @@ -792,9 +789,8 @@ lint = [ ] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", marker = "python_full_version < '3.9'", specifier = ">=0.1.40,<0.3" }, - { name = "langchain-core", marker = "python_full_version >= '3.9'", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-tests", editable = "../../standard-tests" }, { name = "onnxruntime", marker = "python_full_version < '3.10'", specifier = "<1.20" }, { name = "onnxruntime", marker = "python_full_version >= '3.10'" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, @@ -806,8 +802,7 @@ test = [ ] test-integration = [] typing = [ - { name = "langchain-core", marker = "python_full_version < '3.9'", specifier = ">=0.1.40,<0.3" }, - { name = "langchain-core", marker = "python_full_version >= '3.9'", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "types-requests", specifier = ">=2.31.0.20240406,<3.0.0.0" }, ] @@ -815,7 +810,7 @@ typing = [ [[package]] name = "langchain-core" version = "0.3.35" -source = { directory = "../../core" } +source = { editable = "../../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -873,7 +868,7 @@ typing = [ [[package]] name = "langchain-tests" version = "0.3.11" -source = { directory = "../../standard-tests" } +source = { editable = "../../standard-tests" } dependencies = [ { name = "httpx" }, { name = "langchain-core" }, @@ -887,7 +882,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "httpx", specifier = ">=0.25.0,<1" }, - { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, { name = "pytest", specifier = ">=7,<9" }, @@ -899,10 +894,10 @@ requires-dist = [ [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] lint = [{ name = "ruff", specifier = ">=0.9.2,<1.0.0" }] -test = [{ name = "langchain-core", directory = "../core" }] +test = [{ name = "langchain-core", editable = "../../core" }] test-integration = [] typing = [ - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1,<2" }, ] diff --git a/libs/partners/deepseek/pyproject.toml b/libs/partners/deepseek/pyproject.toml index 98e0a054801..b8b10514d18 100644 --- a/libs/partners/deepseek/pyproject.toml +++ b/libs/partners/deepseek/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "pdm.backend" [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<4.0,>=3.9" dependencies = [ "langchain-core<1.0.0,>=0.3.34", @@ -27,22 +27,20 @@ test = [ "pytest-socket<1.0.0,>=0.7.0", "pytest-watcher<1.0.0,>=0.3.4", "langchain-tests<1.0.0,>=0.3.5", - "langchain-openai @ file:///${PROJECT_ROOT}/../openai", + "langchain-openai", "pytest-timeout<3.0.0,>=2.3.1", ] -codespell = [ - "codespell<3.0.0,>=2.2.6", -] +codespell = ["codespell<3.0.0,>=2.2.6"] test_integration = [] -lint = [ - "ruff<1.0,>=0.5", -] +lint = ["ruff<1.0,>=0.5"] dev = [] -typing = [ - "mypy<2.0,>=1.10", -] +typing = ["mypy<2.0,>=1.10"] +[tool.uv.sources] +langchain-openai = { path = "../openai", editable = true } +langchain-core = { path = "../../core", editable = true } + [tool.mypy] disallow_untyped_defs = "True" diff --git a/libs/partners/deepseek/uv.lock b/libs/partners/deepseek/uv.lock index 9f0f48e8df3..4820cc01c05 100644 --- a/libs/partners/deepseek/uv.lock +++ b/libs/partners/deepseek/uv.lock @@ -367,8 +367,8 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.34" -source = { registry = "https://pypi.org/simple" } +version = "0.3.35" +source = { editable = "../../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -378,9 +378,49 @@ dependencies = [ { name = "tenacity" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/c8/a4394a5bdfc820f539bd6983b1408964723ed43ce8cfafbcc7cada69c015/langchain_core-0.3.34.tar.gz", hash = "sha256:26504cf1e8e6c310adad907b890d4e3c147581cfa7434114f6dc1134fe4bc6d3", size = 524756 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/65/27a586c8871a0632d747059eb97855b49ac6dea12b263a79f6c1b4f18b99/langchain_core-0.3.34-py3-none-any.whl", hash = "sha256:a057ebeddd2158d3be14bde341b25640ddf958b6989bd6e47160396f5a8202ae", size = 412955 }, + +[package.metadata] +requires-dist = [ + { name = "jsonpatch", specifier = ">=1.33,<2.0" }, + { name = "langsmith", specifier = ">=0.1.125,<0.4" }, + { name = "packaging", specifier = ">=23.2,<25" }, + { name = "pydantic", marker = "python_full_version < '3.12.4'", specifier = ">=2.5.2,<3.0.0" }, + { name = "pydantic", marker = "python_full_version >= '3.12.4'", specifier = ">=2.7.4,<3.0.0" }, + { name = "pyyaml", specifier = ">=5.3" }, + { name = "tenacity", specifier = ">=8.1.0,!=8.4.0,<10.0.0" }, + { name = "typing-extensions", specifier = ">=4.7" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "grandalf", specifier = ">=0.8,<1.0" }, + { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, + { name = "setuptools", specifier = ">=67.6.1,<68.0.0" }, +] +lint = [{ name = "ruff", specifier = ">=0.9.2,<1.0.0" }] +test = [ + { name = "blockbuster", specifier = "~=1.5.11" }, + { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, + { name = "grandalf", specifier = ">=0.8,<1.0" }, + { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, + { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.0,<3" }, + { name = "pytest", specifier = ">=8,<9" }, + { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, + { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, + { name = "pytest-socket", specifier = ">=0.7.0,<1.0.0" }, + { name = "pytest-watcher", specifier = ">=0.3.4,<1.0.0" }, + { name = "pytest-xdist", specifier = ">=3.6.1,<4.0.0" }, + { name = "responses", specifier = ">=0.25.0,<1.0.0" }, + { name = "syrupy", specifier = ">=4.0.2,<5.0.0" }, +] +test-integration = [] +typing = [ + { name = "langchain-text-splitters", directory = "../../text-splitters" }, + { name = "mypy", specifier = ">=1.10,<1.11" }, + { name = "types-jinja2", specifier = ">=2.11.9,<3.0.0" }, + { name = "types-pyyaml", specifier = ">=6.0.12.2,<7.0.0.0" }, + { name = "types-requests", specifier = ">=2.28.11.5,<3.0.0.0" }, ] [[package]] @@ -414,8 +454,8 @@ typing = [ [package.metadata] requires-dist = [ - { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, - { name = "langchain-openai", specifier = ">=0.3.5,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-openai", editable = "../openai" }, ] [package.metadata.requires-dev] @@ -423,7 +463,7 @@ codespell = [{ name = "codespell", specifier = ">=2.2.6,<3.0.0" }] dev = [] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ - { name = "langchain-openai", directory = "../openai" }, + { name = "langchain-openai", editable = "../openai" }, { name = "langchain-tests", specifier = ">=0.3.5,<1.0.0" }, { name = "pytest", specifier = ">=7.4.3,<8.0.0" }, { name = "pytest-asyncio", specifier = ">=0.23.2,<1.0.0" }, @@ -437,7 +477,7 @@ typing = [{ name = "mypy", specifier = ">=1.10,<2.0" }] [[package]] name = "langchain-openai" version = "0.3.5" -source = { directory = "../openai" } +source = { editable = "../openai" } dependencies = [ { name = "langchain-core" }, { name = "openai" }, @@ -446,19 +486,19 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "openai", specifier = ">=1.58.1,<2.0.0" }, { name = "tiktoken", specifier = ">=0.7,<1" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "../../core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-tests", editable = "../../standard-tests" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1,<2" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.0,<2.0.0" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, @@ -477,7 +517,7 @@ test-integration = [ { name = "pillow", specifier = ">=10.3.0,<11.0.0" }, ] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "types-tqdm", specifier = ">=4.66.0.5,<5.0.0.0" }, ] diff --git a/libs/partners/exa/pyproject.toml b/libs/partners/exa/pyproject.toml index 0df3b856343..c135e8e3e5f 100644 --- a/libs/partners/exa/pyproject.toml +++ b/libs/partners/exa/pyproject.toml @@ -4,12 +4,9 @@ build-backend = "pdm.backend" [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<4.0,>=3.9" -dependencies = [ - "langchain-core<1.0.0,>=0.3.15", - "exa-py<2.0.0,>=1.0.8", -] +dependencies = ["langchain-core<1.0.0,>=0.3.15", "exa-py<2.0.0,>=1.0.8"] name = "langchain-exa" version = "0.2.1" description = "An integration package connecting Exa and LangChain" @@ -28,35 +25,36 @@ test = [ "syrupy<5.0.0,>=4.0.2", "pytest-watcher<1.0.0,>=0.3.4", "pytest-asyncio<1.0.0,>=0.21.1", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] -codespell = [ - "codespell<3.0.0,>=2.2.0", -] -lint = [ - "ruff<1.0,>=0.5", -] -dev = [ - "langchain-core @ file:///${PROJECT_ROOT}/../../core", + "langchain-core", ] +codespell = ["codespell<3.0.0,>=2.2.0"] +lint = ["ruff<1.0,>=0.5"] +dev = ["langchain-core"] test_integration = [] typing = [ "mypy<2.0,>=1.10", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", - "pydantic>2.0,<2.10", # TODO: support 2.10 + "langchain-core", + "pydantic>2.0,<2.10", # TODO: support 2.10 ] +[tool.uv.sources] +langchain-core = { path = "../../core", editable = true } + + [tool.mypy] disallow_untyped_defs = "True" [tool.ruff.lint] -select = [ "E", "F", "I", "T201",] +select = ["E", "F", "I", "T201"] [tool.coverage.run] -omit = [ "tests/*",] +omit = ["tests/*"] [tool.pytest.ini_options] addopts = "--snapshot-warn-unused --strict-markers --strict-config --durations=5" -markers = [ "requires: mark tests as requiring a specific library", "compile: mark placeholder test used to compile integration tests without running them",] +markers = [ + "requires: mark tests as requiring a specific library", + "compile: mark placeholder test used to compile integration tests without running them", +] asyncio_mode = "auto" diff --git a/libs/partners/exa/uv.lock b/libs/partners/exa/uv.lock index b3140d5c71c..ba7c4e1df9a 100644 --- a/libs/partners/exa/uv.lock +++ b/libs/partners/exa/uv.lock @@ -393,8 +393,8 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.34rc1" -source = { directory = "../../core" } +version = "0.3.35" +source = { editable = "../../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -486,16 +486,16 @@ typing = [ [package.metadata] requires-dist = [ { name = "exa-py", specifier = ">=1.0.8,<2.0.0" }, - { name = "langchain-core", specifier = ">=0.3.15,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "../../core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, @@ -504,7 +504,7 @@ test = [ ] test-integration = [] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "pydantic", specifier = ">2.0,<2.10" }, ] diff --git a/libs/partners/fireworks/pyproject.toml b/libs/partners/fireworks/pyproject.toml index 28e99c783d4..5efa04c4be1 100644 --- a/libs/partners/fireworks/pyproject.toml +++ b/libs/partners/fireworks/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "pdm.backend" [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<4.0,>=3.9" dependencies = [ "langchain-core<1.0.0,>=0.3.33", @@ -32,25 +32,18 @@ test = [ "pytest-watcher<1.0.0,>=0.3.4", "pytest-asyncio<1.0.0,>=0.21.1", "pytest-socket<1.0.0,>=0.7.0", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", - "langchain-tests @ file:///${PROJECT_ROOT}/../../standard-tests", -] -codespell = [ - "codespell<3.0.0,>=2.2.0", + "langchain-core", + "langchain-tests", ] +codespell = ["codespell<3.0.0,>=2.2.0"] test_integration = [] -lint = [ - "ruff<1.0,>=0.5", -] -dev = [ - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] -typing = [ - "mypy<2.0,>=1.10", - "types-requests<3,>=2", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] +lint = ["ruff<1.0,>=0.5"] +dev = ["langchain-core"] +typing = ["mypy<2.0,>=1.10", "types-requests<3,>=2", "langchain-core"] +[tool.uv.sources] +langchain-core = { path = "../../core", editable = true } +langchain-tests = { path = "../../standard-tests", editable = true } [tool.mypy] disallow_untyped_defs = "True" diff --git a/libs/partners/fireworks/uv.lock b/libs/partners/fireworks/uv.lock index 4b71bcd7b22..570944acf7b 100644 --- a/libs/partners/fireworks/uv.lock +++ b/libs/partners/fireworks/uv.lock @@ -635,8 +635,8 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.34rc1" -source = { directory = "../../core" } +version = "0.3.35" +source = { editable = "../../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -734,19 +734,19 @@ typing = [ requires-dist = [ { name = "aiohttp", specifier = ">=3.9.1,<4.0.0" }, { name = "fireworks-ai", specifier = ">=0.13.0" }, - { name = "langchain-core", specifier = ">=0.3.33,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "openai", specifier = ">=1.10.0,<2.0.0" }, { name = "requests", specifier = ">=2,<3" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "../../core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-tests", editable = "../../standard-tests" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, @@ -756,15 +756,15 @@ test = [ ] test-integration = [] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "types-requests", specifier = ">=2,<3" }, ] [[package]] name = "langchain-tests" -version = "0.3.10" -source = { directory = "../../standard-tests" } +version = "0.3.11" +source = { editable = "../../standard-tests" } dependencies = [ { name = "httpx" }, { name = "langchain-core" }, @@ -779,7 +779,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "httpx", specifier = ">=0.25.0,<1" }, - { name = "langchain-core", specifier = ">=0.3.33,<0.4.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, { name = "pytest", specifier = ">=7,<9" }, @@ -788,6 +788,16 @@ requires-dist = [ { name = "syrupy", specifier = ">=4,<5" }, ] +[package.metadata.requires-dev] +codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] +lint = [{ name = "ruff", specifier = ">=0.9.2,<1.0.0" }] +test = [{ name = "langchain-core", editable = "../../core" }] +test-integration = [] +typing = [ + { name = "langchain-core", editable = "../../core" }, + { name = "mypy", specifier = ">=1,<2" }, +] + [[package]] name = "langsmith" version = "0.3.5" diff --git a/libs/partners/groq/pyproject.toml b/libs/partners/groq/pyproject.toml index e070ccd8dc7..283276f6932 100644 --- a/libs/partners/groq/pyproject.toml +++ b/libs/partners/groq/pyproject.toml @@ -4,12 +4,9 @@ build-backend = "pdm.backend" [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<4.0,>=3.9" -dependencies = [ - "langchain-core<1.0.0,>=0.3.33", - "groq<1,>=0.4.1", -] +dependencies = ["langchain-core<1.0.0,>=0.3.33", "groq<1,>=0.4.1"] name = "langchain-groq" version = "0.2.4" description = "An integration package connecting Groq and LangChain" @@ -26,26 +23,18 @@ test = [ "pytest-mock<4.0.0,>=3.10.0", "pytest-watcher<1.0.0,>=0.3.4", "pytest-asyncio<1.0.0,>=0.21.1", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", - "langchain-tests @ file:///${PROJECT_ROOT}/../../standard-tests", -] -codespell = [ - "codespell<3.0.0,>=2.2.0", -] -lint = [ - "ruff<1.0,>=0.5", -] -dev = [ - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] -test_integration = [ - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] -typing = [ - "mypy<2.0,>=1.10", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", + "langchain-core", + "langchain-tests", ] +codespell = ["codespell<3.0.0,>=2.2.0"] +lint = ["ruff<1.0,>=0.5"] +dev = ["langchain-core"] +test_integration = ["langchain-core"] +typing = ["mypy<2.0,>=1.10", "langchain-core"] +[tool.uv.sources] +langchain-core = { path = "../../core", editable = true } +langchain-tests = { path = "../../standard-tests", editable = true } [tool.mypy] disallow_untyped_defs = "True" diff --git a/libs/partners/groq/uv.lock b/libs/partners/groq/uv.lock index 805bbb96da2..6874b46c32f 100644 --- a/libs/partners/groq/uv.lock +++ b/libs/partners/groq/uv.lock @@ -313,8 +313,8 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.34rc1" -source = { directory = "../../core" } +version = "0.3.35" +source = { editable = "../../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -407,31 +407,31 @@ typing = [ [package.metadata] requires-dist = [ { name = "groq", specifier = ">=0.4.1,<1" }, - { name = "langchain-core", specifier = ">=0.3.33,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "../../core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-tests", editable = "../../standard-tests" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, { name = "pytest-watcher", specifier = ">=0.3.4,<1.0.0" }, ] -test-integration = [{ name = "langchain-core", directory = "../../core" }] +test-integration = [{ name = "langchain-core", editable = "../../core" }] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, ] [[package]] name = "langchain-tests" -version = "0.3.10" -source = { directory = "../../standard-tests" } +version = "0.3.11" +source = { editable = "../../standard-tests" } dependencies = [ { name = "httpx" }, { name = "langchain-core" }, @@ -446,7 +446,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "httpx", specifier = ">=0.25.0,<1" }, - { name = "langchain-core", specifier = ">=0.3.33,<0.4.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, { name = "pytest", specifier = ">=7,<9" }, @@ -455,6 +455,16 @@ requires-dist = [ { name = "syrupy", specifier = ">=4,<5" }, ] +[package.metadata.requires-dev] +codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] +lint = [{ name = "ruff", specifier = ">=0.9.2,<1.0.0" }] +test = [{ name = "langchain-core", editable = "../../core" }] +test-integration = [] +typing = [ + { name = "langchain-core", editable = "../../core" }, + { name = "mypy", specifier = ">=1,<2" }, +] + [[package]] name = "langsmith" version = "0.3.5" diff --git a/libs/partners/huggingface/pyproject.toml b/libs/partners/huggingface/pyproject.toml index 8527db136d2..c429d6a0fb6 100644 --- a/libs/partners/huggingface/pyproject.toml +++ b/libs/partners/huggingface/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "pdm.backend" [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<4.0,>=3.9" dependencies = [ "langchain-core<1.0.0,>=0.3.15", @@ -33,26 +33,20 @@ test = [ "scipy<2.0.0,>=1.7.0; python_version >= \"3.12\"", "numpy<2,>=1; python_version < \"3.12\"", "numpy<2.0.0,>=1.26.0; python_version >= \"3.12\"", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", - "langchain-tests @ file:///${PROJECT_ROOT}/../../standard-tests", - "langchain-community @ file:///${PROJECT_ROOT}/../../community", -] -codespell = [ - "codespell<3.0.0,>=2.2.0", -] -lint = [ - "ruff<1.0,>=0.5", -] -dev = [ - "ipykernel<7.0.0,>=6.29.2", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", + "langchain-core", + "langchain-tests", + "langchain-community", ] +codespell = ["codespell<3.0.0,>=2.2.0"] +lint = ["ruff<1.0,>=0.5"] +dev = ["ipykernel<7.0.0,>=6.29.2", "langchain-core"] test_integration = [] -typing = [ - "mypy<2.0,>=1.10", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] +typing = ["mypy<2.0,>=1.10", "langchain-core"] +[tool.uv.sources] +langchain-core = { path = "../../core", editable = true } +langchain-tests = { path = "../../standard-tests", editable = true } +langchain-community = { path = "../../community", editable = true } [tool.mypy] disallow_untyped_defs = "True" diff --git a/libs/partners/huggingface/uv.lock b/libs/partners/huggingface/uv.lock index 7176585683d..eb4c1fa3c19 100644 --- a/libs/partners/huggingface/uv.lock +++ b/libs/partners/huggingface/uv.lock @@ -853,8 +853,8 @@ wheels = [ [[package]] name = "langchain" -version = "0.3.18rc1" -source = { registry = "https://pypi.org/simple" } +version = "0.3.18" +source = { editable = "../../langchain" } dependencies = [ { name = "aiohttp" }, { name = "async-timeout", marker = "python_full_version < '3.11'" }, @@ -868,15 +868,104 @@ dependencies = [ { name = "sqlalchemy" }, { name = "tenacity" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5d/87/79e4c09d85f81805420ab00cac7719a6c80f3bb822cb095592e6c3bbf856/langchain-0.3.18rc1.tar.gz", hash = "sha256:486e858d3588af703427f4a642520c6159a9a0a98379571372f24415f91b1933", size = 10223626 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/92/76/0211285da97ed5f4823d82baf063596da9f13848dc693fdd3bf1099931ef/langchain-0.3.18rc1-py3-none-any.whl", hash = "sha256:373dd95fda919fdd3fffdb0095c2ae3c5a3f89f8d0a7202864d44d5ebecfb660", size = 1010357 }, + +[package.metadata] +requires-dist = [ + { name = "aiohttp", specifier = ">=3.8.3,<4.0.0" }, + { name = "async-timeout", marker = "python_full_version < '3.11'", specifier = ">=4.0.0,<5.0.0" }, + { name = "langchain-anthropic", marker = "extra == 'anthropic'" }, + { name = "langchain-aws", marker = "extra == 'aws'" }, + { name = "langchain-cohere", marker = "extra == 'cohere'" }, + { name = "langchain-community", marker = "extra == 'community'" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-deepseek", marker = "extra == 'deepseek'" }, + { name = "langchain-fireworks", marker = "extra == 'fireworks'" }, + { name = "langchain-google-genai", marker = "extra == 'google-genai'" }, + { name = "langchain-google-vertexai", marker = "extra == 'google-vertexai'" }, + { name = "langchain-groq", marker = "extra == 'groq'" }, + { name = "langchain-huggingface", marker = "extra == 'huggingface'" }, + { name = "langchain-mistralai", marker = "extra == 'mistralai'" }, + { name = "langchain-ollama", marker = "extra == 'ollama'" }, + { name = "langchain-openai", marker = "extra == 'openai'", editable = "../openai" }, + { name = "langchain-text-splitters", editable = "../../text-splitters" }, + { name = "langchain-together", marker = "extra == 'together'" }, + { name = "langsmith", specifier = ">=0.1.17,<0.4" }, + { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.26.4,<2" }, + { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, + { name = "pydantic", specifier = ">=2.7.4,<3.0.0" }, + { name = "pyyaml", specifier = ">=5.3" }, + { name = "requests", specifier = ">=2,<3" }, + { name = "sqlalchemy", specifier = ">=1.4,<3" }, + { name = "tenacity", specifier = ">=8.1.0,!=8.4.0,<10" }, +] + +[package.metadata.requires-dev] +codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] +dev = [ + { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-text-splitters", editable = "../../text-splitters" }, + { name = "playwright", specifier = ">=1.28.0,<2.0.0" }, + { name = "setuptools", specifier = ">=67.6.1,<68.0.0" }, +] +lint = [ + { name = "cffi", marker = "python_full_version < '3.10'", specifier = "<1.17.1" }, + { name = "cffi", marker = "python_full_version >= '3.10'" }, + { name = "ruff", specifier = ">=0.9.2,<1.0.0" }, +] +test = [ + { name = "blockbuster", specifier = ">=1.5.14,<1.6" }, + { name = "cffi", marker = "python_full_version < '3.10'", specifier = "<1.17.1" }, + { name = "cffi", marker = "python_full_version >= '3.10'" }, + { name = "duckdb-engine", specifier = ">=0.9.2,<1.0.0" }, + { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-openai", editable = "../openai" }, + { name = "langchain-tests", editable = "../../standard-tests" }, + { name = "langchain-text-splitters", editable = "../../text-splitters" }, + { name = "lark", specifier = ">=1.1.5,<2.0.0" }, + { name = "packaging", specifier = ">=24.2" }, + { name = "pandas", specifier = ">=2.0.0,<3.0.0" }, + { name = "pytest", specifier = ">=8,<9" }, + { name = "pytest-asyncio", specifier = ">=0.23.2,<1.0.0" }, + { name = "pytest-cov", specifier = ">=4.0.0,<5.0.0" }, + { name = "pytest-dotenv", specifier = ">=0.5.2,<1.0.0" }, + { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, + { name = "pytest-socket", specifier = ">=0.6.0,<1.0.0" }, + { name = "pytest-watcher", specifier = ">=0.2.6,<1.0.0" }, + { name = "pytest-xdist", specifier = ">=3.6.1,<4.0.0" }, + { name = "requests-mock", specifier = ">=1.11.0,<2.0.0" }, + { name = "responses", specifier = ">=0.22.0,<1.0.0" }, + { name = "syrupy", specifier = ">=4.0.2,<5.0.0" }, + { name = "toml", specifier = ">=0.10.2" }, +] +test-integration = [ + { name = "cassio", specifier = ">=0.1.0,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-text-splitters", editable = "../../text-splitters" }, + { name = "langchainhub", specifier = ">=0.1.16,<1.0.0" }, + { name = "pytest-vcr", specifier = ">=1.0.2,<2.0.0" }, + { name = "python-dotenv", specifier = ">=1.0.0,<2.0.0" }, + { name = "urllib3", marker = "python_full_version < '3.10'", specifier = "<2" }, + { name = "wrapt", specifier = ">=1.15.0,<2.0.0" }, +] +typing = [ + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-text-splitters", editable = "../../text-splitters" }, + { name = "mypy", specifier = ">=1.10,<2.0" }, + { name = "mypy-protobuf", specifier = ">=3.0.0,<4.0.0" }, + { name = "types-chardet", specifier = ">=5.0.4.6,<6.0.0.0" }, + { name = "types-pytz", specifier = ">=2023.3.0.0,<2024.0.0.0" }, + { name = "types-pyyaml", specifier = ">=6.0.12.2,<7.0.0.0" }, + { name = "types-redis", specifier = ">=4.3.21.6,<5.0.0.0" }, + { name = "types-requests", specifier = ">=2.28.11.5,<3.0.0.0" }, + { name = "types-toml", specifier = ">=0.10.8.1,<1.0.0.0" }, ] [[package]] name = "langchain-community" -version = "0.3.17rc1" -source = { directory = "../../community" } +version = "0.3.17" +source = { editable = "../../community" } dependencies = [ { name = "aiohttp" }, { name = "dataclasses-json" }, @@ -897,8 +986,8 @@ requires-dist = [ { name = "aiohttp", specifier = ">=3.8.3,<4.0.0" }, { name = "dataclasses-json", specifier = ">=0.5.7,<0.7" }, { name = "httpx-sse", specifier = ">=0.4.0,<1.0.0" }, - { name = "langchain", specifier = ">=0.3.18rc1,<1.0.0" }, - { name = "langchain-core", specifier = ">=0.3.34rc1,<1.0.0" }, + { name = "langchain", editable = "../../langchain" }, + { name = "langchain-core", editable = "../../core" }, { name = "langsmith", specifier = ">=0.1.125,<0.4" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.26.4,<2" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, @@ -913,22 +1002,23 @@ requires-dist = [ codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "setuptools", specifier = ">=67.6.1,<68.0.0" }, ] lint = [ { name = "cffi", marker = "python_full_version < '3.10'", specifier = "<1.17.1" }, { name = "cffi", marker = "python_full_version >= '3.10'" }, - { name = "ruff", specifier = ">=0.5,<0.6" }, + { name = "ruff", specifier = ">=0.9,<0.10" }, ] test = [ + { name = "blockbuster", specifier = ">=1.5.13,<1.6" }, { name = "cffi", marker = "python_full_version < '3.10'", specifier = "<1.17.1" }, { name = "cffi", marker = "python_full_version >= '3.10'" }, { name = "duckdb-engine", specifier = ">=0.13.6,<1.0.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain", directory = "../langchain" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-tests", directory = "../standard-tests" }, + { name = "langchain", editable = "../../langchain" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-tests", editable = "../../standard-tests" }, { name = "lark", specifier = ">=1.1.5,<2.0.0" }, { name = "pandas", specifier = ">=2.0.0,<3.0.0" }, { name = "pytest", specifier = ">=7.4.4,<8.0.0" }, @@ -949,9 +1039,9 @@ test-integration = [ { name = "vcrpy", specifier = ">=6,<7" }, ] typing = [ - { name = "langchain", directory = "../langchain" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain", editable = "../../langchain" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-text-splitters", editable = "../../text-splitters" }, { name = "mypy", specifier = ">=1.12,<2.0" }, { name = "mypy-protobuf", specifier = ">=3.0.0,<4.0.0" }, { name = "types-chardet", specifier = ">=5.0.4.6,<6.0.0.0" }, @@ -964,8 +1054,8 @@ typing = [ [[package]] name = "langchain-core" -version = "0.3.34rc1" -source = { directory = "../../core" } +version = "0.3.35" +source = { editable = "../../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -1063,7 +1153,7 @@ typing = [ [package.metadata] requires-dist = [ { name = "huggingface-hub", specifier = ">=0.23.0" }, - { name = "langchain-core", specifier = ">=0.3.15,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "sentence-transformers", specifier = ">=2.6.0" }, { name = "tokenizers", specifier = ">=0.19.1" }, { name = "transformers", specifier = ">=4.39.0" }, @@ -1073,13 +1163,13 @@ requires-dist = [ codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] dev = [ { name = "ipykernel", specifier = ">=6.29.2,<7.0.0" }, - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, ] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ - { name = "langchain-community", directory = "../../community" }, - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-community", editable = "../../community" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-tests", editable = "../../standard-tests" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1,<2" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.0,<2.0.0" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, @@ -1091,14 +1181,14 @@ test = [ ] test-integration = [] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, ] [[package]] name = "langchain-tests" -version = "0.3.10" -source = { directory = "../../standard-tests" } +version = "0.3.11" +source = { editable = "../../standard-tests" } dependencies = [ { name = "httpx" }, { name = "langchain-core" }, @@ -1112,7 +1202,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "httpx", specifier = ">=0.25.0,<1" }, - { name = "langchain-core", specifier = ">=0.3.33,<0.4.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, { name = "pytest", specifier = ">=7,<9" }, @@ -1121,16 +1211,58 @@ requires-dist = [ { name = "syrupy", specifier = ">=4,<5" }, ] +[package.metadata.requires-dev] +codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] +lint = [{ name = "ruff", specifier = ">=0.9.2,<1.0.0" }] +test = [{ name = "langchain-core", editable = "../../core" }] +test-integration = [] +typing = [ + { name = "langchain-core", editable = "../../core" }, + { name = "mypy", specifier = ">=1,<2" }, +] + [[package]] name = "langchain-text-splitters" -version = "0.3.5" -source = { registry = "https://pypi.org/simple" } +version = "0.3.6" +source = { editable = "../../text-splitters" } dependencies = [ { name = "langchain-core" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/10/35/a6f8d6b1bb0e6e8c00b49bce4d1a115f8b68368b1899f65bb34dbbb44160/langchain_text_splitters-0.3.5.tar.gz", hash = "sha256:11cb7ca3694e5bdd342bc16d3875b7f7381651d4a53cbb91d34f22412ae16443", size = 26318 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/83/f8081c3bea416bd9d9f0c26af795c74f42c24f9ad3c4fbf361b7d69de134/langchain_text_splitters-0.3.5-py3-none-any.whl", hash = "sha256:8c9b059827438c5fa8f327b4df857e307828a5ec815163c9b5c9569a3e82c8ee", size = 31620 }, + +[package.metadata] +requires-dist = [{ name = "langchain-core", editable = "../../core" }] + +[package.metadata.requires-dev] +dev = [ + { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, + { name = "langchain-core", editable = "../../core" }, +] +lint = [ + { name = "langchain-core", editable = "../../core" }, + { name = "ruff", specifier = ">=0.9.2,<1.0.0" }, +] +test = [ + { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, + { name = "langchain-core", editable = "../../core" }, + { name = "pytest", specifier = ">=8,<9" }, + { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, + { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, + { name = "pytest-socket", specifier = ">=0.7.0,<1.0.0" }, + { name = "pytest-watcher", specifier = ">=0.3.4,<1.0.0" }, + { name = "pytest-xdist", specifier = ">=3.6.1,<4.0.0" }, +] +test-integration = [ + { name = "nltk", specifier = ">=3.9.1,<4.0.0" }, + { name = "sentence-transformers", marker = "python_full_version < '3.13'", specifier = ">=2.6.0" }, + { name = "spacy", marker = "python_full_version < '3.10'", specifier = ">=3.0.0,<3.8.4" }, + { name = "spacy", marker = "python_full_version < '3.13'", specifier = ">=3.0.0,<4.0.0" }, + { name = "transformers", specifier = ">=4.47.0,<5.0.0" }, +] +typing = [ + { name = "lxml-stubs", specifier = ">=0.5.1,<1.0.0" }, + { name = "mypy", specifier = ">=1.10,<2.0" }, + { name = "tiktoken", specifier = ">=0.8.0,<1.0.0" }, + { name = "types-requests", specifier = ">=2.31.0.20240218,<3.0.0.0" }, ] [[package]] diff --git a/libs/partners/mistralai/pyproject.toml b/libs/partners/mistralai/pyproject.toml index 9b56ee7b0a2..cfa2e4f3b9e 100644 --- a/libs/partners/mistralai/pyproject.toml +++ b/libs/partners/mistralai/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "pdm.backend" [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<4.0,>=3.9" dependencies = [ "langchain-core<1.0.0,>=0.3.33", @@ -28,35 +28,32 @@ test = [ "pytest<8.0.0,>=7.3.0", "pytest-asyncio<1.0.0,>=0.21.1", "pytest-watcher<1.0.0,>=0.3.4", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", - "langchain-tests @ file:///${PROJECT_ROOT}/../../standard-tests", + "langchain-core", + "langchain-tests", ] test_integration = [] -codespell = [ - "codespell<3.0.0,>=2.2.0", -] -lint = [ - "ruff<1.0,>=0.5", -] -dev = [ - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] -typing = [ - "mypy<2.0,>=1.10", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] +codespell = ["codespell<3.0.0,>=2.2.0"] +lint = ["ruff<1.0,>=0.5"] +dev = ["langchain-core"] +typing = ["mypy<2.0,>=1.10", "langchain-core"] +[tool.uv.sources] +langchain-core = { path = "../../core", editable = true } +langchain-tests = { path = "../../standard-tests", editable = true } [tool.mypy] disallow_untyped_defs = "True" [tool.ruff.lint] -select = [ "E", "F", "I", "T201",] +select = ["E", "F", "I", "T201"] [tool.coverage.run] -omit = [ "tests/*",] +omit = ["tests/*"] [tool.pytest.ini_options] addopts = "--strict-markers --strict-config --durations=5" -markers = [ "requires: mark tests as requiring a specific library", "compile: mark placeholder test used to compile integration tests without running them",] +markers = [ + "requires: mark tests as requiring a specific library", + "compile: mark placeholder test used to compile integration tests without running them", +] asyncio_mode = "auto" diff --git a/libs/partners/mistralai/uv.lock b/libs/partners/mistralai/uv.lock index 04533bfeec3..ca95243c123 100644 --- a/libs/partners/mistralai/uv.lock +++ b/libs/partners/mistralai/uv.lock @@ -332,8 +332,8 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.34rc1" -source = { directory = "../../core" } +version = "0.3.35" +source = { editable = "../../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -426,32 +426,32 @@ typing = [ requires-dist = [ { name = "httpx", specifier = ">=0.25.2,<1" }, { name = "httpx-sse", specifier = ">=0.3.1,<1" }, - { name = "langchain-core", specifier = ">=0.3.33,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "pydantic", specifier = ">=2,<3" }, { name = "tokenizers", specifier = ">=0.15.1,<1" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "../../core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-tests", editable = "../../standard-tests" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-watcher", specifier = ">=0.3.4,<1.0.0" }, ] test-integration = [] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, ] [[package]] name = "langchain-tests" -version = "0.3.10" -source = { directory = "../../standard-tests" } +version = "0.3.11" +source = { editable = "../../standard-tests" } dependencies = [ { name = "httpx" }, { name = "langchain-core" }, @@ -466,7 +466,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "httpx", specifier = ">=0.25.0,<1" }, - { name = "langchain-core", specifier = ">=0.3.33,<0.4.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, { name = "pytest", specifier = ">=7,<9" }, @@ -475,6 +475,16 @@ requires-dist = [ { name = "syrupy", specifier = ">=4,<5" }, ] +[package.metadata.requires-dev] +codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] +lint = [{ name = "ruff", specifier = ">=0.9.2,<1.0.0" }] +test = [{ name = "langchain-core", editable = "../../core" }] +test-integration = [] +typing = [ + { name = "langchain-core", editable = "../../core" }, + { name = "mypy", specifier = ">=1,<2" }, +] + [[package]] name = "langsmith" version = "0.3.5" diff --git a/libs/partners/nomic/pyproject.toml b/libs/partners/nomic/pyproject.toml index 845e019d8a2..50bec91d066 100644 --- a/libs/partners/nomic/pyproject.toml +++ b/libs/partners/nomic/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "pdm.backend" [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<4.0,>=3.9" dependencies = [ "langchain-core!=0.3.0,!=0.3.1,!=0.3.10,!=0.3.11,!=0.3.12,!=0.3.13,!=0.3.14,!=0.3.2,!=0.3.3,!=0.3.4,!=0.3.5,!=0.3.6,!=0.3.7,!=0.3.8,!=0.3.9,<0.4.0,>=0.2.43", @@ -29,32 +29,25 @@ test = [ "syrupy<5.0.0,>=4.0.2", "pytest-watcher<1.0.0,>=0.3.4", "pytest-asyncio<1.0.0,>=0.21.1", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", + "langchain-core", "numpy<2.0.0,>=1.24.0; python_version < \"3.12\"", "numpy<2.0.0,>=1.26.0; python_version >= \"3.12\"", ] -codespell = [ - "codespell<3.0.0,>=2.2.0", -] +codespell = ["codespell<3.0.0,>=2.2.0"] test_integration = [] -lint = [ - "ruff<1.0.0,>=0.1.5", -] -typing = [ - "mypy<1.0,>=0.991", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] -dev = [ - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] +lint = ["ruff<1.0.0,>=0.1.5"] +typing = ["mypy<1.0,>=0.991", "langchain-core"] +dev = ["langchain-core"] +[tool.uv.sources] +langchain-core = { path = "../../core", editable = true } [tool.ruff.lint] select = [ - "E", # pycodestyle - "F", # pyflakes - "I", # isort - "T201", # print + "E", # pycodestyle + "F", # pyflakes + "I", # isort + "T201", # print ] [tool.mypy] @@ -77,7 +70,7 @@ addopts = "--snapshot-warn-unused --strict-markers --strict-config --durations=5 # Registering custom markers. # https://docs.pytest.org/en/7.1.x/example/markers.html#registering-markers markers = [ - "requires: mark tests as requiring a specific library", - "compile: mark placeholder test used to compile integration tests without running them", + "requires: mark tests as requiring a specific library", + "compile: mark placeholder test used to compile integration tests without running them", ] asyncio_mode = "auto" diff --git a/libs/partners/nomic/uv.lock b/libs/partners/nomic/uv.lock index cb0e8a77368..8dc98ca9471 100644 --- a/libs/partners/nomic/uv.lock +++ b/libs/partners/nomic/uv.lock @@ -333,8 +333,8 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.34rc1" -source = { directory = "../../core" } +version = "0.3.35" +source = { editable = "../../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -426,18 +426,18 @@ typing = [ [package.metadata] requires-dist = [ - { name = "langchain-core", specifier = ">=0.2.43,!=0.3.0,!=0.3.1,!=0.3.2,!=0.3.3,!=0.3.4,!=0.3.5,!=0.3.6,!=0.3.7,!=0.3.8,!=0.3.9,!=0.3.10,!=0.3.11,!=0.3.12,!=0.3.13,!=0.3.14,<0.4.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "nomic", specifier = ">=3.1.2,<4.0.0" }, { name = "pillow", specifier = ">=10.3.0,<11.0.0" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "../../core" }] lint = [{ name = "ruff", specifier = ">=0.1.5,<1.0.0" }] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.0,<2.0.0" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, @@ -448,7 +448,7 @@ test = [ ] test-integration = [] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=0.991,<1.0" }, ] diff --git a/libs/partners/ollama/pyproject.toml b/libs/partners/ollama/pyproject.toml index d7892ced482..c159c6eb3d1 100644 --- a/libs/partners/ollama/pyproject.toml +++ b/libs/partners/ollama/pyproject.toml @@ -4,12 +4,9 @@ build-backend = "pdm.backend" [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<4.0,>=3.9" -dependencies = [ - "ollama<1,>=0.4.4", - "langchain-core<1.0.0,>=0.3.33", -] +dependencies = ["ollama<1,>=0.4.4", "langchain-core<1.0.0,>=0.3.33"] name = "langchain-ollama" version = "0.2.3" description = "An integration package connecting Ollama and LangChain" @@ -27,35 +24,29 @@ test = [ "syrupy<5.0.0,>=4.0.2", "pytest-socket<1.0.0,>=0.7.0", "pytest-watcher<1.0.0,>=0.3.4", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", - "langchain-tests @ file:///${PROJECT_ROOT}/../../standard-tests", -] -codespell = [ - "codespell<3.0.0,>=2.2.6", + "langchain-core", + "langchain-tests", ] +codespell = ["codespell<3.0.0,>=2.2.6"] test_integration = [] -lint = [ - "ruff<1.0.0,>=0.1.8", -] -dev = [ - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] -typing = [ - "mypy<2.0.0,>=1.7.1", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] +lint = ["ruff<1.0.0,>=0.1.8"] +dev = ["langchain-core"] +typing = ["mypy<2.0.0,>=1.7.1", "langchain-core"] +[tool.uv.sources] +langchain-core = { path = "../../core", editable = true } +langchain-tests = { path = "../../standard-tests", editable = true } [tool.mypy] disallow_untyped_defs = "True" [tool.ruff.lint] select = [ - "E", # pycodestyle - "F", # pyflakes - "I", # isort - "T201", # print - "D", # pydocstyle + "E", # pycodestyle + "F", # pyflakes + "I", # isort + "T201", # print + "D", # pydocstyle ] @@ -71,6 +62,6 @@ omit = ["tests/*"] [tool.pytest.ini_options] addopts = "--snapshot-warn-unused --strict-markers --strict-config --durations=5" markers = [ - "compile: mark placeholder test used to compile integration tests without running them", + "compile: mark placeholder test used to compile integration tests without running them", ] asyncio_mode = "auto" diff --git a/libs/partners/ollama/uv.lock b/libs/partners/ollama/uv.lock index 4ca4f035e8b..f2207769418 100644 --- a/libs/partners/ollama/uv.lock +++ b/libs/partners/ollama/uv.lock @@ -287,8 +287,8 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.34rc1" -source = { directory = "../../core" } +version = "0.3.35" +source = { editable = "../../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -378,17 +378,17 @@ typing = [ [package.metadata] requires-dist = [ - { name = "langchain-core", specifier = ">=0.3.33,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "ollama", specifier = ">=0.4.4,<1" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.6,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "../../core" }] lint = [{ name = "ruff", specifier = ">=0.1.8,<1.0.0" }] test = [ - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-tests", editable = "../../standard-tests" }, { name = "pytest", specifier = ">=7.4.3,<8.0.0" }, { name = "pytest-asyncio", specifier = ">=0.23.2,<1.0.0" }, { name = "pytest-socket", specifier = ">=0.7.0,<1.0.0" }, @@ -397,14 +397,14 @@ test = [ ] test-integration = [] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1.7.1,<2.0.0" }, ] [[package]] name = "langchain-tests" -version = "0.3.10" -source = { directory = "../../standard-tests" } +version = "0.3.11" +source = { editable = "../../standard-tests" } dependencies = [ { name = "httpx" }, { name = "langchain-core" }, @@ -419,7 +419,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "httpx", specifier = ">=0.25.0,<1" }, - { name = "langchain-core", specifier = ">=0.3.33,<0.4.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, { name = "pytest", specifier = ">=7,<9" }, @@ -428,6 +428,16 @@ requires-dist = [ { name = "syrupy", specifier = ">=4,<5" }, ] +[package.metadata.requires-dev] +codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] +lint = [{ name = "ruff", specifier = ">=0.9.2,<1.0.0" }] +test = [{ name = "langchain-core", editable = "../../core" }] +test-integration = [] +typing = [ + { name = "langchain-core", editable = "../../core" }, + { name = "mypy", specifier = ">=1,<2" }, +] + [[package]] name = "langsmith" version = "0.3.5" diff --git a/libs/partners/openai/pyproject.toml b/libs/partners/openai/pyproject.toml index f099368229a..0ffb2042585 100644 --- a/libs/partners/openai/pyproject.toml +++ b/libs/partners/openai/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "pdm.backend" [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<4.0,>=3.9" dependencies = [ "langchain-core<1.0.0,>=0.3.34", @@ -34,30 +34,23 @@ test = [ "pytest-xdist<4.0.0,>=3.6.1", "numpy<2,>=1; python_version < \"3.12\"", "numpy<2.0.0,>=1.26.0; python_version >= \"3.12\"", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", - "langchain-tests @ file:///${PROJECT_ROOT}/../../standard-tests", -] -codespell = [ - "codespell<3.0.0,>=2.2.0", -] -lint = [ - "ruff<1.0,>=0.5", -] -dev = [ - "langchain-core @ file:///${PROJECT_ROOT}/../../core", + "langchain-core", + "langchain-tests", ] +codespell = ["codespell<3.0.0,>=2.2.0"] +lint = ["ruff<1.0,>=0.5"] +dev = ["langchain-core"] test_integration = [ "httpx<1.0.0,>=0.27.0", "pillow<11.0.0,>=10.3.0", "numpy<2,>=1; python_version < \"3.12\"", "numpy<2.0.0,>=1.26.0; python_version >= \"3.12\"", ] -typing = [ - "mypy<2.0,>=1.10", - "types-tqdm<5.0.0.0,>=4.66.0.5", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] +typing = ["mypy<2.0,>=1.10", "types-tqdm<5.0.0.0,>=4.66.0.5", "langchain-core"] +[tool.uv.sources] +langchain-core = { path = "../../core", editable = true } +langchain-tests = { path = "../../standard-tests", editable = true } [tool.mypy] disallow_untyped_defs = "True" @@ -66,17 +59,23 @@ module = "transformers" ignore_missing_imports = true [tool.ruff.lint] -select = [ "E", "F", "I", "T201",] +select = ["E", "F", "I", "T201"] [tool.ruff.format] docstring-code-format = true skip-magic-trailing-comma = true [tool.coverage.run] -omit = [ "tests/*",] +omit = ["tests/*"] [tool.pytest.ini_options] addopts = "--snapshot-warn-unused --strict-markers --strict-config --durations=5 --cov=langchain_openai" -markers = [ "requires: mark tests as requiring a specific library", "compile: mark placeholder test used to compile integration tests without running them", "scheduled: mark tests to run in scheduled testing",] +markers = [ + "requires: mark tests as requiring a specific library", + "compile: mark placeholder test used to compile integration tests without running them", + "scheduled: mark tests to run in scheduled testing", +] asyncio_mode = "auto" -filterwarnings = [ "ignore::langchain_core._api.beta_decorator.LangChainBetaWarning",] +filterwarnings = [ + "ignore::langchain_core._api.beta_decorator.LangChainBetaWarning", +] diff --git a/libs/partners/openai/uv.lock b/libs/partners/openai/uv.lock index c18de379832..e8235bf1d68 100644 --- a/libs/partners/openai/uv.lock +++ b/libs/partners/openai/uv.lock @@ -462,8 +462,8 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.34" -source = { directory = "../../core" } +version = "0.3.35" +source = { editable = "../../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -565,19 +565,19 @@ typing = [ [package.metadata] requires-dist = [ - { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "openai", specifier = ">=1.58.1,<2.0.0" }, { name = "tiktoken", specifier = ">=0.7,<1" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "../../core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-tests", editable = "../../standard-tests" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1,<2" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.0,<2.0.0" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, @@ -596,7 +596,7 @@ test-integration = [ { name = "pillow", specifier = ">=10.3.0,<11.0.0" }, ] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "types-tqdm", specifier = ">=4.66.0.5,<5.0.0.0" }, ] @@ -604,7 +604,7 @@ typing = [ [[package]] name = "langchain-tests" version = "0.3.11" -source = { directory = "../../standard-tests" } +source = { editable = "../../standard-tests" } dependencies = [ { name = "httpx" }, { name = "langchain-core" }, @@ -618,7 +618,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "httpx", specifier = ">=0.25.0,<1" }, - { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, { name = "pytest", specifier = ">=7,<9" }, @@ -630,10 +630,10 @@ requires-dist = [ [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] lint = [{ name = "ruff", specifier = ">=0.9.2,<1.0.0" }] -test = [{ name = "langchain-core", directory = "../core" }] +test = [{ name = "langchain-core", editable = "../../core" }] test-integration = [] typing = [ - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1,<2" }, ] diff --git a/libs/partners/pinecone/pyproject.toml b/libs/partners/pinecone/pyproject.toml index 9390dec26fd..d9ea495cd78 100644 --- a/libs/partners/pinecone/pyproject.toml +++ b/libs/partners/pinecone/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "pdm.backend" [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<3.14,>=3.9" dependencies = [ "langchain-core<1.0.0,>=0.3.34", @@ -32,26 +32,17 @@ test = [ "pytest-watcher<1.0.0,>=0.3.4", "pytest-asyncio<1,>=0.25.0", "pytest-socket<1.0.0,>=0.7.0", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] -codespell = [ - "codespell<3.0.0,>=2.2.0", -] -test_integration = [ - "langchain-openai @ file:///${PROJECT_ROOT}/../openai", -] -lint = [ - "ruff<1.0,>=0.5", -] -dev = [ - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] -typing = [ - "mypy<2.0,>=1.10", - "simsimd<6.0.0,>=5.0.0", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", + "langchain-core", ] +codespell = ["codespell<3.0.0,>=2.2.0"] +test_integration = ["langchain-openai"] +lint = ["ruff<1.0,>=0.5"] +dev = ["langchain-core"] +typing = ["mypy<2.0,>=1.10", "simsimd<6.0.0,>=5.0.0", "langchain-core"] +[tool.uv.sources] +langchain-core = { path = "../../core", editable = true } +langchain-openai = { path = "../openai", editable = true } [tool.mypy] disallow_untyped_defs = "True" diff --git a/libs/partners/pinecone/uv.lock b/libs/partners/pinecone/uv.lock index c0722c134be..be82ab073ea 100644 --- a/libs/partners/pinecone/uv.lock +++ b/libs/partners/pinecone/uv.lock @@ -594,8 +594,8 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.34" -source = { directory = "../../core" } +version = "0.3.35" +source = { editable = "../../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -653,7 +653,7 @@ typing = [ [[package]] name = "langchain-openai" version = "0.3.5" -source = { directory = "../openai" } +source = { editable = "../openai" } dependencies = [ { name = "langchain-core" }, { name = "openai" }, @@ -662,19 +662,19 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "openai", specifier = ">=1.58.1,<2.0.0" }, { name = "tiktoken", specifier = ">=0.7,<1" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "../../core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-tests", editable = "../../standard-tests" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1,<2" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.0,<2.0.0" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, @@ -693,7 +693,7 @@ test-integration = [ { name = "pillow", specifier = ">=10.3.0,<11.0.0" }, ] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "types-tqdm", specifier = ">=4.66.0.5,<5.0.0.0" }, ] @@ -742,7 +742,7 @@ typing = [ [package.metadata] requires-dist = [ { name = "aiohttp", specifier = ">=3.10,<3.11" }, - { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "langchain-tests", specifier = ">=0.3.7,<1.0.0" }, { name = "numpy", specifier = ">=1.26.4,<2.0.0" }, { name = "pinecone", specifier = ">=5.4.0,<6.0.0" }, @@ -750,11 +750,11 @@ requires-dist = [ [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "../../core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "pytest", specifier = ">=8,<9" }, { name = "pytest-asyncio", specifier = ">=0.25.0,<1" }, { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, @@ -762,9 +762,9 @@ test = [ { name = "pytest-watcher", specifier = ">=0.3.4,<1.0.0" }, { name = "syrupy", specifier = ">=4.0.2,<5.0.0" }, ] -test-integration = [{ name = "langchain-openai", directory = "../openai" }] +test-integration = [{ name = "langchain-openai", editable = "../openai" }] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "simsimd", specifier = ">=5.0.0,<6.0.0" }, ] diff --git a/libs/partners/prompty/pyproject.toml b/libs/partners/prompty/pyproject.toml index fbdb2bec1d0..f47596855a5 100644 --- a/libs/partners/prompty/pyproject.toml +++ b/libs/partners/prompty/pyproject.toml @@ -4,12 +4,9 @@ build-backend = "pdm.backend" [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<4.0,>=3.9" -dependencies = [ - "langchain-core<1.0.0,>=0.3.15", - "pyyaml<7.0.0,>=6.0.1", -] +dependencies = ["langchain-core<1.0.0,>=0.3.15", "pyyaml<7.0.0,>=6.0.1"] name = "langchain-prompty" version = "0.1.1" description = "An integration package connecting Prompty and LangChain" @@ -28,38 +25,40 @@ test = [ "syrupy<5.0.0,>=4.0.2", "pytest-watcher<1.0.0,>=0.3.4", "pytest-asyncio<1.0.0,>=0.21.1", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", - "langchain @ file:///${PROJECT_ROOT}/../../langchain", - "langchain-text-splitters @ file:///${PROJECT_ROOT}/../../text-splitters", -] -codespell = [ - "codespell<3.0.0,>=2.2.0", + "langchain-core", + "langchain", + "langchain-text-splitters", ] +codespell = ["codespell<3.0.0,>=2.2.0"] test_integration = [] -lint = [ - "ruff<1.0.0,>=0.1.5", -] -dev = [ - "types-pyyaml<7.0.0.0,>=6.0.12.20240311", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] +lint = ["ruff<1.0.0,>=0.1.5"] +dev = ["types-pyyaml<7.0.0.0,>=6.0.12.20240311", "langchain-core"] typing = [ "mypy<1.0,>=0.991", "types-pyyaml<7.0.0.0,>=6.0.12.20240311", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", + "langchain-core", ] +[tool.uv.sources] +langchain-core = { path = "../../core", editable = true } +langchain-text-splitters = { path = "../../text-splitters", editable = true } +langchain = { path = "../../langchain", editable = true } + + [tool.ruff] -select = [ "E", "F", "I",] +select = ["E", "F", "I"] [tool.mypy] disallow_untyped_defs = "True" [tool.coverage.run] -omit = [ "tests/*",] +omit = ["tests/*"] [tool.pytest.ini_options] addopts = "--snapshot-warn-unused --strict-markers --strict-config --durations=5" -markers = [ "requires: mark tests as requiring a specific library", "compile: mark placeholder test used to compile integration tests without running them",] +markers = [ + "requires: mark tests as requiring a specific library", + "compile: mark placeholder test used to compile integration tests without running them", +] asyncio_mode = "auto" diff --git a/libs/partners/prompty/uv.lock b/libs/partners/prompty/uv.lock index 238123d738e..c48335161cb 100644 --- a/libs/partners/prompty/uv.lock +++ b/libs/partners/prompty/uv.lock @@ -576,8 +576,8 @@ wheels = [ [[package]] name = "langchain" -version = "0.3.18rc1" -source = { directory = "../../langchain" } +version = "0.3.18" +source = { editable = "../../langchain" } dependencies = [ { name = "aiohttp" }, { name = "async-timeout", marker = "python_full_version < '3.11'" }, @@ -601,7 +601,7 @@ requires-dist = [ { name = "langchain-aws", marker = "extra == 'aws'" }, { name = "langchain-cohere", marker = "extra == 'cohere'" }, { name = "langchain-community", marker = "extra == 'community'" }, - { name = "langchain-core", specifier = ">=0.3.33,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "langchain-deepseek", marker = "extra == 'deepseek'" }, { name = "langchain-fireworks", marker = "extra == 'fireworks'" }, { name = "langchain-google-genai", marker = "extra == 'google-genai'" }, @@ -610,8 +610,8 @@ requires-dist = [ { name = "langchain-huggingface", marker = "extra == 'huggingface'" }, { name = "langchain-mistralai", marker = "extra == 'mistralai'" }, { name = "langchain-ollama", marker = "extra == 'ollama'" }, - { name = "langchain-openai", marker = "extra == 'openai'" }, - { name = "langchain-text-splitters", specifier = ">=0.3.3,<1.0.0" }, + { name = "langchain-openai", marker = "extra == 'openai'", editable = "../openai" }, + { name = "langchain-text-splitters", editable = "../../text-splitters" }, { name = "langchain-together", marker = "extra == 'together'" }, { name = "langsmith", specifier = ">=0.1.17,<0.4" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.26.4,<2" }, @@ -627,8 +627,8 @@ requires-dist = [ codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-text-splitters", editable = "../../text-splitters" }, { name = "playwright", specifier = ">=1.28.0,<2.0.0" }, { name = "setuptools", specifier = ">=67.6.1,<68.0.0" }, ] @@ -638,14 +638,15 @@ lint = [ { name = "ruff", specifier = ">=0.9.2,<1.0.0" }, ] test = [ + { name = "blockbuster", specifier = ">=1.5.14,<1.6" }, { name = "cffi", marker = "python_full_version < '3.10'", specifier = "<1.17.1" }, { name = "cffi", marker = "python_full_version >= '3.10'" }, { name = "duckdb-engine", specifier = ">=0.9.2,<1.0.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-openai", directory = "../partners/openai" }, - { name = "langchain-tests", directory = "../standard-tests" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-openai", editable = "../openai" }, + { name = "langchain-tests", editable = "../../standard-tests" }, + { name = "langchain-text-splitters", editable = "../../text-splitters" }, { name = "lark", specifier = ">=1.1.5,<2.0.0" }, { name = "packaging", specifier = ">=24.2" }, { name = "pandas", specifier = ">=2.0.0,<3.0.0" }, @@ -664,8 +665,8 @@ test = [ ] test-integration = [ { name = "cassio", specifier = ">=0.1.0,<1.0.0" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-text-splitters", editable = "../../text-splitters" }, { name = "langchainhub", specifier = ">=0.1.16,<1.0.0" }, { name = "pytest-vcr", specifier = ">=1.0.2,<2.0.0" }, { name = "python-dotenv", specifier = ">=1.0.0,<2.0.0" }, @@ -673,8 +674,8 @@ test-integration = [ { name = "wrapt", specifier = ">=1.15.0,<2.0.0" }, ] typing = [ - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-text-splitters", editable = "../../text-splitters" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "mypy-protobuf", specifier = ">=3.0.0,<4.0.0" }, { name = "types-chardet", specifier = ">=5.0.4.6,<6.0.0.0" }, @@ -687,8 +688,8 @@ typing = [ [[package]] name = "langchain-core" -version = "0.3.34rc1" -source = { directory = "../../core" } +version = "0.3.35" +source = { editable = "../../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -782,22 +783,22 @@ typing = [ [package.metadata] requires-dist = [ - { name = "langchain-core", specifier = ">=0.3.15,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "pyyaml", specifier = ">=6.0.1,<7.0.0" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] dev = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "types-pyyaml", specifier = ">=6.0.12.20240311,<7.0.0.0" }, ] lint = [{ name = "ruff", specifier = ">=0.1.5,<1.0.0" }] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain", directory = "../../langchain" }, - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-text-splitters", directory = "../../text-splitters" }, + { name = "langchain", editable = "../../langchain" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-text-splitters", editable = "../../text-splitters" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, @@ -806,34 +807,34 @@ test = [ ] test-integration = [] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=0.991,<1.0" }, { name = "types-pyyaml", specifier = ">=6.0.12.20240311,<7.0.0.0" }, ] [[package]] name = "langchain-text-splitters" -version = "0.3.6rc1" -source = { directory = "../../text-splitters" } +version = "0.3.6" +source = { editable = "../../text-splitters" } dependencies = [ { name = "langchain-core" }, ] [package.metadata] -requires-dist = [{ name = "langchain-core", specifier = ">=0.3.34rc1,<1.0.0" }] +requires-dist = [{ name = "langchain-core", editable = "../../core" }] [package.metadata.requires-dev] dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../../core" }, ] lint = [ - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "ruff", specifier = ">=0.9.2,<1.0.0" }, ] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "pytest", specifier = ">=8,<9" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, diff --git a/libs/partners/qdrant/pyproject.toml b/libs/partners/qdrant/pyproject.toml index 4f30354054c..ba2f28f29af 100644 --- a/libs/partners/qdrant/pyproject.toml +++ b/libs/partners/qdrant/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "pdm.backend" [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<4,>=3.9" dependencies = [ "qdrant-client<2.0.0,>=1.10.1", @@ -36,27 +36,16 @@ test = [ "pytest-asyncio<1.0.0,>=0.21.1", "requests<3.0.0,>=2.31.0", "pytest-socket<1.0.0,>=0.7.0", - "langchain-core @ file:///${PROJECT_ROOT}/../../core ; python_version >= \"3.9\"", - "langchain-core<0.3,>=0.1.40; python_version < \"3.9\"", -] -codespell = [ - "codespell<3.0.0,>=2.2.0", + "langchain-core", ] +codespell = ["codespell<3.0.0,>=2.2.0"] test_integration = [] -lint = [ - "ruff<1.0,>=0.5", -] -dev = [ - "langchain-core @ file:///${PROJECT_ROOT}/../../core ; python_version >= \"3.9\"", - "langchain-core<0.3,>=0.1.52; python_version < \"3.9\"", -] -typing = [ - "mypy<2.0,>=1.10", - "simsimd<7.0.0,>=6.0.0", - "langchain-core @ file:///${PROJECT_ROOT}/../../core ; python_version >= \"3.9\"", - "langchain-core<0.3,>=0.1.52; python_version < \"3.9\"", -] +lint = ["ruff<1.0,>=0.5"] +dev = ["langchain-core"] +typing = ["mypy<2.0,>=1.10", "simsimd<7.0.0,>=6.0.0", "langchain-core"] +[tool.uv.sources] +langchain-core = { path = "../../core", editable = true } [tool.ruff] select = ["E", "F", "I"] diff --git a/libs/partners/qdrant/uv.lock b/libs/partners/qdrant/uv.lock index 45582997ea0..b9e5a499252 100644 --- a/libs/partners/qdrant/uv.lock +++ b/libs/partners/qdrant/uv.lock @@ -540,8 +540,8 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.34rc1" -source = { directory = "../../core" } +version = "0.3.35" +source = { editable = "../../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -641,22 +641,18 @@ typing = [ [package.metadata] requires-dist = [ { name = "fastembed", marker = "python_full_version >= '3.9' and python_full_version < '3.13' and extra == 'fastembed'", specifier = ">=0.3.3,<1.0.0" }, - { name = "langchain-core", specifier = ">=0.2.43,!=0.3.0,!=0.3.1,!=0.3.2,!=0.3.3,!=0.3.4,!=0.3.5,!=0.3.6,!=0.3.7,!=0.3.8,!=0.3.9,!=0.3.10,!=0.3.11,!=0.3.12,!=0.3.13,!=0.3.14,<0.4.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "pydantic", specifier = ">=2.7.4,<3.0.0" }, { name = "qdrant-client", specifier = ">=1.10.1,<2.0.0" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [ - { name = "langchain-core", marker = "python_full_version < '3.9'", specifier = ">=0.1.52,<0.3" }, - { name = "langchain-core", marker = "python_full_version >= '3.9'", directory = "../../core" }, -] +dev = [{ name = "langchain-core", editable = "../../core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", marker = "python_full_version < '3.9'", specifier = ">=0.1.40,<0.3" }, - { name = "langchain-core", marker = "python_full_version >= '3.9'", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, @@ -667,8 +663,7 @@ test = [ ] test-integration = [] typing = [ - { name = "langchain-core", marker = "python_full_version < '3.9'", specifier = ">=0.1.52,<0.3" }, - { name = "langchain-core", marker = "python_full_version >= '3.9'", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "simsimd", specifier = ">=6.0.0,<7.0.0" }, ] diff --git a/libs/partners/voyageai/pyproject.toml b/libs/partners/voyageai/pyproject.toml index ddf3f71ef16..511f5d642be 100644 --- a/libs/partners/voyageai/pyproject.toml +++ b/libs/partners/voyageai/pyproject.toml @@ -7,7 +7,7 @@ includes = [] [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<3.13,>=3.9" dependencies = [ "langchain-core<1.0.0,>=0.3.29", @@ -35,34 +35,30 @@ test = [ "pytest-socket<1.0.0,>=0.7.0", "numpy<2.0.0,>=1.24.0; python_version < \"3.12\"", "numpy<2.0.0,>=1.26.0; python_version >= \"3.12\"", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] -codespell = [ - "codespell<3.0.0,>=2.2.0", + "langchain-core", ] +codespell = ["codespell<3.0.0,>=2.2.0"] test_integration = [] -lint = [ - "ruff<1.0.0,>=0.1.5", -] -dev = [ - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] -typing = [ - "mypy<2.0,>=1.10", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] +lint = ["ruff<1.0.0,>=0.1.5"] +dev = ["langchain-core"] +typing = ["mypy<2.0,>=1.10", "langchain-core"] +[tool.uv.sources] +langchain-core = { path = "../../core", editable = true } [tool.mypy] disallow_untyped_defs = "True" [tool.ruff.lint] -select = [ "E", "F", "I",] +select = ["E", "F", "I"] [tool.coverage.run] -omit = [ "tests/*",] +omit = ["tests/*"] [tool.pytest.ini_options] addopts = "--strict-markers --strict-config --durations=5" -markers = [ "requires: mark tests as requiring a specific library", "compile: mark placeholder test used to compile integration tests without running them",] +markers = [ + "requires: mark tests as requiring a specific library", + "compile: mark placeholder test used to compile integration tests without running them", +] asyncio_mode = "auto" diff --git a/libs/partners/voyageai/uv.lock b/libs/partners/voyageai/uv.lock index 59b4dda39e4..3dd4cd22765 100644 --- a/libs/partners/voyageai/uv.lock +++ b/libs/partners/voyageai/uv.lock @@ -506,8 +506,8 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.34rc1" -source = { directory = "../../core" } +version = "0.3.35" +source = { editable = "../../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -600,18 +600,18 @@ typing = [ [package.metadata] requires-dist = [ - { name = "langchain-core", specifier = ">=0.3.29,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "pydantic", specifier = ">=2,<3" }, { name = "voyageai", specifier = ">=0.3.2,<1" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "../../core" }] lint = [{ name = "ruff", specifier = ">=0.1.5,<1.0.0" }] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.0,<2.0.0" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, @@ -623,7 +623,7 @@ test = [ ] test-integration = [] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, ] diff --git a/libs/partners/xai/pyproject.toml b/libs/partners/xai/pyproject.toml index edfd38155c6..2b8f16d68c0 100644 --- a/libs/partners/xai/pyproject.toml +++ b/libs/partners/xai/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "pdm.backend" [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<4.0,>=3.9" dependencies = [ "langchain-openai<0.4,>=0.3", @@ -31,30 +31,24 @@ test = [ "pytest-watcher<1.0.0,>=0.3.4", "pytest-asyncio<1.0.0,>=0.21.1", "docarray<1.0.0,>=0.32.1", - "langchain-openai @ file:///${PROJECT_ROOT}/../openai", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", - "langchain-tests @ file:///${PROJECT_ROOT}/../../standard-tests", + "langchain-openai", + "langchain-core", + "langchain-tests", "pytest-socket<1.0.0,>=0.7.0", ] -codespell = [ - "codespell<3.0.0,>=2.2.0", -] +codespell = ["codespell<3.0.0,>=2.2.0"] test_integration = [ "numpy<2,>=1; python_version < \"3.12\"", "numpy<2.0.0,>=1.26.0; python_version >= \"3.12\"", ] -lint = [ - "ruff<1.0,>=0.5", -] -typing = [ - "mypy<2.0,>=1.10", - "types-requests<3,>=2", - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] -dev = [ - "langchain-core @ file:///${PROJECT_ROOT}/../../core", -] +lint = ["ruff<1.0,>=0.5"] +typing = ["mypy<2.0,>=1.10", "types-requests<3,>=2", "langchain-core"] +dev = ["langchain-core"] +[tool.uv.sources] +langchain-core = { path = "../../core", editable = true } +langchain-tests = { path = "../../standard-tests", editable = true } +langchain-openai = { path = "../openai", editable = true } [tool.mypy] disallow_untyped_defs = "True" diff --git a/libs/partners/xai/uv.lock b/libs/partners/xai/uv.lock index 2808198e9c3..268eaf47702 100644 --- a/libs/partners/xai/uv.lock +++ b/libs/partners/xai/uv.lock @@ -612,8 +612,8 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.34rc1" -source = { directory = "../../core" } +version = "0.3.35" +source = { editable = "../../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -670,8 +670,8 @@ typing = [ [[package]] name = "langchain-openai" -version = "0.3.3" -source = { directory = "../openai" } +version = "0.3.5" +source = { editable = "../openai" } dependencies = [ { name = "langchain-core" }, { name = "openai" }, @@ -680,19 +680,19 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "langchain-core", specifier = ">=0.3.33,<1.0.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "openai", specifier = ">=1.58.1,<2.0.0" }, { name = "tiktoken", specifier = ">=0.7,<1" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "../../core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-tests", editable = "../../standard-tests" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1,<2" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.0,<2.0.0" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, @@ -711,15 +711,15 @@ test-integration = [ { name = "pillow", specifier = ">=10.3.0,<11.0.0" }, ] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "types-tqdm", specifier = ">=4.66.0.5,<5.0.0.0" }, ] [[package]] name = "langchain-tests" -version = "0.3.10" -source = { directory = "../../standard-tests" } +version = "0.3.11" +source = { editable = "../../standard-tests" } dependencies = [ { name = "httpx" }, { name = "langchain-core" }, @@ -733,7 +733,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "httpx", specifier = ">=0.25.0,<1" }, - { name = "langchain-core", specifier = ">=0.3.33,<0.4.0" }, + { name = "langchain-core", editable = "../../core" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, { name = "pytest", specifier = ">=7,<9" }, @@ -742,6 +742,16 @@ requires-dist = [ { name = "syrupy", specifier = ">=4,<5" }, ] +[package.metadata.requires-dev] +codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] +lint = [{ name = "ruff", specifier = ">=0.9.2,<1.0.0" }] +test = [{ name = "langchain-core", editable = "../../core" }] +test-integration = [] +typing = [ + { name = "langchain-core", editable = "../../core" }, + { name = "mypy", specifier = ">=1,<2" }, +] + [[package]] name = "langchain-xai" version = "0.2.0" @@ -788,21 +798,21 @@ typing = [ [package.metadata] requires-dist = [ { name = "aiohttp", specifier = ">=3.9.1,<4" }, - { name = "langchain-core", specifier = ">=0.3.29,<1.0.0" }, - { name = "langchain-openai", specifier = ">=0.3,<0.4" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-openai", editable = "../openai" }, { name = "requests", specifier = ">=2,<3" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "../../core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ { name = "docarray", specifier = ">=0.32.1,<1.0.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-openai", directory = "../openai" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "../../core" }, + { name = "langchain-openai", editable = "../openai" }, + { name = "langchain-tests", editable = "../../standard-tests" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, @@ -815,7 +825,7 @@ test-integration = [ { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.0,<2.0.0" }, ] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "../../core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "types-requests", specifier = ">=2,<3" }, ] diff --git a/libs/standard-tests/pyproject.toml b/libs/standard-tests/pyproject.toml index 29ab14b09d1..7e4e7eb711b 100644 --- a/libs/standard-tests/pyproject.toml +++ b/libs/standard-tests/pyproject.toml @@ -3,10 +3,8 @@ requires = ["pdm-backend"] build-backend = "pdm.backend" [project] -authors = [ - {name = "Erick Friis", email = "erick@langchain.dev"}, -] -license = {text = "MIT"} +authors = [{ name = "Erick Friis", email = "erick@langchain.dev" }] +license = { text = "MIT" } requires-python = "<4.0,>=3.9" dependencies = [ "langchain-core<1.0.0,>=0.3.34", @@ -28,21 +26,14 @@ readme = "README.md" repository = "https://github.com/langchain-ai/langchain" [dependency-groups] -test = [ - "langchain-core @ file:///${PROJECT_ROOT}/../core", -] +test = ["langchain-core"] test_integration = [] -codespell = [ - "codespell<3.0.0,>=2.2.0", -] -lint = [ - "ruff<1.0.0,>=0.9.2", -] -typing = [ - "mypy<2,>=1", - "langchain-core @ file:///${PROJECT_ROOT}/../core", -] +codespell = ["codespell<3.0.0,>=2.2.0"] +lint = ["ruff<1.0.0,>=0.9.2"] +typing = ["mypy<2,>=1", "langchain-core"] +[tool.uv.sources] +langchain-core = { path = "../core", editable = true } [tool.mypy] disallow_untyped_defs = "True" diff --git a/libs/standard-tests/uv.lock b/libs/standard-tests/uv.lock index fb850739089..335c8af6922 100644 --- a/libs/standard-tests/uv.lock +++ b/libs/standard-tests/uv.lock @@ -287,8 +287,8 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.34" -source = { directory = "../core" } +version = "0.3.35" +source = { editable = "../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -351,7 +351,7 @@ dependencies = [ { name = "httpx" }, { name = "langchain-core" }, { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "numpy", version = "2.2.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "pytest" }, { name = "pytest-asyncio" }, { name = "pytest-socket" }, @@ -376,7 +376,7 @@ typing = [ [package.metadata] requires-dist = [ { name = "httpx", specifier = ">=0.25.0,<1" }, - { name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }, + { name = "langchain-core", editable = "../core" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.24.0,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, { name = "pytest", specifier = ">=7,<9" }, @@ -388,16 +388,16 @@ requires-dist = [ [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] lint = [{ name = "ruff", specifier = ">=0.9.2,<1.0.0" }] -test = [{ name = "langchain-core", directory = "../core" }] +test = [{ name = "langchain-core", editable = "../core" }] test-integration = [] typing = [ - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../core" }, { name = "mypy", specifier = ">=1,<2" }, ] [[package]] name = "langsmith" -version = "0.3.5" +version = "0.3.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, @@ -407,9 +407,9 @@ dependencies = [ { name = "requests-toolbelt" }, { name = "zstandard" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b7/2c/d8acbc61896f5fc210a3f3bc8ddf39db5213b23eaf83a755ba334be30212/langsmith-0.3.5.tar.gz", hash = "sha256:d891a205f70ab0b2c26311db6c52486ffc9fc1124238b999619445f6ae900725", size = 321847 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/1a/974b66a9e7c43f41bec067e1f393a296803aee48fafcf183941c31295b59/langsmith-0.3.8.tar.gz", hash = "sha256:97f9bebe0b7cb0a4f278e6ff30ae7d5ededff3883b014442ec6d7d575b02a0f1", size = 321394 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/00/dbbb9df2c575217326021da731534f246dce4bb6e95b55432ff7191643ac/langsmith-0.3.5-py3-none-any.whl", hash = "sha256:29da924d2e3662dd56f96d179ebc06662b66dd0b2317362ccebe0de1b78750e7", size = 333276 }, + { url = "https://files.pythonhosted.org/packages/8b/e4/5380e8229c442e406404977d2ec71a9db6a3e6a89fce7791c6ad7cd2bdbe/langsmith-0.3.8-py3-none-any.whl", hash = "sha256:fbb9dd97b0f090219447fca9362698d07abaeda1da85aa7cc6ec6517b36581b1", size = 332800 }, ] [[package]] @@ -513,68 +513,68 @@ wheels = [ [[package]] name = "numpy" -version = "2.2.2" +version = "2.2.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.12.4'", "python_full_version >= '3.12' and python_full_version < '3.12.4'", ] -sdist = { url = "https://files.pythonhosted.org/packages/ec/d0/c12ddfd3a02274be06ffc71f3efc6d0e457b0409c4481596881e748cb264/numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f", size = 20233295 } +sdist = { url = "https://files.pythonhosted.org/packages/fb/90/8956572f5c4ae52201fdec7ba2044b2c882832dcec7d5d0922c9e9acf2de/numpy-2.2.3.tar.gz", hash = "sha256:dbdc15f0c81611925f382dfa97b3bd0bc2c1ce19d4fe50482cb0ddc12ba30020", size = 20262700 } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/2a/69033dc22d981ad21325314f8357438078f5c28310a6d89fb3833030ec8a/numpy-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7079129b64cb78bdc8d611d1fd7e8002c0a2565da6a47c4df8062349fee90e3e", size = 21215825 }, - { url = "https://files.pythonhosted.org/packages/31/2c/39f91e00bbd3d5639b027ac48c55dc5f2992bd2b305412d26be4c830862a/numpy-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ec6c689c61df613b783aeb21f945c4cbe6c51c28cb70aae8430577ab39f163e", size = 14354996 }, - { url = "https://files.pythonhosted.org/packages/0a/2c/d468ebd253851af10de5b3e8f3418ebabfaab5f0337a75299fbeb8b8c17a/numpy-2.2.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:40c7ff5da22cd391944a28c6a9c638a5eef77fcf71d6e3a79e1d9d9e82752715", size = 5393621 }, - { url = "https://files.pythonhosted.org/packages/7f/f4/3d8a5a0da297034106c5de92be881aca7079cde6058934215a1de91334f6/numpy-2.2.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:995f9e8181723852ca458e22de5d9b7d3ba4da3f11cc1cb113f093b271d7965a", size = 6928931 }, - { url = "https://files.pythonhosted.org/packages/47/a7/029354ab56edd43dd3f5efbfad292b8844f98b93174f322f82353fa46efa/numpy-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78ea78450fd96a498f50ee096f69c75379af5138f7881a51355ab0e11286c97", size = 14333157 }, - { url = "https://files.pythonhosted.org/packages/e3/d7/11fc594838d35c43519763310c316d4fd56f8600d3fc80a8e13e325b5c5c/numpy-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fbe72d347fbc59f94124125e73fc4976a06927ebc503ec5afbfb35f193cd957", size = 16381794 }, - { url = "https://files.pythonhosted.org/packages/af/d4/dd9b19cd4aff9c79d3f54d17f8be815407520d3116004bc574948336981b/numpy-2.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8e6da5cffbbe571f93588f562ed130ea63ee206d12851b60819512dd3e1ba50d", size = 15543990 }, - { url = "https://files.pythonhosted.org/packages/30/97/ab96b7650f27f684a9b1e46757a7294ecc50cab27701d05f146e9f779627/numpy-2.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:09d6a2032faf25e8d0cadde7fd6145118ac55d2740132c1d845f98721b5ebcfd", size = 18170896 }, - { url = "https://files.pythonhosted.org/packages/81/9b/bae9618cab20db67a2ca9d711795cad29b2ca4b73034dd3b5d05b962070a/numpy-2.2.2-cp310-cp310-win32.whl", hash = "sha256:159ff6ee4c4a36a23fe01b7c3d07bd8c14cc433d9720f977fcd52c13c0098160", size = 6573458 }, - { url = "https://files.pythonhosted.org/packages/92/9b/95678092febd14070cfb7906ea7932e71e9dd5a6ab3ee948f9ed975e905d/numpy-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:64bd6e1762cd7f0986a740fee4dff927b9ec2c5e4d9a28d056eb17d332158014", size = 12915812 }, - { url = "https://files.pythonhosted.org/packages/21/67/32c68756eed84df181c06528ff57e09138f893c4653448c4967311e0f992/numpy-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:642199e98af1bd2b6aeb8ecf726972d238c9877b0f6e8221ee5ab945ec8a2189", size = 21220002 }, - { url = "https://files.pythonhosted.org/packages/3b/89/f43bcad18f2b2e5814457b1c7f7b0e671d0db12c8c0e43397ab8cb1831ed/numpy-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6d9fc9d812c81e6168b6d405bf00b8d6739a7f72ef22a9214c4241e0dc70b323", size = 14391215 }, - { url = "https://files.pythonhosted.org/packages/9c/e6/efb8cd6122bf25e86e3dd89d9dbfec9e6861c50e8810eed77d4be59b51c6/numpy-2.2.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:c7d1fd447e33ee20c1f33f2c8e6634211124a9aabde3c617687d8b739aa69eac", size = 5391918 }, - { url = "https://files.pythonhosted.org/packages/47/e2/fccf89d64d9b47ffb242823d4e851fc9d36fa751908c9aac2807924d9b4e/numpy-2.2.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:451e854cfae0febe723077bd0cf0a4302a5d84ff25f0bfece8f29206c7bed02e", size = 6933133 }, - { url = "https://files.pythonhosted.org/packages/34/22/5ece749c0e5420a9380eef6fbf83d16a50010bd18fef77b9193d80a6760e/numpy-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd249bc894af67cbd8bad2c22e7cbcd46cf87ddfca1f1289d1e7e54868cc785c", size = 14338187 }, - { url = "https://files.pythonhosted.org/packages/5b/86/caec78829311f62afa6fa334c8dfcd79cffb4d24bcf96ee02ae4840d462b/numpy-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02935e2c3c0c6cbe9c7955a8efa8908dd4221d7755644c59d1bba28b94fd334f", size = 16393429 }, - { url = "https://files.pythonhosted.org/packages/c8/4e/0c25f74c88239a37924577d6ad780f3212a50f4b4b5f54f5e8c918d726bd/numpy-2.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a972cec723e0563aa0823ee2ab1df0cb196ed0778f173b381c871a03719d4826", size = 15559103 }, - { url = "https://files.pythonhosted.org/packages/d4/bd/d557f10fa50dc4d5871fb9606af563249b66af2fc6f99041a10e8757c6f1/numpy-2.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6d6a0910c3b4368d89dde073e630882cdb266755565155bc33520283b2d9df8", size = 18182967 }, - { url = "https://files.pythonhosted.org/packages/30/e9/66cc0f66386d78ed89e45a56e2a1d051e177b6e04477c4a41cd590ef4017/numpy-2.2.2-cp311-cp311-win32.whl", hash = "sha256:860fd59990c37c3ef913c3ae390b3929d005243acca1a86facb0773e2d8d9e50", size = 6571499 }, - { url = "https://files.pythonhosted.org/packages/66/a3/4139296b481ae7304a43581046b8f0a20da6a0dfe0ee47a044cade796603/numpy-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:da1eeb460ecce8d5b8608826595c777728cdf28ce7b5a5a8c8ac8d949beadcf2", size = 12919805 }, - { url = "https://files.pythonhosted.org/packages/0c/e6/847d15770ab7a01e807bdfcd4ead5bdae57c0092b7dc83878171b6af97bb/numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467", size = 20912636 }, - { url = "https://files.pythonhosted.org/packages/d1/af/f83580891577b13bd7e261416120e036d0d8fb508c8a43a73e38928b794b/numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a", size = 14098403 }, - { url = "https://files.pythonhosted.org/packages/2b/86/d019fb60a9d0f1d4cf04b014fe88a9135090adfadcc31c1fadbb071d7fa7/numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825", size = 5128938 }, - { url = "https://files.pythonhosted.org/packages/7a/1b/50985edb6f1ec495a1c36452e860476f5b7ecdc3fc59ea89ccad3c4926c5/numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37", size = 6661937 }, - { url = "https://files.pythonhosted.org/packages/f4/1b/17efd94cad1b9d605c3f8907fb06bcffc4ce4d1d14d46b95316cccccf2b9/numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748", size = 14049518 }, - { url = "https://files.pythonhosted.org/packages/5b/73/65d2f0b698df1731e851e3295eb29a5ab8aa06f763f7e4188647a809578d/numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0", size = 16099146 }, - { url = "https://files.pythonhosted.org/packages/d5/69/308f55c0e19d4b5057b5df286c5433822e3c8039ede06d4051d96f1c2c4e/numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278", size = 15246336 }, - { url = "https://files.pythonhosted.org/packages/f0/d8/d8d333ad0d8518d077a21aeea7b7c826eff766a2b1ce1194dea95ca0bacf/numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba", size = 17863507 }, - { url = "https://files.pythonhosted.org/packages/82/6e/0b84ad3103ffc16d6673e63b5acbe7901b2af96c2837174c6318c98e27ab/numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283", size = 6276491 }, - { url = "https://files.pythonhosted.org/packages/fc/84/7f801a42a67b9772a883223a0a1e12069a14626c81a732bd70aac57aebc1/numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb", size = 12616372 }, - { url = "https://files.pythonhosted.org/packages/e1/fe/df5624001f4f5c3e0b78e9017bfab7fdc18a8d3b3d3161da3d64924dd659/numpy-2.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc", size = 20899188 }, - { url = "https://files.pythonhosted.org/packages/a9/80/d349c3b5ed66bd3cb0214be60c27e32b90a506946857b866838adbe84040/numpy-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369", size = 14113972 }, - { url = "https://files.pythonhosted.org/packages/9d/50/949ec9cbb28c4b751edfa64503f0913cbfa8d795b4a251e7980f13a8a655/numpy-2.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd", size = 5114294 }, - { url = "https://files.pythonhosted.org/packages/8d/f3/399c15629d5a0c68ef2aa7621d430b2be22034f01dd7f3c65a9c9666c445/numpy-2.2.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be", size = 6648426 }, - { url = "https://files.pythonhosted.org/packages/2c/03/c72474c13772e30e1bc2e558cdffd9123c7872b731263d5648b5c49dd459/numpy-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84", size = 14045990 }, - { url = "https://files.pythonhosted.org/packages/83/9c/96a9ab62274ffafb023f8ee08c88d3d31ee74ca58869f859db6845494fa6/numpy-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff", size = 16096614 }, - { url = "https://files.pythonhosted.org/packages/d5/34/cd0a735534c29bec7093544b3a509febc9b0df77718a9b41ffb0809c9f46/numpy-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0", size = 15242123 }, - { url = "https://files.pythonhosted.org/packages/5e/6d/541717a554a8f56fa75e91886d9b79ade2e595918690eb5d0d3dbd3accb9/numpy-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de", size = 17859160 }, - { url = "https://files.pythonhosted.org/packages/b9/a5/fbf1f2b54adab31510728edd06a05c1b30839f37cf8c9747cb85831aaf1b/numpy-2.2.2-cp313-cp313-win32.whl", hash = "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9", size = 6273337 }, - { url = "https://files.pythonhosted.org/packages/56/e5/01106b9291ef1d680f82bc47d0c5b5e26dfed15b0754928e8f856c82c881/numpy-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369", size = 12609010 }, - { url = "https://files.pythonhosted.org/packages/9f/30/f23d9876de0f08dceb707c4dcf7f8dd7588266745029debb12a3cdd40be6/numpy-2.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391", size = 20924451 }, - { url = "https://files.pythonhosted.org/packages/6a/ec/6ea85b2da9d5dfa1dbb4cb3c76587fc8ddcae580cb1262303ab21c0926c4/numpy-2.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39", size = 14122390 }, - { url = "https://files.pythonhosted.org/packages/68/05/bfbdf490414a7dbaf65b10c78bc243f312c4553234b6d91c94eb7c4b53c2/numpy-2.2.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317", size = 5156590 }, - { url = "https://files.pythonhosted.org/packages/f7/ec/fe2e91b2642b9d6544518388a441bcd65c904cea38d9ff998e2e8ebf808e/numpy-2.2.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49", size = 6671958 }, - { url = "https://files.pythonhosted.org/packages/b1/6f/6531a78e182f194d33ee17e59d67d03d0d5a1ce7f6be7343787828d1bd4a/numpy-2.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2", size = 14019950 }, - { url = "https://files.pythonhosted.org/packages/e1/fb/13c58591d0b6294a08cc40fcc6b9552d239d773d520858ae27f39997f2ae/numpy-2.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7", size = 16079759 }, - { url = "https://files.pythonhosted.org/packages/2c/f2/f2f8edd62abb4b289f65a7f6d1f3650273af00b91b7267a2431be7f1aec6/numpy-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb", size = 15226139 }, - { url = "https://files.pythonhosted.org/packages/aa/29/14a177f1a90b8ad8a592ca32124ac06af5eff32889874e53a308f850290f/numpy-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648", size = 17856316 }, - { url = "https://files.pythonhosted.org/packages/95/03/242ae8d7b97f4e0e4ab8dd51231465fb23ed5e802680d629149722e3faf1/numpy-2.2.2-cp313-cp313t-win32.whl", hash = "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4", size = 6329134 }, - { url = "https://files.pythonhosted.org/packages/80/94/cd9e9b04012c015cb6320ab3bf43bc615e248dddfeb163728e800a5d96f0/numpy-2.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576", size = 12696208 }, - { url = "https://files.pythonhosted.org/packages/96/7e/1dd770ee68916ed358991ab62c2cc353ffd98d0b75b901d52183ca28e8bb/numpy-2.2.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b0531f0b0e07643eb089df4c509d30d72c9ef40defa53e41363eca8a8cc61495", size = 21047291 }, - { url = "https://files.pythonhosted.org/packages/d1/3c/ccd08578dc532a8e6927952339d4a02682b776d5e85be49ed0760308433e/numpy-2.2.2-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:e9e82dcb3f2ebbc8cb5ce1102d5f1c5ed236bf8a11730fb45ba82e2841ec21df", size = 6792494 }, - { url = "https://files.pythonhosted.org/packages/7c/28/8754b9aee4f97199f9a047f73bb644b5a2014994a6d7b061ba67134a42de/numpy-2.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0d4142eb40ca6f94539e4db929410f2a46052a0fe7a2c1c59f6179c39938d2a", size = 16197312 }, - { url = "https://files.pythonhosted.org/packages/26/96/deb93f871f401045a684ca08a009382b247d14996d7a94fea6aa43c67b94/numpy-2.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:356ca982c188acbfa6af0d694284d8cf20e95b1c3d0aefa8929376fea9146f60", size = 12822674 }, + { url = "https://files.pythonhosted.org/packages/5e/e1/1816d5d527fa870b260a1c2c5904d060caad7515637bd54f495a5ce13ccd/numpy-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cbc6472e01952d3d1b2772b720428f8b90e2deea8344e854df22b0618e9cce71", size = 21232911 }, + { url = "https://files.pythonhosted.org/packages/29/46/9f25dc19b359f10c0e52b6bac25d3181eb1f4b4d04c9846a32cf5ea52762/numpy-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdfe0c22692a30cd830c0755746473ae66c4a8f2e7bd508b35fb3b6a0813d787", size = 14371955 }, + { url = "https://files.pythonhosted.org/packages/72/d7/de941296e6b09a5c81d3664ad912f1496a0ecdd2f403318e5e35604ff70f/numpy-2.2.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:e37242f5324ffd9f7ba5acf96d774f9276aa62a966c0bad8dae692deebec7716", size = 5410476 }, + { url = "https://files.pythonhosted.org/packages/36/ce/55f685995110f8a268fdca0f198c9a84fa87b39512830965cc1087af6391/numpy-2.2.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:95172a21038c9b423e68be78fd0be6e1b97674cde269b76fe269a5dfa6fadf0b", size = 6945730 }, + { url = "https://files.pythonhosted.org/packages/4f/84/abdb9f6e22576d89c259401c3234d4755b322539491bbcffadc8bcb120d3/numpy-2.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5b47c440210c5d1d67e1cf434124e0b5c395eee1f5806fdd89b553ed1acd0a3", size = 14350752 }, + { url = "https://files.pythonhosted.org/packages/e9/88/3870cfa9bef4dffb3a326507f430e6007eeac258ebeef6b76fc542aef66d/numpy-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0391ea3622f5c51a2e29708877d56e3d276827ac5447d7f45e9bc4ade8923c52", size = 16399386 }, + { url = "https://files.pythonhosted.org/packages/02/10/3f629682dd0b457525c131945329c4e81e2dadeb11256e6ce4c9a1a6fb41/numpy-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f6b3dfc7661f8842babd8ea07e9897fe3d9b69a1d7e5fbb743e4160f9387833b", size = 15561826 }, + { url = "https://files.pythonhosted.org/packages/da/18/fd35673ba9751eba449d4ce5d24d94e3b612cdbfba79348da71488c0b7ac/numpy-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1ad78ce7f18ce4e7df1b2ea4019b5817a2f6a8a16e34ff2775f646adce0a5027", size = 18188593 }, + { url = "https://files.pythonhosted.org/packages/ce/4c/c0f897b580ea59484b4cc96a441fea50333b26675a60a1421bc912268b5f/numpy-2.2.3-cp310-cp310-win32.whl", hash = "sha256:5ebeb7ef54a7be11044c33a17b2624abe4307a75893c001a4800857956b41094", size = 6590421 }, + { url = "https://files.pythonhosted.org/packages/e5/5b/aaabbfc7060c5c8f0124c5deb5e114a3b413a548bbc64e372c5b5db36165/numpy-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:596140185c7fa113563c67c2e894eabe0daea18cf8e33851738c19f70ce86aeb", size = 12925667 }, + { url = "https://files.pythonhosted.org/packages/96/86/453aa3949eab6ff54e2405f9cb0c01f756f031c3dc2a6d60a1d40cba5488/numpy-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:16372619ee728ed67a2a606a614f56d3eabc5b86f8b615c79d01957062826ca8", size = 21237256 }, + { url = "https://files.pythonhosted.org/packages/20/c3/93ecceadf3e155d6a9e4464dd2392d8d80cf436084c714dc8535121c83e8/numpy-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5521a06a3148686d9269c53b09f7d399a5725c47bbb5b35747e1cb76326b714b", size = 14408049 }, + { url = "https://files.pythonhosted.org/packages/8d/29/076999b69bd9264b8df5e56f2be18da2de6b2a2d0e10737e5307592e01de/numpy-2.2.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:7c8dde0ca2f77828815fd1aedfdf52e59071a5bae30dac3b4da2a335c672149a", size = 5408655 }, + { url = "https://files.pythonhosted.org/packages/e2/a7/b14f0a73eb0fe77cb9bd5b44534c183b23d4229c099e339c522724b02678/numpy-2.2.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:77974aba6c1bc26e3c205c2214f0d5b4305bdc719268b93e768ddb17e3fdd636", size = 6949996 }, + { url = "https://files.pythonhosted.org/packages/72/2f/8063da0616bb0f414b66dccead503bd96e33e43685c820e78a61a214c098/numpy-2.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d42f9c36d06440e34226e8bd65ff065ca0963aeecada587b937011efa02cdc9d", size = 14355789 }, + { url = "https://files.pythonhosted.org/packages/e6/d7/3cd47b00b8ea95ab358c376cf5602ad21871410950bc754cf3284771f8b6/numpy-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2712c5179f40af9ddc8f6727f2bd910ea0eb50206daea75f58ddd9fa3f715bb", size = 16411356 }, + { url = "https://files.pythonhosted.org/packages/27/c0/a2379e202acbb70b85b41483a422c1e697ff7eee74db642ca478de4ba89f/numpy-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c8b0451d2ec95010d1db8ca733afc41f659f425b7f608af569711097fd6014e2", size = 15576770 }, + { url = "https://files.pythonhosted.org/packages/bc/63/a13ee650f27b7999e5b9e1964ae942af50bb25606d088df4229283eda779/numpy-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9b4a8148c57ecac25a16b0e11798cbe88edf5237b0df99973687dd866f05e1b", size = 18200483 }, + { url = "https://files.pythonhosted.org/packages/4c/87/e71f89935e09e8161ac9c590c82f66d2321eb163893a94af749dfa8a3cf8/numpy-2.2.3-cp311-cp311-win32.whl", hash = "sha256:1f45315b2dc58d8a3e7754fe4e38b6fce132dab284a92851e41b2b344f6441c5", size = 6588415 }, + { url = "https://files.pythonhosted.org/packages/b9/c6/cd4298729826af9979c5f9ab02fcaa344b82621e7c49322cd2d210483d3f/numpy-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f48ba6f6c13e5e49f3d3efb1b51c8193215c42ac82610a04624906a9270be6f", size = 12929604 }, + { url = "https://files.pythonhosted.org/packages/43/ec/43628dcf98466e087812142eec6d1c1a6c6bdfdad30a0aa07b872dc01f6f/numpy-2.2.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12c045f43b1d2915eca6b880a7f4a256f59d62df4f044788c8ba67709412128d", size = 20929458 }, + { url = "https://files.pythonhosted.org/packages/9b/c0/2f4225073e99a5c12350954949ed19b5d4a738f541d33e6f7439e33e98e4/numpy-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:87eed225fd415bbae787f93a457af7f5990b92a334e346f72070bf569b9c9c95", size = 14115299 }, + { url = "https://files.pythonhosted.org/packages/ca/fa/d2c5575d9c734a7376cc1592fae50257ec95d061b27ee3dbdb0b3b551eb2/numpy-2.2.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:712a64103d97c404e87d4d7c47fb0c7ff9acccc625ca2002848e0d53288b90ea", size = 5145723 }, + { url = "https://files.pythonhosted.org/packages/eb/dc/023dad5b268a7895e58e791f28dc1c60eb7b6c06fcbc2af8538ad069d5f3/numpy-2.2.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a5ae282abe60a2db0fd407072aff4599c279bcd6e9a2475500fc35b00a57c532", size = 6678797 }, + { url = "https://files.pythonhosted.org/packages/3f/19/bcd641ccf19ac25abb6fb1dcd7744840c11f9d62519d7057b6ab2096eb60/numpy-2.2.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5266de33d4c3420973cf9ae3b98b54a2a6d53a559310e3236c4b2b06b9c07d4e", size = 14067362 }, + { url = "https://files.pythonhosted.org/packages/39/04/78d2e7402fb479d893953fb78fa7045f7deb635ec095b6b4f0260223091a/numpy-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b787adbf04b0db1967798dba8da1af07e387908ed1553a0d6e74c084d1ceafe", size = 16116679 }, + { url = "https://files.pythonhosted.org/packages/d0/a1/e90f7aa66512be3150cb9d27f3d9995db330ad1b2046474a13b7040dfd92/numpy-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:34c1b7e83f94f3b564b35f480f5652a47007dd91f7c839f404d03279cc8dd021", size = 15264272 }, + { url = "https://files.pythonhosted.org/packages/dc/b6/50bd027cca494de4fa1fc7bf1662983d0ba5f256fa0ece2c376b5eb9b3f0/numpy-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4d8335b5f1b6e2bce120d55fb17064b0262ff29b459e8493d1785c18ae2553b8", size = 17880549 }, + { url = "https://files.pythonhosted.org/packages/96/30/f7bf4acb5f8db10a96f73896bdeed7a63373137b131ca18bd3dab889db3b/numpy-2.2.3-cp312-cp312-win32.whl", hash = "sha256:4d9828d25fb246bedd31e04c9e75714a4087211ac348cb39c8c5f99dbb6683fe", size = 6293394 }, + { url = "https://files.pythonhosted.org/packages/42/6e/55580a538116d16ae7c9aa17d4edd56e83f42126cb1dfe7a684da7925d2c/numpy-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:83807d445817326b4bcdaaaf8e8e9f1753da04341eceec705c001ff342002e5d", size = 12626357 }, + { url = "https://files.pythonhosted.org/packages/0e/8b/88b98ed534d6a03ba8cddb316950fe80842885709b58501233c29dfa24a9/numpy-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bfdb06b395385ea9b91bf55c1adf1b297c9fdb531552845ff1d3ea6e40d5aba", size = 20916001 }, + { url = "https://files.pythonhosted.org/packages/d9/b4/def6ec32c725cc5fbd8bdf8af80f616acf075fe752d8a23e895da8c67b70/numpy-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:23c9f4edbf4c065fddb10a4f6e8b6a244342d95966a48820c614891e5059bb50", size = 14130721 }, + { url = "https://files.pythonhosted.org/packages/20/60/70af0acc86495b25b672d403e12cb25448d79a2b9658f4fc45e845c397a8/numpy-2.2.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:a0c03b6be48aaf92525cccf393265e02773be8fd9551a2f9adbe7db1fa2b60f1", size = 5130999 }, + { url = "https://files.pythonhosted.org/packages/2e/69/d96c006fb73c9a47bcb3611417cf178049aae159afae47c48bd66df9c536/numpy-2.2.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:2376e317111daa0a6739e50f7ee2a6353f768489102308b0d98fcf4a04f7f3b5", size = 6665299 }, + { url = "https://files.pythonhosted.org/packages/5a/3f/d8a877b6e48103733ac224ffa26b30887dc9944ff95dffdfa6c4ce3d7df3/numpy-2.2.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fb62fe3d206d72fe1cfe31c4a1106ad2b136fcc1606093aeab314f02930fdf2", size = 14064096 }, + { url = "https://files.pythonhosted.org/packages/e4/43/619c2c7a0665aafc80efca465ddb1f260287266bdbdce517396f2f145d49/numpy-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52659ad2534427dffcc36aac76bebdd02b67e3b7a619ac67543bc9bfe6b7cdb1", size = 16114758 }, + { url = "https://files.pythonhosted.org/packages/d9/79/ee4fe4f60967ccd3897aa71ae14cdee9e3c097e3256975cc9575d393cb42/numpy-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b416af7d0ed3271cad0f0a0d0bee0911ed7eba23e66f8424d9f3dfcdcae1304", size = 15259880 }, + { url = "https://files.pythonhosted.org/packages/fb/c8/8b55cf05db6d85b7a7d414b3d1bd5a740706df00bfa0824a08bf041e52ee/numpy-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1402da8e0f435991983d0a9708b779f95a8c98c6b18a171b9f1be09005e64d9d", size = 17876721 }, + { url = "https://files.pythonhosted.org/packages/21/d6/b4c2f0564b7dcc413117b0ffbb818d837e4b29996b9234e38b2025ed24e7/numpy-2.2.3-cp313-cp313-win32.whl", hash = "sha256:136553f123ee2951bfcfbc264acd34a2fc2f29d7cdf610ce7daf672b6fbaa693", size = 6290195 }, + { url = "https://files.pythonhosted.org/packages/97/e7/7d55a86719d0de7a6a597949f3febefb1009435b79ba510ff32f05a8c1d7/numpy-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5b732c8beef1d7bc2d9e476dbba20aaff6167bf205ad9aa8d30913859e82884b", size = 12619013 }, + { url = "https://files.pythonhosted.org/packages/a6/1f/0b863d5528b9048fd486a56e0b97c18bf705e88736c8cea7239012119a54/numpy-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:435e7a933b9fda8126130b046975a968cc2d833b505475e588339e09f7672890", size = 20944621 }, + { url = "https://files.pythonhosted.org/packages/aa/99/b478c384f7a0a2e0736177aafc97dc9152fc036a3fdb13f5a3ab225f1494/numpy-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7678556eeb0152cbd1522b684dcd215250885993dd00adb93679ec3c0e6e091c", size = 14142502 }, + { url = "https://files.pythonhosted.org/packages/fb/61/2d9a694a0f9cd0a839501d362de2a18de75e3004576a3008e56bdd60fcdb/numpy-2.2.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2e8da03bd561504d9b20e7a12340870dfc206c64ea59b4cfee9fceb95070ee94", size = 5176293 }, + { url = "https://files.pythonhosted.org/packages/33/35/51e94011b23e753fa33f891f601e5c1c9a3d515448659b06df9d40c0aa6e/numpy-2.2.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:c9aa4496fd0e17e3843399f533d62857cef5900facf93e735ef65aa4bbc90ef0", size = 6691874 }, + { url = "https://files.pythonhosted.org/packages/ff/cf/06e37619aad98a9d03bd8d65b8e3041c3a639be0f5f6b0a0e2da544538d4/numpy-2.2.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4ca91d61a4bf61b0f2228f24bbfa6a9facd5f8af03759fe2a655c50ae2c6610", size = 14036826 }, + { url = "https://files.pythonhosted.org/packages/0c/93/5d7d19955abd4d6099ef4a8ee006f9ce258166c38af259f9e5558a172e3e/numpy-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:deaa09cd492e24fd9b15296844c0ad1b3c976da7907e1c1ed3a0ad21dded6f76", size = 16096567 }, + { url = "https://files.pythonhosted.org/packages/af/53/d1c599acf7732d81f46a93621dab6aa8daad914b502a7a115b3f17288ab2/numpy-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:246535e2f7496b7ac85deffe932896a3577be7af8fb7eebe7146444680297e9a", size = 15242514 }, + { url = "https://files.pythonhosted.org/packages/53/43/c0f5411c7b3ea90adf341d05ace762dad8cb9819ef26093e27b15dd121ac/numpy-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:daf43a3d1ea699402c5a850e5313680ac355b4adc9770cd5cfc2940e7861f1bf", size = 17872920 }, + { url = "https://files.pythonhosted.org/packages/5b/57/6dbdd45ab277aff62021cafa1e15f9644a52f5b5fc840bc7591b4079fb58/numpy-2.2.3-cp313-cp313t-win32.whl", hash = "sha256:cf802eef1f0134afb81fef94020351be4fe1d6681aadf9c5e862af6602af64ef", size = 6346584 }, + { url = "https://files.pythonhosted.org/packages/97/9b/484f7d04b537d0a1202a5ba81c6f53f1846ae6c63c2127f8df869ed31342/numpy-2.2.3-cp313-cp313t-win_amd64.whl", hash = "sha256:aee2512827ceb6d7f517c8b85aa5d3923afe8fc7a57d028cffcd522f1c6fd082", size = 12706784 }, + { url = "https://files.pythonhosted.org/packages/0a/b5/a7839f5478be8f859cb880f13d90fcfe4b0ec7a9ebaff2bcc30d96760596/numpy-2.2.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3c2ec8a0f51d60f1e9c0c5ab116b7fc104b165ada3f6c58abf881cb2eb16044d", size = 21064244 }, + { url = "https://files.pythonhosted.org/packages/29/e8/5da32ffcaa7a72f7ecd82f90c062140a061eb823cb88e90279424e515cf4/numpy-2.2.3-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:ed2cf9ed4e8ebc3b754d398cba12f24359f018b416c380f577bbae112ca52fc9", size = 6809418 }, + { url = "https://files.pythonhosted.org/packages/a8/a9/68aa7076c7656a7308a0f73d0a2ced8c03f282c9fd98fa7ce21c12634087/numpy-2.2.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39261798d208c3095ae4f7bc8eaeb3481ea8c6e03dc48028057d3cbdbdb8937e", size = 16215461 }, + { url = "https://files.pythonhosted.org/packages/17/7f/d322a4125405920401450118dbdc52e0384026bd669939484670ce8b2ab9/numpy-2.2.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:783145835458e60fa97afac25d511d00a1eca94d4a8f3ace9fe2043003c678e4", size = 12839607 }, ] [[package]] @@ -911,27 +911,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.9.4" +version = "0.9.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c0/17/529e78f49fc6f8076f50d985edd9a2cf011d1dbadb1cdeacc1d12afc1d26/ruff-0.9.4.tar.gz", hash = "sha256:6907ee3529244bb0ed066683e075f09285b38dd5b4039370df6ff06041ca19e7", size = 3599458 } +sdist = { url = "https://files.pythonhosted.org/packages/2a/e1/e265aba384343dd8ddd3083f5e33536cd17e1566c41453a5517b5dd443be/ruff-0.9.6.tar.gz", hash = "sha256:81761592f72b620ec8fa1068a6fd00e98a5ebee342a3642efd84454f3031dca9", size = 3639454 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/f8/3fafb7804d82e0699a122101b5bee5f0d6e17c3a806dcbc527bb7d3f5b7a/ruff-0.9.4-py3-none-linux_armv6l.whl", hash = "sha256:64e73d25b954f71ff100bb70f39f1ee09e880728efb4250c632ceed4e4cdf706", size = 11668400 }, - { url = "https://files.pythonhosted.org/packages/2e/a6/2efa772d335da48a70ab2c6bb41a096c8517ca43c086ea672d51079e3d1f/ruff-0.9.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6ce6743ed64d9afab4fafeaea70d3631b4d4b28b592db21a5c2d1f0ef52934bf", size = 11628395 }, - { url = "https://files.pythonhosted.org/packages/dc/d7/cd822437561082f1c9d7225cc0d0fbb4bad117ad7ac3c41cd5d7f0fa948c/ruff-0.9.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54499fb08408e32b57360f6f9de7157a5fec24ad79cb3f42ef2c3f3f728dfe2b", size = 11090052 }, - { url = "https://files.pythonhosted.org/packages/9e/67/3660d58e893d470abb9a13f679223368ff1684a4ef40f254a0157f51b448/ruff-0.9.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37c892540108314a6f01f105040b5106aeb829fa5fb0561d2dcaf71485021137", size = 11882221 }, - { url = "https://files.pythonhosted.org/packages/79/d1/757559995c8ba5f14dfec4459ef2dd3fcea82ac43bc4e7c7bf47484180c0/ruff-0.9.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de9edf2ce4b9ddf43fd93e20ef635a900e25f622f87ed6e3047a664d0e8f810e", size = 11424862 }, - { url = "https://files.pythonhosted.org/packages/c0/96/7915a7c6877bb734caa6a2af424045baf6419f685632469643dbd8eb2958/ruff-0.9.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87c90c32357c74f11deb7fbb065126d91771b207bf9bfaaee01277ca59b574ec", size = 12626735 }, - { url = "https://files.pythonhosted.org/packages/0e/cc/dadb9b35473d7cb17c7ffe4737b4377aeec519a446ee8514123ff4a26091/ruff-0.9.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:56acd6c694da3695a7461cc55775f3a409c3815ac467279dfa126061d84b314b", size = 13255976 }, - { url = "https://files.pythonhosted.org/packages/5f/c3/ad2dd59d3cabbc12df308cced780f9c14367f0321e7800ca0fe52849da4c/ruff-0.9.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0c93e7d47ed951b9394cf352d6695b31498e68fd5782d6cbc282425655f687a", size = 12752262 }, - { url = "https://files.pythonhosted.org/packages/c7/17/5f1971e54bd71604da6788efd84d66d789362b1105e17e5ccc53bba0289b/ruff-0.9.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d4c8772670aecf037d1bf7a07c39106574d143b26cfe5ed1787d2f31e800214", size = 14401648 }, - { url = "https://files.pythonhosted.org/packages/30/24/6200b13ea611b83260501b6955b764bb320e23b2b75884c60ee7d3f0b68e/ruff-0.9.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfc5f1d7afeda8d5d37660eeca6d389b142d7f2b5a1ab659d9214ebd0e025231", size = 12414702 }, - { url = "https://files.pythonhosted.org/packages/34/cb/f5d50d0c4ecdcc7670e348bd0b11878154bc4617f3fdd1e8ad5297c0d0ba/ruff-0.9.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:faa935fc00ae854d8b638c16a5f1ce881bc3f67446957dd6f2af440a5fc8526b", size = 11859608 }, - { url = "https://files.pythonhosted.org/packages/d6/f4/9c8499ae8426da48363bbb78d081b817b0f64a9305f9b7f87eab2a8fb2c1/ruff-0.9.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a6c634fc6f5a0ceae1ab3e13c58183978185d131a29c425e4eaa9f40afe1e6d6", size = 11485702 }, - { url = "https://files.pythonhosted.org/packages/18/59/30490e483e804ccaa8147dd78c52e44ff96e1c30b5a95d69a63163cdb15b/ruff-0.9.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:433dedf6ddfdec7f1ac7575ec1eb9844fa60c4c8c2f8887a070672b8d353d34c", size = 12067782 }, - { url = "https://files.pythonhosted.org/packages/3d/8c/893fa9551760b2f8eb2a351b603e96f15af167ceaf27e27ad873570bc04c/ruff-0.9.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d612dbd0f3a919a8cc1d12037168bfa536862066808960e0cc901404b77968f0", size = 12483087 }, - { url = "https://files.pythonhosted.org/packages/23/15/f6751c07c21ca10e3f4a51ea495ca975ad936d780c347d9808bcedbd7182/ruff-0.9.4-py3-none-win32.whl", hash = "sha256:db1192ddda2200671f9ef61d9597fcef89d934f5d1705e571a93a67fb13a4402", size = 9852302 }, - { url = "https://files.pythonhosted.org/packages/12/41/2d2d2c6a72e62566f730e49254f602dfed23019c33b5b21ea8f8917315a1/ruff-0.9.4-py3-none-win_amd64.whl", hash = "sha256:05bebf4cdbe3ef75430d26c375773978950bbf4ee3c95ccb5448940dc092408e", size = 10850051 }, - { url = "https://files.pythonhosted.org/packages/c6/e6/3d6ec3bc3d254e7f005c543a661a41c3e788976d0e52a1ada195bd664344/ruff-0.9.4-py3-none-win_arm64.whl", hash = "sha256:585792f1e81509e38ac5123492f8875fbc36f3ede8185af0a26df348e5154f41", size = 10078251 }, + { url = "https://files.pythonhosted.org/packages/76/e3/3d2c022e687e18cf5d93d6bfa2722d46afc64eaa438c7fbbdd603b3597be/ruff-0.9.6-py3-none-linux_armv6l.whl", hash = "sha256:2f218f356dd2d995839f1941322ff021c72a492c470f0b26a34f844c29cdf5ba", size = 11714128 }, + { url = "https://files.pythonhosted.org/packages/e1/22/aff073b70f95c052e5c58153cba735748c9e70107a77d03420d7850710a0/ruff-0.9.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b908ff4df65dad7b251c9968a2e4560836d8f5487c2f0cc238321ed951ea0504", size = 11682539 }, + { url = "https://files.pythonhosted.org/packages/75/a7/f5b7390afd98a7918582a3d256cd3e78ba0a26165a467c1820084587cbf9/ruff-0.9.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b109c0ad2ececf42e75fa99dc4043ff72a357436bb171900714a9ea581ddef83", size = 11132512 }, + { url = "https://files.pythonhosted.org/packages/a6/e3/45de13ef65047fea2e33f7e573d848206e15c715e5cd56095589a7733d04/ruff-0.9.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1de4367cca3dac99bcbd15c161404e849bb0bfd543664db39232648dc00112dc", size = 11929275 }, + { url = "https://files.pythonhosted.org/packages/7d/f2/23d04cd6c43b2e641ab961ade8d0b5edb212ecebd112506188c91f2a6e6c/ruff-0.9.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3ee4d7c2c92ddfdaedf0bf31b2b176fa7aa8950efc454628d477394d35638b", size = 11466502 }, + { url = "https://files.pythonhosted.org/packages/b5/6f/3a8cf166f2d7f1627dd2201e6cbc4cb81f8b7d58099348f0c1ff7b733792/ruff-0.9.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dc1edd1775270e6aa2386119aea692039781429f0be1e0949ea5884e011aa8e", size = 12676364 }, + { url = "https://files.pythonhosted.org/packages/f5/c4/db52e2189983c70114ff2b7e3997e48c8318af44fe83e1ce9517570a50c6/ruff-0.9.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:4a091729086dffa4bd070aa5dab7e39cc6b9d62eb2bef8f3d91172d30d599666", size = 13335518 }, + { url = "https://files.pythonhosted.org/packages/66/44/545f8a4d136830f08f4d24324e7db957c5374bf3a3f7a6c0bc7be4623a37/ruff-0.9.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1bbc6808bf7b15796cef0815e1dfb796fbd383e7dbd4334709642649625e7c5", size = 12823287 }, + { url = "https://files.pythonhosted.org/packages/c5/26/8208ef9ee7431032c143649a9967c3ae1aae4257d95e6f8519f07309aa66/ruff-0.9.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:589d1d9f25b5754ff230dce914a174a7c951a85a4e9270613a2b74231fdac2f5", size = 14592374 }, + { url = "https://files.pythonhosted.org/packages/31/70/e917781e55ff39c5b5208bda384fd397ffd76605e68544d71a7e40944945/ruff-0.9.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc61dd5131742e21103fbbdcad683a8813be0e3c204472d520d9a5021ca8b217", size = 12500173 }, + { url = "https://files.pythonhosted.org/packages/84/f5/e4ddee07660f5a9622a9c2b639afd8f3104988dc4f6ba0b73ffacffa9a8c/ruff-0.9.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5e2d9126161d0357e5c8f30b0bd6168d2c3872372f14481136d13de9937f79b6", size = 11906555 }, + { url = "https://files.pythonhosted.org/packages/f1/2b/6ff2fe383667075eef8656b9892e73dd9b119b5e3add51298628b87f6429/ruff-0.9.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:68660eab1a8e65babb5229a1f97b46e3120923757a68b5413d8561f8a85d4897", size = 11538958 }, + { url = "https://files.pythonhosted.org/packages/3c/db/98e59e90de45d1eb46649151c10a062d5707b5b7f76f64eb1e29edf6ebb1/ruff-0.9.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c4cae6c4cc7b9b4017c71114115db0445b00a16de3bcde0946273e8392856f08", size = 12117247 }, + { url = "https://files.pythonhosted.org/packages/ec/bc/54e38f6d219013a9204a5a2015c09e7a8c36cedcd50a4b01ac69a550b9d9/ruff-0.9.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:19f505b643228b417c1111a2a536424ddde0db4ef9023b9e04a46ed8a1cb4656", size = 12554647 }, + { url = "https://files.pythonhosted.org/packages/a5/7d/7b461ab0e2404293c0627125bb70ac642c2e8d55bf590f6fce85f508f1b2/ruff-0.9.6-py3-none-win32.whl", hash = "sha256:194d8402bceef1b31164909540a597e0d913c0e4952015a5b40e28c146121b5d", size = 9949214 }, + { url = "https://files.pythonhosted.org/packages/ee/30/c3cee10f915ed75a5c29c1e57311282d1a15855551a64795c1b2bbe5cf37/ruff-0.9.6-py3-none-win_amd64.whl", hash = "sha256:03482d5c09d90d4ee3f40d97578423698ad895c87314c4de39ed2af945633caa", size = 10999914 }, + { url = "https://files.pythonhosted.org/packages/e8/a8/d71f44b93e3aa86ae232af1f2126ca7b95c0f515ec135462b3e1f351441c/ruff-0.9.6-py3-none-win_arm64.whl", hash = "sha256:0e2bb706a2be7ddfea4a4af918562fdc1bcb16df255e5fa595bbd800ce322a5a", size = 10177499 }, ] [[package]] diff --git a/libs/text-splitters/pyproject.toml b/libs/text-splitters/pyproject.toml index 0cdbc4a0e71..88b0cf471cb 100644 --- a/libs/text-splitters/pyproject.toml +++ b/libs/text-splitters/pyproject.toml @@ -4,11 +4,9 @@ build-backend = "pdm.backend" [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<4.0,>=3.9" -dependencies = [ - "langchain-core<1.0.0,>=0.3.34", -] +dependencies = ["langchain-core<1.0.0,>=0.3.34"] name = "langchain-text-splitters" version = "0.3.6" description = "LangChain text splitting utilities" @@ -20,20 +18,14 @@ readme = "README.md" repository = "https://github.com/langchain-ai/langchain" [dependency-groups] -lint = [ - "ruff<1.0.0,>=0.9.2", - "langchain-core @ file:///${PROJECT_ROOT}/../core", -] +lint = ["ruff<1.0.0,>=0.9.2", "langchain-core"] typing = [ "mypy<2.0,>=1.10", "lxml-stubs<1.0.0,>=0.5.1", "types-requests<3.0.0.0,>=2.31.0.20240218", "tiktoken<1.0.0,>=0.8.0", ] -dev = [ - "jupyter<2.0.0,>=1.0.0", - "langchain-core @ file:///${PROJECT_ROOT}/../core", -] +dev = ["jupyter<2.0.0,>=1.0.0", "langchain-core"] test = [ "pytest<9,>=8", "freezegun<2.0.0,>=1.2.2", @@ -42,7 +34,7 @@ test = [ "pytest-asyncio<1.0.0,>=0.21.1", "pytest-socket<1.0.0,>=0.7.0", "pytest-xdist<4.0.0,>=3.6.1", - "langchain-core @ file:///${PROJECT_ROOT}/../core", + "langchain-core", ] test_integration = [ "spacy<3.8.4,>=3.0.0; python_version < \"3.10.0\"", @@ -52,6 +44,8 @@ test_integration = [ "sentence-transformers>=2.6.0; python_version < \"3.13\"", ] +[tool.uv.sources] +langchain-core = { path = "../core", editable = true } [tool.mypy] disallow_untyped_defs = "True" diff --git a/libs/text-splitters/uv.lock b/libs/text-splitters/uv.lock index 0ca443c04b4..b29af09463d 100644 --- a/libs/text-splitters/uv.lock +++ b/libs/text-splitters/uv.lock @@ -1079,8 +1079,8 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.34" -source = { directory = "../core" } +version = "0.3.35" +source = { editable = "../core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -1177,20 +1177,20 @@ typing = [ ] [package.metadata] -requires-dist = [{ name = "langchain-core", specifier = ">=0.3.34,<1.0.0" }] +requires-dist = [{ name = "langchain-core", editable = "../core" }] [package.metadata.requires-dev] dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../core" }, ] lint = [ - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../core" }, { name = "ruff", specifier = ">=0.9.2,<1.0.0" }, ] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "../core" }, { name = "pytest", specifier = ">=8,<9" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, diff --git a/pyproject.toml b/pyproject.toml index 7ff4fe448a5..e932562aee6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] authors = [] -license = {text = "MIT"} +license = { text = "MIT" } requires-python = "<4.0,>=3.9" dependencies = [] name = "langchain-monorepo" @@ -12,33 +12,29 @@ readme = "README.md" repository = "https://www.github.com/langchain-ai/langchain" [dependency-groups] -lint = [ - "ruff<1.0.0,>=0.5.0", -] +lint = ["ruff<1.0.0,>=0.5.0"] dev = [ - "langchain-core @ file:///${PROJECT_ROOT}/libs/core", - "langchain-text-splitters @ file:///${PROJECT_ROOT}/libs/text-splitters", - "langchain-community @ file:///${PROJECT_ROOT}/libs/community", - "langchain @ file:///${PROJECT_ROOT}/libs/langchain", - "langchain-openai @ file:///${PROJECT_ROOT}/libs/partners/openai", + "langchain-core", + "langchain-text-splitters", + "langchain-community", + "langchain", + "langchain-openai", "ipykernel<7.0.0,>=6.29.2", ] -codespell = [ - "codespell<3.0.0,>=2.2.0", -] +codespell = ["codespell<3.0.0,>=2.2.0"] typing = [] test = [ "langchain-experimental @ git+https://github.com/langchain-ai/langchain-experimental.git#subdirectory=libs/experimental", - "langchain-anthropic @ file:///${PROJECT_ROOT}/libs/partners/anthropic", + "langchain-anthropic", "langchain-aws @ git+https://github.com/langchain-ai/langchain-aws.git#subdirectory=libs/aws", - "langchain-chroma @ file:///${PROJECT_ROOT}/libs/partners/chroma", - "langchain-fireworks @ file:///${PROJECT_ROOT}/libs/partners/fireworks", + "langchain-chroma", + "langchain-fireworks", "langchain-google-vertexai @ git+https://github.com/langchain-ai/langchain-google.git#subdirectory=libs/vertexai", - "langchain-groq @ file:///${PROJECT_ROOT}/libs/partners/groq", - "langchain-mistralai @ file:///${PROJECT_ROOT}/libs/partners/mistralai", + "langchain-groq", + "langchain-mistralai", "langchain-together @ git+https://github.com/langchain-ai/langchain-together.git#subdirectory=libs/together", "langchain-unstructured @ git+https://github.com/langchain-ai/langchain-unstructured.git#subdirectory=libs/unstructured", - "langgraph @ git+https://github.com/langchain-ai/langgraph.git#subdirectory=libs/langgraph", + "langgraph", "jupyter<2.0.0,>=1.1.1", "click<9.0.0,>=8.1.7", "aiofiles<25.0.0,>=24.1.0", @@ -54,6 +50,20 @@ test = [ "vcrpy<7.0.0,>=6.0.1", ] + +[tool.uv.sources] +langchain-core = { path = "./libs/core", editable = true } +langchain-text-splitters = { path = "./libs/text-splitters", editable = true } +langchain-tests = { path = "./libs/standard-tests", editable = true } +langchain-community = { path = "./libs/community", editable = true } +langchain = { path = "./libs/langchain", editable = true } +langchain-openai = { path = "./libs/partners/openai", editable = true } +langchain-anthropic = { path = "./libs/partners/anthropic", editable = true } +langchain-chroma = { path = "./libs/partners/chroma", editable = true } +langchain-fireworks = { path = "./libs/partners/fireworks", editable = true } +langchain-groq = { path = "./libs/partners/groq", editable = true } +langchain-mistralai = { path = "./libs/partners/mistralai", editable = true } + [build-system] requires = ["pdm-backend"] build-backend = "pdm.backend" @@ -84,9 +94,9 @@ pydocstyle = { convention = "google" } "F401", # allow "imported but unused" example code "F811", # allow re-importing the same module, so that cells can stay independent "F841", # allow assignments to variables that are never read -- it's example code - + ] -"!libs/langchain/langchain/model_laboratory.py"=["D"] +"!libs/langchain/langchain/model_laboratory.py" = ["D"] # These files were failing the listed rules at the time ruff was adopted for notebooks. # Don't require them to change at once, though we should look into them eventually. diff --git a/uv.lock b/uv.lock index 39ebba63719..35bfac1abc1 100644 --- a/uv.lock +++ b/uv.lock @@ -2152,8 +2152,8 @@ wheels = [ [[package]] name = "langchain" -version = "0.3.18rc1" -source = { directory = "libs/langchain" } +version = "0.3.18" +source = { editable = "libs/langchain" } dependencies = [ { name = "aiohttp" }, { name = "async-timeout", marker = "python_full_version < '3.11'" }, @@ -2176,7 +2176,7 @@ requires-dist = [ { name = "langchain-aws", marker = "extra == 'aws'" }, { name = "langchain-cohere", marker = "extra == 'cohere'" }, { name = "langchain-community", marker = "extra == 'community'" }, - { name = "langchain-core", specifier = ">=0.3.33,<1.0.0" }, + { name = "langchain-core", editable = "libs/core" }, { name = "langchain-deepseek", marker = "extra == 'deepseek'" }, { name = "langchain-fireworks", marker = "extra == 'fireworks'" }, { name = "langchain-google-genai", marker = "extra == 'google-genai'" }, @@ -2185,8 +2185,8 @@ requires-dist = [ { name = "langchain-huggingface", marker = "extra == 'huggingface'" }, { name = "langchain-mistralai", marker = "extra == 'mistralai'" }, { name = "langchain-ollama", marker = "extra == 'ollama'" }, - { name = "langchain-openai", marker = "extra == 'openai'" }, - { name = "langchain-text-splitters", specifier = ">=0.3.3,<1.0.0" }, + { name = "langchain-openai", marker = "extra == 'openai'", editable = "libs/partners/openai" }, + { name = "langchain-text-splitters", editable = "libs/text-splitters" }, { name = "langchain-together", marker = "extra == 'together'" }, { name = "langsmith", specifier = ">=0.1.17,<0.4" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.26.4,<2" }, @@ -2202,8 +2202,8 @@ requires-dist = [ codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "libs/core" }, + { name = "langchain-text-splitters", editable = "libs/text-splitters" }, { name = "playwright", specifier = ">=1.28.0,<2.0.0" }, { name = "setuptools", specifier = ">=67.6.1,<68.0.0" }, ] @@ -2213,14 +2213,15 @@ lint = [ { name = "ruff", specifier = ">=0.9.2,<1.0.0" }, ] test = [ + { name = "blockbuster", specifier = ">=1.5.14,<1.6" }, { name = "cffi", marker = "python_full_version < '3.10'", specifier = "<1.17.1" }, { name = "cffi", marker = "python_full_version >= '3.10'" }, { name = "duckdb-engine", specifier = ">=0.9.2,<1.0.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-openai", directory = "../partners/openai" }, - { name = "langchain-tests", directory = "../standard-tests" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "libs/core" }, + { name = "langchain-openai", editable = "libs/partners/openai" }, + { name = "langchain-tests", editable = "libs/standard-tests" }, + { name = "langchain-text-splitters", editable = "libs/text-splitters" }, { name = "lark", specifier = ">=1.1.5,<2.0.0" }, { name = "packaging", specifier = ">=24.2" }, { name = "pandas", specifier = ">=2.0.0,<3.0.0" }, @@ -2239,8 +2240,8 @@ test = [ ] test-integration = [ { name = "cassio", specifier = ">=0.1.0,<1.0.0" }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "libs/core" }, + { name = "langchain-text-splitters", editable = "libs/text-splitters" }, { name = "langchainhub", specifier = ">=0.1.16,<1.0.0" }, { name = "pytest-vcr", specifier = ">=1.0.2,<2.0.0" }, { name = "python-dotenv", specifier = ">=1.0.0,<2.0.0" }, @@ -2248,8 +2249,8 @@ test-integration = [ { name = "wrapt", specifier = ">=1.15.0,<2.0.0" }, ] typing = [ - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain-core", editable = "libs/core" }, + { name = "langchain-text-splitters", editable = "libs/text-splitters" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "mypy-protobuf", specifier = ">=3.0.0,<4.0.0" }, { name = "types-chardet", specifier = ">=5.0.4.6,<6.0.0.0" }, @@ -2262,8 +2263,8 @@ typing = [ [[package]] name = "langchain-anthropic" -version = "0.3.6" -source = { directory = "libs/partners/anthropic" } +version = "0.3.7" +source = { editable = "libs/partners/anthropic" } dependencies = [ { name = "anthropic" }, { name = "langchain-core" }, @@ -2273,19 +2274,19 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "anthropic", specifier = ">=0.45.0,<1" }, - { name = "langchain-core", specifier = ">=0.3.33,<1.0.0" }, + { name = "langchain-core", editable = "libs/core" }, { name = "pydantic", specifier = ">=2.7.4,<3.0.0" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "libs/core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ { name = "defusedxml", specifier = ">=0.7.1,<1.0.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "libs/core" }, + { name = "langchain-tests", editable = "libs/standard-tests" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, @@ -2295,11 +2296,11 @@ test = [ { name = "syrupy", specifier = ">=4.0.2,<5.0.0" }, ] test-integration = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "libs/core" }, { name = "requests", specifier = ">=2.32.3,<3.0.0" }, ] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "libs/core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "types-requests", specifier = ">=2.32.0.20241016,<3.0.0.0" }, ] @@ -2317,8 +2318,8 @@ dependencies = [ [[package]] name = "langchain-chroma" -version = "0.2.1" -source = { directory = "libs/partners/chroma" } +version = "0.2.2" +source = { editable = "libs/partners/chroma" } dependencies = [ { name = "chromadb" }, { name = "langchain-core" }, @@ -2328,17 +2329,14 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "chromadb", specifier = ">=0.4.0,!=0.5.4,!=0.5.5,!=0.5.7,!=0.5.9,!=0.5.10,!=0.5.11,!=0.5.12,<0.7.0" }, - { name = "langchain-core", specifier = ">=0.2.43,!=0.3.0,!=0.3.1,!=0.3.2,!=0.3.3,!=0.3.4,!=0.3.5,!=0.3.6,!=0.3.7,!=0.3.8,!=0.3.9,!=0.3.10,!=0.3.11,!=0.3.12,!=0.3.13,!=0.3.14,<0.4.0" }, + { name = "langchain-core", editable = "libs/core" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.22.4,<2.0.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<2.0.0" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [ - { name = "langchain-core", marker = "python_full_version < '3.9'", specifier = ">=0.1.40,<0.3" }, - { name = "langchain-core", marker = "python_full_version >= '3.9'", directory = "../../core" }, -] +dev = [{ name = "langchain-core", editable = "libs/core" }] lint = [ { name = "onnxruntime", marker = "python_full_version < '3.10'", specifier = "<1.20" }, { name = "onnxruntime", marker = "python_full_version >= '3.10'" }, @@ -2346,9 +2344,8 @@ lint = [ ] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", marker = "python_full_version < '3.9'", specifier = ">=0.1.40,<0.3" }, - { name = "langchain-core", marker = "python_full_version >= '3.9'", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "libs/core" }, + { name = "langchain-tests", editable = "libs/standard-tests" }, { name = "onnxruntime", marker = "python_full_version < '3.10'", specifier = "<1.20" }, { name = "onnxruntime", marker = "python_full_version >= '3.10'" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, @@ -2360,16 +2357,15 @@ test = [ ] test-integration = [] typing = [ - { name = "langchain-core", marker = "python_full_version < '3.9'", specifier = ">=0.1.40,<0.3" }, - { name = "langchain-core", marker = "python_full_version >= '3.9'", directory = "../../core" }, + { name = "langchain-core", editable = "libs/core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "types-requests", specifier = ">=2.31.0.20240406,<3.0.0.0" }, ] [[package]] name = "langchain-community" -version = "0.3.17rc1" -source = { directory = "libs/community" } +version = "0.3.17" +source = { editable = "libs/community" } dependencies = [ { name = "aiohttp" }, { name = "dataclasses-json" }, @@ -2390,8 +2386,8 @@ requires-dist = [ { name = "aiohttp", specifier = ">=3.8.3,<4.0.0" }, { name = "dataclasses-json", specifier = ">=0.5.7,<0.7" }, { name = "httpx-sse", specifier = ">=0.4.0,<1.0.0" }, - { name = "langchain", specifier = ">=0.3.18rc1,<1.0.0" }, - { name = "langchain-core", specifier = ">=0.3.34rc1,<1.0.0" }, + { name = "langchain", editable = "libs/langchain" }, + { name = "langchain-core", editable = "libs/core" }, { name = "langsmith", specifier = ">=0.1.125,<0.4" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.26.4,<2" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, @@ -2406,22 +2402,23 @@ requires-dist = [ codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "libs/core" }, { name = "setuptools", specifier = ">=67.6.1,<68.0.0" }, ] lint = [ { name = "cffi", marker = "python_full_version < '3.10'", specifier = "<1.17.1" }, { name = "cffi", marker = "python_full_version >= '3.10'" }, - { name = "ruff", specifier = ">=0.5,<0.6" }, + { name = "ruff", specifier = ">=0.9,<0.10" }, ] test = [ + { name = "blockbuster", specifier = ">=1.5.13,<1.6" }, { name = "cffi", marker = "python_full_version < '3.10'", specifier = "<1.17.1" }, { name = "cffi", marker = "python_full_version >= '3.10'" }, { name = "duckdb-engine", specifier = ">=0.13.6,<1.0.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain", directory = "." }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-tests", directory = "../standard-tests" }, + { name = "langchain", editable = "libs/langchain" }, + { name = "langchain-core", editable = "libs/core" }, + { name = "langchain-tests", editable = "libs/standard-tests" }, { name = "lark", specifier = ">=1.1.5,<2.0.0" }, { name = "pandas", specifier = ">=2.0.0,<3.0.0" }, { name = "pytest", specifier = ">=7.4.4,<8.0.0" }, @@ -2442,9 +2439,9 @@ test-integration = [ { name = "vcrpy", specifier = ">=6,<7" }, ] typing = [ - { name = "langchain", directory = "." }, - { name = "langchain-core", directory = "../core" }, - { name = "langchain-text-splitters", directory = "../text-splitters" }, + { name = "langchain", editable = "libs/langchain" }, + { name = "langchain-core", editable = "libs/core" }, + { name = "langchain-text-splitters", editable = "libs/text-splitters" }, { name = "mypy", specifier = ">=1.12,<2.0" }, { name = "mypy-protobuf", specifier = ">=3.0.0,<4.0.0" }, { name = "types-chardet", specifier = ">=5.0.4.6,<6.0.0.0" }, @@ -2457,8 +2454,8 @@ typing = [ [[package]] name = "langchain-core" -version = "0.3.34rc1" -source = { directory = "libs/core" } +version = "0.3.35" +source = { editable = "libs/core" } dependencies = [ { name = "jsonpatch" }, { name = "langsmith" }, @@ -2525,7 +2522,7 @@ dependencies = [ [[package]] name = "langchain-fireworks" version = "0.2.7" -source = { directory = "libs/partners/fireworks" } +source = { editable = "libs/partners/fireworks" } dependencies = [ { name = "aiohttp" }, { name = "fireworks-ai" }, @@ -2538,19 +2535,19 @@ dependencies = [ requires-dist = [ { name = "aiohttp", specifier = ">=3.9.1,<4.0.0" }, { name = "fireworks-ai", specifier = ">=0.13.0" }, - { name = "langchain-core", specifier = ">=0.3.33,<1.0.0" }, + { name = "langchain-core", editable = "libs/core" }, { name = "openai", specifier = ">=1.10.0,<2.0.0" }, { name = "requests", specifier = ">=2,<3" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "libs/core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "libs/core" }, + { name = "langchain-tests", editable = "libs/standard-tests" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, @@ -2560,7 +2557,7 @@ test = [ ] test-integration = [] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "libs/core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "types-requests", specifier = ">=2,<3" }, ] @@ -2581,7 +2578,7 @@ dependencies = [ [[package]] name = "langchain-groq" version = "0.2.4" -source = { directory = "libs/partners/groq" } +source = { editable = "libs/partners/groq" } dependencies = [ { name = "groq" }, { name = "langchain-core" }, @@ -2590,31 +2587,31 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "groq", specifier = ">=0.4.1,<1" }, - { name = "langchain-core", specifier = ">=0.3.33,<1.0.0" }, + { name = "langchain-core", editable = "libs/core" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "libs/core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "libs/core" }, + { name = "langchain-tests", editable = "libs/standard-tests" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, { name = "pytest-watcher", specifier = ">=0.3.4,<1.0.0" }, ] -test-integration = [{ name = "langchain-core", directory = "../../core" }] +test-integration = [{ name = "langchain-core", editable = "libs/core" }] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "libs/core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, ] [[package]] name = "langchain-mistralai" version = "0.2.6" -source = { directory = "libs/partners/mistralai" } +source = { editable = "libs/partners/mistralai" } dependencies = [ { name = "httpx" }, { name = "httpx-sse" }, @@ -2627,25 +2624,25 @@ dependencies = [ requires-dist = [ { name = "httpx", specifier = ">=0.25.2,<1" }, { name = "httpx-sse", specifier = ">=0.3.1,<1" }, - { name = "langchain-core", specifier = ">=0.3.33,<1.0.0" }, + { name = "langchain-core", editable = "libs/core" }, { name = "pydantic", specifier = ">=2,<3" }, { name = "tokenizers", specifier = ">=0.15.1,<1" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "libs/core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "libs/core" }, + { name = "langchain-tests", editable = "libs/standard-tests" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-watcher", specifier = ">=0.3.4,<1.0.0" }, ] test-integration = [] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "libs/core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, ] @@ -2702,11 +2699,11 @@ test = [ codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] dev = [ { name = "ipykernel", specifier = ">=6.29.2,<7.0.0" }, - { name = "langchain", directory = "libs/langchain" }, - { name = "langchain-community", directory = "libs/community" }, - { name = "langchain-core", directory = "libs/core" }, - { name = "langchain-openai", directory = "libs/partners/openai" }, - { name = "langchain-text-splitters", directory = "libs/text-splitters" }, + { name = "langchain", editable = "libs/langchain" }, + { name = "langchain-community", editable = "libs/community" }, + { name = "langchain-core", editable = "libs/core" }, + { name = "langchain-openai", editable = "libs/partners/openai" }, + { name = "langchain-text-splitters", editable = "libs/text-splitters" }, ] lint = [{ name = "ruff", specifier = ">=0.5.0,<1.0.0" }] test = [ @@ -2715,17 +2712,17 @@ test = [ { name = "faiss-cpu", specifier = ">=1.7.4,<2.0.0" }, { name = "grandalf", specifier = ">=0.8,<1.0" }, { name = "jupyter", specifier = ">=1.1.1,<2.0.0" }, - { name = "langchain-anthropic", directory = "libs/partners/anthropic" }, + { name = "langchain-anthropic", editable = "libs/partners/anthropic" }, { name = "langchain-aws", git = "https://github.com/langchain-ai/langchain-aws.git?subdirectory=libs%2Faws" }, - { name = "langchain-chroma", directory = "libs/partners/chroma" }, + { name = "langchain-chroma", editable = "libs/partners/chroma" }, { name = "langchain-experimental", git = "https://github.com/langchain-ai/langchain-experimental.git?subdirectory=libs%2Fexperimental" }, - { name = "langchain-fireworks", directory = "libs/partners/fireworks" }, + { name = "langchain-fireworks", editable = "libs/partners/fireworks" }, { name = "langchain-google-vertexai", git = "https://github.com/langchain-ai/langchain-google.git?subdirectory=libs%2Fvertexai" }, - { name = "langchain-groq", directory = "libs/partners/groq" }, - { name = "langchain-mistralai", directory = "libs/partners/mistralai" }, + { name = "langchain-groq", editable = "libs/partners/groq" }, + { name = "langchain-mistralai", editable = "libs/partners/mistralai" }, { name = "langchain-together", git = "https://github.com/langchain-ai/langchain-together.git?subdirectory=libs%2Ftogether" }, { name = "langchain-unstructured", git = "https://github.com/langchain-ai/langchain-unstructured.git?subdirectory=libs%2Funstructured" }, - { name = "langgraph", git = "https://github.com/langchain-ai/langgraph.git?subdirectory=libs%2Flanggraph" }, + { name = "langgraph" }, { name = "lark", specifier = ">=1.1.9,<2.0.0" }, { name = "pandas", specifier = ">=2,<3" }, { name = "pypdf", specifier = ">=5.0.0,<6.0.0" }, @@ -2739,8 +2736,8 @@ typing = [] [[package]] name = "langchain-openai" -version = "0.3.3" -source = { directory = "libs/partners/openai" } +version = "0.3.5" +source = { editable = "libs/partners/openai" } dependencies = [ { name = "langchain-core" }, { name = "openai" }, @@ -2749,19 +2746,19 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "langchain-core", specifier = ">=0.3.33,<1.0.0" }, + { name = "langchain-core", editable = "libs/core" }, { name = "openai", specifier = ">=1.58.1,<2.0.0" }, { name = "tiktoken", specifier = ">=0.7,<1" }, ] [package.metadata.requires-dev] codespell = [{ name = "codespell", specifier = ">=2.2.0,<3.0.0" }] -dev = [{ name = "langchain-core", directory = "../../core" }] +dev = [{ name = "langchain-core", editable = "libs/core" }] lint = [{ name = "ruff", specifier = ">=0.5,<1.0" }] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../../core" }, - { name = "langchain-tests", directory = "../../standard-tests" }, + { name = "langchain-core", editable = "libs/core" }, + { name = "langchain-tests", editable = "libs/standard-tests" }, { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1,<2" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.0,<2.0.0" }, { name = "pytest", specifier = ">=7.3.0,<8.0.0" }, @@ -2780,34 +2777,34 @@ test-integration = [ { name = "pillow", specifier = ">=10.3.0,<11.0.0" }, ] typing = [ - { name = "langchain-core", directory = "../../core" }, + { name = "langchain-core", editable = "libs/core" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "types-tqdm", specifier = ">=4.66.0.5,<5.0.0.0" }, ] [[package]] name = "langchain-text-splitters" -version = "0.3.6rc1" -source = { directory = "libs/text-splitters" } +version = "0.3.6" +source = { editable = "libs/text-splitters" } dependencies = [ { name = "langchain-core" }, ] [package.metadata] -requires-dist = [{ name = "langchain-core", specifier = ">=0.3.34rc1,<1.0.0" }] +requires-dist = [{ name = "langchain-core", editable = "libs/core" }] [package.metadata.requires-dev] dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "libs/core" }, ] lint = [ - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "libs/core" }, { name = "ruff", specifier = ">=0.9.2,<1.0.0" }, ] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, - { name = "langchain-core", directory = "../core" }, + { name = "langchain-core", editable = "libs/core" }, { name = "pytest", specifier = ">=8,<9" }, { name = "pytest-asyncio", specifier = ">=0.21.1,<1.0.0" }, { name = "pytest-mock", specifier = ">=3.10.0,<4.0.0" }, @@ -2862,12 +2859,16 @@ sdist = { url = "https://files.pythonhosted.org/packages/0e/72/a3add0e4eec4eb9e2 [[package]] name = "langgraph" version = "0.2.69" -source = { git = "https://github.com/langchain-ai/langgraph.git?subdirectory=libs%2Flanggraph#04a044374270d1c101a65b0215a4f6ac8a17b17d" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, { name = "langgraph-checkpoint" }, { name = "langgraph-sdk" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/9b/36/d75836c6c1b4a817bb22f591137dc533be02fdba171df4d80eac49e22043/langgraph-0.2.69.tar.gz", hash = "sha256:77bd6efd967b4f092ec31d2148b3e6ba3c31e202b4f3a975dbb082b19b5bb057", size = 128593 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/be/f3489ee7a67bb5bb3dc256b9e95d19a44c31e337f0345a38b443018355e3/langgraph-0.2.69-py3-none-any.whl", hash = "sha256:b64a5755fa2c7f2f67608ff4ce0ef8c168b30a0fb551a6c1d2e19bf1d2268ce4", size = 148716 }, +] [[package]] name = "langgraph-checkpoint" From 49cc6106f7df94c5604b395a9a604862f18ba990 Mon Sep 17 00:00:00 2001 From: ccurme Date: Thu, 13 Feb 2025 15:15:52 -0800 Subject: [PATCH 21/24] tests[patch]: fix query for test_tool_calling_with_no_arguments (#29793) --- .../langchain_tests/integration_tests/chat_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/standard-tests/langchain_tests/integration_tests/chat_models.py b/libs/standard-tests/langchain_tests/integration_tests/chat_models.py index 0b0c6a54046..2e9214d8a21 100644 --- a/libs/standard-tests/langchain_tests/integration_tests/chat_models.py +++ b/libs/standard-tests/langchain_tests/integration_tests/chat_models.py @@ -1122,7 +1122,7 @@ class ChatModelIntegrationTests(ChatModelTests): model_with_tools = model.bind_tools( [magic_function_no_args], tool_choice=tool_choice ) - query = "What is the value of magic_function()? Use the tool." + query = "What is the value of magic_function_no_args()? Use the tool." result = model_with_tools.invoke(query) _validate_tool_call_message_no_args(result) From f34e62ef429dc3917c27041803da19fbe1b8c3ec Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Thu, 13 Feb 2025 15:36:41 -0800 Subject: [PATCH 22/24] packages: add langchain-xai (#29795) wasn't registered per the contribution guide: https://python.langchain.com/docs/contributing/how_to/integrations/ --- libs/packages.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libs/packages.yml b/libs/packages.yml index 602492db21e..c5a9f86f74c 100644 --- a/libs/packages.yml +++ b/libs/packages.yml @@ -343,8 +343,8 @@ packages: downloads_updated_at: '2025-02-13T20:29:06.035211+00:00' - name: langchain-lindorm-integration path: . - provider_page: lindorm repo: AlwaysBluer/langchain-lindorm-integration + provider_page: lindorm downloads: 79 downloads_updated_at: '2025-02-13T20:30:13.814314+00:00' - name: langchain-hyperbrowser @@ -424,3 +424,8 @@ packages: provider_page: graph_rag downloads: 2093 downloads_updated_at: '2025-02-13T20:32:23.744801+00:00' +- name: langchain-xai + path: libs/partners/xai + repo: langchain-ai/langchain + downloads: 9521 + downloads_updated_at: '2025-02-13T23:35:48.490391+00:00' From e4f106ea623598dc0c9856be4a9ebab28a9325e1 Mon Sep 17 00:00:00 2001 From: ccurme Date: Thu, 13 Feb 2025 15:49:50 -0800 Subject: [PATCH 23/24] groq[patch]: remove xfails (#29794) These appear to pass. --- .../integration_tests/test_chat_models.py | 37 ------------------- .../tests/integration_tests/test_standard.py | 23 ------------ 2 files changed, 60 deletions(-) diff --git a/libs/partners/groq/tests/integration_tests/test_chat_models.py b/libs/partners/groq/tests/integration_tests/test_chat_models.py index 9ee5bccca8a..9113c829871 100644 --- a/libs/partners/groq/tests/integration_tests/test_chat_models.py +++ b/libs/partners/groq/tests/integration_tests/test_chat_models.py @@ -13,7 +13,6 @@ from langchain_core.messages import ( SystemMessage, ) from langchain_core.outputs import ChatGeneration, LLMResult -from langchain_core.tools import tool from pydantic import BaseModel, Field from langchain_groq import ChatGroq @@ -394,42 +393,6 @@ def test_json_mode_structured_output() -> None: assert len(result.punchline) != 0 -def test_tool_calling_no_arguments() -> None: - # Note: this is a variant of a test in langchain_tests - # that as of 2024-08-19 fails with "Failed to call a function. Please - # adjust your prompt." when `tool_choice="any"` is specified, but - # passes when `tool_choice` is not specified. - model = ChatGroq(model="llama-3.3-70b-versatile", temperature=0) # type: ignore[call-arg] - - @tool - def magic_function_no_args() -> int: - """Calculates a magic function.""" - return 5 - - model_with_tools = model.bind_tools([magic_function_no_args]) - query = "What is the value of magic_function()? Use the tool." - result = model_with_tools.invoke(query) - assert isinstance(result, AIMessage) - assert len(result.tool_calls) == 1 - tool_call = result.tool_calls[0] - assert tool_call["name"] == "magic_function_no_args" - assert tool_call["args"] == {} - assert tool_call["id"] is not None - assert tool_call["type"] == "tool_call" - - # Test streaming - full: Optional[BaseMessageChunk] = None - for chunk in model_with_tools.stream(query): - full = chunk if full is None else full + chunk # type: ignore - assert isinstance(full, AIMessage) - assert len(full.tool_calls) == 1 - tool_call = full.tool_calls[0] - assert tool_call["name"] == "magic_function_no_args" - assert tool_call["args"] == {} - assert tool_call["id"] is not None - assert tool_call["type"] == "tool_call" - - # Groq does not currently support N > 1 # @pytest.mark.scheduled # def test_chat_multiple_completions() -> None: diff --git a/libs/partners/groq/tests/integration_tests/test_standard.py b/libs/partners/groq/tests/integration_tests/test_standard.py index b62982e4ec9..fe91a614dd7 100644 --- a/libs/partners/groq/tests/integration_tests/test_standard.py +++ b/libs/partners/groq/tests/integration_tests/test_standard.py @@ -48,26 +48,3 @@ class TestGroqLlama(BaseTestGroq): @property def supports_json_mode(self) -> bool: return False # Not supported in streaming mode - - @pytest.mark.xfail( - reason=("Fails with 'Failed to call a function. Please adjust your prompt.'") - ) - def test_tool_calling_with_no_arguments(self, model: BaseChatModel) -> None: - super().test_tool_calling_with_no_arguments(model) - - @pytest.mark.xfail( - reason=("Fails with 'Failed to call a function. Please adjust your prompt.'") - ) - def test_tool_message_histories_string_content( - self, model: BaseChatModel, my_adder_tool: BaseTool - ) -> None: - super().test_tool_message_histories_string_content(model, my_adder_tool) - - @pytest.mark.xfail( - reason=( - "Sometimes fails with 'Failed to call a function. " - "Please adjust your prompt.'" - ) - ) - def test_bind_runnables_as_tools(self, model: BaseChatModel) -> None: - super().test_bind_runnables_as_tools(model) From d9a069c414a321e7a3f3638a32ecf8a37ec2d188 Mon Sep 17 00:00:00 2001 From: ccurme Date: Thu, 13 Feb 2025 15:57:44 -0800 Subject: [PATCH 24/24] tests[patch]: release 0.3.12 (#29797) --- libs/standard-tests/pyproject.toml | 4 ++-- libs/standard-tests/uv.lock | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/standard-tests/pyproject.toml b/libs/standard-tests/pyproject.toml index 7e4e7eb711b..9cdb2f5e7fe 100644 --- a/libs/standard-tests/pyproject.toml +++ b/libs/standard-tests/pyproject.toml @@ -7,7 +7,7 @@ authors = [{ name = "Erick Friis", email = "erick@langchain.dev" }] license = { text = "MIT" } requires-python = "<4.0,>=3.9" dependencies = [ - "langchain-core<1.0.0,>=0.3.34", + "langchain-core<1.0.0,>=0.3.35", "pytest<9,>=7", "pytest-asyncio<1,>=0.20", "httpx<1,>=0.25.0", @@ -17,7 +17,7 @@ dependencies = [ "numpy<3,>=1.26.2; python_version >= \"3.12\"", ] name = "langchain-tests" -version = "0.3.11" +version = "0.3.12" description = "Standard tests for LangChain implementations" readme = "README.md" diff --git a/libs/standard-tests/uv.lock b/libs/standard-tests/uv.lock index 335c8af6922..e3e94d33dd3 100644 --- a/libs/standard-tests/uv.lock +++ b/libs/standard-tests/uv.lock @@ -345,7 +345,7 @@ typing = [ [[package]] name = "langchain-tests" -version = "0.3.11" +version = "0.3.12" source = { editable = "." } dependencies = [ { name = "httpx" },