mirror of
https://github.com/langchain-ai/langgraph.git
synced 2026-10-14 04:05:27 +02:00
Compare commits
39
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f26ca07716 | ||
|
|
b250823532 | ||
|
|
120d34303d | ||
|
|
6ff9e4a764 | ||
|
|
3c36d2e2c8 | ||
|
|
f6d0382d66 | ||
|
|
0386fe5f6a | ||
|
|
b11ece823b | ||
|
|
46ce6ad927 | ||
|
|
0c929e62eb | ||
|
|
88c434048f | ||
|
|
f67a089a68 | ||
|
|
cc97fad7e5 | ||
|
|
75c73369a3 | ||
|
|
fdbcc07381 | ||
|
|
80e19ecf4d | ||
|
|
54272afe01 | ||
|
|
e1aeb24a4e | ||
|
|
a51c0bfa31 | ||
|
|
d73902ae76 | ||
|
|
501ba8be34 | ||
|
|
998e194e82 | ||
|
|
ef65d3cf88 | ||
|
|
a692e24a58 | ||
|
|
a566f1f892 | ||
|
|
c0b29a6df5 | ||
|
|
a86eb4c5d0 | ||
|
|
3488eb2a2c | ||
|
|
875f20ba9f | ||
|
|
723d4641b0 | ||
|
|
ae62b8faf2 | ||
|
|
9918488169 | ||
|
|
c37c9cbab3 | ||
|
|
0cd8745aad | ||
|
|
33d13c6f52 | ||
|
|
054e2759ca | ||
|
|
23b71048c1 | ||
|
|
a15f542a1f | ||
|
|
d43eaf1f42 |
@@ -1,10 +1,15 @@
|
|||||||
import ast
|
import ast
|
||||||
import os
|
import os
|
||||||
from itertools import filterfalse
|
from itertools import filterfalse
|
||||||
from typing import List, Tuple
|
from typing import Dict, List, Tuple
|
||||||
|
|
||||||
ROOT_PATH = os.path.abspath(os.path.join(__file__, "..", "..", ".."))
|
ROOT_PATH = os.path.abspath(os.path.join(__file__, "..", "..", ".."))
|
||||||
CLIENT_PATH = os.path.join(ROOT_PATH, "libs", "sdk-py", "langgraph_sdk", "client.py")
|
CLIENT_PATH = os.path.join(ROOT_PATH, "libs", "sdk-py", "langgraph_sdk", "client.py")
|
||||||
|
ASYNC_TO_SYNC_METHOD_MAP: Dict[str, str] = {
|
||||||
|
"aclose": "close",
|
||||||
|
"__aenter__": "__enter__",
|
||||||
|
"__aexit__": "__exit__",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def get_class_methods(node: ast.ClassDef) -> List[str]:
|
def get_class_methods(node: ast.ClassDef) -> List[str]:
|
||||||
@@ -22,7 +27,7 @@ def find_classes(tree: ast.AST) -> List[Tuple[str, List[str]]]:
|
|||||||
|
|
||||||
def compare_sync_async_methods(sync_methods: List[str], async_methods: List[str]) -> List[str]:
|
def compare_sync_async_methods(sync_methods: List[str], async_methods: List[str]) -> List[str]:
|
||||||
sync_set = set(sync_methods)
|
sync_set = set(sync_methods)
|
||||||
async_set = set(async_methods)
|
async_set = {ASYNC_TO_SYNC_METHOD_MAP.get(async_method, async_method) for async_method in async_methods}
|
||||||
missing_in_sync = list(async_set - sync_set)
|
missing_in_sync = list(async_set - sync_set)
|
||||||
missing_in_async = list(sync_set - async_set)
|
missing_in_async = list(sync_set - async_set)
|
||||||
return missing_in_sync + missing_in_async
|
return missing_in_sync + missing_in_async
|
||||||
|
|||||||
@@ -1,107 +1,145 @@
|
|||||||
import asyncio
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import pathlib
|
import pathlib
|
||||||
import sys
|
import sys
|
||||||
import langgraph_cli
|
import time
|
||||||
import langgraph_cli.docker
|
from urllib import request, error
|
||||||
import langgraph_cli.config
|
|
||||||
|
|
||||||
|
import langgraph_cli
|
||||||
|
import langgraph_cli.config
|
||||||
|
import langgraph_cli.docker
|
||||||
|
from langgraph_cli.cli import prepare_args_and_stdin
|
||||||
|
from langgraph_cli.constants import DEFAULT_PORT
|
||||||
from langgraph_cli.exec import Runner, subp_exec
|
from langgraph_cli.exec import Runner, subp_exec
|
||||||
from langgraph_cli.progress import Progress
|
from langgraph_cli.progress import Progress
|
||||||
from langgraph_cli.constants import DEFAULT_PORT
|
|
||||||
|
|
||||||
|
|
||||||
def test(
|
def test(config: pathlib.Path, port: int, tag: str, verbose: bool):
|
||||||
config: pathlib.Path,
|
"""Spin up API with Postgres/Redis via docker compose and wait until ready."""
|
||||||
port: int,
|
|
||||||
tag: str,
|
|
||||||
verbose: bool,
|
|
||||||
):
|
|
||||||
with Runner() as runner, Progress(message="Pulling...") as set:
|
with Runner() as runner, Progress(message="Pulling...") as set:
|
||||||
# check docker available
|
# Detect docker/compose capabilities
|
||||||
capabilities = langgraph_cli.docker.check_capabilities(runner)
|
capabilities = langgraph_cli.docker.check_capabilities(runner)
|
||||||
# open config
|
|
||||||
|
# Validate config and prepare compose stdin/args using built image
|
||||||
config_json = langgraph_cli.config.validate_config_file(config)
|
config_json = langgraph_cli.config.validate_config_file(config)
|
||||||
|
args, stdin = prepare_args_and_stdin(
|
||||||
|
capabilities=capabilities,
|
||||||
|
config_path=config,
|
||||||
|
config=config_json,
|
||||||
|
docker_compose=None,
|
||||||
|
port=port,
|
||||||
|
watch=False,
|
||||||
|
debugger_port=None,
|
||||||
|
debugger_base_url=f"http://127.0.0.1:{port}",
|
||||||
|
postgres_uri=None,
|
||||||
|
api_version=None,
|
||||||
|
image=tag,
|
||||||
|
base_image=None,
|
||||||
|
)
|
||||||
|
|
||||||
set("Running...")
|
# Compose up with wait (implies detach), similar to `langgraph up --wait`
|
||||||
args = [
|
args_up = [*args, "up", "--remove-orphans", "--wait"]
|
||||||
"run",
|
|
||||||
"--rm",
|
|
||||||
"-p",
|
|
||||||
f"{port}:8000",
|
|
||||||
]
|
|
||||||
if isinstance(config_json["env"], str):
|
|
||||||
args.extend(
|
|
||||||
[
|
|
||||||
"--env-file",
|
|
||||||
str(config.parent / config_json["env"]),
|
|
||||||
]
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
for k, v in config_json["env"].items():
|
|
||||||
args.extend(
|
|
||||||
[
|
|
||||||
"-e",
|
|
||||||
f"{k}={v}",
|
|
||||||
]
|
|
||||||
)
|
|
||||||
if capabilities.healthcheck_start_interval:
|
|
||||||
args.extend(
|
|
||||||
[
|
|
||||||
"--health-interval",
|
|
||||||
"5s",
|
|
||||||
"--health-retries",
|
|
||||||
"1",
|
|
||||||
"--health-start-period",
|
|
||||||
"10s",
|
|
||||||
"--health-start-interval",
|
|
||||||
"1s",
|
|
||||||
]
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
args.extend(
|
|
||||||
[
|
|
||||||
"--health-interval",
|
|
||||||
"5s",
|
|
||||||
"--health-retries",
|
|
||||||
"2",
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
_task = None
|
compose_cmd = ["docker", "compose"]
|
||||||
|
if capabilities.compose_type == "standalone":
|
||||||
def on_stdout(line: str):
|
compose_cmd = ["docker-compose"]
|
||||||
nonlocal _task
|
|
||||||
if "GET /ok" in line or "Uvicorn running on" in line:
|
|
||||||
set("")
|
|
||||||
sys.stdout.write(
|
|
||||||
f"""Ready!
|
|
||||||
- API: http://localhost:{port}
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
sys.stdout.flush()
|
|
||||||
_task.cancel()
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def subp_exec_task(*args, **kwargs):
|
|
||||||
nonlocal _task
|
|
||||||
_task = asyncio.create_task(subp_exec(*args, **kwargs))
|
|
||||||
await _task
|
|
||||||
|
|
||||||
|
set("Starting...")
|
||||||
try:
|
try:
|
||||||
runner.run(
|
runner.run(
|
||||||
subp_exec_task(
|
subp_exec(
|
||||||
"docker",
|
*compose_cmd,
|
||||||
*args,
|
*args_up,
|
||||||
tag,
|
input=stdin,
|
||||||
verbose=verbose,
|
verbose=verbose,
|
||||||
on_stdout=on_stdout,
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
except asyncio.CancelledError:
|
except Exception as e: # noqa: BLE001
|
||||||
pass
|
# On failure, show diagnostics then ensure clean teardown
|
||||||
|
sys.stderr.write(f"docker compose up failed: {e}\n")
|
||||||
|
try:
|
||||||
|
sys.stderr.write("\n== docker compose ps ==\n")
|
||||||
|
runner.run(subp_exec(*compose_cmd, *args, "ps", input=stdin, verbose=False))
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
sys.stderr.write("\n== docker compose logs (api) ==\n")
|
||||||
|
runner.run(
|
||||||
|
subp_exec(
|
||||||
|
*compose_cmd,
|
||||||
|
*args,
|
||||||
|
"logs",
|
||||||
|
"langgraph-api",
|
||||||
|
input=stdin,
|
||||||
|
verbose=False,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
finally:
|
||||||
|
try:
|
||||||
|
runner.run(
|
||||||
|
subp_exec(
|
||||||
|
*compose_cmd,
|
||||||
|
*args,
|
||||||
|
"down",
|
||||||
|
"-v",
|
||||||
|
"--remove-orphans",
|
||||||
|
input=stdin,
|
||||||
|
verbose=False,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
finally:
|
||||||
|
raise
|
||||||
|
|
||||||
|
set("")
|
||||||
|
base_url = f"http://localhost:{port}"
|
||||||
|
ok_url = f"{base_url}/ok"
|
||||||
|
print(f"Waiting for {ok_url} to respond with 200...")
|
||||||
|
deadline = time.time() + 30
|
||||||
|
last_err: Exception | None = None
|
||||||
|
while time.time() < deadline:
|
||||||
|
try:
|
||||||
|
with request.urlopen(ok_url, timeout=2) as resp:
|
||||||
|
if resp.status == 200:
|
||||||
|
sys.stdout.write(
|
||||||
|
f"""Ready!\n- API: {base_url}\n- /ok: 200 OK\n"""
|
||||||
|
)
|
||||||
|
sys.stdout.flush()
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
last_err = RuntimeError(f"Unexpected status: {resp.status}")
|
||||||
|
print(f"Unexpected status: {resp.status}")
|
||||||
|
except error.URLError as e:
|
||||||
|
last_err = e
|
||||||
|
except Exception as e: # noqa: BLE001
|
||||||
|
last_err = e
|
||||||
|
time.sleep(0.5)
|
||||||
|
else:
|
||||||
|
# Bring stack down before raising
|
||||||
|
args_down = [*args, "down", "-v", "--remove-orphans"]
|
||||||
|
try:
|
||||||
|
runner.run(
|
||||||
|
subp_exec(
|
||||||
|
*compose_cmd,
|
||||||
|
*args_down,
|
||||||
|
input=stdin,
|
||||||
|
verbose=verbose,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
finally:
|
||||||
|
raise SystemExit(
|
||||||
|
f"/ok did not return 202 within timeout. Last error: {last_err}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Clean up: bring compose stack down to free ports for next test
|
||||||
|
args_down = [*args, "down", "-v", "--remove-orphans"]
|
||||||
|
runner.run(
|
||||||
|
subp_exec(
|
||||||
|
*compose_cmd,
|
||||||
|
*args_down,
|
||||||
|
input=stdin,
|
||||||
|
verbose=verbose,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
@@ -110,6 +148,6 @@ if __name__ == "__main__":
|
|||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument("-t", "--tag", type=str)
|
parser.add_argument("-t", "--tag", type=str)
|
||||||
parser.add_argument("-c", "--config", type=str, default="./langgraph.json")
|
parser.add_argument("-c", "--config", type=str, default="./langgraph.json")
|
||||||
parser.add_argument("-p", "--port", default=DEFAULT_PORT)
|
parser.add_argument("-p", "--port", type=int, default=DEFAULT_PORT)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
test(pathlib.Path(args.config), args.port, args.tag, verbose=True)
|
test(pathlib.Path(args.config), args.port, args.tag, verbose=True)
|
||||||
|
|||||||
@@ -43,28 +43,43 @@ jobs:
|
|||||||
- name: Build and test service A
|
- name: Build and test service A
|
||||||
if: steps.changed-files.outputs.all
|
if: steps.changed-files.outputs.all
|
||||||
working-directory: libs/cli/examples
|
working-directory: libs/cli/examples
|
||||||
|
env:
|
||||||
|
LANGSMITH_API_KEY: ${{ secrets.LANGSMITH_API_KEY }}
|
||||||
run: |
|
run: |
|
||||||
# The build-arg isn't used; just testing that we accept other args
|
# The build-arg isn't used; just testing that we accept other args
|
||||||
langgraph build -t langgraph-test-a --base-image "langchain/langgraph-trial"
|
langgraph build -t langgraph-test-a
|
||||||
cp .env.example .envg
|
cp .env.example .env
|
||||||
|
if [ -n "${{ secrets.LANGSMITH_API_KEY }}" ]; then echo "LANGSMITH_API_KEY=${{ secrets.LANGSMITH_API_KEY }}" >> .env; fi
|
||||||
timeout 60 python ../../../.github/scripts/run_langgraph_cli_test.py -c langgraph.json -t langgraph-test-a
|
timeout 60 python ../../../.github/scripts/run_langgraph_cli_test.py -c langgraph.json -t langgraph-test-a
|
||||||
- name: Build and test service B
|
- name: Build and test service B
|
||||||
if: steps.changed-files.outputs.all
|
if: steps.changed-files.outputs.all
|
||||||
working-directory: libs/cli/examples/graphs
|
working-directory: libs/cli/examples/graphs
|
||||||
|
env:
|
||||||
|
LANGSMITH_API_KEY: ${{ secrets.LANGSMITH_API_KEY }}
|
||||||
run: |
|
run: |
|
||||||
langgraph build -t langgraph-test-b --base-image "langchain/langgraph-trial"
|
langgraph build -t langgraph-test-b
|
||||||
|
cp ../.env.example .env
|
||||||
|
if [ -n "${{ secrets.LANGSMITH_API_KEY }}" ]; then echo "LANGSMITH_API_KEY=${{ secrets.LANGSMITH_API_KEY }}" >> .env; fi
|
||||||
timeout 60 python ../../../../.github/scripts/run_langgraph_cli_test.py -t langgraph-test-b
|
timeout 60 python ../../../../.github/scripts/run_langgraph_cli_test.py -t langgraph-test-b
|
||||||
- name: Build and test service C
|
- name: Build and test service C
|
||||||
if: steps.changed-files.outputs.all
|
if: steps.changed-files.outputs.all
|
||||||
working-directory: libs/cli/examples/graphs_reqs_a
|
working-directory: libs/cli/examples/graphs_reqs_a
|
||||||
|
env:
|
||||||
|
LANGSMITH_API_KEY: ${{ secrets.LANGSMITH_API_KEY }}
|
||||||
run: |
|
run: |
|
||||||
langgraph build -t langgraph-test-c --base-image "langchain/langgraph-trial"
|
langgraph build -t langgraph-test-c
|
||||||
|
cp ../.env.example .env
|
||||||
|
if [ -n "${{ secrets.LANGSMITH_API_KEY }}" ]; then echo "LANGSMITH_API_KEY=${{ secrets.LANGSMITH_API_KEY }}" >> .env; fi
|
||||||
timeout 60 python ../../../../.github/scripts/run_langgraph_cli_test.py -t langgraph-test-c
|
timeout 60 python ../../../../.github/scripts/run_langgraph_cli_test.py -t langgraph-test-c
|
||||||
- name: Build and test service D
|
- name: Build and test service D
|
||||||
if: steps.changed-files.outputs.all
|
if: steps.changed-files.outputs.all
|
||||||
working-directory: libs/cli/examples/graphs_reqs_b
|
working-directory: libs/cli/examples/graphs_reqs_b
|
||||||
|
env:
|
||||||
|
LANGSMITH_API_KEY: ${{ secrets.LANGSMITH_API_KEY }}
|
||||||
run: |
|
run: |
|
||||||
langgraph build -t langgraph-test-d --base-image "langchain/langgraph-trial"
|
langgraph build -t langgraph-test-d
|
||||||
|
cp ../.env.example .env
|
||||||
|
if [ -n "${{ secrets.LANGSMITH_API_KEY }}" ]; then echo "LANGSMITH_API_KEY=${{ secrets.LANGSMITH_API_KEY }}" >> .env; fi
|
||||||
timeout 60 python ../../../../.github/scripts/run_langgraph_cli_test.py -t langgraph-test-d
|
timeout 60 python ../../../../.github/scripts/run_langgraph_cli_test.py -t langgraph-test-d
|
||||||
|
|
||||||
- name: Build JS service
|
- name: Build JS service
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ jobs:
|
|||||||
"libs/checkpoint-sqlite",
|
"libs/checkpoint-sqlite",
|
||||||
"libs/checkpoint-postgres",
|
"libs/checkpoint-postgres",
|
||||||
"libs/prebuilt",
|
"libs/prebuilt",
|
||||||
|
"libs/sdk-py",
|
||||||
]
|
]
|
||||||
if: needs.changes.outputs.python == 'true' || needs.changes.outputs.deps == 'true'
|
if: needs.changes.outputs.python == 'true' || needs.changes.outputs.deps == 'true'
|
||||||
uses: ./.github/workflows/_test.yml
|
uses: ./.github/workflows/_test.yml
|
||||||
|
|||||||
@@ -62,7 +62,13 @@ jobs:
|
|||||||
working-directory: ${{ inputs.working-directory }}
|
working-directory: ${{ inputs.working-directory }}
|
||||||
run: |
|
run: |
|
||||||
PKG_NAME=$(grep -m 1 "^name = " pyproject.toml | cut -d '"' -f 2)
|
PKG_NAME=$(grep -m 1 "^name = " pyproject.toml | cut -d '"' -f 2)
|
||||||
VERSION=$(grep -m 1 "^version = " pyproject.toml | cut -d '"' -f 2)
|
if grep -q 'dynamic.*=.*\[.*"version".*\]' pyproject.toml; then
|
||||||
|
# handle dynamic versioning
|
||||||
|
DIR_NAME=$(echo "$PKG_NAME" | tr '-' '_')
|
||||||
|
VERSION=$(grep -m 1 '^__version__' "${DIR_NAME}/__init__.py" | cut -d '"' -f 2)
|
||||||
|
else
|
||||||
|
VERSION=$(grep -m 1 "^version = " pyproject.toml | cut -d '"' -f 2)
|
||||||
|
fi
|
||||||
SHORT_PKG_NAME="$(echo "$PKG_NAME" | sed -e 's/langgraph//g' -e 's/-//g')"
|
SHORT_PKG_NAME="$(echo "$PKG_NAME" | sed -e 's/langgraph//g' -e 's/-//g')"
|
||||||
if [ -z $SHORT_PKG_NAME ]; then
|
if [ -z $SHORT_PKG_NAME ]; then
|
||||||
TAG="$VERSION"
|
TAG="$VERSION"
|
||||||
|
|||||||
@@ -190,11 +190,11 @@ REDIRECT_MAP = {
|
|||||||
"concepts/langgraph_cloud.md": "https://docs.langchain.com/langgraph-platform/cloud",
|
"concepts/langgraph_cloud.md": "https://docs.langchain.com/langgraph-platform/cloud",
|
||||||
"concepts/langgraph_self_hosted_data_plane.md": "https://docs.langchain.com/langgraph-platform/hybrid",
|
"concepts/langgraph_self_hosted_data_plane.md": "https://docs.langchain.com/langgraph-platform/hybrid",
|
||||||
"concepts/langgraph_self_hosted_control_plane.md": "https://docs.langchain.com/langgraph-platform/self-hosted",
|
"concepts/langgraph_self_hosted_control_plane.md": "https://docs.langchain.com/langgraph-platform/self-hosted",
|
||||||
"concepts/langgraph_standalone_container.md": "https://docs.langchain.com/langgraph-platform/self-hosted#data-plane-only",
|
"concepts/langgraph_standalone_container.md": "https://docs.langchain.com/langgraph-platform/self-hosted#standalone-server",
|
||||||
"cloud/deployment/cloud.md": "https://docs.langchain.com/langgraph-platform/cloud",
|
"cloud/deployment/cloud.md": "https://docs.langchain.com/langgraph-platform/cloud",
|
||||||
"cloud/deployment/self_hosted_data_plane.md": "https://docs.langchain.com/langgraph-platform/deploy-hybrid",
|
"cloud/deployment/self_hosted_data_plane.md": "https://docs.langchain.com/langgraph-platform/deploy-hybrid",
|
||||||
"cloud/deployment/self_hosted_control_plane.md": "https://docs.langchain.com/langgraph-platform/deploy-self-hosted-full-platform",
|
"cloud/deployment/self_hosted_control_plane.md": "https://docs.langchain.com/langgraph-platform/deploy-self-hosted-full-platform",
|
||||||
"cloud/deployment/standalone_container.md": "https://docs.langchain.com/langgraph-platform/deploy-data-plane-only",
|
"cloud/deployment/standalone_container.md": "https://docs.langchain.com/langgraph-platform/deploy-standalone-server",
|
||||||
"concepts/server-mcp.md": "https://docs.langchain.com/langgraph-platform/server-mcp",
|
"concepts/server-mcp.md": "https://docs.langchain.com/langgraph-platform/server-mcp",
|
||||||
"cloud/how-tos/human_in_the_loop_time_travel.md": "https://docs.langchain.com/langgraph-platform/human-in-the-loop-time-travel",
|
"cloud/how-tos/human_in_the_loop_time_travel.md": "https://docs.langchain.com/langgraph-platform/human-in-the-loop-time-travel",
|
||||||
"cloud/how-tos/add-human-in-the-loop.md": "https://docs.langchain.com/langgraph-platform/add-human-in-the-loop",
|
"cloud/how-tos/add-human-in-the-loop.md": "https://docs.langchain.com/langgraph-platform/add-human-in-the-loop",
|
||||||
|
|||||||
@@ -367,13 +367,13 @@ To implement handoffs with `createReactAgent`, you need to:
|
|||||||
|
|
||||||
3. Define a parent graph that contains individual agents as nodes:
|
3. Define a parent graph that contains individual agents as nodes:
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
import { StateGraph, MessagesZodState } from "@langchain/langgraph";
|
import { StateGraph, MessagesZodState } from "@langchain/langgraph";
|
||||||
const multiAgentGraph = new StateGraph(MessagesZodState)
|
const multiAgentGraph = new StateGraph(MessagesZodState)
|
||||||
.addNode("flight_assistant", flightAssistant)
|
.addNode("flight_assistant", flightAssistant)
|
||||||
.addNode("hotel_assistant", hotelAssistant)
|
.addNode("hotel_assistant", hotelAssistant)
|
||||||
// ...
|
// ...
|
||||||
```
|
```
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
@@ -619,7 +619,8 @@ for await (const chunk of multiAgentGraph.stream({
|
|||||||
3. Name of the agent or node to hand off to.
|
3. Name of the agent or node to hand off to.
|
||||||
4. Take the agent's messages and **add** them to the parent's **state** as part of the handoff. The next agent will see the parent state.
|
4. Take the agent's messages and **add** them to the parent's **state** as part of the handoff. The next agent will see the parent state.
|
||||||
5. Indicate to LangGraph that we need to navigate to agent node in a **parent** multi-agent graph.
|
5. Indicate to LangGraph that we need to navigate to agent node in a **parent** multi-agent graph.
|
||||||
:::
|
|
||||||
|
:::
|
||||||
|
|
||||||
!!! Note
|
!!! Note
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,14 @@
|
|||||||
{
|
{
|
||||||
"name": "Store",
|
"name": "Store",
|
||||||
"description": "Store is an API for managing persistent key-value store (long-term memory) that is available from any thread."
|
"description": "Store is an API for managing persistent key-value store (long-term memory) that is available from any thread."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "MCP",
|
||||||
|
"description": "Model Context Protocol related endpoints for exposing an agent as an MCP server."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "System",
|
||||||
|
"description": "System endpoints for health checks, metrics, and server information."
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"paths": {
|
"paths": {
|
||||||
@@ -149,6 +157,59 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"/assistants/count": {
|
||||||
|
"post": {
|
||||||
|
"tags": [
|
||||||
|
"Assistants"
|
||||||
|
],
|
||||||
|
"summary": "Count Assistants",
|
||||||
|
"description": "Get the count of assistants matching the specified criteria.",
|
||||||
|
"operationId": "count_assistants_assistants_count_post",
|
||||||
|
"requestBody": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/AssistantCountRequest"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Success",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"type": "integer",
|
||||||
|
"title": "Count"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"description": "Not Found",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/ErrorResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"422": {
|
||||||
|
"description": "Validation Error",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/ErrorResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"/assistants/{assistant_id}": {
|
"/assistants/{assistant_id}": {
|
||||||
"get": {
|
"get": {
|
||||||
"tags": [
|
"tags": [
|
||||||
@@ -805,6 +866,59 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"/threads/count": {
|
||||||
|
"post": {
|
||||||
|
"tags": [
|
||||||
|
"Threads"
|
||||||
|
],
|
||||||
|
"summary": "Count Threads",
|
||||||
|
"description": "Get the count of threads matching the specified criteria.",
|
||||||
|
"operationId": "count_threads_threads_count_post",
|
||||||
|
"requestBody": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/ThreadCountRequest"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Success",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"type": "integer",
|
||||||
|
"title": "Count"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"description": "Not Found",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/ErrorResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"422": {
|
||||||
|
"description": "Validation Error",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/ErrorResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"/threads/{thread_id}/state": {
|
"/threads/{thread_id}/state": {
|
||||||
"get": {
|
"get": {
|
||||||
"tags": [
|
"tags": [
|
||||||
@@ -1461,6 +1575,30 @@
|
|||||||
},
|
},
|
||||||
"name": "status",
|
"name": "status",
|
||||||
"in": "query"
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"required": false,
|
||||||
|
"schema": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"run_id",
|
||||||
|
"thread_id",
|
||||||
|
"assistant_id",
|
||||||
|
"created_at",
|
||||||
|
"updated_at",
|
||||||
|
"status",
|
||||||
|
"metadata",
|
||||||
|
"kwargs",
|
||||||
|
"multitask_strategy"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"title": "Select",
|
||||||
|
"description": "Specify which fields to return. If not provided, all fields are returned."
|
||||||
|
},
|
||||||
|
"name": "select",
|
||||||
|
"in": "query"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"responses": {
|
"responses": {
|
||||||
@@ -2312,6 +2450,59 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"/runs/crons/count": {
|
||||||
|
"post": {
|
||||||
|
"tags": [
|
||||||
|
"Crons (Plus tier)"
|
||||||
|
],
|
||||||
|
"summary": "Count Crons",
|
||||||
|
"description": "Get the count of crons matching the specified criteria.",
|
||||||
|
"operationId": "count_crons_runs_crons_count_post",
|
||||||
|
"requestBody": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/CronCountRequest"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Success",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"type": "integer",
|
||||||
|
"title": "Count"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"description": "Not Found",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/ErrorResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"422": {
|
||||||
|
"description": "Validation Error",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/ErrorResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"/runs/stream": {
|
"/runs/stream": {
|
||||||
"post": {
|
"post": {
|
||||||
"tags": [
|
"tags": [
|
||||||
@@ -2996,6 +3187,153 @@
|
|||||||
"MCP"
|
"MCP"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"/info": {
|
||||||
|
"get": {
|
||||||
|
"tags": [
|
||||||
|
"System"
|
||||||
|
],
|
||||||
|
"summary": "Server Information",
|
||||||
|
"description": "Get server version information, feature flags, and metadata.",
|
||||||
|
"operationId": "server_info_info_get",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Success",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"version": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "Version",
|
||||||
|
"description": "LangGraph API version"
|
||||||
|
},
|
||||||
|
"langgraph_py_version": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "LangGraph Python Version",
|
||||||
|
"description": "LangGraph Python library version"
|
||||||
|
},
|
||||||
|
"flags": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Feature Flags",
|
||||||
|
"description": "Enabled features and capabilities"
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Metadata",
|
||||||
|
"description": "Server deployment metadata"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["version", "langgraph_py_version", "flags", "metadata"],
|
||||||
|
"title": "ServerInfo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/metrics": {
|
||||||
|
"get": {
|
||||||
|
"tags": [
|
||||||
|
"System"
|
||||||
|
],
|
||||||
|
"summary": "System Metrics",
|
||||||
|
"description": "Get system metrics in Prometheus or JSON format for monitoring and observability.",
|
||||||
|
"operationId": "system_metrics_metrics_get",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "format",
|
||||||
|
"in": "query",
|
||||||
|
"required": false,
|
||||||
|
"schema": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["prometheus", "json"],
|
||||||
|
"default": "prometheus",
|
||||||
|
"title": "Output Format",
|
||||||
|
"description": "Response format: prometheus (default) or json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Success",
|
||||||
|
"content": {
|
||||||
|
"text/plain": {
|
||||||
|
"schema": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "Prometheus Metrics",
|
||||||
|
"description": "Metrics in Prometheus exposition format"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "JSON Metrics",
|
||||||
|
"description": "Metrics in JSON format including queue stats, worker stats, and HTTP metrics"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/ok": {
|
||||||
|
"get": {
|
||||||
|
"tags": [
|
||||||
|
"System"
|
||||||
|
],
|
||||||
|
"summary": "Health Check",
|
||||||
|
"description": "Check the health status of the server. Optionally check database connectivity.",
|
||||||
|
"operationId": "health_check_ok_get",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "check_db",
|
||||||
|
"in": "query",
|
||||||
|
"required": false,
|
||||||
|
"schema": {
|
||||||
|
"type": "integer",
|
||||||
|
"enum": [0, 1],
|
||||||
|
"default": 0,
|
||||||
|
"title": "Check Database",
|
||||||
|
"description": "Whether to check database connectivity (0=false, 1=true)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Success",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"ok": {
|
||||||
|
"type": "boolean",
|
||||||
|
"const": true,
|
||||||
|
"title": "OK",
|
||||||
|
"description": "Indicates the server is healthy"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["ok"],
|
||||||
|
"title": "HealthResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"500": {
|
||||||
|
"description": "Internal Server Error",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/ErrorResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"components": {
|
"components": {
|
||||||
@@ -3035,6 +3373,11 @@
|
|||||||
"title": "Config",
|
"title": "Config",
|
||||||
"description": "The assistant config."
|
"description": "The assistant config."
|
||||||
},
|
},
|
||||||
|
"context": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Context",
|
||||||
|
"description": "Static context added to the assistant."
|
||||||
|
},
|
||||||
"created_at": {
|
"created_at": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "date-time",
|
"format": "date-time",
|
||||||
@@ -3100,6 +3443,11 @@
|
|||||||
"title": "Config",
|
"title": "Config",
|
||||||
"description": "Configuration to use for the graph. Useful when graph is configurable and you want to create different assistants based on different configurations."
|
"description": "Configuration to use for the graph. Useful when graph is configurable and you want to create different assistants based on different configurations."
|
||||||
},
|
},
|
||||||
|
"context": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Context",
|
||||||
|
"description": "Static context added to the assistant."
|
||||||
|
},
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"title": "Metadata",
|
"title": "Metadata",
|
||||||
@@ -3148,6 +3496,11 @@
|
|||||||
"title": "Config",
|
"title": "Config",
|
||||||
"description": "Configuration to use for the graph. Useful when graph is configurable and you want to update the assistant's configuration."
|
"description": "Configuration to use for the graph. Useful when graph is configurable and you want to update the assistant's configuration."
|
||||||
},
|
},
|
||||||
|
"context": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Context",
|
||||||
|
"description": "Static context added to the assistant."
|
||||||
|
},
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"title": "Metadata",
|
"title": "Metadata",
|
||||||
@@ -3209,6 +3562,12 @@
|
|||||||
"title": "Cron Id",
|
"title": "Cron Id",
|
||||||
"description": "The ID of the cron."
|
"description": "The ID of the cron."
|
||||||
},
|
},
|
||||||
|
"assistant_id": {
|
||||||
|
"type": ["string", "null"],
|
||||||
|
"format": "uuid",
|
||||||
|
"title": "Assistant Id",
|
||||||
|
"description": "The ID of the assistant."
|
||||||
|
},
|
||||||
"thread_id": {
|
"thread_id": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "uuid",
|
"format": "uuid",
|
||||||
@@ -3238,10 +3597,26 @@
|
|||||||
"title": "Updated At",
|
"title": "Updated At",
|
||||||
"description": "The last time the cron was updated."
|
"description": "The last time the cron was updated."
|
||||||
},
|
},
|
||||||
|
"user_id": {
|
||||||
|
"type": ["string", "null"],
|
||||||
|
"title": "User Id",
|
||||||
|
"description": "The ID of the user."
|
||||||
|
},
|
||||||
"payload": {
|
"payload": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"title": "Payload",
|
"title": "Payload",
|
||||||
"description": "The run payload to use for creating new run."
|
"description": "The run payload to use for creating new run."
|
||||||
|
},
|
||||||
|
"next_run_date": {
|
||||||
|
"type": ["string", "null"],
|
||||||
|
"format": "date-time",
|
||||||
|
"title": "Next Run Date",
|
||||||
|
"description": "The next run date of the cron."
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Metadata",
|
||||||
|
"description": "The cron metadata."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"type": "object",
|
"type": "object",
|
||||||
@@ -3326,6 +3701,11 @@
|
|||||||
"title": "Config",
|
"title": "Config",
|
||||||
"description": "The configuration for the assistant."
|
"description": "The configuration for the assistant."
|
||||||
},
|
},
|
||||||
|
"context": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Context",
|
||||||
|
"description": "Static context added to the assistant."
|
||||||
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"maxLength": 65536,
|
"maxLength": 65536,
|
||||||
@@ -3380,7 +3760,7 @@
|
|||||||
],
|
],
|
||||||
"title": "Multitask Strategy",
|
"title": "Multitask Strategy",
|
||||||
"description": "Multitask strategy to use. Must be one of 'reject', 'interrupt', 'rollback', or 'enqueue'.",
|
"description": "Multitask strategy to use. Must be one of 'reject', 'interrupt', 'rollback', or 'enqueue'.",
|
||||||
"default": "reject"
|
"default": "enqueue"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"type": "object",
|
"type": "object",
|
||||||
@@ -3397,7 +3777,7 @@
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "uuid",
|
"format": "uuid",
|
||||||
"title": "Assistant Id",
|
"title": "Assistant Id",
|
||||||
"description": "The assistant ID or graph name to search for."
|
"description": "The assistant ID or graph name to filter by using exact match."
|
||||||
},
|
},
|
||||||
"thread_id": {
|
"thread_id": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
@@ -3433,6 +3813,28 @@
|
|||||||
"description": "The order to sort by.",
|
"description": "The order to sort by.",
|
||||||
"default": "desc",
|
"default": "desc",
|
||||||
"enum": ["asc", "desc"]
|
"enum": ["asc", "desc"]
|
||||||
|
},
|
||||||
|
"select": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"cron_id",
|
||||||
|
"assistant_id",
|
||||||
|
"thread_id",
|
||||||
|
"end_time",
|
||||||
|
"schedule",
|
||||||
|
"created_at",
|
||||||
|
"updated_at",
|
||||||
|
"user_id",
|
||||||
|
"payload",
|
||||||
|
"next_run_date",
|
||||||
|
"metadata",
|
||||||
|
"now"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"title": "Select",
|
||||||
|
"description": "Specify which fields to return. If not provided, all fields are returned."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"type": "object",
|
"type": "object",
|
||||||
@@ -3440,6 +3842,25 @@
|
|||||||
"title": "CronSearch",
|
"title": "CronSearch",
|
||||||
"description": "Payload for listing crons"
|
"description": "Payload for listing crons"
|
||||||
},
|
},
|
||||||
|
"CronCountRequest": {
|
||||||
|
"properties": {
|
||||||
|
"assistant_id": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uuid",
|
||||||
|
"title": "Assistant Id",
|
||||||
|
"description": "The assistant ID or graph name to search for."
|
||||||
|
},
|
||||||
|
"thread_id": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uuid",
|
||||||
|
"title": "Thread Id",
|
||||||
|
"description": "The thread ID to search for."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object",
|
||||||
|
"title": "CronCountRequest",
|
||||||
|
"description": "Payload for counting crons"
|
||||||
|
},
|
||||||
"GraphSchema": {
|
"GraphSchema": {
|
||||||
"properties": {
|
"properties": {
|
||||||
"graph_id": {
|
"graph_id": {
|
||||||
@@ -3466,13 +3887,17 @@
|
|||||||
"type": "object",
|
"type": "object",
|
||||||
"title": "Config Schema",
|
"title": "Config Schema",
|
||||||
"description": "The schema for the graph config. Missing if unable to generate JSON schema from graph."
|
"description": "The schema for the graph config. Missing if unable to generate JSON schema from graph."
|
||||||
|
},
|
||||||
|
"context_schema": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Context Schema",
|
||||||
|
"description": "The schema for the graph context. Missing if unable to generate JSON schema from graph."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"required": [
|
"required": [
|
||||||
"graph_id",
|
"graph_id",
|
||||||
"state_schema",
|
"state_schema"
|
||||||
"config_schema"
|
|
||||||
],
|
],
|
||||||
"title": "GraphSchema",
|
"title": "GraphSchema",
|
||||||
"description": "Defines the structure and properties of a graph."
|
"description": "Defines the structure and properties of a graph."
|
||||||
@@ -3498,14 +3923,18 @@
|
|||||||
"type": "object",
|
"type": "object",
|
||||||
"title": "Config Schema",
|
"title": "Config Schema",
|
||||||
"description": "The schema for the graph config. Missing if unable to generate JSON schema from graph."
|
"description": "The schema for the graph config. Missing if unable to generate JSON schema from graph."
|
||||||
|
},
|
||||||
|
"context_schema": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Context Schema",
|
||||||
|
"description": "The schema for the graph context. Missing if unable to generate JSON schema from graph."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"required": [
|
"required": [
|
||||||
"input_schema",
|
"input_schema",
|
||||||
"output_schema",
|
"output_schema",
|
||||||
"state_schema",
|
"state_schema"
|
||||||
"config_schema"
|
|
||||||
],
|
],
|
||||||
"title": "GraphSchemaNoId",
|
"title": "GraphSchemaNoId",
|
||||||
"description": "Defines the structure and properties of a graph without an ID."
|
"description": "Defines the structure and properties of a graph without an ID."
|
||||||
@@ -3516,7 +3945,7 @@
|
|||||||
"$ref": "#/components/schemas/GraphSchemaNoId"
|
"$ref": "#/components/schemas/GraphSchemaNoId"
|
||||||
},
|
},
|
||||||
"title": "Subgraphs",
|
"title": "Subgraphs",
|
||||||
"description": "Map of graph name to graph schema metadata (`input_schema`, `output_schema`, `state_schema`, `config_schema`)."
|
"description": "Map of graph name to graph schema metadata (`input_schema`, `output_schema`, `state_schema`, `config_schema`, `context_schema`)."
|
||||||
},
|
},
|
||||||
"Run": {
|
"Run": {
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -3766,6 +4195,11 @@
|
|||||||
"title": "Config",
|
"title": "Config",
|
||||||
"description": "The configuration for the assistant."
|
"description": "The configuration for the assistant."
|
||||||
},
|
},
|
||||||
|
"context": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Context",
|
||||||
|
"description": "Static context added to the assistant."
|
||||||
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"maxLength": 65536,
|
"maxLength": 65536,
|
||||||
@@ -3819,6 +4253,8 @@
|
|||||||
"values",
|
"values",
|
||||||
"messages",
|
"messages",
|
||||||
"messages-tuple",
|
"messages-tuple",
|
||||||
|
"tasks",
|
||||||
|
"checkpoints",
|
||||||
"updates",
|
"updates",
|
||||||
"events",
|
"events",
|
||||||
"debug",
|
"debug",
|
||||||
@@ -3833,6 +4269,8 @@
|
|||||||
"values",
|
"values",
|
||||||
"messages",
|
"messages",
|
||||||
"messages-tuple",
|
"messages-tuple",
|
||||||
|
"tasks",
|
||||||
|
"checkpoints",
|
||||||
"updates",
|
"updates",
|
||||||
"events",
|
"events",
|
||||||
"debug",
|
"debug",
|
||||||
@@ -3886,7 +4324,7 @@
|
|||||||
],
|
],
|
||||||
"title": "Multitask Strategy",
|
"title": "Multitask Strategy",
|
||||||
"description": "Multitask strategy to use. Must be one of 'reject', 'interrupt', 'rollback', or 'enqueue'.",
|
"description": "Multitask strategy to use. Must be one of 'reject', 'interrupt', 'rollback', or 'enqueue'.",
|
||||||
"default": "reject"
|
"default": "enqueue"
|
||||||
},
|
},
|
||||||
"if_not_exists": {
|
"if_not_exists": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
@@ -4005,6 +4443,11 @@
|
|||||||
"title": "Config",
|
"title": "Config",
|
||||||
"description": "The configuration for the assistant."
|
"description": "The configuration for the assistant."
|
||||||
},
|
},
|
||||||
|
"context": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Context",
|
||||||
|
"description": "Static context added to the assistant."
|
||||||
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"maxLength": 65536,
|
"maxLength": 65536,
|
||||||
@@ -4058,6 +4501,8 @@
|
|||||||
"values",
|
"values",
|
||||||
"messages",
|
"messages",
|
||||||
"messages-tuple",
|
"messages-tuple",
|
||||||
|
"tasks",
|
||||||
|
"checkpoints",
|
||||||
"updates",
|
"updates",
|
||||||
"events",
|
"events",
|
||||||
"debug",
|
"debug",
|
||||||
@@ -4072,6 +4517,8 @@
|
|||||||
"values",
|
"values",
|
||||||
"messages",
|
"messages",
|
||||||
"messages-tuple",
|
"messages-tuple",
|
||||||
|
"tasks",
|
||||||
|
"checkpoints",
|
||||||
"updates",
|
"updates",
|
||||||
"events",
|
"events",
|
||||||
"debug",
|
"debug",
|
||||||
@@ -4191,12 +4638,49 @@
|
|||||||
],
|
],
|
||||||
"title": "Sort Order",
|
"title": "Sort Order",
|
||||||
"description": "The order to sort by."
|
"description": "The order to sort by."
|
||||||
|
},
|
||||||
|
"select": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"assistant_id",
|
||||||
|
"graph_id",
|
||||||
|
"name",
|
||||||
|
"description",
|
||||||
|
"config",
|
||||||
|
"context",
|
||||||
|
"created_at",
|
||||||
|
"updated_at",
|
||||||
|
"metadata",
|
||||||
|
"version"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"title": "Select",
|
||||||
|
"description": "Specify which fields to return. If not provided, all fields are returned."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"title": "AssistantSearchRequest",
|
"title": "AssistantSearchRequest",
|
||||||
"description": "Payload for listing assistants."
|
"description": "Payload for listing assistants."
|
||||||
},
|
},
|
||||||
|
"AssistantCountRequest": {
|
||||||
|
"properties": {
|
||||||
|
"metadata": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Metadata",
|
||||||
|
"description": "Metadata to filter by. Exact match filter for each KV pair."
|
||||||
|
},
|
||||||
|
"graph_id": {
|
||||||
|
"type": "string",
|
||||||
|
"title": "Graph Id",
|
||||||
|
"description": "The ID of the graph to filter by. The graph ID is normally set in your langgraph.json configuration."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object",
|
||||||
|
"title": "AssistantCountRequest",
|
||||||
|
"description": "Payload for counting assistants."
|
||||||
|
},
|
||||||
"AssistantVersionsSearchRequest": {
|
"AssistantVersionsSearchRequest": {
|
||||||
"properties": {
|
"properties": {
|
||||||
"metadata": {
|
"metadata": {
|
||||||
@@ -4281,12 +4765,59 @@
|
|||||||
],
|
],
|
||||||
"title": "Sort Order",
|
"title": "Sort Order",
|
||||||
"description": "Sort order."
|
"description": "Sort order."
|
||||||
|
},
|
||||||
|
"select": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"thread_id",
|
||||||
|
"created_at",
|
||||||
|
"updated_at",
|
||||||
|
"metadata",
|
||||||
|
"config",
|
||||||
|
"context",
|
||||||
|
"status",
|
||||||
|
"values",
|
||||||
|
"interrupts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"title": "Select",
|
||||||
|
"description": "Specify which fields to return. If not provided, all fields are returned."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"title": "ThreadSearchRequest",
|
"title": "ThreadSearchRequest",
|
||||||
"description": "Payload for listing threads."
|
"description": "Payload for listing threads."
|
||||||
},
|
},
|
||||||
|
"ThreadCountRequest": {
|
||||||
|
"properties": {
|
||||||
|
"metadata": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Metadata",
|
||||||
|
"description": "Thread metadata to filter on."
|
||||||
|
},
|
||||||
|
"values": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Values",
|
||||||
|
"description": "State values to filter on."
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"idle",
|
||||||
|
"busy",
|
||||||
|
"interrupted",
|
||||||
|
"error"
|
||||||
|
],
|
||||||
|
"title": "Status",
|
||||||
|
"description": "Thread status to filter on."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object",
|
||||||
|
"title": "ThreadCountRequest",
|
||||||
|
"description": "Payload for counting threads."
|
||||||
|
},
|
||||||
"Thread": {
|
"Thread": {
|
||||||
"properties": {
|
"properties": {
|
||||||
"thread_id": {
|
"thread_id": {
|
||||||
@@ -4312,6 +4843,11 @@
|
|||||||
"title": "Metadata",
|
"title": "Metadata",
|
||||||
"description": "The thread metadata."
|
"description": "The thread metadata."
|
||||||
},
|
},
|
||||||
|
"config": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Config",
|
||||||
|
"description": "The thread config."
|
||||||
|
},
|
||||||
"status": {
|
"status": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"enum": [
|
||||||
@@ -4327,6 +4863,11 @@
|
|||||||
"type": "object",
|
"type": "object",
|
||||||
"title": "Values",
|
"title": "Values",
|
||||||
"description": "The current state of the thread."
|
"description": "The current state of the thread."
|
||||||
|
},
|
||||||
|
"interrupts": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "Interrupts",
|
||||||
|
"description": "The current interrupts of the thread."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"type": "object",
|
"type": "object",
|
||||||
@@ -4476,7 +5017,9 @@
|
|||||||
},
|
},
|
||||||
"interrupts": {
|
"interrupts": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {}
|
"items": {
|
||||||
|
"$ref": "#/components/schemas/Interrupt"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"checkpoint": {
|
"checkpoint": {
|
||||||
"$ref": "#/components/schemas/CheckpointConfig",
|
"$ref": "#/components/schemas/CheckpointConfig",
|
||||||
@@ -4509,6 +5052,12 @@
|
|||||||
"parent_checkpoint": {
|
"parent_checkpoint": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"title": "Parent Checkpoint"
|
"title": "Parent Checkpoint"
|
||||||
|
},
|
||||||
|
"interrupts": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/components/schemas/Interrupt"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"type": "object",
|
"type": "object",
|
||||||
@@ -4527,7 +5076,7 @@
|
|||||||
"type": "integer",
|
"type": "integer",
|
||||||
"title": "Limit",
|
"title": "Limit",
|
||||||
"description": "The maximum number of states to return.",
|
"description": "The maximum number of states to return.",
|
||||||
"default": 10,
|
"default": 1,
|
||||||
"maximum": 1000,
|
"maximum": 1000,
|
||||||
"minimum": 1
|
"minimum": 1
|
||||||
},
|
},
|
||||||
@@ -4954,6 +5503,24 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"Interrupt": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"id": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"value": {
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"title": "Interrupt",
|
||||||
|
"required": [
|
||||||
|
"value"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,14 @@
|
|||||||
|
|
||||||
Install the `langchain-mcp-adapters` library to use MCP tools in LangGraph:
|
Install the `langchain-mcp-adapters` library to use MCP tools in LangGraph:
|
||||||
|
|
||||||
|
:::python
|
||||||
```bash
|
```bash
|
||||||
pip install langchain-mcp-adapters
|
pip install langchain-mcp-adapters
|
||||||
```
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
```bash
|
||||||
|
npm install @langchain/mcp-adapters
|
||||||
|
```
|
||||||
|
:::
|
||||||
@@ -315,7 +315,8 @@ In our example, the output of `get_state_history` will look like this:
|
|||||||
tasks=(),
|
tasks=(),
|
||||||
),
|
),
|
||||||
StateSnapshot(
|
StateSnapshot(
|
||||||
values={'foo': 'a', 'bar': ['a']}, next=('node_b',),
|
values={'foo': 'a', 'bar': ['a']},
|
||||||
|
next=('node_b',),
|
||||||
config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1ef663ba-28f9-6ec4-8001-31981c2c39f8'}},
|
config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1ef663ba-28f9-6ec4-8001-31981c2c39f8'}},
|
||||||
metadata={'source': 'loop', 'writes': {'node_a': {'foo': 'a', 'bar': ['a']}}, 'step': 1},
|
metadata={'source': 'loop', 'writes': {'node_a': {'foo': 'a', 'bar': ['a']}}, 'step': 1},
|
||||||
created_at='2024-08-29T19:19:38.819946+00:00',
|
created_at='2024-08-29T19:19:38.819946+00:00',
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ There are three different plans for using it.
|
|||||||
|
|
||||||
- **Developer**: All [LangSmith](https://smith.langchain.com/) users have access to this plan. You can sign up for this plan simply by creating a LangSmith account. This gives you access to the [local deployment](./deployment_options.md#free-deployment) option.
|
- **Developer**: All [LangSmith](https://smith.langchain.com/) users have access to this plan. You can sign up for this plan simply by creating a LangSmith account. This gives you access to the [local deployment](./deployment_options.md#free-deployment) option.
|
||||||
- **Plus**: All [LangSmith](https://smith.langchain.com/) users with a [Plus account](https://docs.smith.langchain.com/administration/pricing) have access to this plan. You can sign up for this plan simply by upgrading your LangSmith account to the Plus plan type. This gives you access to the [Cloud](./deployment_options.md#cloud-saas) deployment option.
|
- **Plus**: All [LangSmith](https://smith.langchain.com/) users with a [Plus account](https://docs.smith.langchain.com/administration/pricing) have access to this plan. You can sign up for this plan simply by upgrading your LangSmith account to the Plus plan type. This gives you access to the [Cloud](./deployment_options.md#cloud-saas) deployment option.
|
||||||
- **Enterprise**: This is separate from LangSmith plans. You can sign up for this plan by contacting sales@langchain.dev. This gives you access to all [deployment options](./deployment_options.md).
|
- **Enterprise**: This is separate from LangSmith plans. You can sign up for this plan by [contacting our sales team](https://www.langchain.com/contact-sales). This gives you access to all [deployment options](./deployment_options.md).
|
||||||
|
|
||||||
|
|
||||||
## Plan Details
|
## Plan Details
|
||||||
|
|||||||
+1411
-9
File diff suppressed because it is too large
Load Diff
@@ -22,6 +22,7 @@ To set up communication between the agents in a multi-agent system you can use [
|
|||||||
|
|
||||||
To implement handoffs, you can return `Command` objects from your agent nodes or tools:
|
To implement handoffs, you can return `Command` objects from your agent nodes or tools:
|
||||||
|
|
||||||
|
:::python
|
||||||
```python
|
```python
|
||||||
from typing import Annotated
|
from typing import Annotated
|
||||||
from langchain_core.tools import tool, InjectedToolCallId
|
from langchain_core.tools import tool, InjectedToolCallId
|
||||||
@@ -73,25 +74,109 @@ def create_handoff_tool(*, agent_name: str, description: str | None = None):
|
|||||||
commands = [tools_by_name[tool_call["name"]].invoke(tool_call) for tool_call in tool_calls]
|
commands = [tools_by_name[tool_call["name"]].invoke(tool_call) for tool_call in tool_calls]
|
||||||
return commands
|
return commands
|
||||||
```
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
```typescript
|
||||||
|
import { tool } from "@langchain/core/tools";
|
||||||
|
import { Command, MessagesZodState } from "@langchain/langgraph";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
function createHandoffTool({
|
||||||
|
agentName,
|
||||||
|
description,
|
||||||
|
}: {
|
||||||
|
agentName: string;
|
||||||
|
description?: string;
|
||||||
|
}) {
|
||||||
|
const name = `transfer_to_${agentName}`;
|
||||||
|
const toolDescription = description || `Transfer to ${agentName}`;
|
||||||
|
|
||||||
|
return tool(
|
||||||
|
async (_, config) => {
|
||||||
|
// (1)!
|
||||||
|
const state = config.state;
|
||||||
|
const toolCallId = config.toolCall.id;
|
||||||
|
|
||||||
|
const toolMessage = {
|
||||||
|
role: "tool" as const,
|
||||||
|
content: `Successfully transferred to ${agentName}`,
|
||||||
|
name: name,
|
||||||
|
tool_call_id: toolCallId,
|
||||||
|
};
|
||||||
|
|
||||||
|
return new Command({
|
||||||
|
// (3)!
|
||||||
|
goto: agentName,
|
||||||
|
// (4)!
|
||||||
|
update: { messages: [...state.messages, toolMessage] },
|
||||||
|
// (5)!
|
||||||
|
graph: Command.PARENT,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name,
|
||||||
|
description: toolDescription,
|
||||||
|
schema: z.object({}),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Access the [state](../concepts/low_level.md#state) of the agent that is calling the handoff tool through the `config` parameter.
|
||||||
|
2. The `Command` primitive allows specifying a state update and a node transition as a single operation, making it useful for implementing handoffs.
|
||||||
|
3. Name of the agent or node to hand off to.
|
||||||
|
4. Take the agent's messages and **add** them to the parent's **state** as part of the handoff. The next agent will see the parent state.
|
||||||
|
5. Indicate to LangGraph that we need to navigate to agent node in a **parent** multi-agent graph.
|
||||||
|
|
||||||
|
!!! tip
|
||||||
|
|
||||||
|
If you want to use tools that return `Command`, you can either use prebuilt @[`create_react_agent`][create_react_agent] / @[`ToolNode`][ToolNode] components, or implement your own tool-executing node that collects `Command` objects returned by the tools and returns a list of them, e.g.:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const callTools = async (state) => {
|
||||||
|
// ...
|
||||||
|
const commands = await Promise.all(
|
||||||
|
toolCalls.map(toolCall => toolsByName[toolCall.name].invoke(toolCall))
|
||||||
|
);
|
||||||
|
return commands;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
!!! Important
|
!!! Important
|
||||||
|
|
||||||
This handoff implementation assumes that:
|
This handoff implementation assumes that:
|
||||||
|
|
||||||
- each agent receives overall message history (across all agents) in the multi-agent system as its input. If you want more control over agent inputs, see [this section](#control-agent-inputs)
|
- each agent receives overall message history (across all agents) in the multi-agent system as its input. If you want more control over agent inputs, see [this section](#control-agent-inputs)
|
||||||
- each agent outputs its internal messages history to the overall message history of the multi-agent system. If you want more control over **how agent outputs are added**, wrap the agent in a separate node function:
|
- each agent outputs its internal messages history to the overall message history of the multi-agent system. If you want more control over **how agent outputs are added**, wrap the agent in a separate node function:
|
||||||
|
|
||||||
```python
|
:::python
|
||||||
def call_hotel_assistant(state):
|
```python
|
||||||
# return agent's final response,
|
def call_hotel_assistant(state):
|
||||||
# excluding inner monologue
|
# return agent's final response,
|
||||||
response = hotel_assistant.invoke(state)
|
# excluding inner monologue
|
||||||
# highlight-next-line
|
response = hotel_assistant.invoke(state)
|
||||||
return {"messages": response["messages"][-1]}
|
# highlight-next-line
|
||||||
```
|
return {"messages": response["messages"][-1]}
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
```typescript
|
||||||
|
const callHotelAssistant = async (state) => {
|
||||||
|
// return agent's final response,
|
||||||
|
// excluding inner monologue
|
||||||
|
const response = await hotelAssistant.invoke(state);
|
||||||
|
// highlight-next-line
|
||||||
|
return { messages: [response.messages.at(-1)] };
|
||||||
|
};
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
### Control agent inputs
|
### Control agent inputs
|
||||||
|
|
||||||
|
:::python
|
||||||
You can use the @[`Send()`][Send] primitive to directly send data to the worker agents during the handoff. For example, you can request that the calling agent populate a task description for the next agent:
|
You can use the @[`Send()`][Send] primitive to directly send data to the worker agents during the handoff. For example, you can request that the calling agent populate a task description for the next agent:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
@@ -129,6 +214,63 @@ def create_task_description_handoff_tool(
|
|||||||
|
|
||||||
return handoff_tool
|
return handoff_tool
|
||||||
```
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
You can use the @[`Send()`][Send] primitive to directly send data to the worker agents during the handoff. For example, you can request that the calling agent populate a task description for the next agent:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { tool } from "@langchain/core/tools";
|
||||||
|
import { Command, Send, MessagesZodState } from "@langchain/langgraph";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
function createTaskDescriptionHandoffTool({
|
||||||
|
agentName,
|
||||||
|
description,
|
||||||
|
}: {
|
||||||
|
agentName: string;
|
||||||
|
description?: string;
|
||||||
|
}) {
|
||||||
|
const name = `transfer_to_${agentName}`;
|
||||||
|
const toolDescription = description || `Ask ${agentName} for help.`;
|
||||||
|
|
||||||
|
return tool(
|
||||||
|
async (
|
||||||
|
{ taskDescription },
|
||||||
|
config
|
||||||
|
) => {
|
||||||
|
const state = config.state;
|
||||||
|
|
||||||
|
const taskDescriptionMessage = {
|
||||||
|
role: "user" as const,
|
||||||
|
content: taskDescription,
|
||||||
|
};
|
||||||
|
const agentInput = {
|
||||||
|
...state,
|
||||||
|
messages: [taskDescriptionMessage],
|
||||||
|
};
|
||||||
|
|
||||||
|
return new Command({
|
||||||
|
// highlight-next-line
|
||||||
|
goto: [new Send(agentName, agentInput)],
|
||||||
|
graph: Command.PARENT,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name,
|
||||||
|
description: toolDescription,
|
||||||
|
schema: z.object({
|
||||||
|
taskDescription: z
|
||||||
|
.string()
|
||||||
|
.describe(
|
||||||
|
"Description of what the next agent should do, including all of the relevant context."
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
See the multi-agent [supervisor](../tutorials/multi_agent/agent_supervisor.md#4-create-delegation-tasks) example for a full example of using @[`Send()`][Send] in handoffs.
|
See the multi-agent [supervisor](../tutorials/multi_agent/agent_supervisor.md#4-create-delegation-tasks) example for a full example of using @[`Send()`][Send] in handoffs.
|
||||||
|
|
||||||
@@ -136,6 +278,7 @@ See the multi-agent [supervisor](../tutorials/multi_agent/agent_supervisor.md#4-
|
|||||||
|
|
||||||
You can use handoffs in any agents built with LangGraph. We recommend using the prebuilt [agent](../agents/overview.md) or [`ToolNode`](./tool-calling.md#toolnode), as they natively support handoffs tools returning `Command`. Below is an example of how you can implement a multi-agent system for booking travel using handoffs:
|
You can use handoffs in any agents built with LangGraph. We recommend using the prebuilt [agent](../agents/overview.md) or [`ToolNode`](./tool-calling.md#toolnode), as they natively support handoffs tools returning `Command`. Below is an example of how you can implement a multi-agent system for booking travel using handoffs:
|
||||||
|
|
||||||
|
:::python
|
||||||
```python
|
```python
|
||||||
from langgraph.prebuilt import create_react_agent
|
from langgraph.prebuilt import create_react_agent
|
||||||
from langgraph.graph import StateGraph, START, MessagesState
|
from langgraph.graph import StateGraph, START, MessagesState
|
||||||
@@ -176,9 +319,65 @@ multi_agent_graph = (
|
|||||||
.compile()
|
.compile()
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
```typescript
|
||||||
|
import { createReactAgent } from "@langchain/langgraph/prebuilt";
|
||||||
|
import { StateGraph, START, MessagesZodState } from "@langchain/langgraph";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
function createHandoffTool({
|
||||||
|
agentName,
|
||||||
|
description,
|
||||||
|
}: {
|
||||||
|
agentName: string;
|
||||||
|
description?: string;
|
||||||
|
}) {
|
||||||
|
// same implementation as above
|
||||||
|
// ...
|
||||||
|
return new Command(/* ... */);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handoffs
|
||||||
|
const transferToHotelAssistant = createHandoffTool({
|
||||||
|
agentName: "hotel_assistant",
|
||||||
|
});
|
||||||
|
const transferToFlightAssistant = createHandoffTool({
|
||||||
|
agentName: "flight_assistant",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Define agents
|
||||||
|
const flightAssistant = createReactAgent({
|
||||||
|
llm: model,
|
||||||
|
// highlight-next-line
|
||||||
|
tools: [/* ... */, transferToHotelAssistant],
|
||||||
|
// highlight-next-line
|
||||||
|
name: "flight_assistant",
|
||||||
|
});
|
||||||
|
|
||||||
|
const hotelAssistant = createReactAgent({
|
||||||
|
llm: model,
|
||||||
|
// highlight-next-line
|
||||||
|
tools: [/* ... */, transferToFlightAssistant],
|
||||||
|
// highlight-next-line
|
||||||
|
name: "hotel_assistant",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Define multi-agent graph
|
||||||
|
const multiAgentGraph = new StateGraph(MessagesZodState)
|
||||||
|
// highlight-next-line
|
||||||
|
.addNode("flight_assistant", flightAssistant)
|
||||||
|
// highlight-next-line
|
||||||
|
.addNode("hotel_assistant", hotelAssistant)
|
||||||
|
.addEdge(START, "flight_assistant")
|
||||||
|
.compile();
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
??? example "Full example: Multi-agent system for booking travel"
|
??? example "Full example: Multi-agent system for booking travel"
|
||||||
|
|
||||||
|
:::python
|
||||||
```python
|
```python
|
||||||
from typing import Annotated
|
from typing import Annotated
|
||||||
from langchain_core.messages import convert_to_messages
|
from langchain_core.messages import convert_to_messages
|
||||||
@@ -323,6 +522,183 @@ multi_agent_graph = (
|
|||||||
3. Name of the agent or node to hand off to.
|
3. Name of the agent or node to hand off to.
|
||||||
4. Take the agent's messages and **add** them to the parent's **state** as part of the handoff. The next agent will see the parent state.
|
4. Take the agent's messages and **add** them to the parent's **state** as part of the handoff. The next agent will see the parent state.
|
||||||
5. Indicate to LangGraph that we need to navigate to agent node in a **parent** multi-agent graph.
|
5. Indicate to LangGraph that we need to navigate to agent node in a **parent** multi-agent graph.
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
```typescript
|
||||||
|
import { tool } from "@langchain/core/tools";
|
||||||
|
import { createReactAgent } from "@langchain/langgraph/prebuilt";
|
||||||
|
import { StateGraph, START, MessagesZodState, Command } from "@langchain/langgraph";
|
||||||
|
import { ChatAnthropic } from "@langchain/anthropic";
|
||||||
|
import { isBaseMessage } from "@langchain/core/messages";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
// We'll use a helper to render the streamed agent outputs nicely
|
||||||
|
const prettyPrintMessages = (update: Record<string, any>) => {
|
||||||
|
// Handle tuple case with namespace
|
||||||
|
if (Array.isArray(update)) {
|
||||||
|
const [ns, updateData] = update;
|
||||||
|
// Skip parent graph updates in the printouts
|
||||||
|
if (ns.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const graphId = ns[ns.length - 1].split(":")[0];
|
||||||
|
console.log(`Update from subgraph ${graphId}:\n`);
|
||||||
|
update = updateData;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const [nodeName, updateValue] of Object.entries(update)) {
|
||||||
|
console.log(`Update from node ${nodeName}:\n`);
|
||||||
|
|
||||||
|
const messages = updateValue.messages || [];
|
||||||
|
for (const message of messages) {
|
||||||
|
if (isBaseMessage(message)) {
|
||||||
|
const textContent =
|
||||||
|
typeof message.content === "string"
|
||||||
|
? message.content
|
||||||
|
: JSON.stringify(message.content);
|
||||||
|
console.log(`${message.getType()}: ${textContent}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log("\n");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function createHandoffTool({
|
||||||
|
agentName,
|
||||||
|
description,
|
||||||
|
}: {
|
||||||
|
agentName: string;
|
||||||
|
description?: string;
|
||||||
|
}) {
|
||||||
|
const name = `transfer_to_${agentName}`;
|
||||||
|
const toolDescription = description || `Transfer to ${agentName}`;
|
||||||
|
|
||||||
|
return tool(
|
||||||
|
async (_, config) => {
|
||||||
|
// highlight-next-line
|
||||||
|
const state = config.state; // (1)!
|
||||||
|
const toolCallId = config.toolCall.id;
|
||||||
|
|
||||||
|
const toolMessage = {
|
||||||
|
role: "tool" as const,
|
||||||
|
content: `Successfully transferred to ${agentName}`,
|
||||||
|
name: name,
|
||||||
|
tool_call_id: toolCallId,
|
||||||
|
};
|
||||||
|
|
||||||
|
return new Command({
|
||||||
|
// highlight-next-line
|
||||||
|
goto: agentName, // (3)!
|
||||||
|
// highlight-next-line
|
||||||
|
update: { messages: [...state.messages, toolMessage] }, // (4)!
|
||||||
|
// highlight-next-line
|
||||||
|
graph: Command.PARENT, // (5)!
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name,
|
||||||
|
description: toolDescription,
|
||||||
|
schema: z.object({}),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handoffs
|
||||||
|
const transferToHotelAssistant = createHandoffTool({
|
||||||
|
agentName: "hotel_assistant",
|
||||||
|
description: "Transfer user to the hotel-booking assistant.",
|
||||||
|
});
|
||||||
|
|
||||||
|
const transferToFlightAssistant = createHandoffTool({
|
||||||
|
agentName: "flight_assistant",
|
||||||
|
description: "Transfer user to the flight-booking assistant.",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Simple agent tools
|
||||||
|
const bookHotel = tool(
|
||||||
|
async ({ hotelName }) => {
|
||||||
|
return `Successfully booked a stay at ${hotelName}.`;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "book_hotel",
|
||||||
|
description: "Book a hotel",
|
||||||
|
schema: z.object({
|
||||||
|
hotelName: z.string(),
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const bookFlight = tool(
|
||||||
|
async ({ fromAirport, toAirport }) => {
|
||||||
|
return `Successfully booked a flight from ${fromAirport} to ${toAirport}.`;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "book_flight",
|
||||||
|
description: "Book a flight",
|
||||||
|
schema: z.object({
|
||||||
|
fromAirport: z.string(),
|
||||||
|
toAirport: z.string(),
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const model = new ChatAnthropic({
|
||||||
|
model: "claude-3-5-sonnet-latest",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Define agents
|
||||||
|
const flightAssistant = createReactAgent({
|
||||||
|
llm: model,
|
||||||
|
// highlight-next-line
|
||||||
|
tools: [bookFlight, transferToHotelAssistant],
|
||||||
|
prompt: "You are a flight booking assistant",
|
||||||
|
// highlight-next-line
|
||||||
|
name: "flight_assistant",
|
||||||
|
});
|
||||||
|
|
||||||
|
const hotelAssistant = createReactAgent({
|
||||||
|
llm: model,
|
||||||
|
// highlight-next-line
|
||||||
|
tools: [bookHotel, transferToFlightAssistant],
|
||||||
|
prompt: "You are a hotel booking assistant",
|
||||||
|
// highlight-next-line
|
||||||
|
name: "hotel_assistant",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Define multi-agent graph
|
||||||
|
const multiAgentGraph = new StateGraph(MessagesZodState)
|
||||||
|
.addNode("flight_assistant", flightAssistant)
|
||||||
|
.addNode("hotel_assistant", hotelAssistant)
|
||||||
|
.addEdge(START, "flight_assistant")
|
||||||
|
.compile();
|
||||||
|
|
||||||
|
// Run the multi-agent graph
|
||||||
|
const stream = await multiAgentGraph.stream(
|
||||||
|
{
|
||||||
|
messages: [
|
||||||
|
{
|
||||||
|
role: "user",
|
||||||
|
content: "book a flight from BOS to JFK and a stay at McKittrick Hotel",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
// highlight-next-line
|
||||||
|
{ subgraphs: true }
|
||||||
|
);
|
||||||
|
|
||||||
|
for await (const chunk of stream) {
|
||||||
|
prettyPrintMessages(chunk);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Access agent's state
|
||||||
|
2. The `Command` primitive allows specifying a state update and a node transition as a single operation, making it useful for implementing handoffs.
|
||||||
|
3. Name of the agent or node to hand off to.
|
||||||
|
4. Take the agent's messages and **add** them to the parent's **state** as part of the handoff. The next agent will see the parent state.
|
||||||
|
5. Indicate to LangGraph that we need to navigate to agent node in a **parent** multi-agent graph.
|
||||||
|
:::
|
||||||
|
|
||||||
## Multi-turn conversation
|
## Multi-turn conversation
|
||||||
|
|
||||||
@@ -333,6 +709,7 @@ The agents can then be implemented as nodes in a graph that executes agent steps
|
|||||||
1. **Wait for user input** to continue the conversation, or
|
1. **Wait for user input** to continue the conversation, or
|
||||||
2. **Route to another agent** (or back to itself, such as in a loop) via a [handoff](#handoffs)
|
2. **Route to another agent** (or back to itself, such as in a loop) via a [handoff](#handoffs)
|
||||||
|
|
||||||
|
:::python
|
||||||
```python
|
```python
|
||||||
def human(state) -> Command[Literal["agent", "another_agent"]]:
|
def human(state) -> Command[Literal["agent", "another_agent"]]:
|
||||||
"""A node for collecting user input."""
|
"""A node for collecting user input."""
|
||||||
@@ -360,6 +737,44 @@ def agent(state) -> Command[Literal["agent", "another_agent", "human"]]:
|
|||||||
else:
|
else:
|
||||||
return Command(goto="human") # Go to human node
|
return Command(goto="human") # Go to human node
|
||||||
```
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
```typescript
|
||||||
|
import { interrupt, Command } from "@langchain/langgraph";
|
||||||
|
|
||||||
|
function human(state: MessagesState): Command {
|
||||||
|
const userInput: string = interrupt("Ready for user input.");
|
||||||
|
|
||||||
|
// Determine the active agent
|
||||||
|
const activeAgent = /* ... */;
|
||||||
|
|
||||||
|
return new Command({
|
||||||
|
update: {
|
||||||
|
messages: [{
|
||||||
|
role: "human",
|
||||||
|
content: userInput,
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
goto: activeAgent,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function agent(state: MessagesState): Command {
|
||||||
|
// The condition for routing/halting can be anything, e.g. LLM tool call / structured output, etc.
|
||||||
|
const goto = getNextAgent(/* ... */); // 'agent' / 'anotherAgent'
|
||||||
|
|
||||||
|
if (goto) {
|
||||||
|
return new Command({
|
||||||
|
goto,
|
||||||
|
update: { myStateKey: "myStateValue" }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Command({ goto: "human" });
|
||||||
|
}
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
??? example "Full example: multi-agent system for travel recommendations"
|
??? example "Full example: multi-agent system for travel recommendations"
|
||||||
|
|
||||||
@@ -370,6 +785,7 @@ def agent(state) -> Command[Literal["agent", "another_agent", "human"]]:
|
|||||||
* travel_advisor: can help with travel destination recommendations. Can ask hotel_advisor for help.
|
* travel_advisor: can help with travel destination recommendations. Can ask hotel_advisor for help.
|
||||||
* hotel_advisor: can help with hotel recommendations. Can ask travel_advisor for help.
|
* hotel_advisor: can help with hotel recommendations. Can ask travel_advisor for help.
|
||||||
|
|
||||||
|
:::python
|
||||||
```python
|
```python
|
||||||
from langchain_anthropic import ChatAnthropic
|
from langchain_anthropic import ChatAnthropic
|
||||||
from langgraph.graph import MessagesState, StateGraph, START
|
from langgraph.graph import MessagesState, StateGraph, START
|
||||||
@@ -571,10 +987,267 @@ def agent(state) -> Command[Literal["agent", "another_agent", "human"]]:
|
|||||||
|
|
||||||
Would you like more specific information about any of these activities or would you like to know about other options in the area?
|
Would you like more specific information about any of these activities or would you like to know about other options in the area?
|
||||||
```
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
```typescript
|
||||||
|
import { ChatAnthropic } from "@langchain/anthropic";
|
||||||
|
import { StateGraph, START, MessagesZodState, Command, interrupt, MemorySaver } from "@langchain/langgraph";
|
||||||
|
import { createReactAgent } from "@langchain/langgraph/prebuilt";
|
||||||
|
import { tool } from "@langchain/core/tools";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
const model = new ChatAnthropic({ model: "claude-3-5-sonnet-latest" });
|
||||||
|
|
||||||
|
const MultiAgentState = MessagesZodState.extend({
|
||||||
|
lastActiveAgent: z.string().optional(),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Define travel advisor tools
|
||||||
|
const getTravelRecommendations = tool(
|
||||||
|
async () => {
|
||||||
|
// Placeholder implementation
|
||||||
|
return "Based on current trends, I recommend visiting Japan, Portugal, or New Zealand.";
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "get_travel_recommendations",
|
||||||
|
description: "Get current travel destination recommendations",
|
||||||
|
schema: z.object({}),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const makeHandoffTool = (agentName: string) => {
|
||||||
|
return tool(
|
||||||
|
async (_, config) => {
|
||||||
|
const state = config.state;
|
||||||
|
const toolCallId = config.toolCall.id;
|
||||||
|
|
||||||
|
const toolMessage = {
|
||||||
|
role: "tool" as const,
|
||||||
|
content: `Successfully transferred to ${agentName}`,
|
||||||
|
name: `transfer_to_${agentName}`,
|
||||||
|
tool_call_id: toolCallId,
|
||||||
|
};
|
||||||
|
|
||||||
|
return new Command({
|
||||||
|
goto: agentName,
|
||||||
|
update: { messages: [...state.messages, toolMessage] },
|
||||||
|
graph: Command.PARENT,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `transfer_to_${agentName}`,
|
||||||
|
description: `Transfer to ${agentName}`,
|
||||||
|
schema: z.object({}),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const travelAdvisorTools = [
|
||||||
|
getTravelRecommendations,
|
||||||
|
makeHandoffTool("hotel_advisor"),
|
||||||
|
];
|
||||||
|
|
||||||
|
const travelAdvisor = createReactAgent({
|
||||||
|
llm: model,
|
||||||
|
tools: travelAdvisorTools,
|
||||||
|
prompt: [
|
||||||
|
"You are a general travel expert that can recommend travel destinations (e.g. countries, cities, etc). ",
|
||||||
|
"If you need hotel recommendations, ask 'hotel_advisor' for help. ",
|
||||||
|
"You MUST include human-readable response before transferring to another agent."
|
||||||
|
].join("")
|
||||||
|
});
|
||||||
|
|
||||||
|
const callTravelAdvisor = async (
|
||||||
|
state: z.infer<typeof MultiAgentState>
|
||||||
|
): Promise<Command> => {
|
||||||
|
const response = await travelAdvisor.invoke(state);
|
||||||
|
const update = { ...response, lastActiveAgent: "travel_advisor" };
|
||||||
|
return new Command({ update, goto: "human" });
|
||||||
|
};
|
||||||
|
|
||||||
|
// Define hotel advisor tools
|
||||||
|
const getHotelRecommendations = tool(
|
||||||
|
async () => {
|
||||||
|
// Placeholder implementation
|
||||||
|
return "I recommend the Ritz-Carlton for luxury stays or boutique hotels for unique experiences.";
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "get_hotel_recommendations",
|
||||||
|
description: "Get hotel recommendations for destinations",
|
||||||
|
schema: z.object({}),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const hotelAdvisorTools = [
|
||||||
|
getHotelRecommendations,
|
||||||
|
makeHandoffTool("travel_advisor"),
|
||||||
|
];
|
||||||
|
|
||||||
|
const hotelAdvisor = createReactAgent({
|
||||||
|
llm: model,
|
||||||
|
tools: hotelAdvisorTools,
|
||||||
|
prompt: [
|
||||||
|
"You are a hotel expert that can provide hotel recommendations for a given destination. ",
|
||||||
|
"If you need help picking travel destinations, ask 'travel_advisor' for help.",
|
||||||
|
"You MUST include human-readable response before transferring to another agent."
|
||||||
|
].join("")
|
||||||
|
});
|
||||||
|
|
||||||
|
const callHotelAdvisor = async (
|
||||||
|
state: z.infer<typeof MultiAgentState>
|
||||||
|
): Promise<Command> => {
|
||||||
|
const response = await hotelAdvisor.invoke(state);
|
||||||
|
const update = { ...response, lastActiveAgent: "hotel_advisor" };
|
||||||
|
return new Command({ update, goto: "human" });
|
||||||
|
};
|
||||||
|
|
||||||
|
const humanNode = async (
|
||||||
|
state: z.infer<typeof MultiAgentState>
|
||||||
|
): Promise<Command> => {
|
||||||
|
const userInput: string = interrupt("Ready for user input.");
|
||||||
|
const activeAgent = state.lastActiveAgent || "travel_advisor";
|
||||||
|
|
||||||
|
return new Command({
|
||||||
|
update: {
|
||||||
|
messages: [
|
||||||
|
{
|
||||||
|
role: "human",
|
||||||
|
content: userInput,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
goto: activeAgent,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const builder = new StateGraph(MultiAgentState)
|
||||||
|
.addNode("travel_advisor", callTravelAdvisor)
|
||||||
|
.addNode("hotel_advisor", callHotelAdvisor)
|
||||||
|
.addNode("human", humanNode)
|
||||||
|
.addEdge(START, "travel_advisor");
|
||||||
|
|
||||||
|
const checkpointer = new MemorySaver();
|
||||||
|
const graph = builder.compile({ checkpointer });
|
||||||
|
```
|
||||||
|
|
||||||
|
Let's test a multi turn conversation with this application.
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { v4 as uuidv4 } from "uuid";
|
||||||
|
import { Command } from "@langchain/langgraph";
|
||||||
|
|
||||||
|
const threadConfig = { configurable: { thread_id: uuidv4() } };
|
||||||
|
|
||||||
|
const inputs = [
|
||||||
|
// 1st round of conversation
|
||||||
|
{
|
||||||
|
messages: [
|
||||||
|
{ role: "user", content: "i wanna go somewhere warm in the caribbean" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
// Since we're using `interrupt`, we'll need to resume using the Command primitive.
|
||||||
|
// 2nd round of conversation
|
||||||
|
new Command({
|
||||||
|
resume: "could you recommend a nice hotel in one of the areas and tell me which area it is."
|
||||||
|
}),
|
||||||
|
// 3rd round of conversation
|
||||||
|
new Command({
|
||||||
|
resume: "i like the first one. could you recommend something to do near the hotel?"
|
||||||
|
}),
|
||||||
|
];
|
||||||
|
|
||||||
|
for (const [idx, userInput] of inputs.entries()) {
|
||||||
|
console.log();
|
||||||
|
console.log(`--- Conversation Turn ${idx + 1} ---`);
|
||||||
|
console.log();
|
||||||
|
console.log(`User: ${JSON.stringify(userInput)}`);
|
||||||
|
console.log();
|
||||||
|
|
||||||
|
for await (const update of await graph.stream(
|
||||||
|
userInput,
|
||||||
|
{ ...threadConfig, streamMode: "updates" }
|
||||||
|
)) {
|
||||||
|
for (const [nodeId, value] of Object.entries(update)) {
|
||||||
|
if (value?.messages?.length) {
|
||||||
|
const lastMessage = value.messages.at(-1);
|
||||||
|
if (lastMessage?.getType?.() === "ai") {
|
||||||
|
console.log(`${nodeId}: ${lastMessage.content}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
--- Conversation Turn 1 ---
|
||||||
|
|
||||||
|
User: {"messages":[{"role":"user","content":"i wanna go somewhere warm in the caribbean"}]}
|
||||||
|
|
||||||
|
travel_advisor: Based on the recommendations, Aruba would be an excellent choice for your Caribbean getaway! Aruba is known as "One Happy Island" and offers:
|
||||||
|
- Year-round warm weather with consistent temperatures around 82°F (28°C)
|
||||||
|
- Beautiful white sand beaches like Eagle Beach and Palm Beach
|
||||||
|
- Clear turquoise waters perfect for swimming and snorkeling
|
||||||
|
- Minimal rainfall and location outside the hurricane belt
|
||||||
|
- A blend of Caribbean and Dutch culture
|
||||||
|
- Great dining options and nightlife
|
||||||
|
- Various water sports and activities
|
||||||
|
|
||||||
|
Would you like me to get some specific hotel recommendations in Aruba for your stay? I can transfer you to our hotel advisor who can help with accommodations.
|
||||||
|
|
||||||
|
--- Conversation Turn 2 ---
|
||||||
|
|
||||||
|
User: Command { resume: 'could you recommend a nice hotel in one of the areas and tell me which area it is.' }
|
||||||
|
|
||||||
|
hotel_advisor: Based on the recommendations, I can suggest two excellent options:
|
||||||
|
|
||||||
|
1. The Ritz-Carlton, Aruba - Located in Palm Beach
|
||||||
|
- This luxury resort is situated in the vibrant Palm Beach area
|
||||||
|
- Known for its exceptional service and amenities
|
||||||
|
- Perfect if you want to be close to dining, shopping, and entertainment
|
||||||
|
- Features multiple restaurants, a casino, and a world-class spa
|
||||||
|
- Located on a pristine stretch of Palm Beach
|
||||||
|
|
||||||
|
2. Bucuti & Tara Beach Resort - Located in Eagle Beach
|
||||||
|
- An adults-only boutique resort on Eagle Beach
|
||||||
|
- Known for being more intimate and peaceful
|
||||||
|
- Award-winning for its sustainability practices
|
||||||
|
- Perfect for a romantic getaway or peaceful vacation
|
||||||
|
- Located on one of the most beautiful beaches in the Caribbean
|
||||||
|
|
||||||
|
Would you like more specific information about either of these properties or their locations?
|
||||||
|
|
||||||
|
--- Conversation Turn 3 ---
|
||||||
|
|
||||||
|
User: Command { resume: 'i like the first one. could you recommend something to do near the hotel?' }
|
||||||
|
|
||||||
|
travel_advisor: Near the Ritz-Carlton in Palm Beach, here are some highly recommended activities:
|
||||||
|
|
||||||
|
1. Visit the Palm Beach Plaza Mall - Just a short walk from the hotel, featuring shopping, dining, and entertainment
|
||||||
|
2. Try your luck at the Stellaris Casino - It's right in the Ritz-Carlton
|
||||||
|
3. Take a sunset sailing cruise - Many depart from the nearby pier
|
||||||
|
4. Visit the California Lighthouse - A scenic landmark just north of Palm Beach
|
||||||
|
5. Enjoy water sports at Palm Beach:
|
||||||
|
- Jet skiing
|
||||||
|
- Parasailing
|
||||||
|
- Snorkeling
|
||||||
|
- Stand-up paddleboarding
|
||||||
|
|
||||||
|
Would you like more specific information about any of these activities or would you like to know about other options in the area?
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
## Prebuilt implementations
|
## Prebuilt implementations
|
||||||
|
|
||||||
LangGraph comes with prebuilt implementations of two of the most popular multi-agent architectures:
|
LangGraph comes with prebuilt implementations of two of the most popular multi-agent architectures:
|
||||||
|
|
||||||
|
:::python
|
||||||
- [supervisor](../agents/multi-agent.md#supervisor) — individual agents are coordinated by a central supervisor agent. The supervisor controls all communication flow and task delegation, making decisions about which agent to invoke based on the current context and task requirements. You can use [`langgraph-supervisor`](https://github.com/langchain-ai/langgraph-supervisor-py) library to create a supervisor multi-agent systems.
|
- [supervisor](../agents/multi-agent.md#supervisor) — individual agents are coordinated by a central supervisor agent. The supervisor controls all communication flow and task delegation, making decisions about which agent to invoke based on the current context and task requirements. You can use [`langgraph-supervisor`](https://github.com/langchain-ai/langgraph-supervisor-py) library to create a supervisor multi-agent systems.
|
||||||
- [swarm](../agents/multi-agent.md#supervisor) — agents dynamically hand off control to one another based on their specializations. The system remembers which agent was last active, ensuring that on subsequent interactions, the conversation resumes with that agent. You can use [`langgraph-swarm`](https://github.com/langchain-ai/langgraph-swarm-py) library to create a swarm multi-agent systems.
|
- [swarm](../agents/multi-agent.md#supervisor) — agents dynamically hand off control to one another based on their specializations. The system remembers which agent was last active, ensuring that on subsequent interactions, the conversation resumes with that agent. You can use [`langgraph-swarm`](https://github.com/langchain-ai/langgraph-swarm-py) library to create a swarm multi-agent systems.
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
- [supervisor](../agents/multi-agent.md#supervisor) — individual agents are coordinated by a central supervisor agent. The supervisor controls all communication flow and task delegation, making decisions about which agent to invoke based on the current context and task requirements. You can use [`langgraph-supervisor`](https://github.com/langchain-ai/langgraph-supervisor-js) library to create a supervisor multi-agent systems.
|
||||||
|
- [swarm](../agents/multi-agent.md#supervisor) — agents dynamically hand off control to one another based on their specializations. The system remembers which agent was last active, ensuring that on subsequent interactions, the conversation resumes with that agent. You can use [`langgraph-swarm`](https://github.com/langchain-ai/langgraph-swarm-js) library to create a swarm multi-agent systems.
|
||||||
|
:::
|
||||||
@@ -9,11 +9,20 @@ When adding subgraphs, you need to define how the parent graph and the subgraph
|
|||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
|
:::python
|
||||||
```bash
|
```bash
|
||||||
pip install -U langgraph
|
pip install -U langgraph
|
||||||
```
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
```bash
|
||||||
|
npm install @langchain/langgraph
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
!!! tip "Set up LangSmith for LangGraph development"
|
!!! tip "Set up LangSmith for LangGraph development"
|
||||||
|
|
||||||
Sign up for [LangSmith](https://smith.langchain.com) to quickly spot issues and improve the performance of your LangGraph projects. LangSmith lets you use trace data to debug, test, and monitor your LLM apps built with LangGraph — read more about how to get started [here](https://docs.smith.langchain.com).
|
Sign up for [LangSmith](https://smith.langchain.com) to quickly spot issues and improve the performance of your LangGraph projects. LangSmith lets you use trace data to debug, test, and monitor your LLM apps built with LangGraph — read more about how to get started [here](https://docs.smith.langchain.com).
|
||||||
|
|
||||||
## Shared state schemas
|
## Shared state schemas
|
||||||
@@ -22,6 +31,7 @@ A common case is for the parent graph and subgraph to communicate over a shared
|
|||||||
|
|
||||||
If your subgraph shares state keys with the parent graph, you can follow these steps to add it to your graph:
|
If your subgraph shares state keys with the parent graph, you can follow these steps to add it to your graph:
|
||||||
|
|
||||||
|
:::python
|
||||||
1. Define the subgraph workflow (`subgraph_builder` in the example below) and compile it
|
1. Define the subgraph workflow (`subgraph_builder` in the example below) and compile it
|
||||||
2. Pass compiled subgraph to the `.add_node` method when defining the parent graph workflow
|
2. Pass compiled subgraph to the `.add_node` method when defining the parent graph workflow
|
||||||
|
|
||||||
@@ -49,9 +59,41 @@ builder.add_node("node_1", subgraph)
|
|||||||
builder.add_edge(START, "node_1")
|
builder.add_edge(START, "node_1")
|
||||||
graph = builder.compile()
|
graph = builder.compile()
|
||||||
```
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
1. Define the subgraph workflow (`subgraphBuilder` in the example below) and compile it
|
||||||
|
2. Pass compiled subgraph to the `.addNode` method when defining the parent graph workflow
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { StateGraph, START } from "@langchain/langgraph";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
const State = z.object({
|
||||||
|
foo: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Subgraph
|
||||||
|
const subgraphBuilder = new StateGraph(State)
|
||||||
|
.addNode("subgraphNode1", (state) => {
|
||||||
|
return { foo: "hi! " + state.foo };
|
||||||
|
})
|
||||||
|
.addEdge(START, "subgraphNode1");
|
||||||
|
|
||||||
|
const subgraph = subgraphBuilder.compile();
|
||||||
|
|
||||||
|
// Parent graph
|
||||||
|
const builder = new StateGraph(State)
|
||||||
|
.addNode("node1", subgraph)
|
||||||
|
.addEdge(START, "node1");
|
||||||
|
|
||||||
|
const graph = builder.compile();
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
??? example "Full example: shared state schemas"
|
??? example "Full example: shared state schemas"
|
||||||
|
|
||||||
|
:::python
|
||||||
```python
|
```python
|
||||||
from typing_extensions import TypedDict
|
from typing_extensions import TypedDict
|
||||||
from langgraph.graph.state import StateGraph, START
|
from langgraph.graph.state import StateGraph, START
|
||||||
@@ -101,6 +143,61 @@ graph = builder.compile()
|
|||||||
{'node_1': {'foo': 'hi! foo'}}
|
{'node_1': {'foo': 'hi! foo'}}
|
||||||
{'node_2': {'foo': 'hi! foobar'}}
|
{'node_2': {'foo': 'hi! foobar'}}
|
||||||
```
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
```typescript
|
||||||
|
import { StateGraph, START } from "@langchain/langgraph";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
// Define subgraph
|
||||||
|
const SubgraphState = z.object({
|
||||||
|
foo: z.string(), // (1)!
|
||||||
|
bar: z.string(), // (2)!
|
||||||
|
});
|
||||||
|
|
||||||
|
const subgraphBuilder = new StateGraph(SubgraphState)
|
||||||
|
.addNode("subgraphNode1", (state) => {
|
||||||
|
return { bar: "bar" };
|
||||||
|
})
|
||||||
|
.addNode("subgraphNode2", (state) => {
|
||||||
|
// note that this node is using a state key ('bar') that is only available in the subgraph
|
||||||
|
// and is sending update on the shared state key ('foo')
|
||||||
|
return { foo: state.foo + state.bar };
|
||||||
|
})
|
||||||
|
.addEdge(START, "subgraphNode1")
|
||||||
|
.addEdge("subgraphNode1", "subgraphNode2");
|
||||||
|
|
||||||
|
const subgraph = subgraphBuilder.compile();
|
||||||
|
|
||||||
|
// Define parent graph
|
||||||
|
const ParentState = z.object({
|
||||||
|
foo: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const builder = new StateGraph(ParentState)
|
||||||
|
.addNode("node1", (state) => {
|
||||||
|
return { foo: "hi! " + state.foo };
|
||||||
|
})
|
||||||
|
.addNode("node2", subgraph)
|
||||||
|
.addEdge(START, "node1")
|
||||||
|
.addEdge("node1", "node2");
|
||||||
|
|
||||||
|
const graph = builder.compile();
|
||||||
|
|
||||||
|
for await (const chunk of await graph.stream({ foo: "foo" })) {
|
||||||
|
console.log(chunk);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
3. This key is shared with the parent graph state
|
||||||
|
4. This key is private to the `SubgraphState` and is not visible to the parent graph
|
||||||
|
|
||||||
|
```
|
||||||
|
{ node1: { foo: 'hi! foo' } }
|
||||||
|
{ node2: { foo: 'hi! foobar' } }
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
## Different state schemas
|
## Different state schemas
|
||||||
|
|
||||||
@@ -108,6 +205,7 @@ For more complex systems you might want to define subgraphs that have a **comple
|
|||||||
|
|
||||||
If that's the case for your application, you need to define a node **function that invokes the subgraph**. This function needs to transform the input (parent) state to the subgraph state before invoking the subgraph, and transform the results back to the parent state before returning the state update from the node.
|
If that's the case for your application, you need to define a node **function that invokes the subgraph**. This function needs to transform the input (parent) state to the subgraph state before invoking the subgraph, and transform the results back to the parent state before returning the state update from the node.
|
||||||
|
|
||||||
|
:::python
|
||||||
```python
|
```python
|
||||||
from typing_extensions import TypedDict
|
from typing_extensions import TypedDict
|
||||||
from langgraph.graph.state import StateGraph, START
|
from langgraph.graph.state import StateGraph, START
|
||||||
@@ -142,9 +240,48 @@ graph = builder.compile()
|
|||||||
|
|
||||||
1. Transform the state to the subgraph state
|
1. Transform the state to the subgraph state
|
||||||
2. Transform response back to the parent state
|
2. Transform response back to the parent state
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
```typescript
|
||||||
|
import { StateGraph, START } from "@langchain/langgraph";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
const SubgraphState = z.object({
|
||||||
|
bar: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Subgraph
|
||||||
|
const subgraphBuilder = new StateGraph(SubgraphState)
|
||||||
|
.addNode("subgraphNode1", (state) => {
|
||||||
|
return { bar: "hi! " + state.bar };
|
||||||
|
})
|
||||||
|
.addEdge(START, "subgraphNode1");
|
||||||
|
|
||||||
|
const subgraph = subgraphBuilder.compile();
|
||||||
|
|
||||||
|
// Parent graph
|
||||||
|
const State = z.object({
|
||||||
|
foo: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const builder = new StateGraph(State)
|
||||||
|
.addNode("node1", async (state) => {
|
||||||
|
const subgraphOutput = await subgraph.invoke({ bar: state.foo }); // (1)!
|
||||||
|
return { foo: subgraphOutput.bar }; // (2)!
|
||||||
|
})
|
||||||
|
.addEdge(START, "node1");
|
||||||
|
|
||||||
|
const graph = builder.compile();
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Transform the state to the subgraph state
|
||||||
|
2. Transform response back to the parent state
|
||||||
|
:::
|
||||||
|
|
||||||
??? example "Full example: different state schemas"
|
??? example "Full example: different state schemas"
|
||||||
|
|
||||||
|
:::python
|
||||||
```python
|
```python
|
||||||
from typing_extensions import TypedDict
|
from typing_extensions import TypedDict
|
||||||
from langgraph.graph.state import StateGraph, START
|
from langgraph.graph.state import StateGraph, START
|
||||||
@@ -200,11 +337,74 @@ graph = builder.compile()
|
|||||||
(('node_2:9c36dd0f-151a-cb42-cbad-fa2f851f9ab7',), {'grandchild_2': {'bar': 'hi! foobaz'}})
|
(('node_2:9c36dd0f-151a-cb42-cbad-fa2f851f9ab7',), {'grandchild_2': {'bar': 'hi! foobaz'}})
|
||||||
((), {'node_2': {'foo': 'hi! foobaz'}})
|
((), {'node_2': {'foo': 'hi! foobaz'}})
|
||||||
```
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
```typescript
|
||||||
|
import { StateGraph, START } from "@langchain/langgraph";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
// Define subgraph
|
||||||
|
const SubgraphState = z.object({
|
||||||
|
// note that none of these keys are shared with the parent graph state
|
||||||
|
bar: z.string(),
|
||||||
|
baz: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const subgraphBuilder = new StateGraph(SubgraphState)
|
||||||
|
.addNode("subgraphNode1", (state) => {
|
||||||
|
return { baz: "baz" };
|
||||||
|
})
|
||||||
|
.addNode("subgraphNode2", (state) => {
|
||||||
|
return { bar: state.bar + state.baz };
|
||||||
|
})
|
||||||
|
.addEdge(START, "subgraphNode1")
|
||||||
|
.addEdge("subgraphNode1", "subgraphNode2");
|
||||||
|
|
||||||
|
const subgraph = subgraphBuilder.compile();
|
||||||
|
|
||||||
|
// Define parent graph
|
||||||
|
const ParentState = z.object({
|
||||||
|
foo: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const builder = new StateGraph(ParentState)
|
||||||
|
.addNode("node1", (state) => {
|
||||||
|
return { foo: "hi! " + state.foo };
|
||||||
|
})
|
||||||
|
.addNode("node2", async (state) => {
|
||||||
|
const response = await subgraph.invoke({ bar: state.foo }); // (1)!
|
||||||
|
return { foo: response.bar }; // (2)!
|
||||||
|
})
|
||||||
|
.addEdge(START, "node1")
|
||||||
|
.addEdge("node1", "node2");
|
||||||
|
|
||||||
|
const graph = builder.compile();
|
||||||
|
|
||||||
|
for await (const chunk of await graph.stream(
|
||||||
|
{ foo: "foo" },
|
||||||
|
{ subgraphs: true }
|
||||||
|
)) {
|
||||||
|
console.log(chunk);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Transform the state to the subgraph state
|
||||||
|
4. Transform response back to the parent state
|
||||||
|
|
||||||
|
```
|
||||||
|
[[], { node1: { foo: 'hi! foo' } }]
|
||||||
|
[['node2:9c36dd0f-151a-cb42-cbad-fa2f851f9ab7'], { subgraphNode1: { baz: 'baz' } }]
|
||||||
|
[['node2:9c36dd0f-151a-cb42-cbad-fa2f851f9ab7'], { subgraphNode2: { bar: 'hi! foobaz' } }]
|
||||||
|
[[], { node2: { foo: 'hi! foobaz' } }]
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
??? example "Full example: different state schemas (two levels of subgraphs)"
|
??? example "Full example: different state schemas (two levels of subgraphs)"
|
||||||
|
|
||||||
This is an example with two levels of subgraphs: parent -> child -> grandchild.
|
This is an example with two levels of subgraphs: parent -> child -> grandchild.
|
||||||
|
|
||||||
|
:::python
|
||||||
```python
|
```python
|
||||||
# Grandchild graph
|
# Grandchild graph
|
||||||
from typing_extensions import TypedDict
|
from typing_extensions import TypedDict
|
||||||
@@ -288,14 +488,102 @@ graph = builder.compile()
|
|||||||
((), {'child': {'my_key': 'hi Bob, how are you today?'}})
|
((), {'child': {'my_key': 'hi Bob, how are you today?'}})
|
||||||
((), {'parent_2': {'my_key': 'hi Bob, how are you today? bye!'}})
|
((), {'parent_2': {'my_key': 'hi Bob, how are you today? bye!'}})
|
||||||
```
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
```typescript
|
||||||
|
import { StateGraph, START, END } from "@langchain/langgraph";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
// Grandchild graph
|
||||||
|
const GrandChildState = z.object({
|
||||||
|
myGrandchildKey: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const grandchild = new StateGraph(GrandChildState)
|
||||||
|
.addNode("grandchild1", (state) => {
|
||||||
|
// NOTE: child or parent keys will not be accessible here
|
||||||
|
return { myGrandchildKey: state.myGrandchildKey + ", how are you" };
|
||||||
|
})
|
||||||
|
.addEdge(START, "grandchild1")
|
||||||
|
.addEdge("grandchild1", END);
|
||||||
|
|
||||||
|
const grandchildGraph = grandchild.compile();
|
||||||
|
|
||||||
|
// Child graph
|
||||||
|
const ChildState = z.object({
|
||||||
|
myChildKey: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const child = new StateGraph(ChildState)
|
||||||
|
.addNode("child1", async (state) => {
|
||||||
|
// NOTE: parent or grandchild keys won't be accessible here
|
||||||
|
const grandchildGraphInput = { myGrandchildKey: state.myChildKey }; // (1)!
|
||||||
|
const grandchildGraphOutput = await grandchildGraph.invoke(grandchildGraphInput);
|
||||||
|
return { myChildKey: grandchildGraphOutput.myGrandchildKey + " today?" }; // (2)!
|
||||||
|
}) // (3)!
|
||||||
|
.addEdge(START, "child1")
|
||||||
|
.addEdge("child1", END);
|
||||||
|
|
||||||
|
const childGraph = child.compile();
|
||||||
|
|
||||||
|
// Parent graph
|
||||||
|
const ParentState = z.object({
|
||||||
|
myKey: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const parent = new StateGraph(ParentState)
|
||||||
|
.addNode("parent1", (state) => {
|
||||||
|
// NOTE: child or grandchild keys won't be accessible here
|
||||||
|
return { myKey: "hi " + state.myKey };
|
||||||
|
})
|
||||||
|
.addNode("child", async (state) => {
|
||||||
|
const childGraphInput = { myChildKey: state.myKey }; // (4)!
|
||||||
|
const childGraphOutput = await childGraph.invoke(childGraphInput);
|
||||||
|
return { myKey: childGraphOutput.myChildKey }; // (5)!
|
||||||
|
}) // (6)!
|
||||||
|
.addNode("parent2", (state) => {
|
||||||
|
return { myKey: state.myKey + " bye!" };
|
||||||
|
})
|
||||||
|
.addEdge(START, "parent1")
|
||||||
|
.addEdge("parent1", "child")
|
||||||
|
.addEdge("child", "parent2")
|
||||||
|
.addEdge("parent2", END);
|
||||||
|
|
||||||
|
const parentGraph = parent.compile();
|
||||||
|
|
||||||
|
for await (const chunk of await parentGraph.stream(
|
||||||
|
{ myKey: "Bob" },
|
||||||
|
{ subgraphs: true }
|
||||||
|
)) {
|
||||||
|
console.log(chunk);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
7. We're transforming the state from the child state channels (`myChildKey`) to the grandchild state channels (`myGrandchildKey`)
|
||||||
|
8. We're transforming the state from the grandchild state channels (`myGrandchildKey`) back to the child state channels (`myChildKey`)
|
||||||
|
9. We're passing a function here instead of just compiled graph (`grandchildGraph`)
|
||||||
|
10. We're transforming the state from the parent state channels (`myKey`) to the child state channels (`myChildKey`)
|
||||||
|
11. We're transforming the state from the child state channels (`myChildKey`) back to the parent state channels (`myKey`)
|
||||||
|
12. We're passing a function here instead of just a compiled graph (`childGraph`)
|
||||||
|
|
||||||
|
```
|
||||||
|
[[], { parent1: { myKey: 'hi Bob' } }]
|
||||||
|
[['child:2e26e9ce-602f-862c-aa66-1ea5a4655e3b', 'child1:781bb3b1-3971-84ce-810b-acf819a03f9c'], { grandchild1: { myGrandchildKey: 'hi Bob, how are you' } }]
|
||||||
|
[['child:2e26e9ce-602f-862c-aa66-1ea5a4655e3b'], { child1: { myChildKey: 'hi Bob, how are you today?' } }]
|
||||||
|
[[], { child: { myKey: 'hi Bob, how are you today?' } }]
|
||||||
|
[[], { parent2: { myKey: 'hi Bob, how are you today? bye!' } }]
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
## Add persistence
|
## Add persistence
|
||||||
|
|
||||||
You only need to **provide the checkpointer when compiling the parent graph**. LangGraph will automatically propagate the checkpointer to the child subgraphs.
|
You only need to **provide the checkpointer when compiling the parent graph**. LangGraph will automatically propagate the checkpointer to the child subgraphs.
|
||||||
|
|
||||||
|
:::python
|
||||||
```python
|
```python
|
||||||
from langgraph.graph import START, StateGraph
|
from langgraph.graph import START, StateGraph
|
||||||
from langgraph.checkpoint.memory import InMemorySaver
|
from langgraph.checkpoint.memory import MemorySaver
|
||||||
from typing_extensions import TypedDict
|
from typing_extensions import TypedDict
|
||||||
|
|
||||||
class State(TypedDict):
|
class State(TypedDict):
|
||||||
@@ -317,20 +605,66 @@ builder = StateGraph(State)
|
|||||||
builder.add_node("node_1", subgraph)
|
builder.add_node("node_1", subgraph)
|
||||||
builder.add_edge(START, "node_1")
|
builder.add_edge(START, "node_1")
|
||||||
|
|
||||||
checkpointer = InMemorySaver()
|
checkpointer = MemorySaver()
|
||||||
graph = builder.compile(checkpointer=checkpointer)
|
graph = builder.compile(checkpointer=checkpointer)
|
||||||
```
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
If you want the subgraph to **have its own memory**, you can compile it `with checkpointer=True`. This is useful in [multi-agent](../concepts/multi_agent.md) systems, if you want agents to keep track of their internal message histories:
|
:::js
|
||||||
|
```typescript
|
||||||
|
import { StateGraph, START, MemorySaver } from "@langchain/langgraph";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
const State = z.object({
|
||||||
|
foo: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Subgraph
|
||||||
|
const subgraphBuilder = new StateGraph(State)
|
||||||
|
.addNode("subgraphNode1", (state) => {
|
||||||
|
return { foo: state.foo + "bar" };
|
||||||
|
})
|
||||||
|
.addEdge(START, "subgraphNode1");
|
||||||
|
|
||||||
|
const subgraph = subgraphBuilder.compile();
|
||||||
|
|
||||||
|
// Parent graph
|
||||||
|
const builder = new StateGraph(State)
|
||||||
|
.addNode("node1", subgraph)
|
||||||
|
.addEdge(START, "node1");
|
||||||
|
|
||||||
|
const checkpointer = new MemorySaver();
|
||||||
|
const graph = builder.compile({ checkpointer });
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
If you want the subgraph to **have its own memory**, you can compile it with the appropriate checkpointer option. This is useful in [multi-agent](../concepts/multi_agent.md) systems, if you want agents to keep track of their internal message histories:
|
||||||
|
|
||||||
|
:::python
|
||||||
```python
|
```python
|
||||||
subgraph_builder = StateGraph(...)
|
subgraph_builder = StateGraph(...)
|
||||||
subgraph = subgraph_builder.compile(checkpointer=True)
|
subgraph = subgraph_builder.compile(checkpointer=True)
|
||||||
```
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
```typescript
|
||||||
|
const subgraphBuilder = new StateGraph(...)
|
||||||
|
const subgraph = subgraphBuilder.compile({ checkpointer: true });
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
## View subgraph state
|
## View subgraph state
|
||||||
|
|
||||||
When you enable [persistence](../concepts/persistence.md), you can [inspect the graph state](../concepts/persistence.md#checkpoints) (checkpoint) via `graph.get_state(config)`. To view the subgraph state, you can use `graph.get_state(config, subgraphs=True)`.
|
When you enable [persistence](../concepts/persistence.md), you can [inspect the graph state](../concepts/persistence.md#checkpoints) (checkpoint) via the appropriate method. To view the subgraph state, you can use the subgraphs option.
|
||||||
|
|
||||||
|
:::python
|
||||||
|
You can inspect the graph state via `graph.get_state(config)`. To view the subgraph state, you can use `graph.get_state(config, subgraphs=True)`.
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
You can inspect the graph state via `graph.getState(config)`. To view the subgraph state, you can use `graph.getState(config, { subgraphs: true })`.
|
||||||
|
:::
|
||||||
|
|
||||||
!!! important "Available **only** when interrupted"
|
!!! important "Available **only** when interrupted"
|
||||||
|
|
||||||
@@ -338,9 +672,10 @@ When you enable [persistence](../concepts/persistence.md), you can [inspect the
|
|||||||
|
|
||||||
??? example "View interrupted subgraph state"
|
??? example "View interrupted subgraph state"
|
||||||
|
|
||||||
|
:::python
|
||||||
```python
|
```python
|
||||||
from langgraph.graph import START, StateGraph
|
from langgraph.graph import START, StateGraph
|
||||||
from langgraph.checkpoint.memory import InMemorySaver
|
from langgraph.checkpoint.memory import MemorySaver
|
||||||
from langgraph.types import interrupt, Command
|
from langgraph.types import interrupt, Command
|
||||||
from typing_extensions import TypedDict
|
from typing_extensions import TypedDict
|
||||||
|
|
||||||
@@ -365,7 +700,7 @@ When you enable [persistence](../concepts/persistence.md), you can [inspect the
|
|||||||
builder.add_node("node_1", subgraph)
|
builder.add_node("node_1", subgraph)
|
||||||
builder.add_edge(START, "node_1")
|
builder.add_edge(START, "node_1")
|
||||||
|
|
||||||
checkpointer = InMemorySaver()
|
checkpointer = MemorySaver()
|
||||||
graph = builder.compile(checkpointer=checkpointer)
|
graph = builder.compile(checkpointer=checkpointer)
|
||||||
|
|
||||||
config = {"configurable": {"thread_id": "1"}}
|
config = {"configurable": {"thread_id": "1"}}
|
||||||
@@ -379,11 +714,53 @@ When you enable [persistence](../concepts/persistence.md), you can [inspect the
|
|||||||
```
|
```
|
||||||
|
|
||||||
1. This will be available only when the subgraph is interrupted. Once you resume the graph, you won't be able to access the subgraph state.
|
1. This will be available only when the subgraph is interrupted. Once you resume the graph, you won't be able to access the subgraph state.
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
```typescript
|
||||||
|
import { StateGraph, START, MemorySaver, interrupt, Command } from "@langchain/langgraph";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
const State = z.object({
|
||||||
|
foo: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Subgraph
|
||||||
|
const subgraphBuilder = new StateGraph(State)
|
||||||
|
.addNode("subgraphNode1", (state) => {
|
||||||
|
const value = interrupt("Provide value:");
|
||||||
|
return { foo: state.foo + value };
|
||||||
|
})
|
||||||
|
.addEdge(START, "subgraphNode1");
|
||||||
|
|
||||||
|
const subgraph = subgraphBuilder.compile();
|
||||||
|
|
||||||
|
// Parent graph
|
||||||
|
const builder = new StateGraph(State)
|
||||||
|
.addNode("node1", subgraph)
|
||||||
|
.addEdge(START, "node1");
|
||||||
|
|
||||||
|
const checkpointer = new MemorySaver();
|
||||||
|
const graph = builder.compile({ checkpointer });
|
||||||
|
|
||||||
|
const config = { configurable: { thread_id: "1" } };
|
||||||
|
|
||||||
|
await graph.invoke({ foo: "" }, config);
|
||||||
|
const parentState = await graph.getState(config);
|
||||||
|
const subgraphState = (await graph.getState(config, { subgraphs: true })).tasks[0].state; // (1)!
|
||||||
|
|
||||||
|
// resume the subgraph
|
||||||
|
await graph.invoke(new Command({ resume: "bar" }), config);
|
||||||
|
```
|
||||||
|
|
||||||
|
2. This will be available only when the subgraph is interrupted. Once you resume the graph, you won't be able to access the subgraph state.
|
||||||
|
:::
|
||||||
|
|
||||||
## Stream subgraph outputs
|
## Stream subgraph outputs
|
||||||
|
|
||||||
To include outputs from subgraphs in the streamed outputs, you can set `subgraphs=True` in the `.stream()` method of the parent graph. This will stream outputs from both the parent graph and any subgraphs.
|
To include outputs from subgraphs in the streamed outputs, you can set the subgraphs option in the stream method of the parent graph. This will stream outputs from both the parent graph and any subgraphs.
|
||||||
|
|
||||||
|
:::python
|
||||||
```python
|
```python
|
||||||
for chunk in graph.stream(
|
for chunk in graph.stream(
|
||||||
{"foo": "foo"},
|
{"foo": "foo"},
|
||||||
@@ -394,9 +771,27 @@ for chunk in graph.stream(
|
|||||||
```
|
```
|
||||||
|
|
||||||
1. Set `subgraphs=True` to stream outputs from subgraphs.
|
1. Set `subgraphs=True` to stream outputs from subgraphs.
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
```typescript
|
||||||
|
for await (const chunk of await graph.stream(
|
||||||
|
{ foo: "foo" },
|
||||||
|
{
|
||||||
|
subgraphs: true, // (1)!
|
||||||
|
streamMode: "updates",
|
||||||
|
}
|
||||||
|
)) {
|
||||||
|
console.log(chunk);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Set `subgraphs: true` to stream outputs from subgraphs.
|
||||||
|
:::
|
||||||
|
|
||||||
??? example "Stream from subgraphs"
|
??? example "Stream from subgraphs"
|
||||||
|
|
||||||
|
:::python
|
||||||
```python
|
```python
|
||||||
from typing_extensions import TypedDict
|
from typing_extensions import TypedDict
|
||||||
from langgraph.graph.state import StateGraph, START
|
from langgraph.graph.state import StateGraph, START
|
||||||
@@ -450,4 +845,66 @@ for chunk in graph.stream(
|
|||||||
(('node_2:e58e5673-a661-ebb0-70d4-e298a7fc28b7',), {'subgraph_node_1': {'bar': 'bar'}})
|
(('node_2:e58e5673-a661-ebb0-70d4-e298a7fc28b7',), {'subgraph_node_1': {'bar': 'bar'}})
|
||||||
(('node_2:e58e5673-a661-ebb0-70d4-e298a7fc28b7',), {'subgraph_node_2': {'foo': 'hi! foobar'}})
|
(('node_2:e58e5673-a661-ebb0-70d4-e298a7fc28b7',), {'subgraph_node_2': {'foo': 'hi! foobar'}})
|
||||||
((), {'node_2': {'foo': 'hi! foobar'}})
|
((), {'node_2': {'foo': 'hi! foobar'}})
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::js
|
||||||
|
```typescript
|
||||||
|
import { StateGraph, START } from "@langchain/langgraph";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
// Define subgraph
|
||||||
|
const SubgraphState = z.object({
|
||||||
|
foo: z.string(),
|
||||||
|
bar: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const subgraphBuilder = new StateGraph(SubgraphState)
|
||||||
|
.addNode("subgraphNode1", (state) => {
|
||||||
|
return { bar: "bar" };
|
||||||
|
})
|
||||||
|
.addNode("subgraphNode2", (state) => {
|
||||||
|
// note that this node is using a state key ('bar') that is only available in the subgraph
|
||||||
|
// and is sending update on the shared state key ('foo')
|
||||||
|
return { foo: state.foo + state.bar };
|
||||||
|
})
|
||||||
|
.addEdge(START, "subgraphNode1")
|
||||||
|
.addEdge("subgraphNode1", "subgraphNode2");
|
||||||
|
|
||||||
|
const subgraph = subgraphBuilder.compile();
|
||||||
|
|
||||||
|
// Define parent graph
|
||||||
|
const ParentState = z.object({
|
||||||
|
foo: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const builder = new StateGraph(ParentState)
|
||||||
|
.addNode("node1", (state) => {
|
||||||
|
return { foo: "hi! " + state.foo };
|
||||||
|
})
|
||||||
|
.addNode("node2", subgraph)
|
||||||
|
.addEdge(START, "node1")
|
||||||
|
.addEdge("node1", "node2");
|
||||||
|
|
||||||
|
const graph = builder.compile();
|
||||||
|
|
||||||
|
for await (const chunk of await graph.stream(
|
||||||
|
{ foo: "foo" },
|
||||||
|
{
|
||||||
|
streamMode: "updates",
|
||||||
|
subgraphs: true, // (1)!
|
||||||
|
}
|
||||||
|
)) {
|
||||||
|
console.log(chunk);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Set `subgraphs: true` to stream outputs from subgraphs.
|
||||||
|
|
||||||
|
```
|
||||||
|
[[], { node1: { foo: 'hi! foo' } }]
|
||||||
|
[['node2:e58e5673-a661-ebb0-70d4-e298a7fc28b7'], { subgraphNode1: { bar: 'bar' } }]
|
||||||
|
[['node2:e58e5673-a661-ebb0-70d4-e298a7fc28b7'], { subgraphNode2: { foo: 'hi! foobar' } }]
|
||||||
|
[[], { node2: { foo: 'hi! foobar' } }]
|
||||||
|
```
|
||||||
|
:::
|
||||||
@@ -360,5 +360,5 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block announce %}
|
{% block announce %}
|
||||||
<strong>LangGraph Platform docs have moved!</strong> Find the LangGraph Platform docs at the new <a href="https://docs.langchain.com/langgraph-platform" target="_blank">LangChain Docs</a> site.
|
Our new LangChain Academy Course Deep Research with LangGraph is now live! <a href="https://academy.langchain.com/courses/deep-research-with-langgraph/?utm_medium=internal&utm_source=docs&utm_campaign=q3-2025_deep-research-course_co" target="_blank">Enroll for free</a>.
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -161,9 +161,7 @@ class TestRedisCache:
|
|||||||
async def test_async_operations(self):
|
async def test_async_operations(self):
|
||||||
"""Test async set and get operations with sync Redis client."""
|
"""Test async set and get operations with sync Redis client."""
|
||||||
# Create sync Redis client and cache (like main integration tests)
|
# Create sync Redis client and cache (like main integration tests)
|
||||||
client = redis.Redis(
|
client = redis.Redis(host="localhost", port=6379, db=1, decode_responses=False)
|
||||||
host="localhost", port=6379, db=1, decode_responses=False
|
|
||||||
)
|
|
||||||
try:
|
try:
|
||||||
client.ping()
|
client.ping()
|
||||||
except Exception:
|
except Exception:
|
||||||
@@ -189,9 +187,7 @@ class TestRedisCache:
|
|||||||
async def test_async_clear(self):
|
async def test_async_clear(self):
|
||||||
"""Test async clear operations with sync Redis client."""
|
"""Test async clear operations with sync Redis client."""
|
||||||
# Create sync Redis client and cache (like main integration tests)
|
# Create sync Redis client and cache (like main integration tests)
|
||||||
client = redis.Redis(
|
client = redis.Redis(host="localhost", port=6379, db=1, decode_responses=False)
|
||||||
host="localhost", port=6379, db=1, decode_responses=False
|
|
||||||
)
|
|
||||||
try:
|
try:
|
||||||
client.ping()
|
client.ping()
|
||||||
except Exception:
|
except Exception:
|
||||||
|
|||||||
+2
-1
@@ -4,8 +4,9 @@
|
|||||||
# TESTING AND COVERAGE
|
# TESTING AND COVERAGE
|
||||||
######################
|
######################
|
||||||
|
|
||||||
|
TEST?= "tests/unit_tests"
|
||||||
test:
|
test:
|
||||||
uv run pytest tests/unit_tests
|
uv run pytest $(TEST)
|
||||||
test-integration:
|
test-integration:
|
||||||
uv run pytest tests/integration_tests
|
uv run pytest tests/integration_tests
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,3 @@
|
|||||||
OPENAI_API_KEY=placeholder
|
OPENAI_API_KEY=placeholder
|
||||||
ANTHROPIC_API_KEY=placeholder
|
ANTHROPIC_API_KEY=placeholder
|
||||||
TAVILY_API_KEY=placeholder
|
TAVILY_API_KEY=placeholder
|
||||||
LANGCHAIN_TRACING_V2=false
|
|
||||||
LANGCHAIN_ENDPOINT=placeholder
|
|
||||||
LANGCHAIN_API_KEY=placeholder
|
|
||||||
LANGCHAIN_PROJECT=placeholder
|
|
||||||
LANGGRAPH_AUTH_TYPE=noop
|
|
||||||
LANGSMITH_AUTH_ENDPOINT=placeholder
|
|
||||||
LANGSMITH_TENANT_ID=placeholder
|
|
||||||
@@ -163,14 +163,7 @@ def generate_schema():
|
|||||||
|
|
||||||
# Add enum constraint for python_version
|
# Add enum constraint for python_version
|
||||||
if "python_version" in python_schema["properties"]:
|
if "python_version" in python_schema["properties"]:
|
||||||
python_schema["properties"]["python_version"]["enum"] = ["3.11", "3.12"]
|
python_schema["properties"]["python_version"]["enum"] = ["3.11", "3.12", "3.13"]
|
||||||
|
|
||||||
# Add enum constraint for image_distro
|
|
||||||
if "image_distro" in python_schema["properties"]:
|
|
||||||
python_schema["properties"]["image_distro"]["anyOf"] = [
|
|
||||||
{"type": "string", "enum": ["debian", "wolfi"]},
|
|
||||||
{"type": "null"},
|
|
||||||
]
|
|
||||||
|
|
||||||
# Create Node.js schema with node_version
|
# Create Node.js schema with node_version
|
||||||
node_schema = {
|
node_schema = {
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
__version__ = "0.3.8"
|
||||||
|
|||||||
@@ -17,6 +17,9 @@ DEFAULT_PYTHON_VERSION = "3.11"
|
|||||||
DEFAULT_IMAGE_DISTRO = "debian"
|
DEFAULT_IMAGE_DISTRO = "debian"
|
||||||
|
|
||||||
|
|
||||||
|
Distros = Literal["debian", "wolfi", "bullseye", "bookworm"]
|
||||||
|
|
||||||
|
|
||||||
class TTLConfig(TypedDict, total=False):
|
class TTLConfig(TypedDict, total=False):
|
||||||
"""Configuration for TTL (time-to-live) behavior in the store."""
|
"""Configuration for TTL (time-to-live) behavior in the store."""
|
||||||
|
|
||||||
@@ -369,6 +372,13 @@ class Config(TypedDict, total=False):
|
|||||||
Must be >= 20 if provided.
|
Must be >= 20 if provided.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
api_version: Optional[str]
|
||||||
|
"""Optional. Which semantic version of the LangGraph API server to use.
|
||||||
|
|
||||||
|
Defaults to latest. Check the
|
||||||
|
[changelog](https://docs.langchain.com/langgraph-platform/langgraph-server-changelog)
|
||||||
|
for more information."""
|
||||||
|
|
||||||
_INTERNAL_docker_tag: Optional[str]
|
_INTERNAL_docker_tag: Optional[str]
|
||||||
"""Optional. Internal use only.
|
"""Optional. Internal use only.
|
||||||
"""
|
"""
|
||||||
@@ -378,10 +388,11 @@ class Config(TypedDict, total=False):
|
|||||||
|
|
||||||
Defaults to langchain/langgraph-api or langchain/langgraphjs-api."""
|
Defaults to langchain/langgraph-api or langchain/langgraphjs-api."""
|
||||||
|
|
||||||
image_distro: Optional[str]
|
image_distro: Optional[Distros]
|
||||||
"""Optional. Linux distribution for the base image.
|
"""Optional. Linux distribution for the base image.
|
||||||
|
|
||||||
Must be either 'debian' or 'wolfi'. If omitted, defaults to 'debian'.
|
Must be one of 'wolfi', 'debian', 'bullseye', or 'bookworm'.
|
||||||
|
If omitted, defaults to 'debian' ('latest').
|
||||||
"""
|
"""
|
||||||
|
|
||||||
pip_config_file: Optional[str]
|
pip_config_file: Optional[str]
|
||||||
@@ -587,13 +598,28 @@ def validate_config(config: Config) -> Config:
|
|||||||
)
|
)
|
||||||
|
|
||||||
image_distro = config.get("image_distro", DEFAULT_IMAGE_DISTRO)
|
image_distro = config.get("image_distro", DEFAULT_IMAGE_DISTRO)
|
||||||
|
internal_docker_tag = config.get("_INTERNAL_docker_tag")
|
||||||
|
api_version = config.get("api_version")
|
||||||
|
if internal_docker_tag:
|
||||||
|
if api_version:
|
||||||
|
raise click.UsageError(
|
||||||
|
"Cannot specify both _INTERNAL_docker_tag and api_version."
|
||||||
|
)
|
||||||
|
if api_version:
|
||||||
|
try:
|
||||||
|
parts = tuple(map(int, api_version.split("-")[0].split(".")))
|
||||||
|
if len(parts) > 3:
|
||||||
|
raise ValueError(
|
||||||
|
"Version must be major or major.minor or major.minor.patch."
|
||||||
|
)
|
||||||
|
except TypeError:
|
||||||
|
raise click.UsageError(f"Invalid version format: {api_version}") from None
|
||||||
|
|
||||||
config = {
|
config = {
|
||||||
"node_version": node_version,
|
"node_version": node_version,
|
||||||
"python_version": python_version,
|
"python_version": python_version,
|
||||||
"pip_config_file": config.get("pip_config_file"),
|
"pip_config_file": config.get("pip_config_file"),
|
||||||
"pip_installer": config.get("pip_installer", "auto"),
|
"pip_installer": config.get("pip_installer", "auto"),
|
||||||
"_INTERNAL_docker_tag": config.get("_INTERNAL_docker_tag"),
|
|
||||||
"base_image": config.get("base_image"),
|
"base_image": config.get("base_image"),
|
||||||
"image_distro": image_distro,
|
"image_distro": image_distro,
|
||||||
"dependencies": config.get("dependencies", []),
|
"dependencies": config.get("dependencies", []),
|
||||||
@@ -608,6 +634,10 @@ def validate_config(config: Config) -> Config:
|
|||||||
"ui_config": config.get("ui_config"),
|
"ui_config": config.get("ui_config"),
|
||||||
"keep_pkg_tools": config.get("keep_pkg_tools"),
|
"keep_pkg_tools": config.get("keep_pkg_tools"),
|
||||||
}
|
}
|
||||||
|
if internal_docker_tag:
|
||||||
|
config["_INTERNAL_docker_tag"] = internal_docker_tag
|
||||||
|
if api_version:
|
||||||
|
config["api_version"] = api_version
|
||||||
|
|
||||||
if config.get("node_version"):
|
if config.get("node_version"):
|
||||||
node_version = config["node_version"]
|
node_version = config["node_version"]
|
||||||
@@ -644,17 +674,17 @@ def validate_config(config: Config) -> Config:
|
|||||||
"Add at least one dependency to 'dependencies' list."
|
"Add at least one dependency to 'dependencies' list."
|
||||||
)
|
)
|
||||||
|
|
||||||
if not config["graphs"]:
|
if not config.get("graphs"):
|
||||||
raise click.UsageError(
|
raise click.UsageError(
|
||||||
"No graphs found in config. Add at least one graph to 'graphs' dictionary."
|
"No graphs found in config. Add at least one graph to 'graphs' dictionary."
|
||||||
)
|
)
|
||||||
|
|
||||||
# Validate image_distro config
|
# Validate image_distro config
|
||||||
if image_distro := config.get("image_distro"):
|
if image_distro := config.get("image_distro"):
|
||||||
if image_distro not in ["debian", "wolfi"]:
|
if image_distro not in Distros.__args__:
|
||||||
raise click.UsageError(
|
raise click.UsageError(
|
||||||
f"Invalid image_distro: '{image_distro}'. "
|
f"Invalid image_distro: '{image_distro}'. "
|
||||||
"Must be either 'debian' or 'wolfi'."
|
"Must be one of 'debian', 'bullseye', or 'bookworm'."
|
||||||
)
|
)
|
||||||
|
|
||||||
if pip_installer := config.get("pip_installer"):
|
if pip_installer := config.get("pip_installer"):
|
||||||
@@ -1465,6 +1495,7 @@ def docker_tag(
|
|||||||
base_image: Optional[str] = None,
|
base_image: Optional[str] = None,
|
||||||
api_version: Optional[str] = None,
|
api_version: Optional[str] = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
|
api_version = api_version or config.get("api_version")
|
||||||
base_image = base_image or default_base_image(config)
|
base_image = base_image or default_base_image(config)
|
||||||
|
|
||||||
image_distro = config.get("image_distro")
|
image_distro = config.get("image_distro")
|
||||||
@@ -1473,9 +1504,6 @@ def docker_tag(
|
|||||||
if config.get("_INTERNAL_docker_tag"):
|
if config.get("_INTERNAL_docker_tag"):
|
||||||
return f"{base_image}:{config['_INTERNAL_docker_tag']}"
|
return f"{base_image}:{config['_INTERNAL_docker_tag']}"
|
||||||
|
|
||||||
if "/langgraph-server" in base_image:
|
|
||||||
return f"{base_image}-py{config['python_version']}"
|
|
||||||
|
|
||||||
# Build the standard tag format
|
# Build the standard tag format
|
||||||
language, version = None, None
|
language, version = None, None
|
||||||
if config.get("node_version") and not config.get("python_version"):
|
if config.get("node_version") and not config.get("python_version"):
|
||||||
@@ -1488,6 +1516,8 @@ def docker_tag(
|
|||||||
# Prepend API version if provided
|
# Prepend API version if provided
|
||||||
if api_version:
|
if api_version:
|
||||||
full_tag = f"{api_version}-{language}{version_distro_tag}"
|
full_tag = f"{api_version}-{language}{version_distro_tag}"
|
||||||
|
elif "/langgraph-server" in base_image and version_distro_tag not in base_image:
|
||||||
|
return f"{base_image}-{language}{version_distro_tag}"
|
||||||
else:
|
else:
|
||||||
full_tag = version_distro_tag
|
full_tag = version_distro_tag
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "langgraph-cli"
|
name = "langgraph-cli"
|
||||||
version = "0.3.6"
|
dynamic = ["version"]
|
||||||
description = "CLI for interacting with LangGraph API"
|
description = "CLI for interacting with LangGraph API"
|
||||||
authors = []
|
authors = []
|
||||||
requires-python = ">=3.9"
|
requires-python = ">=3.9"
|
||||||
@@ -15,11 +15,12 @@ dependencies = [
|
|||||||
"click>=8.1.7",
|
"click>=8.1.7",
|
||||||
"langgraph-sdk>=0.1.0 ; python_version >= '3.11'",
|
"langgraph-sdk>=0.1.0 ; python_version >= '3.11'",
|
||||||
]
|
]
|
||||||
|
[tool.hatch.version]
|
||||||
|
path = "langgraph_cli/__init__.py"
|
||||||
[project.optional-dependencies]
|
[project.optional-dependencies]
|
||||||
inmem = [
|
inmem = [
|
||||||
"langgraph-api>=0.2.67,<0.3.0 ; python_version >= '3.11'",
|
"langgraph-api>=0.2.120,<0.4.0 ; python_version >= '3.11'",
|
||||||
"langgraph-runtime-inmem>=0.6.0 ; python_version >= '3.11'",
|
"langgraph-runtime-inmem>=0.6.8 ; python_version >= '3.11'",
|
||||||
"python-dotenv>=0.8.0",
|
"python-dotenv>=0.8.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,8 @@
|
|||||||
"description": "Optional. Python version in 'major.minor' format (e.g. '3.11').\nMust be at least 3.11 or greater for this deployment to function properly.\n",
|
"description": "Optional. Python version in 'major.minor' format (e.g. '3.11').\nMust be at least 3.11 or greater for this deployment to function properly.\n",
|
||||||
"enum": [
|
"enum": [
|
||||||
"3.11",
|
"3.11",
|
||||||
"3.12"
|
"3.12",
|
||||||
|
"3.13"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"pip_config_file": {
|
"pip_config_file": {
|
||||||
@@ -40,6 +41,17 @@
|
|||||||
],
|
],
|
||||||
"description": "Optional. Internal use only.\n"
|
"description": "Optional. Internal use only.\n"
|
||||||
},
|
},
|
||||||
|
"api_version": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Optional. Which semantic version of the LangGraph API server to use.\n\nDefaults to latest. Check the\nfor more information.\n"
|
||||||
|
},
|
||||||
"auth": {
|
"auth": {
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
{
|
{
|
||||||
@@ -122,8 +134,9 @@
|
|||||||
"image_distro": {
|
"image_distro": {
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
{
|
{
|
||||||
"type": "string",
|
|
||||||
"enum": [
|
"enum": [
|
||||||
|
"bookworm",
|
||||||
|
"bullseye",
|
||||||
"debian",
|
"debian",
|
||||||
"wolfi"
|
"wolfi"
|
||||||
]
|
]
|
||||||
@@ -132,7 +145,7 @@
|
|||||||
"type": "null"
|
"type": "null"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"description": "Optional. Linux distribution for the base image.\n\nMust be either 'debian' or 'wolfi'. If omitted, defaults to 'debian'.\n"
|
"description": "Optional. Linux distribution for the base image.\n\nMust be one of 'wolfi', 'debian', 'bullseye', or 'bookworm'.\nIf omitted, defaults to 'debian' ('latest').\n"
|
||||||
},
|
},
|
||||||
"keep_pkg_tools": {
|
"keep_pkg_tools": {
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
@@ -221,6 +234,17 @@
|
|||||||
],
|
],
|
||||||
"description": "Optional. Internal use only.\n"
|
"description": "Optional. Internal use only.\n"
|
||||||
},
|
},
|
||||||
|
"api_version": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Optional. Which semantic version of the LangGraph API server to use.\n\nDefaults to latest. Check the\nfor more information.\n"
|
||||||
|
},
|
||||||
"auth": {
|
"auth": {
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
{
|
{
|
||||||
@@ -313,7 +337,7 @@
|
|||||||
"type": "null"
|
"type": "null"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"description": "Optional. Linux distribution for the base image.\n\nMust be either 'debian' or 'wolfi'. If omitted, defaults to 'debian'.\n"
|
"description": "Optional. Linux distribution for the base image.\n\nMust be one of 'wolfi', 'debian', 'bullseye', or 'bookworm'.\nIf omitted, defaults to 'debian' ('latest').\n"
|
||||||
},
|
},
|
||||||
"keep_pkg_tools": {
|
"keep_pkg_tools": {
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
|
|||||||
@@ -15,7 +15,8 @@
|
|||||||
"description": "Optional. Python version in 'major.minor' format (e.g. '3.11').\nMust be at least 3.11 or greater for this deployment to function properly.\n",
|
"description": "Optional. Python version in 'major.minor' format (e.g. '3.11').\nMust be at least 3.11 or greater for this deployment to function properly.\n",
|
||||||
"enum": [
|
"enum": [
|
||||||
"3.11",
|
"3.11",
|
||||||
"3.12"
|
"3.12",
|
||||||
|
"3.13"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"pip_config_file": {
|
"pip_config_file": {
|
||||||
@@ -40,6 +41,17 @@
|
|||||||
],
|
],
|
||||||
"description": "Optional. Internal use only.\n"
|
"description": "Optional. Internal use only.\n"
|
||||||
},
|
},
|
||||||
|
"api_version": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Optional. Which semantic version of the LangGraph API server to use.\n\nDefaults to latest. Check the\nfor more information.\n"
|
||||||
|
},
|
||||||
"auth": {
|
"auth": {
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
{
|
{
|
||||||
@@ -122,8 +134,9 @@
|
|||||||
"image_distro": {
|
"image_distro": {
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
{
|
{
|
||||||
"type": "string",
|
|
||||||
"enum": [
|
"enum": [
|
||||||
|
"bookworm",
|
||||||
|
"bullseye",
|
||||||
"debian",
|
"debian",
|
||||||
"wolfi"
|
"wolfi"
|
||||||
]
|
]
|
||||||
@@ -132,7 +145,7 @@
|
|||||||
"type": "null"
|
"type": "null"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"description": "Optional. Linux distribution for the base image.\n\nMust be either 'debian' or 'wolfi'. If omitted, defaults to 'debian'.\n"
|
"description": "Optional. Linux distribution for the base image.\n\nMust be one of 'wolfi', 'debian', 'bullseye', or 'bookworm'.\nIf omitted, defaults to 'debian' ('latest').\n"
|
||||||
},
|
},
|
||||||
"keep_pkg_tools": {
|
"keep_pkg_tools": {
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
@@ -221,6 +234,17 @@
|
|||||||
],
|
],
|
||||||
"description": "Optional. Internal use only.\n"
|
"description": "Optional. Internal use only.\n"
|
||||||
},
|
},
|
||||||
|
"api_version": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Optional. Which semantic version of the LangGraph API server to use.\n\nDefaults to latest. Check the\nfor more information.\n"
|
||||||
|
},
|
||||||
"auth": {
|
"auth": {
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
{
|
{
|
||||||
@@ -313,7 +337,7 @@
|
|||||||
"type": "null"
|
"type": "null"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"description": "Optional. Linux distribution for the base image.\n\nMust be either 'debian' or 'wolfi'. If omitted, defaults to 'debian'.\n"
|
"description": "Optional. Linux distribution for the base image.\n\nMust be one of 'wolfi', 'debian', 'bullseye', or 'bookworm'.\nIf omitted, defaults to 'debian' ('latest').\n"
|
||||||
},
|
},
|
||||||
"keep_pkg_tools": {
|
"keep_pkg_tools": {
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
|
|||||||
@@ -381,7 +381,9 @@ def test_dockerfile_command_with_base_image() -> None:
|
|||||||
assert save_path.exists()
|
assert save_path.exists()
|
||||||
with open(save_path) as f:
|
with open(save_path) as f:
|
||||||
dockerfile = f.read()
|
dockerfile = f.read()
|
||||||
assert re.match("FROM langchain/langgraph-server:0.2-py3.*", dockerfile)
|
assert re.match("FROM langchain/langgraph-server:0.2-py3.*", dockerfile), (
|
||||||
|
"\n".join(dockerfile.splitlines()[:3])
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_dockerfile_command_with_docker_compose() -> None:
|
def test_dockerfile_command_with_docker_compose() -> None:
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ def test_validate_config():
|
|||||||
}
|
}
|
||||||
actual_config = validate_config(expected_config)
|
actual_config = validate_config(expected_config)
|
||||||
expected_config = {
|
expected_config = {
|
||||||
"_INTERNAL_docker_tag": None,
|
|
||||||
"base_image": None,
|
"base_image": None,
|
||||||
"python_version": "3.11",
|
"python_version": "3.11",
|
||||||
"node_version": None,
|
"node_version": None,
|
||||||
@@ -61,7 +60,6 @@ def test_validate_config():
|
|||||||
# full config
|
# full config
|
||||||
env = ".env"
|
env = ".env"
|
||||||
expected_config = {
|
expected_config = {
|
||||||
"_INTERNAL_docker_tag": None,
|
|
||||||
"base_image": None,
|
"base_image": None,
|
||||||
"python_version": "3.12",
|
"python_version": "3.12",
|
||||||
"node_version": None,
|
"node_version": None,
|
||||||
@@ -190,7 +188,6 @@ def test_validate_config_image_distro():
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
assert "Invalid image_distro: 'ubuntu'" in str(exc_info.value)
|
assert "Invalid image_distro: 'ubuntu'" in str(exc_info.value)
|
||||||
assert "Must be either 'debian' or 'wolfi'" in str(exc_info.value)
|
|
||||||
|
|
||||||
with pytest.raises(click.UsageError) as exc_info:
|
with pytest.raises(click.UsageError) as exc_info:
|
||||||
validate_config(
|
validate_config(
|
||||||
@@ -1339,19 +1336,22 @@ def test_docker_tag_different_node_versions_with_distro():
|
|||||||
assert tag == expected_tag, f"Failed for Node.js {node_version}"
|
assert tag == expected_tag, f"Failed for Node.js {node_version}"
|
||||||
|
|
||||||
|
|
||||||
def test_docker_tag_with_api_version():
|
@pytest.mark.parametrize("in_config", [False, True])
|
||||||
|
def test_docker_tag_with_api_version(in_config: bool):
|
||||||
"""Test docker_tag function with api_version parameter."""
|
"""Test docker_tag function with api_version parameter."""
|
||||||
|
|
||||||
# Test 1: Python config with api_version and default distro
|
# Test 1: Python config with api_version and default distro
|
||||||
|
version = "0.2.74"
|
||||||
config = validate_config(
|
config = validate_config(
|
||||||
{
|
{
|
||||||
"python_version": "3.11",
|
"python_version": "3.11",
|
||||||
"dependencies": ["."],
|
"dependencies": ["."],
|
||||||
"graphs": {"agent": "./agent.py:graph"},
|
"graphs": {"agent": "./agent.py:graph"},
|
||||||
|
"api_version": version if in_config else None,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
tag = docker_tag(config, api_version="0.2.74")
|
tag = docker_tag(config, api_version=version if not in_config else None)
|
||||||
assert tag == "langchain/langgraph-api:0.2.74-py3.11"
|
assert tag == f"langchain/langgraph-api:{version}-py3.11"
|
||||||
|
|
||||||
# Test 2: Python config with api_version and wolfi distro
|
# Test 2: Python config with api_version and wolfi distro
|
||||||
config = validate_config(
|
config = validate_config(
|
||||||
@@ -1360,20 +1360,22 @@ def test_docker_tag_with_api_version():
|
|||||||
"dependencies": ["."],
|
"dependencies": ["."],
|
||||||
"graphs": {"agent": "./agent.py:graph"},
|
"graphs": {"agent": "./agent.py:graph"},
|
||||||
"image_distro": "wolfi",
|
"image_distro": "wolfi",
|
||||||
|
"api_version": version if in_config else None,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
tag = docker_tag(config, api_version="0.2.74")
|
tag = docker_tag(config, api_version=version if not in_config else None)
|
||||||
assert tag == "langchain/langgraph-api:0.2.74-py3.12-wolfi"
|
assert tag == f"langchain/langgraph-api:{version}-py3.12-wolfi"
|
||||||
|
|
||||||
# Test 3: Node.js config with api_version and default distro
|
# Test 3: Node.js config with api_version and default distro
|
||||||
config = validate_config(
|
config = validate_config(
|
||||||
{
|
{
|
||||||
"node_version": "20",
|
"node_version": "20",
|
||||||
"graphs": {"agent": "./agent.js:graph"},
|
"graphs": {"agent": "./agent.js:graph"},
|
||||||
|
"api_version": version if in_config else None,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
tag = docker_tag(config, api_version="0.2.74")
|
tag = docker_tag(config, api_version=version if not in_config else None)
|
||||||
assert tag == "langchain/langgraphjs-api:0.2.74-node20"
|
assert tag == f"langchain/langgraphjs-api:{version}-node20"
|
||||||
|
|
||||||
# Test 4: Node.js config with api_version and wolfi distro
|
# Test 4: Node.js config with api_version and wolfi distro
|
||||||
config = validate_config(
|
config = validate_config(
|
||||||
@@ -1381,10 +1383,11 @@ def test_docker_tag_with_api_version():
|
|||||||
"node_version": "20",
|
"node_version": "20",
|
||||||
"graphs": {"agent": "./agent.js:graph"},
|
"graphs": {"agent": "./agent.js:graph"},
|
||||||
"image_distro": "wolfi",
|
"image_distro": "wolfi",
|
||||||
|
"api_version": version if in_config else None,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
tag = docker_tag(config, api_version="0.2.74")
|
tag = docker_tag(config, api_version=version if not in_config else None)
|
||||||
assert tag == "langchain/langgraphjs-api:0.2.74-node20-wolfi"
|
assert tag == f"langchain/langgraphjs-api:{version}-node20-wolfi"
|
||||||
|
|
||||||
# Test 5: Custom base image with api_version
|
# Test 5: Custom base image with api_version
|
||||||
config = validate_config(
|
config = validate_config(
|
||||||
@@ -1393,10 +1396,15 @@ def test_docker_tag_with_api_version():
|
|||||||
"dependencies": ["."],
|
"dependencies": ["."],
|
||||||
"graphs": {"agent": "./agent.py:graph"},
|
"graphs": {"agent": "./agent.py:graph"},
|
||||||
"base_image": "my-registry/custom-image",
|
"base_image": "my-registry/custom-image",
|
||||||
|
"api_version": version if in_config else None,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
tag = docker_tag(config, base_image="my-registry/custom-image", api_version="1.0.0")
|
tag = docker_tag(
|
||||||
assert tag == "my-registry/custom-image:1.0.0-py3.11"
|
config,
|
||||||
|
base_image="my-registry/custom-image",
|
||||||
|
api_version=version if not in_config else None,
|
||||||
|
)
|
||||||
|
assert tag == f"my-registry/custom-image:{version}-py3.11"
|
||||||
|
|
||||||
# Test 6: api_version with different Python versions
|
# Test 6: api_version with different Python versions
|
||||||
for python_version in ["3.11", "3.12", "3.13"]:
|
for python_version in ["3.11", "3.12", "3.13"]:
|
||||||
@@ -1405,10 +1413,11 @@ def test_docker_tag_with_api_version():
|
|||||||
"python_version": python_version,
|
"python_version": python_version,
|
||||||
"dependencies": ["."],
|
"dependencies": ["."],
|
||||||
"graphs": {"agent": "./agent.py:graph"},
|
"graphs": {"agent": "./agent.py:graph"},
|
||||||
|
"api_version": version if in_config else None,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
tag = docker_tag(config, api_version="0.2.74")
|
tag = docker_tag(config, api_version=version if not in_config else None)
|
||||||
assert tag == f"langchain/langgraph-api:0.2.74-py{python_version}"
|
assert tag == f"langchain/langgraph-api:{version}-py{python_version}"
|
||||||
|
|
||||||
# Test 7: Without api_version should work as before
|
# Test 7: Without api_version should work as before
|
||||||
config = validate_config(
|
config = validate_config(
|
||||||
@@ -1428,10 +1437,11 @@ def test_docker_tag_with_api_version():
|
|||||||
"node_version": "20",
|
"node_version": "20",
|
||||||
"dependencies": ["."],
|
"dependencies": ["."],
|
||||||
"graphs": {"python": "./agent.py:graph", "js": "./agent.js:graph"},
|
"graphs": {"python": "./agent.py:graph", "js": "./agent.js:graph"},
|
||||||
|
"api_version": version if in_config else None,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
tag = docker_tag(config, api_version="0.2.74")
|
tag = docker_tag(config, api_version=version if not in_config else None)
|
||||||
assert tag == "langchain/langgraph-api:0.2.74-py3.11"
|
assert tag == f"langchain/langgraph-api:{version}-py3.11"
|
||||||
|
|
||||||
# Test 9: api_version with _INTERNAL_docker_tag should ignore api_version
|
# Test 9: api_version with _INTERNAL_docker_tag should ignore api_version
|
||||||
config = validate_config(
|
config = validate_config(
|
||||||
@@ -1451,12 +1461,15 @@ def test_docker_tag_with_api_version():
|
|||||||
"python_version": "3.11",
|
"python_version": "3.11",
|
||||||
"dependencies": ["."],
|
"dependencies": ["."],
|
||||||
"graphs": {"agent": "./agent.py:graph"},
|
"graphs": {"agent": "./agent.py:graph"},
|
||||||
|
"api_version": version if in_config else None,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
tag = docker_tag(
|
tag = docker_tag(
|
||||||
config, base_image="langchain/langgraph-server:0.2", api_version="0.2.74"
|
config,
|
||||||
|
base_image="langchain/langgraph-server",
|
||||||
|
api_version=version if not in_config else None,
|
||||||
)
|
)
|
||||||
assert tag == "langchain/langgraph-server:0.2-py3.11"
|
assert tag == f"langchain/langgraph-server:{version}-py3.11"
|
||||||
|
|
||||||
|
|
||||||
def test_config_to_docker_with_api_version():
|
def test_config_to_docker_with_api_version():
|
||||||
|
|||||||
Generated
+350
-317
@@ -18,16 +18,16 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anyio"
|
name = "anyio"
|
||||||
version = "4.9.0"
|
version = "4.10.0"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "idna", marker = "python_full_version >= '3.11'" },
|
{ name = "idna", marker = "python_full_version >= '3.11'" },
|
||||||
{ name = "sniffio", marker = "python_full_version >= '3.11'" },
|
{ name = "sniffio", marker = "python_full_version >= '3.11'" },
|
||||||
{ name = "typing-extensions", marker = "python_full_version >= '3.11' and python_full_version < '3.13'" },
|
{ name = "typing-extensions", marker = "python_full_version >= '3.11' and python_full_version < '3.13'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload-time = "2025-03-17T00:02:54.77Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/f1/b4/636b3b65173d3ce9a38ef5f0522789614e590dab6a8d505340a4efe4c567/anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6", size = 213252, upload-time = "2025-08-04T08:54:26.451Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" },
|
{ url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -53,11 +53,11 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "certifi"
|
name = "certifi"
|
||||||
version = "2025.7.14"
|
version = "2025.8.3"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/b3/76/52c535bcebe74590f296d6c77c86dabf761c41980e1347a2422e4aa2ae41/certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995", size = 163981, upload-time = "2025-07-14T03:29:28.449Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/4f/52/34c6cf5bb9285074dc3531c437b3919e825d976fde097a7a73f79e726d03/certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2", size = 162722, upload-time = "2025-07-14T03:29:26.863Z" },
|
{ url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -131,76 +131,77 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "charset-normalizer"
|
name = "charset-normalizer"
|
||||||
version = "3.4.2"
|
version = "3.4.3"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload-time = "2025-08-09T07:57:28.46Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/95/28/9901804da60055b406e1a1c5ba7aac1276fb77f1dde635aabfc7fd84b8ab/charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", size = 201818, upload-time = "2025-05-02T08:31:46.725Z" },
|
{ url = "https://files.pythonhosted.org/packages/d6/98/f3b8013223728a99b908c9344da3aa04ee6e3fa235f19409033eda92fb78/charset_normalizer-3.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72", size = 207695, upload-time = "2025-08-09T07:55:36.452Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d9/9b/892a8c8af9110935e5adcbb06d9c6fe741b6bb02608c6513983048ba1a18/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", size = 144649, upload-time = "2025-05-02T08:31:48.889Z" },
|
{ url = "https://files.pythonhosted.org/packages/21/40/5188be1e3118c82dcb7c2a5ba101b783822cfb413a0268ed3be0468532de/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe", size = 147153, upload-time = "2025-08-09T07:55:38.467Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/7b/a5/4179abd063ff6414223575e008593861d62abfc22455b5d1a44995b7c101/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", size = 155045, upload-time = "2025-05-02T08:31:50.757Z" },
|
{ url = "https://files.pythonhosted.org/packages/37/60/5d0d74bc1e1380f0b72c327948d9c2aca14b46a9efd87604e724260f384c/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601", size = 160428, upload-time = "2025-08-09T07:55:40.072Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/3b/95/bc08c7dfeddd26b4be8c8287b9bb055716f31077c8b0ea1cd09553794665/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", size = 147356, upload-time = "2025-05-02T08:31:52.634Z" },
|
{ url = "https://files.pythonhosted.org/packages/85/9a/d891f63722d9158688de58d050c59dc3da560ea7f04f4c53e769de5140f5/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c", size = 157627, upload-time = "2025-08-09T07:55:41.706Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a8/2d/7a5b635aa65284bf3eab7653e8b4151ab420ecbae918d3e359d1947b4d61/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", size = 149471, upload-time = "2025-05-02T08:31:56.207Z" },
|
{ url = "https://files.pythonhosted.org/packages/65/1a/7425c952944a6521a9cfa7e675343f83fd82085b8af2b1373a2409c683dc/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2", size = 152388, upload-time = "2025-08-09T07:55:43.262Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ae/38/51fc6ac74251fd331a8cfdb7ec57beba8c23fd5493f1050f71c87ef77ed0/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", size = 151317, upload-time = "2025-05-02T08:31:57.613Z" },
|
{ url = "https://files.pythonhosted.org/packages/f0/c9/a2c9c2a355a8594ce2446085e2ec97fd44d323c684ff32042e2a6b718e1d/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0", size = 150077, upload-time = "2025-08-09T07:55:44.903Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/b7/17/edee1e32215ee6e9e46c3e482645b46575a44a2d72c7dfd49e49f60ce6bf/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", size = 146368, upload-time = "2025-05-02T08:31:59.468Z" },
|
{ url = "https://files.pythonhosted.org/packages/3b/38/20a1f44e4851aa1c9105d6e7110c9d020e093dfa5836d712a5f074a12bf7/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0", size = 161631, upload-time = "2025-08-09T07:55:46.346Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/26/2c/ea3e66f2b5f21fd00b2825c94cafb8c326ea6240cd80a91eb09e4a285830/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", size = 154491, upload-time = "2025-05-02T08:32:01.219Z" },
|
{ url = "https://files.pythonhosted.org/packages/a4/fa/384d2c0f57edad03d7bec3ebefb462090d8905b4ff5a2d2525f3bb711fac/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0", size = 159210, upload-time = "2025-08-09T07:55:47.539Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/52/47/7be7fa972422ad062e909fd62460d45c3ef4c141805b7078dbab15904ff7/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", size = 157695, upload-time = "2025-05-02T08:32:03.045Z" },
|
{ url = "https://files.pythonhosted.org/packages/33/9e/eca49d35867ca2db336b6ca27617deed4653b97ebf45dfc21311ce473c37/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a", size = 153739, upload-time = "2025-08-09T07:55:48.744Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2f/42/9f02c194da282b2b340f28e5fb60762de1151387a36842a92b533685c61e/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", size = 154849, upload-time = "2025-05-02T08:32:04.651Z" },
|
{ url = "https://files.pythonhosted.org/packages/2a/91/26c3036e62dfe8de8061182d33be5025e2424002125c9500faff74a6735e/charset_normalizer-3.4.3-cp310-cp310-win32.whl", hash = "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f", size = 99825, upload-time = "2025-08-09T07:55:50.305Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/67/44/89cacd6628f31fb0b63201a618049be4be2a7435a31b55b5eb1c3674547a/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", size = 150091, upload-time = "2025-05-02T08:32:06.719Z" },
|
{ url = "https://files.pythonhosted.org/packages/e2/c6/f05db471f81af1fa01839d44ae2a8bfeec8d2a8b4590f16c4e7393afd323/charset_normalizer-3.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669", size = 107452, upload-time = "2025-08-09T07:55:51.461Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/1f/79/4b8da9f712bc079c0f16b6d67b099b0b8d808c2292c937f267d816ec5ecc/charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", size = 98445, upload-time = "2025-05-02T08:32:08.66Z" },
|
{ url = "https://files.pythonhosted.org/packages/7f/b5/991245018615474a60965a7c9cd2b4efbaabd16d582a5547c47ee1c7730b/charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b", size = 204483, upload-time = "2025-08-09T07:55:53.12Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/7d/d7/96970afb4fb66497a40761cdf7bd4f6fca0fc7bafde3a84f836c1f57a926/charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", size = 105782, upload-time = "2025-05-02T08:32:10.46Z" },
|
{ url = "https://files.pythonhosted.org/packages/c7/2a/ae245c41c06299ec18262825c1569c5d3298fc920e4ddf56ab011b417efd/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64", size = 145520, upload-time = "2025-08-09T07:55:54.712Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload-time = "2025-05-02T08:32:11.945Z" },
|
{ url = "https://files.pythonhosted.org/packages/3a/a4/b3b6c76e7a635748c4421d2b92c7b8f90a432f98bda5082049af37ffc8e3/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91", size = 158876, upload-time = "2025-08-09T07:55:56.024Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload-time = "2025-05-02T08:32:13.946Z" },
|
{ url = "https://files.pythonhosted.org/packages/e2/e6/63bb0e10f90a8243c5def74b5b105b3bbbfb3e7bb753915fe333fb0c11ea/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f", size = 156083, upload-time = "2025-08-09T07:55:57.582Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload-time = "2025-05-02T08:32:15.873Z" },
|
{ url = "https://files.pythonhosted.org/packages/87/df/b7737ff046c974b183ea9aa111b74185ac8c3a326c6262d413bd5a1b8c69/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07", size = 150295, upload-time = "2025-08-09T07:55:59.147Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload-time = "2025-05-02T08:32:17.283Z" },
|
{ url = "https://files.pythonhosted.org/packages/61/f1/190d9977e0084d3f1dc169acd060d479bbbc71b90bf3e7bf7b9927dec3eb/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30", size = 148379, upload-time = "2025-08-09T07:56:00.364Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload-time = "2025-05-02T08:32:18.807Z" },
|
{ url = "https://files.pythonhosted.org/packages/4c/92/27dbe365d34c68cfe0ca76f1edd70e8705d82b378cb54ebbaeabc2e3029d/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14", size = 160018, upload-time = "2025-08-09T07:56:01.678Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload-time = "2025-05-02T08:32:20.333Z" },
|
{ url = "https://files.pythonhosted.org/packages/99/04/baae2a1ea1893a01635d475b9261c889a18fd48393634b6270827869fa34/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c", size = 157430, upload-time = "2025-08-09T07:56:02.87Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload-time = "2025-05-02T08:32:21.86Z" },
|
{ url = "https://files.pythonhosted.org/packages/2f/36/77da9c6a328c54d17b960c89eccacfab8271fdaaa228305330915b88afa9/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae", size = 151600, upload-time = "2025-08-09T07:56:04.089Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload-time = "2025-05-02T08:32:23.434Z" },
|
{ url = "https://files.pythonhosted.org/packages/64/d4/9eb4ff2c167edbbf08cdd28e19078bf195762e9bd63371689cab5ecd3d0d/charset_normalizer-3.4.3-cp311-cp311-win32.whl", hash = "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849", size = 99616, upload-time = "2025-08-09T07:56:05.658Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload-time = "2025-05-02T08:32:24.993Z" },
|
{ url = "https://files.pythonhosted.org/packages/f4/9c/996a4a028222e7761a96634d1820de8a744ff4327a00ada9c8942033089b/charset_normalizer-3.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c", size = 107108, upload-time = "2025-08-09T07:56:07.176Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload-time = "2025-05-02T08:32:26.435Z" },
|
{ url = "https://files.pythonhosted.org/packages/e9/5e/14c94999e418d9b87682734589404a25854d5f5d0408df68bc15b6ff54bb/charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", size = 205655, upload-time = "2025-08-09T07:56:08.475Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload-time = "2025-05-02T08:32:28.376Z" },
|
{ url = "https://files.pythonhosted.org/packages/7d/a8/c6ec5d389672521f644505a257f50544c074cf5fc292d5390331cd6fc9c3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", size = 146223, upload-time = "2025-08-09T07:56:09.708Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload-time = "2025-05-02T08:32:30.281Z" },
|
{ url = "https://files.pythonhosted.org/packages/fc/eb/a2ffb08547f4e1e5415fb69eb7db25932c52a52bed371429648db4d84fb1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", size = 159366, upload-time = "2025-08-09T07:56:11.326Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload-time = "2025-05-02T08:32:32.191Z" },
|
{ url = "https://files.pythonhosted.org/packages/82/10/0fd19f20c624b278dddaf83b8464dcddc2456cb4b02bb902a6da126b87a1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", size = 157104, upload-time = "2025-08-09T07:56:13.014Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload-time = "2025-05-02T08:32:33.712Z" },
|
{ url = "https://files.pythonhosted.org/packages/16/ab/0233c3231af734f5dfcf0844aa9582d5a1466c985bbed6cedab85af9bfe3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", size = 151830, upload-time = "2025-08-09T07:56:14.428Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload-time = "2025-05-02T08:32:35.768Z" },
|
{ url = "https://files.pythonhosted.org/packages/ae/02/e29e22b4e02839a0e4a06557b1999d0a47db3567e82989b5bb21f3fbbd9f/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", size = 148854, upload-time = "2025-08-09T07:56:16.051Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload-time = "2025-05-02T08:32:37.284Z" },
|
{ url = "https://files.pythonhosted.org/packages/05/6b/e2539a0a4be302b481e8cafb5af8792da8093b486885a1ae4d15d452bcec/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", size = 160670, upload-time = "2025-08-09T07:56:17.314Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload-time = "2025-05-02T08:32:38.803Z" },
|
{ url = "https://files.pythonhosted.org/packages/31/e7/883ee5676a2ef217a40ce0bffcc3d0dfbf9e64cbcfbdf822c52981c3304b/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", size = 158501, upload-time = "2025-08-09T07:56:18.641Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload-time = "2025-05-02T08:32:40.251Z" },
|
{ url = "https://files.pythonhosted.org/packages/c1/35/6525b21aa0db614cf8b5792d232021dca3df7f90a1944db934efa5d20bb1/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", size = 153173, upload-time = "2025-08-09T07:56:20.289Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload-time = "2025-05-02T08:32:41.705Z" },
|
{ url = "https://files.pythonhosted.org/packages/50/ee/f4704bad8201de513fdc8aac1cabc87e38c5818c93857140e06e772b5892/charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", size = 99822, upload-time = "2025-08-09T07:56:21.551Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload-time = "2025-05-02T08:32:43.709Z" },
|
{ url = "https://files.pythonhosted.org/packages/39/f5/3b3836ca6064d0992c58c7561c6b6eee1b3892e9665d650c803bd5614522/charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", size = 107543, upload-time = "2025-08-09T07:56:23.115Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload-time = "2025-05-02T08:32:46.197Z" },
|
{ url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326, upload-time = "2025-08-09T07:56:24.721Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload-time = "2025-05-02T08:32:48.105Z" },
|
{ url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008, upload-time = "2025-08-09T07:56:26.004Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload-time = "2025-05-02T08:32:49.719Z" },
|
{ url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196, upload-time = "2025-08-09T07:56:27.25Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload-time = "2025-05-02T08:32:51.404Z" },
|
{ url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819, upload-time = "2025-08-09T07:56:28.515Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload-time = "2025-05-02T08:32:53.079Z" },
|
{ url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350, upload-time = "2025-08-09T07:56:29.716Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload-time = "2025-05-02T08:32:54.573Z" },
|
{ url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644, upload-time = "2025-08-09T07:56:30.984Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" },
|
{ url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468, upload-time = "2025-08-09T07:56:32.252Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" },
|
{ url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187, upload-time = "2025-08-09T07:56:33.481Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" },
|
{ url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699, upload-time = "2025-08-09T07:56:34.739Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" },
|
{ url = "https://files.pythonhosted.org/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580, upload-time = "2025-08-09T07:56:35.981Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" },
|
{ url = "https://files.pythonhosted.org/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366, upload-time = "2025-08-09T07:56:37.339Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" },
|
{ url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload-time = "2025-08-09T07:56:38.687Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" },
|
{ url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload-time = "2025-08-09T07:56:40.048Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" },
|
{ url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload-time = "2025-08-09T07:56:41.311Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" },
|
{ url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload-time = "2025-08-09T07:56:43.195Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" },
|
{ url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload-time = "2025-08-09T07:56:44.819Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" },
|
{ url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload-time = "2025-08-09T07:56:46.684Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload-time = "2025-05-02T08:33:17.06Z" },
|
{ url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload-time = "2025-08-09T07:56:47.941Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload-time = "2025-05-02T08:33:18.753Z" },
|
{ url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload-time = "2025-08-09T07:56:49.756Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/28/f8/dfb01ff6cc9af38552c69c9027501ff5a5117c4cc18dcd27cb5259fa1888/charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", size = 201671, upload-time = "2025-05-02T08:34:12.696Z" },
|
{ url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload-time = "2025-08-09T07:56:51.369Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/32/fb/74e26ee556a9dbfe3bd264289b67be1e6d616329403036f6507bb9f3f29c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", size = 144744, upload-time = "2025-05-02T08:34:14.665Z" },
|
{ url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086, upload-time = "2025-08-09T07:56:52.722Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ad/06/8499ee5aa7addc6f6d72e068691826ff093329fe59891e83b092ae4c851c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", size = 154993, upload-time = "2025-05-02T08:34:17.134Z" },
|
{ url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400, upload-time = "2025-08-09T07:56:55.172Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f1/a2/5e4c187680728219254ef107a6949c60ee0e9a916a5dadb148c7ae82459c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", size = 147382, upload-time = "2025-05-02T08:34:19.081Z" },
|
{ url = "https://files.pythonhosted.org/packages/c2/ca/9a0983dd5c8e9733565cf3db4df2b0a2e9a82659fd8aa2a868ac6e4a991f/charset_normalizer-3.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05", size = 207520, upload-time = "2025-08-09T07:57:11.026Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4c/fe/56aca740dda674f0cc1ba1418c4d84534be51f639b5f98f538b332dc9a95/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", size = 149536, upload-time = "2025-05-02T08:34:21.073Z" },
|
{ url = "https://files.pythonhosted.org/packages/39/c6/99271dc37243a4f925b09090493fb96c9333d7992c6187f5cfe5312008d2/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e", size = 147307, upload-time = "2025-08-09T07:57:12.4Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/53/13/db2e7779f892386b589173dd689c1b1e304621c5792046edd8a978cbf9e0/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", size = 151349, upload-time = "2025-05-02T08:34:23.193Z" },
|
{ url = "https://files.pythonhosted.org/packages/e4/69/132eab043356bba06eb333cc2cc60c6340857d0a2e4ca6dc2b51312886b3/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99", size = 160448, upload-time = "2025-08-09T07:57:13.712Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/69/35/e52ab9a276186f729bce7a0638585d2982f50402046e4b0faa5d2c3ef2da/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", size = 146365, upload-time = "2025-05-02T08:34:25.187Z" },
|
{ url = "https://files.pythonhosted.org/packages/04/9a/914d294daa4809c57667b77470533e65def9c0be1ef8b4c1183a99170e9d/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7", size = 157758, upload-time = "2025-08-09T07:57:14.979Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a6/d8/af7333f732fc2e7635867d56cb7c349c28c7094910c72267586947561b4b/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", size = 154499, upload-time = "2025-05-02T08:34:27.359Z" },
|
{ url = "https://files.pythonhosted.org/packages/b0/a8/6f5bcf1bcf63cb45625f7c5cadca026121ff8a6c8a3256d8d8cd59302663/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7", size = 152487, upload-time = "2025-08-09T07:57:16.332Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/7a/3d/a5b2e48acef264d71e036ff30bcc49e51bde80219bb628ba3e00cf59baac/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", size = 157735, upload-time = "2025-05-02T08:34:29.798Z" },
|
{ url = "https://files.pythonhosted.org/packages/c4/72/d3d0e9592f4e504f9dea08b8db270821c909558c353dc3b457ed2509f2fb/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19", size = 150054, upload-time = "2025-08-09T07:57:17.576Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/85/d8/23e2c112532a29f3eef374375a8684a4f3b8e784f62b01da931186f43494/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", size = 154786, upload-time = "2025-05-02T08:34:31.858Z" },
|
{ url = "https://files.pythonhosted.org/packages/20/30/5f64fe3981677fe63fa987b80e6c01042eb5ff653ff7cec1b7bd9268e54e/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312", size = 161703, upload-time = "2025-08-09T07:57:20.012Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c7/57/93e0169f08ecc20fe82d12254a200dfaceddc1c12a4077bf454ecc597e33/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", size = 150203, upload-time = "2025-05-02T08:34:33.88Z" },
|
{ url = "https://files.pythonhosted.org/packages/e1/ef/dd08b2cac9284fd59e70f7d97382c33a3d0a926e45b15fc21b3308324ffd/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc", size = 159096, upload-time = "2025-08-09T07:57:21.329Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2c/9d/9bf2b005138e7e060d7ebdec7503d0ef3240141587651f4b445bdf7286c2/charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", size = 98436, upload-time = "2025-05-02T08:34:35.907Z" },
|
{ url = "https://files.pythonhosted.org/packages/45/8c/dcef87cfc2b3f002a6478f38906f9040302c68aebe21468090e39cde1445/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34", size = 153852, upload-time = "2025-08-09T07:57:22.608Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6d/24/5849d46cf4311bbf21b424c443b09b459f5b436b1558c04e45dbb7cc478b/charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", size = 105772, upload-time = "2025-05-02T08:34:37.935Z" },
|
{ url = "https://files.pythonhosted.org/packages/63/86/9cbd533bd37883d467fcd1bd491b3547a3532d0fbb46de2b99feeebf185e/charset_normalizer-3.4.3-cp39-cp39-win32.whl", hash = "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432", size = 99840, upload-time = "2025-08-09T07:57:23.883Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" },
|
{ url = "https://files.pythonhosted.org/packages/ce/d6/7e805c8e5c46ff9729c49950acc4ee0aeb55efb8b3a56687658ad10c3216/charset_normalizer-3.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca", size = 107438, upload-time = "2025-08-09T07:57:25.287Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -453,7 +454,7 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "langchain-core"
|
name = "langchain-core"
|
||||||
version = "0.3.69"
|
version = "0.3.74"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "jsonpatch", marker = "python_full_version >= '3.11'" },
|
{ name = "jsonpatch", marker = "python_full_version >= '3.11'" },
|
||||||
@@ -464,14 +465,14 @@ dependencies = [
|
|||||||
{ name = "tenacity", marker = "python_full_version >= '3.11'" },
|
{ name = "tenacity", marker = "python_full_version >= '3.11'" },
|
||||||
{ name = "typing-extensions", marker = "python_full_version >= '3.11'" },
|
{ name = "typing-extensions", marker = "python_full_version >= '3.11'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/82/26/c4770d3933237cde2918d502e3b0a8b6ce100b296840b632658f3e59b341/langchain_core-0.3.69.tar.gz", hash = "sha256:c132961117cc7f0227a4c58dd3e209674a6dd5b7e74abc61a0df93b0d736e283", size = 563824, upload-time = "2025-07-15T21:19:56.626Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/f1/c6/5d755a0f1f4857abbe5ea6f5907ed0e2b5df52bf4dde0a0fd768290e3084/langchain_core-0.3.74.tar.gz", hash = "sha256:ff604441aeade942fbcc0a3860a592daba7671345230c2078ba2eb5f82b6ba76", size = 569553, upload-time = "2025-08-07T20:47:05.094Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/51/7b/bb7b088440ff9cc55e9e6eba94162cbdcd3b1693c194e1ad4764acba29b9/langchain_core-0.3.69-py3-none-any.whl", hash = "sha256:383e9cb4919f7ef4b24bf8552ef42e4323c064924fea88b28dd5d7ddb740d3b8", size = 441556, upload-time = "2025-07-15T21:19:55.342Z" },
|
{ url = "https://files.pythonhosted.org/packages/4d/26/545283681ac0379d31c7ad0bac5f195e1982092d76c65ca048db9e3cec0e/langchain_core-0.3.74-py3-none-any.whl", hash = "sha256:088338b5bc2f6a66892f9afc777992c24ee3188f41cbc603d09181e34a228ce7", size = 443453, upload-time = "2025-08-07T20:47:03.853Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "langgraph"
|
name = "langgraph"
|
||||||
version = "0.5.3"
|
version = "0.6.6"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "langchain-core", marker = "python_full_version >= '3.11'" },
|
{ name = "langchain-core", marker = "python_full_version >= '3.11'" },
|
||||||
@@ -481,14 +482,14 @@ dependencies = [
|
|||||||
{ name = "pydantic", marker = "python_full_version >= '3.11'" },
|
{ name = "pydantic", marker = "python_full_version >= '3.11'" },
|
||||||
{ name = "xxhash", marker = "python_full_version >= '3.11'" },
|
{ name = "xxhash", marker = "python_full_version >= '3.11'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/99/f4/f4ebb83dff589b31d4a11c0d3c9c39a55d41f2a722dfb78761f7ed95e96d/langgraph-0.5.3.tar.gz", hash = "sha256:36d4b67f984ff2649d447826fc99b1a2af3e97599a590058f20750048e4f548f", size = 442591, upload-time = "2025-07-14T20:10:02.907Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/02/2b/59f0b2985467ec84b006dd41ec31c0aae43a7f16722d5514292500b871c9/langgraph-0.6.6.tar.gz", hash = "sha256:e7d3cefacf356f8c01721b166b67b3bf581659d5361a3530f59ecd9b8448eca7", size = 465452, upload-time = "2025-08-20T04:02:13.915Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/d7/2f/11be9302d3a213debcfe44355453a1e8fd7ee5e3138edeb8bd82b56bc8f6/langgraph-0.5.3-py3-none-any.whl", hash = "sha256:9819b88a6ef6134a0fa6d6121a81b202dc3d17b25cf7ea3fe4d7669b9b252b5d", size = 143774, upload-time = "2025-07-14T20:10:01.497Z" },
|
{ url = "https://files.pythonhosted.org/packages/e4/ef/81fce0a80925cd89987aa641ff01573e3556a24f2d205112862a69df7fd3/langgraph-0.6.6-py3-none-any.whl", hash = "sha256:a2283a5236abba6c8307c1a485c04e8a0f0ffa2be770878782a7bf2deb8d7954", size = 153274, upload-time = "2025-08-20T04:02:12.251Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "langgraph-api"
|
name = "langgraph-api"
|
||||||
version = "0.2.96"
|
version = "0.3.0"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "cloudpickle", marker = "python_full_version >= '3.11'" },
|
{ name = "cloudpickle", marker = "python_full_version >= '3.11'" },
|
||||||
@@ -511,9 +512,9 @@ dependencies = [
|
|||||||
{ name = "uvicorn", marker = "python_full_version >= '3.11'" },
|
{ name = "uvicorn", marker = "python_full_version >= '3.11'" },
|
||||||
{ name = "watchfiles", marker = "python_full_version >= '3.11'" },
|
{ name = "watchfiles", marker = "python_full_version >= '3.11'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/ee/4c/837c5ce4aab704b6b13f27c5dd6330dabaf2f25d198032cb18e5d5dcaa53/langgraph_api-0.2.96.tar.gz", hash = "sha256:c498b5542a952d194121cdbe5a4b04e2f48fbc37480141ea2b87ba39a132ddb1", size = 238776, upload-time = "2025-07-17T17:57:47.274Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/74/7c/37bd3f791dc00698b405288dc764e078ed143c7ecd65e2e72cc0e386d3f1/langgraph_api-0.3.0.tar.gz", hash = "sha256:b908c34ebb9c42c2f4fb17f3f3a71e39ee0dfb283b7028d73d4bc1f4681914e7", size = 255812, upload-time = "2025-08-21T00:49:28.347Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/d9/7f/dfae9bc0f85a98bbd96d00df2a39e8b8386977e8ce4a6199d1065bb3709d/langgraph_api-0.2.96-py3-none-any.whl", hash = "sha256:304d424d7a85735489fab1764b439e8219739619ad708b9465b8b8f421f17b37", size = 194393, upload-time = "2025-07-17T17:57:45.89Z" },
|
{ url = "https://files.pythonhosted.org/packages/06/34/cdbb0b5abf603fd01c91a63c9436fbe733f56cae448f42c7a1c7e3f4508e/langgraph_api-0.3.0-py3-none-any.whl", hash = "sha256:b76a7ced3bb559560b42a8d8f3cc7cff638c2022d0881d476caa1d511fb36a2e", size = 206012, upload-time = "2025-08-21T00:49:26.917Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -531,7 +532,6 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "langgraph-cli"
|
name = "langgraph-cli"
|
||||||
version = "0.3.6"
|
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
|
{ name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
|
||||||
@@ -561,8 +561,8 @@ dev = [
|
|||||||
[package.metadata]
|
[package.metadata]
|
||||||
requires-dist = [
|
requires-dist = [
|
||||||
{ name = "click", specifier = ">=8.1.7" },
|
{ name = "click", specifier = ">=8.1.7" },
|
||||||
{ name = "langgraph-api", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.2.67,<0.3.0" },
|
{ name = "langgraph-api", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.2.120,<0.4.0" },
|
||||||
{ name = "langgraph-runtime-inmem", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.6.0" },
|
{ name = "langgraph-runtime-inmem", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.6.8" },
|
||||||
{ name = "langgraph-sdk", marker = "python_full_version >= '3.11'", specifier = ">=0.1.0" },
|
{ name = "langgraph-sdk", marker = "python_full_version >= '3.11'", specifier = ">=0.1.0" },
|
||||||
{ name = "python-dotenv", marker = "extra == 'inmem'", specifier = ">=0.8.0" },
|
{ name = "python-dotenv", marker = "extra == 'inmem'", specifier = ">=0.8.0" },
|
||||||
]
|
]
|
||||||
@@ -582,20 +582,20 @@ dev = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "langgraph-prebuilt"
|
name = "langgraph-prebuilt"
|
||||||
version = "0.5.2"
|
version = "0.6.4"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "langchain-core", marker = "python_full_version >= '3.11'" },
|
{ name = "langchain-core", marker = "python_full_version >= '3.11'" },
|
||||||
{ name = "langgraph-checkpoint", marker = "python_full_version >= '3.11'" },
|
{ name = "langgraph-checkpoint", marker = "python_full_version >= '3.11'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/bb/11/98134c47832fbde0caf0e06f1a104577da9215c358d7854093c1d835b272/langgraph_prebuilt-0.5.2.tar.gz", hash = "sha256:2c900a5be0d6a93ea2521e0d931697cad2b646f1fcda7aa5c39d8d7539772465", size = 117808, upload-time = "2025-06-30T19:52:48.307Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/d6/21/9b198d11732101ee8cdf30af98d0b4f11254c768de15173e57f5260fd14b/langgraph_prebuilt-0.6.4.tar.gz", hash = "sha256:e9e53b906ee5df46541d1dc5303239e815d3ec551e52bb03dd6463acc79ec28f", size = 125695, upload-time = "2025-08-07T18:17:57.333Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/c3/64/6bc45ab9e0e1112698ebff579fe21f5606ea65cd08266995a357e312a4d2/langgraph_prebuilt-0.5.2-py3-none-any.whl", hash = "sha256:1f4cd55deca49dffc3e5127eec12fcd244fc381321002f728afa88642d5ec59d", size = 23776, upload-time = "2025-06-30T19:52:47.494Z" },
|
{ url = "https://files.pythonhosted.org/packages/0a/7f/973b0d9729d9693d6e5b4bc5f3ae41138d194cb7b16b0ed230020beeb13a/langgraph_prebuilt-0.6.4-py3-none-any.whl", hash = "sha256:819f31d88b84cb2729ff1b79db2d51e9506b8fb7aaacfc0d359d4fe16e717344", size = 28025, upload-time = "2025-08-07T18:17:56.493Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "langgraph-runtime-inmem"
|
name = "langgraph-runtime-inmem"
|
||||||
version = "0.6.0"
|
version = "0.8.0"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "blockbuster", marker = "python_full_version >= '3.11'" },
|
{ name = "blockbuster", marker = "python_full_version >= '3.11'" },
|
||||||
@@ -605,27 +605,27 @@ dependencies = [
|
|||||||
{ name = "starlette", marker = "python_full_version >= '3.11'" },
|
{ name = "starlette", marker = "python_full_version >= '3.11'" },
|
||||||
{ name = "structlog", marker = "python_full_version >= '3.11'" },
|
{ name = "structlog", marker = "python_full_version >= '3.11'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/04/0c/d145c6d83d36efda17b10812760711b77ec05f5bbe962c961d75b32e3c17/langgraph_runtime_inmem-0.6.0.tar.gz", hash = "sha256:b09675789a331be4a2b387c9c46de8772c4c8418e74c057b4ca24e85c25acae3", size = 77618, upload-time = "2025-07-17T16:51:01.504Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/8c/94/02b58b1c137cfca6507f6c495e5794fd542b1f5269ef89fb662799be4b8c/langgraph_runtime_inmem-0.8.0.tar.gz", hash = "sha256:3082273f65650665b4a3875241721087fd51e675eb0227b18dc271839ce99594", size = 79510, upload-time = "2025-08-18T09:00:09.162Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/12/6a/9dc5769b5d2f97d1feacbbf93b180c359dff7462454b37dfef8aed4ebcf7/langgraph_runtime_inmem-0.6.0-py3-none-any.whl", hash = "sha256:312dab25bec6557f1edf95cb8bd7c8bb52f7f4bfeecaf66e7001662f095c9079", size = 29317, upload-time = "2025-07-17T16:51:00.622Z" },
|
{ url = "https://files.pythonhosted.org/packages/7a/0e/b09c1aff0bcfdb1357be212b4a5d55f5b98644eae7fab6b115aa463e99fa/langgraph_runtime_inmem-0.8.0-py3-none-any.whl", hash = "sha256:85398321fc186618b0957c4d8629cc059fce2e7f57a4756ef83a75575791da1b", size = 31626, upload-time = "2025-08-18T09:00:08.256Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "langgraph-sdk"
|
name = "langgraph-sdk"
|
||||||
version = "0.1.73"
|
version = "0.2.2"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "httpx", marker = "python_full_version >= '3.11'" },
|
{ name = "httpx", marker = "python_full_version >= '3.11'" },
|
||||||
{ name = "orjson", marker = "python_full_version >= '3.11'" },
|
{ name = "orjson", marker = "python_full_version >= '3.11'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/ba/e8/daf0271f91e93b10566533955c00ee16e471066755c2efd1ba9a887a7eab/langgraph_sdk-0.1.73.tar.gz", hash = "sha256:6e6dcdf66bcf8710739899616856527a72a605ce15beb76fbac7f4ce0e2ad080", size = 72157, upload-time = "2025-07-14T23:57:22.765Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/4d/3a/ea929b5b3827615802f020abdaa6d4a6f9d59ab764f65559fa6f87a6dda6/langgraph_sdk-0.2.2.tar.gz", hash = "sha256:9484e8071953df75d7aaf9845d82db3595e485af7d5dcc235c9b32c52362e1fc", size = 77981, upload-time = "2025-08-18T19:25:42.596Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/77/86/56e01e715e5b0028cdaff1492a89e54fa12e18c21e03b805a10ea36ecd5a/langgraph_sdk-0.1.73-py3-none-any.whl", hash = "sha256:a60ac33f70688ad07051edff1d5ed8089c8f0de1f69dc900be46e095ca20eed8", size = 50222, upload-time = "2025-07-14T23:57:21.42Z" },
|
{ url = "https://files.pythonhosted.org/packages/01/0d/dfa633c6b85e973e7d4383e9b92603b7e910e89768411daeb7777bfbae04/langgraph_sdk-0.2.2-py3-none-any.whl", hash = "sha256:1afbec01ade166f8b6ce18782875415422eb70dcb82852aeaa373e6152db4b82", size = 52017, upload-time = "2025-08-18T19:25:40.567Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "langsmith"
|
name = "langsmith"
|
||||||
version = "0.4.6"
|
version = "0.4.15"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "httpx", marker = "python_full_version >= '3.11'" },
|
{ name = "httpx", marker = "python_full_version >= '3.11'" },
|
||||||
@@ -636,9 +636,9 @@ dependencies = [
|
|||||||
{ name = "requests-toolbelt", marker = "python_full_version >= '3.11'" },
|
{ name = "requests-toolbelt", marker = "python_full_version >= '3.11'" },
|
||||||
{ name = "zstandard", marker = "python_full_version >= '3.11'" },
|
{ name = "zstandard", marker = "python_full_version >= '3.11'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/fc/9e/11536528c6e351820ad3fca0d2807f0e0f0619ff907529c78f68ba648497/langsmith-0.4.6.tar.gz", hash = "sha256:9189dbc9c60f2086ca3a1f0110cfe3aff6b0b7c2e0e3384f9572e70502e7933c", size = 352364, upload-time = "2025-07-15T19:43:18.541Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/66/7a/a17f61670bec8fea8194fb0fef79812d02fc7d2b9660eb2c9d2d514f265f/langsmith-0.4.15.tar.gz", hash = "sha256:c9a4ec4b7b0f5f70e7be204ee9c5b17db872cc3015cd04851e2703a0966b9ff1", size = 930330, upload-time = "2025-08-20T17:48:32.552Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/a7/9b/f2be47db823e89448ea41bfd8fc5ce6a995556bd25be4c23e5b3bb5b6c9b/langsmith-0.4.6-py3-none-any.whl", hash = "sha256:900e83fe59ee672bcf2f75c8bb47cd012bf8154d92a99c0355fc38b6485cbd3e", size = 367901, upload-time = "2025-07-15T19:43:16.508Z" },
|
{ url = "https://files.pythonhosted.org/packages/07/05/fcd7ee91990399fb7e1042da4b196bc99174f5282c6cb266607770abe935/langsmith-0.4.15-py3-none-any.whl", hash = "sha256:633719f9fdafe4297459b0ab442f536d6c0734b36c186ded67343d335e5ea0b3", size = 375733, upload-time = "2025-08-20T17:48:30.254Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -686,7 +686,7 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mypy"
|
name = "mypy"
|
||||||
version = "1.17.0"
|
version = "1.17.1"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "mypy-extensions" },
|
{ name = "mypy-extensions" },
|
||||||
@@ -694,39 +694,45 @@ dependencies = [
|
|||||||
{ name = "tomli", marker = "python_full_version < '3.11'" },
|
{ name = "tomli", marker = "python_full_version < '3.11'" },
|
||||||
{ name = "typing-extensions" },
|
{ name = "typing-extensions" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/1e/e3/034322d5a779685218ed69286c32faa505247f1f096251ef66c8fd203b08/mypy-1.17.0.tar.gz", hash = "sha256:e5d7ccc08ba089c06e2f5629c660388ef1fee708444f1dee0b9203fa031dee03", size = 3352114, upload-time = "2025-07-14T20:34:30.181Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/8e/22/ea637422dedf0bf36f3ef238eab4e455e2a0dcc3082b5cc067615347ab8e/mypy-1.17.1.tar.gz", hash = "sha256:25e01ec741ab5bb3eec8ba9cdb0f769230368a22c959c4937360efb89b7e9f01", size = 3352570, upload-time = "2025-07-31T07:54:19.204Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/6a/31/e762baa3b73905c856d45ab77b4af850e8159dffffd86a52879539a08c6b/mypy-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8e08de6138043108b3b18f09d3f817a4783912e48828ab397ecf183135d84d6", size = 10998313, upload-time = "2025-07-14T20:33:24.519Z" },
|
{ url = "https://files.pythonhosted.org/packages/77/a9/3d7aa83955617cdf02f94e50aab5c830d205cfa4320cf124ff64acce3a8e/mypy-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3fbe6d5555bf608c47203baa3e72dbc6ec9965b3d7c318aa9a4ca76f465bd972", size = 11003299, upload-time = "2025-07-31T07:54:06.425Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/1c/c1/25b2f0d46fb7e0b5e2bee61ec3a47fe13eff9e3c2f2234f144858bbe6485/mypy-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce4a17920ec144647d448fc43725b5873548b1aae6c603225626747ededf582d", size = 10128922, upload-time = "2025-07-14T20:34:06.414Z" },
|
{ url = "https://files.pythonhosted.org/packages/83/e8/72e62ff837dd5caaac2b4a5c07ce769c8e808a00a65e5d8f94ea9c6f20ab/mypy-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80ef5c058b7bce08c83cac668158cb7edea692e458d21098c7d3bce35a5d43e7", size = 10125451, upload-time = "2025-07-31T07:53:52.974Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/02/78/6d646603a57aa8a2886df1b8881fe777ea60f28098790c1089230cd9c61d/mypy-1.17.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ff25d151cc057fdddb1cb1881ef36e9c41fa2a5e78d8dd71bee6e4dcd2bc05b", size = 11913524, upload-time = "2025-07-14T20:33:19.109Z" },
|
{ url = "https://files.pythonhosted.org/packages/7d/10/f3f3543f6448db11881776f26a0ed079865926b0c841818ee22de2c6bbab/mypy-1.17.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a580f8a70c69e4a75587bd925d298434057fe2a428faaf927ffe6e4b9a98df", size = 11916211, upload-time = "2025-07-31T07:53:18.879Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4f/19/dae6c55e87ee426fb76980f7e78484450cad1c01c55a1dc4e91c930bea01/mypy-1.17.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93468cf29aa9a132bceb103bd8475f78cacde2b1b9a94fd978d50d4bdf616c9a", size = 12650527, upload-time = "2025-07-14T20:32:44.095Z" },
|
{ url = "https://files.pythonhosted.org/packages/06/bf/63e83ed551282d67bb3f7fea2cd5561b08d2bb6eb287c096539feb5ddbc5/mypy-1.17.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd86bb649299f09d987a2eebb4d52d10603224500792e1bee18303bbcc1ce390", size = 12652687, upload-time = "2025-07-31T07:53:30.544Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/86/e1/f916845a235235a6c1e4d4d065a3930113767001d491b8b2e1b61ca56647/mypy-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:98189382b310f16343151f65dd7e6867386d3e35f7878c45cfa11383d175d91f", size = 12897284, upload-time = "2025-07-14T20:33:38.168Z" },
|
{ url = "https://files.pythonhosted.org/packages/69/66/68f2eeef11facf597143e85b694a161868b3b006a5fbad50e09ea117ef24/mypy-1.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a76906f26bd8d51ea9504966a9c25419f2e668f012e0bdf3da4ea1526c534d94", size = 12896322, upload-time = "2025-07-31T07:53:50.74Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ae/dc/414760708a4ea1b096bd214d26a24e30ac5e917ef293bc33cdb6fe22d2da/mypy-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:c004135a300ab06a045c1c0d8e3f10215e71d7b4f5bb9a42ab80236364429937", size = 9506493, upload-time = "2025-07-14T20:34:01.093Z" },
|
{ url = "https://files.pythonhosted.org/packages/a3/87/8e3e9c2c8bd0d7e071a89c71be28ad088aaecbadf0454f46a540bda7bca6/mypy-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:e79311f2d904ccb59787477b7bd5d26f3347789c06fcd7656fa500875290264b", size = 9507962, upload-time = "2025-07-31T07:53:08.431Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d4/24/82efb502b0b0f661c49aa21cfe3e1999ddf64bf5500fc03b5a1536a39d39/mypy-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d4fe5c72fd262d9c2c91c1117d16aac555e05f5beb2bae6a755274c6eec42be", size = 10914150, upload-time = "2025-07-14T20:31:51.985Z" },
|
{ url = "https://files.pythonhosted.org/packages/46/cf/eadc80c4e0a70db1c08921dcc220357ba8ab2faecb4392e3cebeb10edbfa/mypy-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad37544be07c5d7fba814eb370e006df58fed8ad1ef33ed1649cb1889ba6ff58", size = 10921009, upload-time = "2025-07-31T07:53:23.037Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/03/96/8ef9a6ff8cedadff4400e2254689ca1dc4b420b92c55255b44573de10c54/mypy-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d96b196e5c16f41b4f7736840e8455958e832871990c7ba26bf58175e357ed61", size = 10039845, upload-time = "2025-07-14T20:32:30.527Z" },
|
{ url = "https://files.pythonhosted.org/packages/5d/c1/c869d8c067829ad30d9bdae051046561552516cfb3a14f7f0347b7d973ee/mypy-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:064e2ff508e5464b4bd807a7c1625bc5047c5022b85c70f030680e18f37273a5", size = 10047482, upload-time = "2025-07-31T07:53:26.151Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/df/32/7ce359a56be779d38021d07941cfbb099b41411d72d827230a36203dbb81/mypy-1.17.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73a0ff2dd10337ceb521c080d4147755ee302dcde6e1a913babd59473904615f", size = 11837246, upload-time = "2025-07-14T20:32:01.28Z" },
|
{ url = "https://files.pythonhosted.org/packages/98/b9/803672bab3fe03cee2e14786ca056efda4bb511ea02dadcedde6176d06d0/mypy-1.17.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70401bbabd2fa1aa7c43bb358f54037baf0586f41e83b0ae67dd0534fc64edfd", size = 11832883, upload-time = "2025-07-31T07:53:47.948Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/82/16/b775047054de4d8dbd668df9137707e54b07fe18c7923839cd1e524bf756/mypy-1.17.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24cfcc1179c4447854e9e406d3af0f77736d631ec87d31c6281ecd5025df625d", size = 12571106, upload-time = "2025-07-14T20:34:26.942Z" },
|
{ url = "https://files.pythonhosted.org/packages/88/fb/fcdac695beca66800918c18697b48833a9a6701de288452b6715a98cfee1/mypy-1.17.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e92bdc656b7757c438660f775f872a669b8ff374edc4d18277d86b63edba6b8b", size = 12566215, upload-time = "2025-07-31T07:54:04.031Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a1/cf/fa33eaf29a606102c8d9ffa45a386a04c2203d9ad18bf4eef3e20c43ebc8/mypy-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c56f180ff6430e6373db7a1d569317675b0a451caf5fef6ce4ab365f5f2f6c3", size = 12759960, upload-time = "2025-07-14T20:33:42.882Z" },
|
{ url = "https://files.pythonhosted.org/packages/7f/37/a932da3d3dace99ee8eb2043b6ab03b6768c36eb29a02f98f46c18c0da0e/mypy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c1fdf4abb29ed1cb091cf432979e162c208a5ac676ce35010373ff29247bcad5", size = 12751956, upload-time = "2025-07-31T07:53:36.263Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/94/75/3f5a29209f27e739ca57e6350bc6b783a38c7621bdf9cac3ab8a08665801/mypy-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:eafaf8b9252734400f9b77df98b4eee3d2eecab16104680d51341c75702cad70", size = 9503888, upload-time = "2025-07-14T20:32:34.392Z" },
|
{ url = "https://files.pythonhosted.org/packages/8c/cf/6438a429e0f2f5cab8bc83e53dbebfa666476f40ee322e13cac5e64b79e7/mypy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:ff2933428516ab63f961644bc49bc4cbe42bbffb2cd3b71cc7277c07d16b1a8b", size = 9507307, upload-time = "2025-07-31T07:53:59.734Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/12/e9/e6824ed620bbf51d3bf4d6cbbe4953e83eaf31a448d1b3cfb3620ccb641c/mypy-1.17.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f986f1cab8dbec39ba6e0eaa42d4d3ac6686516a5d3dccd64be095db05ebc6bb", size = 11086395, upload-time = "2025-07-14T20:34:11.452Z" },
|
{ url = "https://files.pythonhosted.org/packages/17/a2/7034d0d61af8098ec47902108553122baa0f438df8a713be860f7407c9e6/mypy-1.17.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:69e83ea6553a3ba79c08c6e15dbd9bfa912ec1e493bf75489ef93beb65209aeb", size = 11086295, upload-time = "2025-07-31T07:53:28.124Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ba/51/a4afd1ae279707953be175d303f04a5a7bd7e28dc62463ad29c1c857927e/mypy-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:51e455a54d199dd6e931cd7ea987d061c2afbaf0960f7f66deef47c90d1b304d", size = 10120052, upload-time = "2025-07-14T20:33:09.897Z" },
|
{ url = "https://files.pythonhosted.org/packages/14/1f/19e7e44b594d4b12f6ba8064dbe136505cec813549ca3e5191e40b1d3cc2/mypy-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b16708a66d38abb1e6b5702f5c2c87e133289da36f6a1d15f6a5221085c6403", size = 10112355, upload-time = "2025-07-31T07:53:21.121Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8a/71/19adfeac926ba8205f1d1466d0d360d07b46486bf64360c54cb5a2bd86a8/mypy-1.17.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3204d773bab5ff4ebbd1f8efa11b498027cd57017c003ae970f310e5b96be8d8", size = 11861806, upload-time = "2025-07-14T20:32:16.028Z" },
|
{ url = "https://files.pythonhosted.org/packages/5b/69/baa33927e29e6b4c55d798a9d44db5d394072eef2bdc18c3e2048c9ed1e9/mypy-1.17.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:89e972c0035e9e05823907ad5398c5a73b9f47a002b22359b177d40bdaee7056", size = 11875285, upload-time = "2025-07-31T07:53:55.293Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/0b/64/d6120eca3835baf7179e6797a0b61d6c47e0bc2324b1f6819d8428d5b9ba/mypy-1.17.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1051df7ec0886fa246a530ae917c473491e9a0ba6938cfd0ec2abc1076495c3e", size = 12744371, upload-time = "2025-07-14T20:33:33.503Z" },
|
{ url = "https://files.pythonhosted.org/packages/90/13/f3a89c76b0a41e19490b01e7069713a30949d9a6c147289ee1521bcea245/mypy-1.17.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03b6d0ed2b188e35ee6d5c36b5580cffd6da23319991c49ab5556c023ccf1341", size = 12737895, upload-time = "2025-07-31T07:53:43.623Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/1f/dc/56f53b5255a166f5bd0f137eed960e5065f2744509dfe69474ff0ba772a5/mypy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f773c6d14dcc108a5b141b4456b0871df638eb411a89cd1c0c001fc4a9d08fc8", size = 12914558, upload-time = "2025-07-14T20:33:56.961Z" },
|
{ url = "https://files.pythonhosted.org/packages/23/a1/c4ee79ac484241301564072e6476c5a5be2590bc2e7bfd28220033d2ef8f/mypy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c837b896b37cd103570d776bda106eabb8737aa6dd4f248451aecf53030cdbeb", size = 12931025, upload-time = "2025-07-31T07:54:17.125Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/69/ac/070bad311171badc9add2910e7f89271695a25c136de24bbafc7eded56d5/mypy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:1619a485fd0e9c959b943c7b519ed26b712de3002d7de43154a489a2d0fd817d", size = 9585447, upload-time = "2025-07-14T20:32:20.594Z" },
|
{ url = "https://files.pythonhosted.org/packages/89/b8/7409477be7919a0608900e6320b155c72caab4fef46427c5cc75f85edadd/mypy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:665afab0963a4b39dff7c1fa563cc8b11ecff7910206db4b2e64dd1ba25aed19", size = 9584664, upload-time = "2025-07-31T07:54:12.842Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/be/7b/5f8ab461369b9e62157072156935cec9d272196556bdc7c2ff5f4c7c0f9b/mypy-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c41aa59211e49d717d92b3bb1238c06d387c9325d3122085113c79118bebb06", size = 11070019, upload-time = "2025-07-14T20:32:07.99Z" },
|
{ url = "https://files.pythonhosted.org/packages/5b/82/aec2fc9b9b149f372850291827537a508d6c4d3664b1750a324b91f71355/mypy-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93378d3203a5c0800c6b6d850ad2f19f7a3cdf1a3701d3416dbf128805c6a6a7", size = 11075338, upload-time = "2025-07-31T07:53:38.873Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/9c/f8/c49c9e5a2ac0badcc54beb24e774d2499748302c9568f7f09e8730e953fa/mypy-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e69db1fb65b3114f98c753e3930a00514f5b68794ba80590eb02090d54a5d4a", size = 10114457, upload-time = "2025-07-14T20:33:47.285Z" },
|
{ url = "https://files.pythonhosted.org/packages/07/ac/ee93fbde9d2242657128af8c86f5d917cd2887584cf948a8e3663d0cd737/mypy-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:15d54056f7fe7a826d897789f53dd6377ec2ea8ba6f776dc83c2902b899fee81", size = 10113066, upload-time = "2025-07-31T07:54:14.707Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/89/0c/fb3f9c939ad9beed3e328008b3fb90b20fda2cddc0f7e4c20dbefefc3b33/mypy-1.17.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:03ba330b76710f83d6ac500053f7727270b6b8553b0423348ffb3af6f2f7b889", size = 11857838, upload-time = "2025-07-14T20:33:14.462Z" },
|
{ url = "https://files.pythonhosted.org/packages/5a/68/946a1e0be93f17f7caa56c45844ec691ca153ee8b62f21eddda336a2d203/mypy-1.17.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:209a58fed9987eccc20f2ca94afe7257a8f46eb5df1fb69958650973230f91e6", size = 11875473, upload-time = "2025-07-31T07:53:14.504Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4c/66/85607ab5137d65e4f54d9797b77d5a038ef34f714929cf8ad30b03f628df/mypy-1.17.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:037bc0f0b124ce46bfde955c647f3e395c6174476a968c0f22c95a8d2f589bba", size = 12731358, upload-time = "2025-07-14T20:32:25.579Z" },
|
{ url = "https://files.pythonhosted.org/packages/9f/0f/478b4dce1cb4f43cf0f0d00fba3030b21ca04a01b74d1cd272a528cf446f/mypy-1.17.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:099b9a5da47de9e2cb5165e581f158e854d9e19d2e96b6698c0d64de911dd849", size = 12744296, upload-time = "2025-07-31T07:53:03.896Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/73/d0/341dbbfb35ce53d01f8f2969facbb66486cee9804048bf6c01b048127501/mypy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c38876106cb6132259683632b287238858bd58de267d80defb6f418e9ee50658", size = 12917480, upload-time = "2025-07-14T20:34:21.868Z" },
|
{ url = "https://files.pythonhosted.org/packages/ca/70/afa5850176379d1b303f992a828de95fc14487429a7139a4e0bdd17a8279/mypy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ffadfbe6994d724c5a1bb6123a7d27dd68fc9c059561cd33b664a79578e14", size = 12914657, upload-time = "2025-07-31T07:54:08.576Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/64/63/70c8b7dbfc520089ac48d01367a97e8acd734f65bd07813081f508a8c94c/mypy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:d30ba01c0f151998f367506fab31c2ac4527e6a7b2690107c7a7f9e3cb419a9c", size = 9589666, upload-time = "2025-07-14T20:34:16.841Z" },
|
{ url = "https://files.pythonhosted.org/packages/53/f9/4a83e1c856a3d9c8f6edaa4749a4864ee98486e9b9dbfbc93842891029c2/mypy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:9a2b7d9180aed171f033c9f2fc6c204c1245cf60b0cb61cf2e7acc24eea78e0a", size = 9593320, upload-time = "2025-07-31T07:53:01.341Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/9f/a0/6263dd11941231f688f0a8f2faf90ceac1dc243d148d314a089d2fe25108/mypy-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:63e751f1b5ab51d6f3d219fe3a2fe4523eaa387d854ad06906c63883fde5b1ab", size = 10988185, upload-time = "2025-07-14T20:33:04.797Z" },
|
{ url = "https://files.pythonhosted.org/packages/38/56/79c2fac86da57c7d8c48622a05873eaab40b905096c33597462713f5af90/mypy-1.17.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:15a83369400454c41ed3a118e0cc58bd8123921a602f385cb6d6ea5df050c733", size = 11040037, upload-time = "2025-07-31T07:54:10.942Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/02/13/b8f16d6b0dc80277129559c8e7dbc9011241a0da8f60d031edb0e6e9ac8f/mypy-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f7fb09d05e0f1c329a36dcd30e27564a3555717cde87301fae4fb542402ddfad", size = 10120169, upload-time = "2025-07-14T20:32:38.84Z" },
|
{ url = "https://files.pythonhosted.org/packages/4d/c3/adabe6ff53638e3cad19e3547268482408323b1e68bf082c9119000cd049/mypy-1.17.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:55b918670f692fc9fba55c3298d8a3beae295c5cded0a55dccdc5bbead814acd", size = 10131550, upload-time = "2025-07-31T07:53:41.307Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/14/ef/978ba79df0d65af680e20d43121363cf643eb79b04bf3880d01fc8afeb6f/mypy-1.17.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b72c34ce05ac3a1361ae2ebb50757fb6e3624032d91488d93544e9f82db0ed6c", size = 11918121, upload-time = "2025-07-14T20:33:52.328Z" },
|
{ url = "https://files.pythonhosted.org/packages/b8/c5/2e234c22c3bdeb23a7817af57a58865a39753bde52c74e2c661ee0cfc640/mypy-1.17.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:62761474061feef6f720149d7ba876122007ddc64adff5ba6f374fda35a018a0", size = 11872963, upload-time = "2025-07-31T07:53:16.878Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f4/10/55ef70b104151a0d8280474f05268ff0a2a79be8d788d5e647257d121309/mypy-1.17.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:434ad499ad8dde8b2f6391ddfa982f41cb07ccda8e3c67781b1bfd4e5f9450a8", size = 12648821, upload-time = "2025-07-14T20:32:59.631Z" },
|
{ url = "https://files.pythonhosted.org/packages/ab/26/c13c130f35ca8caa5f2ceab68a247775648fdcd6c9a18f158825f2bc2410/mypy-1.17.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c49562d3d908fd49ed0938e5423daed8d407774a479b595b143a3d7f87cdae6a", size = 12710189, upload-time = "2025-07-31T07:54:01.962Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/26/8c/7781fcd2e1eef48fbedd3a422c21fe300a8e03ed5be2eb4bd10246a77f4e/mypy-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f105f61a5eff52e137fd73bee32958b2add9d9f0a856f17314018646af838e97", size = 12896955, upload-time = "2025-07-14T20:32:49.543Z" },
|
{ url = "https://files.pythonhosted.org/packages/82/df/c7d79d09f6de8383fe800521d066d877e54d30b4fb94281c262be2df84ef/mypy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:397fba5d7616a5bc60b45c7ed204717eaddc38f826e3645402c426057ead9a91", size = 12900322, upload-time = "2025-07-31T07:53:10.551Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/78/13/03ac759dabe86e98ca7b6681f114f90ee03f3ff8365a57049d311bd4a4e3/mypy-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:ba06254a5a22729853209550d80f94e28690d5530c661f9416a68ac097b13fc4", size = 9512957, upload-time = "2025-07-14T20:33:28.619Z" },
|
{ url = "https://files.pythonhosted.org/packages/b8/98/3d5a48978b4f708c55ae832619addc66d677f6dc59f3ebad71bae8285ca6/mypy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:9d6b20b97d373f41617bd0708fd46aa656059af57f2ef72aa8c7d6a2b73b74ed", size = 9751879, upload-time = "2025-07-31T07:52:56.683Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e3/fc/ee058cc4316f219078464555873e99d170bde1d9569abd833300dbeb484a/mypy-1.17.0-py3-none-any.whl", hash = "sha256:15d9d0018237ab058e5de3d8fce61b6fa72cc59cc78fd91f1b474bce12abf496", size = 2283195, upload-time = "2025-07-14T20:31:54.753Z" },
|
{ url = "https://files.pythonhosted.org/packages/29/cb/673e3d34e5d8de60b3a61f44f80150a738bff568cd6b7efb55742a605e98/mypy-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5d1092694f166a7e56c805caaf794e0585cabdbf1df36911c414e4e9abb62ae9", size = 10992466, upload-time = "2025-07-31T07:53:57.574Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0c/d0/fe1895836eea3a33ab801561987a10569df92f2d3d4715abf2cfeaa29cb2/mypy-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:79d44f9bfb004941ebb0abe8eff6504223a9c1ac51ef967d1263c6572bbebc99", size = 10117638, upload-time = "2025-07-31T07:53:34.256Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/97/f3/514aa5532303aafb95b9ca400a31054a2bd9489de166558c2baaeea9c522/mypy-1.17.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b01586eed696ec905e61bd2568f48740f7ac4a45b3a468e6423a03d3788a51a8", size = 11915673, upload-time = "2025-07-31T07:52:59.361Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ab/c3/c0805f0edec96fe8e2c048b03769a6291523d509be8ee7f56ae922fa3882/mypy-1.17.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43808d9476c36b927fbcd0b0255ce75efe1b68a080154a38ae68a7e62de8f0f8", size = 12649022, upload-time = "2025-07-31T07:53:45.92Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/45/3e/d646b5a298ada21a8512fa7e5531f664535a495efa672601702398cea2b4/mypy-1.17.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:feb8cc32d319edd5859da2cc084493b3e2ce5e49a946377663cc90f6c15fb259", size = 12895536, upload-time = "2025-07-31T07:53:06.17Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/14/55/e13d0dcd276975927d1f4e9e2ec4fd409e199f01bdc671717e673cc63a22/mypy-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d7598cf74c3e16539d4e2f0b8d8c318e00041553d83d4861f87c7a72e95ac24d", size = 9512564, upload-time = "2025-07-31T07:53:12.346Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1d/f3/8fcd2af0f5b806f6cf463efaffd3c9548a28f84220493ecd38d127b6b66d/mypy-1.17.1-py3-none-any.whl", hash = "sha256:a9f52c0351c21fe24c21d8c0eb1f62967b262d6729393397b6f443c3b773c3b9", size = 2283411, upload-time = "2025-07-31T07:53:24.664Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -740,81 +746,92 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "orjson"
|
name = "orjson"
|
||||||
version = "3.11.0"
|
version = "3.11.2"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/29/87/03ababa86d984952304ac8ce9fbd3a317afb4a225b9a81f9b606ac60c873/orjson-3.11.0.tar.gz", hash = "sha256:2e4c129da624f291bcc607016a99e7f04a353f6874f3bd8d9b47b88597d5f700", size = 5318246, upload-time = "2025-07-15T16:08:29.194Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/df/1d/5e0ae38788bdf0721326695e65fdf41405ed535f633eb0df0f06f57552fa/orjson-3.11.2.tar.gz", hash = "sha256:91bdcf5e69a8fd8e8bdb3de32b31ff01d2bd60c1e8d5fe7d5afabdcf19920309", size = 5470739, upload-time = "2025-08-12T15:12:28.626Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/07/aa/50818f480f0edcb33290c8f35eef6dd3a31e2ff7e1195f8b236ac7419811/orjson-3.11.0-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b8913baba9751f7400f8fa4ec18a8b618ff01177490842e39e47b66c1b04bc79", size = 240422, upload-time = "2025-07-15T16:06:23.029Z" },
|
{ url = "https://files.pythonhosted.org/packages/a1/7b/7aebe925c6b1c46c8606a960fe1d6b681fccd4aaf3f37cd647c3309d6582/orjson-3.11.2-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d6b8a78c33496230a60dc9487118c284c15ebdf6724386057239641e1eb69761", size = 226896, upload-time = "2025-08-12T15:10:22.02Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/16/50/5235aff455fa76337493d21e68618e7cf53aa9db011aaeb06cf378f1344c/orjson-3.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d4d86910554de5c9c87bc560b3bdd315cc3988adbdc2acf5dda3797079407ed", size = 132473, upload-time = "2025-07-15T16:06:25.598Z" },
|
{ url = "https://files.pythonhosted.org/packages/7d/39/c952c9b0d51063e808117dd1e53668a2e4325cc63cfe7df453d853ee8680/orjson-3.11.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc04036eeae11ad4180d1f7b5faddb5dab1dee49ecd147cd431523869514873b", size = 111845, upload-time = "2025-08-12T15:10:24.963Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/23/93/bf1c4e77e7affc46cca13fb852842a86dca2dabbee1d91515ed17b1c21c4/orjson-3.11.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84ae3d329360cf18fb61b67c505c00dedb61b0ee23abfd50f377a58e7d7bed06", size = 127195, upload-time = "2025-07-15T16:06:27.001Z" },
|
{ url = "https://files.pythonhosted.org/packages/f5/dc/90b7f29be38745eeacc30903b693f29fcc1097db0c2a19a71ffb3e9f2a5f/orjson-3.11.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c04325839c5754c253ff301cee8aaed7442d974860a44447bb3be785c411c27", size = 116395, upload-time = "2025-08-12T15:10:26.314Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/7e/2d/64b52c6827e43aa3d98def19e188e091a6c574ca13d9ecef5f3f3284fac6/orjson-3.11.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47a54e660414baacd71ebf41a69bb17ea25abb3c5b69ce9e13e43be7ac20e342", size = 128895, upload-time = "2025-07-15T16:06:28.641Z" },
|
{ url = "https://files.pythonhosted.org/packages/10/c2/fe84ba63164c22932b8d59b8810e2e58590105293a259e6dd1bfaf3422c9/orjson-3.11.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32769e04cd7fdc4a59854376211145a1bbbc0aea5e9d6c9755d3d3c301d7c0df", size = 118768, upload-time = "2025-08-12T15:10:27.605Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ca/5f/9d290bc7a88392f9f7dc2e92ceb2e3efbbebaaf56bbba655b5fe2e3d2ca3/orjson-3.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2560b740604751854be146169c1de7e7ee1e6120b00c1788ec3f3a012c6a243f", size = 132016, upload-time = "2025-07-15T16:06:32.576Z" },
|
{ url = "https://files.pythonhosted.org/packages/a9/ce/d9748ec69b1a4c29b8e2bab8233e8c41c583c69f515b373f1fb00247d8c9/orjson-3.11.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ff285d14917ea1408a821786e3677c5261fa6095277410409c694b8e7720ae0", size = 120887, upload-time = "2025-08-12T15:10:29.153Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ef/8c/b2bdc34649bbb7b44827d487aef7ad4d6a96c53ebc490ddcc191d47bc3b9/orjson-3.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd7f9cd995da9e46fbac0a371f0ff6e89a21d8ecb7a8a113c0acb147b0a32f73", size = 134251, upload-time = "2025-07-15T16:06:34.075Z" },
|
{ url = "https://files.pythonhosted.org/packages/c1/66/b90fac8e4a76e83f981912d7f9524d402b31f6c1b8bff3e498aa321c326c/orjson-3.11.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2662f908114864b63ff75ffe6ffacf996418dd6cc25e02a72ad4bda81b1ec45a", size = 123650, upload-time = "2025-08-12T15:10:30.602Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/33/be/b763b602976aa27407e6f75331ac581258c719f8abb70f66f2de962f649f/orjson-3.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cf728cb3a013bdf9f4132575404bf885aa773d8bb4205656575e1890fc91990", size = 128078, upload-time = "2025-07-15T16:06:35.408Z" },
|
{ url = "https://files.pythonhosted.org/packages/33/81/56143898d1689c7f915ac67703efb97e8f2f8d5805ce8c2c3fd0f2bb6e3d/orjson-3.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab463cf5d08ad6623a4dac1badd20e88a5eb4b840050c4812c782e3149fe2334", size = 121287, upload-time = "2025-08-12T15:10:31.868Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ac/24/1b0fed70392bf179ac8b5abe800f1102ed94f89ac4f889d83916947a2b4e/orjson-3.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c27de273320294121200440cd5002b6aeb922d3cb9dab3357087c69f04ca6934", size = 130734, upload-time = "2025-07-15T16:06:36.832Z" },
|
{ url = "https://files.pythonhosted.org/packages/80/de/f9c6d00c127be766a3739d0d85b52a7c941e437d8dd4d573e03e98d0f89c/orjson-3.11.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:64414241bde943cbf3c00d45fcb5223dca6d9210148ba984aae6b5d63294502b", size = 119637, upload-time = "2025-08-12T15:10:33.078Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/05/d2/2d042bb4fe1da067692cb70d8c01a5ce2737e2f56444e6b2d716853ce8c3/orjson-3.11.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:4430ec6ff1a1f4595dd7e0fad991bdb2fed65401ed294984c490ffa025926325", size = 404040, upload-time = "2025-07-15T16:06:38.259Z" },
|
{ url = "https://files.pythonhosted.org/packages/67/4c/ab70c7627022d395c1b4eb5badf6196b7144e82b46a3a17ed2354f9e592d/orjson-3.11.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:7773e71c0ae8c9660192ff144a3d69df89725325e3d0b6a6bb2c50e5ebaf9b84", size = 392478, upload-time = "2025-08-12T15:10:34.669Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/b4/c5/54938ab416c0d19c93f0d6977a47bb2b3d121e150305380b783f7d6da185/orjson-3.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:325be41a8d7c227d460a9795a181511ba0e731cf3fee088c63eb47e706ea7559", size = 144808, upload-time = "2025-07-15T16:06:39.796Z" },
|
{ url = "https://files.pythonhosted.org/packages/77/91/d890b873b69311db4fae2624c5603c437df9c857fb061e97706dac550a77/orjson-3.11.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:652ca14e283b13ece35bf3a86503c25592f294dbcfc5bb91b20a9c9a62a3d4be", size = 134343, upload-time = "2025-08-12T15:10:35.978Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6d/be/5ead422f396ee7c8941659ceee3da001e26998971f7d5fe0a38519c48aa5/orjson-3.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9760217b84d1aee393b4436fbe9c639e963ec7bc0f2c074581ce5fb3777e466", size = 132570, upload-time = "2025-07-15T16:06:41.209Z" },
|
{ url = "https://files.pythonhosted.org/packages/47/16/1aa248541b4830274a079c4aeb2aa5d1ff17c3f013b1d0d8d16d0848f3de/orjson-3.11.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:26e99e98df8990ecfe3772bbdd7361f602149715c2cbc82e61af89bfad9528a4", size = 123887, upload-time = "2025-08-12T15:10:37.601Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f6/01/db8352f7d0374d7eec25144e294991800aa85738b2dc7f19cc152ba1b254/orjson-3.11.0-cp310-cp310-win32.whl", hash = "sha256:fe36e5012f886ff91c68b87a499c227fa220e9668cea96335219874c8be5fab5", size = 134763, upload-time = "2025-07-15T16:06:42.524Z" },
|
{ url = "https://files.pythonhosted.org/packages/95/e4/7419833c55ac8b5f385d00c02685a260da1f391e900fc5c3e0b797e0d506/orjson-3.11.2-cp310-cp310-win32.whl", hash = "sha256:5814313b3e75a2be7fe6c7958201c16c4560e21a813dbad25920752cecd6ad66", size = 124560, upload-time = "2025-08-12T15:10:38.966Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8b/f5/1322b64d5836d92f0b0c119d959853b3c968b8aae23dd1e3c1bfa566823b/orjson-3.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:ebeecd5d5511b3ca9dc4e7db0ab95266afd41baf424cc2fad8c2d3a3cdae650a", size = 129506, upload-time = "2025-07-15T16:06:43.929Z" },
|
{ url = "https://files.pythonhosted.org/packages/74/f8/27ca7ef3e194c462af32ce1883187f5ec483650c559166f0de59c4c2c5f0/orjson-3.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:dc471ce2225ab4c42ca672f70600d46a8b8e28e8d4e536088c1ccdb1d22b35ce", size = 119700, upload-time = "2025-08-12T15:10:40.911Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f9/2c/0b71a763f0f5130aa2631ef79e2cd84d361294665acccbb12b7a9813194e/orjson-3.11.0-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1785df7ada75c18411ff7e20ac822af904a40161ea9dfe8c55b3f6b66939add6", size = 240007, upload-time = "2025-07-15T16:06:45.411Z" },
|
{ url = "https://files.pythonhosted.org/packages/78/7d/e295df1ac9920cbb19fb4c1afa800e86f175cb657143aa422337270a4782/orjson-3.11.2-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:888b64ef7eaeeff63f773881929434a5834a6a140a63ad45183d59287f07fc6a", size = 226502, upload-time = "2025-08-12T15:10:42.284Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f4/5a/f79ccd63d378b9c7c771d7a54c203d261b4c618fe3034ae95cd30f934f34/orjson-3.11.0-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:a57899bebbcea146616a2426d20b51b3562b4bc9f8039a3bd14fae361c23053d", size = 129320, upload-time = "2025-07-15T16:06:47.249Z" },
|
{ url = "https://files.pythonhosted.org/packages/65/21/ffb0f10ea04caf418fb4e7ad1fda4b9ab3179df9d7a33b69420f191aadd5/orjson-3.11.2-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:83387cc8b26c9fa0ae34d1ea8861a7ae6cff8fb3e346ab53e987d085315a728e", size = 115999, upload-time = "2025-08-12T15:10:43.738Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/7b/8a/63dafc147fa5ba945ad809c374b8f4ee692bb6b18aa6e161c3e6b69b594e/orjson-3.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b6fbc2fc825aff1456dd358c11a0ad7912a4cb4537d3db92e5334af7463a967", size = 132254, upload-time = "2025-07-15T16:06:48.597Z" },
|
{ url = "https://files.pythonhosted.org/packages/90/d5/8da1e252ac3353d92e6f754ee0c85027c8a2cda90b6899da2be0df3ef83d/orjson-3.11.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7e35f003692c216d7ee901b6b916b5734d6fc4180fcaa44c52081f974c08e17", size = 111563, upload-time = "2025-08-12T15:10:45.301Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/3c/11/4d1eb230483cc689a2f039c531bb2c980029c40ca5a9b5f64dce9786e955/orjson-3.11.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4305a638f4cf9bed3746ca3b7c242f14e05177d5baec2527026e0f9ee6c24fb7", size = 127003, upload-time = "2025-07-15T16:06:50.34Z" },
|
{ url = "https://files.pythonhosted.org/packages/4f/81/baabc32e52c570b0e4e1044b1bd2ccbec965e0de3ba2c13082255efa2006/orjson-3.11.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4a0a4c29ae90b11d0c00bcc31533854d89f77bde2649ec602f512a7e16e00640", size = 116222, upload-time = "2025-08-12T15:10:46.92Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4f/39/b6e96072946d908684e0f4b3de1639062fd5b32016b2929c035bd8e5c847/orjson-3.11.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1235fe7bbc37164f69302199d46f29cfb874018738714dccc5a5a44042c79c77", size = 128674, upload-time = "2025-07-15T16:06:51.659Z" },
|
{ url = "https://files.pythonhosted.org/packages/8d/b7/da2ad55ad80b49b560dce894c961477d0e76811ee6e614b301de9f2f8728/orjson-3.11.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:585d712b1880f68370108bc5534a257b561672d1592fae54938738fe7f6f1e33", size = 118594, upload-time = "2025-08-12T15:10:48.488Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/1e/dd/c77e3013f35b202ec2cc1f78a95fadf86b8c5a320d56eb1a0bbb965a87bb/orjson-3.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a640e3954e7b4fcb160097551e54cafbde9966be3991932155b71071077881aa", size = 131846, upload-time = "2025-07-15T16:06:53.359Z" },
|
{ url = "https://files.pythonhosted.org/packages/61/be/014f7eab51449f3c894aa9bbda2707b5340c85650cb7d0db4ec9ae280501/orjson-3.11.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d08e342a7143f8a7c11f1c4033efe81acbd3c98c68ba1b26b96080396019701f", size = 120700, upload-time = "2025-08-12T15:10:49.811Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/3f/7d/d83f0f96c2b142f9cdcf12df19052ea3767970989dc757598dc108db208f/orjson-3.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d750b97d22d5566955e50b02c622f3a1d32744d7a578c878b29a873190ccb7a", size = 134016, upload-time = "2025-07-15T16:06:54.691Z" },
|
{ url = "https://files.pythonhosted.org/packages/cf/ae/c217903a30c51341868e2d8c318c59a8413baa35af54d7845071c8ccd6fe/orjson-3.11.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29c0f84fc50398773a702732c87cd622737bf11c0721e6db3041ac7802a686fb", size = 123433, upload-time = "2025-08-12T15:10:51.06Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/67/4f/d22f79a3c56dde563c4fbc12eebf9224a1b87af5e4ec61beb11f9b3eb499/orjson-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4bfcfe498484161e011f8190a400591c52b026de96b3b3cbd3f21e8999b9dc0e", size = 127930, upload-time = "2025-07-15T16:06:56.001Z" },
|
{ url = "https://files.pythonhosted.org/packages/57/c2/b3c346f78b1ff2da310dd300cb0f5d32167f872b4d3bb1ad122c889d97b0/orjson-3.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:140f84e3c8d4c142575898c91e3981000afebf0333df753a90b3435d349a5fe5", size = 121061, upload-time = "2025-08-12T15:10:52.381Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/07/1e/26aede257db2163d974139fd4571f1e80f565216ccbd2c44ee1d43a63dcc/orjson-3.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:feaed3ed43a1d2df75c039798eb5ec92c350c7d86be53369bafc4f3700ce7df2", size = 130569, upload-time = "2025-07-15T16:06:57.275Z" },
|
{ url = "https://files.pythonhosted.org/packages/00/c8/c97798f6010327ffc75ad21dd6bca11ea2067d1910777e798c2849f1c68f/orjson-3.11.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96304a2b7235e0f3f2d9363ddccdbfb027d27338722fe469fe656832a017602e", size = 119410, upload-time = "2025-08-12T15:10:53.692Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/b4/bf/2cb57eac8d6054b555cba27203490489a7d3f5dca8c34382f22f2f0f17ba/orjson-3.11.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:aa1120607ec8fc98acf8c54aac6fb0b7b003ba883401fa2d261833111e2fa071", size = 403844, upload-time = "2025-07-15T16:06:59.107Z" },
|
{ url = "https://files.pythonhosted.org/packages/37/fd/df720f7c0e35694617b7f95598b11a2cb0374661d8389703bea17217da53/orjson-3.11.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3d7612bb227d5d9582f1f50a60bd55c64618fc22c4a32825d233a4f2771a428a", size = 392294, upload-time = "2025-08-12T15:10:55.079Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/76/34/36e859ccfc45464df7b35c438c0ecc7751c930b3ebbefb50db7e3a641eb7/orjson-3.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c4b48d9775b0cf1f0aca734f4c6b272cbfacfac38e6a455e6520662f9434afb7", size = 144613, upload-time = "2025-07-15T16:07:00.48Z" },
|
{ url = "https://files.pythonhosted.org/packages/ba/52/0120d18f60ab0fe47531d520372b528a45c9a25dcab500f450374421881c/orjson-3.11.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a134587d18fe493befc2defffef2a8d27cfcada5696cb7234de54a21903ae89a", size = 134134, upload-time = "2025-08-12T15:10:56.568Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/31/c5/5aeb84cdd0b44dc3972668944a1312f7983c2a45fb6b0e5e32b2f9408540/orjson-3.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f018ed1986d79434ac712ff19f951cd00b4dfcb767444410fbb834ebec160abf", size = 132419, upload-time = "2025-07-15T16:07:01.927Z" },
|
{ url = "https://files.pythonhosted.org/packages/ec/10/1f967671966598366de42f07e92b0fc694ffc66eafa4b74131aeca84915f/orjson-3.11.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0b84455e60c4bc12c1e4cbaa5cfc1acdc7775a9da9cec040e17232f4b05458bd", size = 123745, upload-time = "2025-08-12T15:10:57.907Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/59/0c/95ee1e61a067ad24c4921609156b3beeca8b102f6f36dca62b08e1a7c7a8/orjson-3.11.0-cp311-cp311-win32.whl", hash = "sha256:08e191f8a55ac2c00be48e98a5d10dca004cbe8abe73392c55951bfda60fc123", size = 134620, upload-time = "2025-07-15T16:07:03.304Z" },
|
{ url = "https://files.pythonhosted.org/packages/43/eb/76081238671461cfd0f47e0c24f408ffa66184237d56ef18c33e86abb612/orjson-3.11.2-cp311-cp311-win32.whl", hash = "sha256:f0660efeac223f0731a70884e6914a5f04d613b5ae500744c43f7bf7b78f00f9", size = 124393, upload-time = "2025-08-12T15:10:59.267Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/94/3e/afd5e284db9387023803553061ea05c785c36fe7845e4fe25912424b343f/orjson-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:b5a4214ea59c8a3b56f8d484b28114af74e9fba0956f9be5c3ce388ae143bf1f", size = 129333, upload-time = "2025-07-15T16:07:04.973Z" },
|
{ url = "https://files.pythonhosted.org/packages/26/76/cc598c1811ba9ba935171267b02e377fc9177489efce525d478a2999d9cc/orjson-3.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:955811c8405251d9e09cbe8606ad8fdef49a451bcf5520095a5ed38c669223d8", size = 119561, upload-time = "2025-08-12T15:11:00.559Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8b/a4/d29e9995d73f23f2444b4db299a99477a4f7e6f5bf8923b775ef43a4e660/orjson-3.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:57e8e7198a679ab21241ab3f355a7990c7447559e35940595e628c107ef23736", size = 126656, upload-time = "2025-07-15T16:07:06.288Z" },
|
{ url = "https://files.pythonhosted.org/packages/d8/17/c48011750f0489006f7617b0a3cebc8230f36d11a34e7e9aca2085f07792/orjson-3.11.2-cp311-cp311-win_arm64.whl", hash = "sha256:2e4d423a6f838552e3a6d9ec734b729f61f88b1124fd697eab82805ea1a2a97d", size = 114186, upload-time = "2025-08-12T15:11:01.931Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/92/c9/241e304fb1e58ea70b720f1a9e5349c6bb7735ffac401ef1b94f422edd6d/orjson-3.11.0-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b4089f940c638bb1947d54e46c1cd58f4259072fcc97bc833ea9c78903150ac9", size = 240269, upload-time = "2025-07-15T16:07:08.173Z" },
|
{ url = "https://files.pythonhosted.org/packages/40/02/46054ebe7996a8adee9640dcad7d39d76c2000dc0377efa38e55dc5cbf78/orjson-3.11.2-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:901d80d349d8452162b3aa1afb82cec5bee79a10550660bc21311cc61a4c5486", size = 226528, upload-time = "2025-08-12T15:11:03.317Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/26/7c/289457cdf40be992b43f1d90ae213ebc03a31a8e2850271ecd79e79a3135/orjson-3.11.0-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:8335a0ba1c26359fb5c82d643b4c1abbee2bc62875e0f2b5bde6c8e9e25eb68c", size = 129276, upload-time = "2025-07-15T16:07:10.128Z" },
|
{ url = "https://files.pythonhosted.org/packages/e2/c6/6b6f0b4d8aea1137436546b990f71be2cd8bd870aa2f5aa14dba0fcc95dc/orjson-3.11.2-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:cf3bd3967a360e87ee14ed82cb258b7f18c710dacf3822fb0042a14313a673a1", size = 115931, upload-time = "2025-08-12T15:11:04.759Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/66/de/5c0528d46ded965939b6b7f75b1fe93af42b9906b0039096fc92c9001c12/orjson-3.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63c1c9772dafc811d16d6a7efa3369a739da15d1720d6e58ebe7562f54d6f4a2", size = 131966, upload-time = "2025-07-15T16:07:11.509Z" },
|
{ url = "https://files.pythonhosted.org/packages/ae/05/4205cc97c30e82a293dd0d149b1a89b138ebe76afeca66fc129fa2aa4e6a/orjson-3.11.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26693dde66910078229a943e80eeb99fdce6cd2c26277dc80ead9f3ab97d2131", size = 111382, upload-time = "2025-08-12T15:11:06.468Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ad/74/39822f267b5935fb6fc961ccc443f4968a74d34fc9270b83caa44e37d907/orjson-3.11.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9457ccbd8b241fb4ba516417a4c5b95ba0059df4ac801309bcb4ec3870f45ad9", size = 127028, upload-time = "2025-07-15T16:07:13.023Z" },
|
{ url = "https://files.pythonhosted.org/packages/50/c7/b8a951a93caa821f9272a7c917115d825ae2e4e8768f5ddf37968ec9de01/orjson-3.11.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4ad4c8acb50a28211c33fc7ef85ddf5cb18d4636a5205fd3fa2dce0411a0e30c", size = 116271, upload-time = "2025-08-12T15:11:07.845Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/7c/e3/28f6ed7f03db69bddb3ef48621b2b05b394125188f5909ee0a43fcf4820e/orjson-3.11.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0846e13abe79daece94a00b92574f294acad1d362be766c04245b9b4dd0e47e1", size = 129105, upload-time = "2025-07-15T16:07:14.367Z" },
|
{ url = "https://files.pythonhosted.org/packages/17/03/1006c7f8782d5327439e26d9b0ec66500ea7b679d4bbb6b891d2834ab3ee/orjson-3.11.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:994181e7f1725bb5f2d481d7d228738e0743b16bf319ca85c29369c65913df14", size = 119086, upload-time = "2025-08-12T15:11:09.329Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/cb/50/8867fd2fc92c0ab1c3e14673ec5d9d0191202e4ab8ba6256d7a1d6943ad3/orjson-3.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5587c85ae02f608a3f377b6af9eb04829606f518257cbffa8f5081c1aacf2e2f", size = 131902, upload-time = "2025-07-15T16:07:16.176Z" },
|
{ url = "https://files.pythonhosted.org/packages/44/61/57d22bc31f36a93878a6f772aea76b2184102c6993dea897656a66d18c74/orjson-3.11.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbb79a0476393c07656b69c8e763c3cc925fa8e1d9e9b7d1f626901bb5025448", size = 120724, upload-time = "2025-08-12T15:11:10.674Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/13/65/c189deea10342afee08006331082ff67d11b98c2394989998b3ea060354a/orjson-3.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7a1964a71c1567b4570c932a0084ac24ad52c8cf6253d1881400936565ed438", size = 134042, upload-time = "2025-07-15T16:07:17.937Z" },
|
{ url = "https://files.pythonhosted.org/packages/78/a9/4550e96b4c490c83aea697d5347b8f7eb188152cd7b5a38001055ca5b379/orjson-3.11.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:191ed27a1dddb305083d8716af413d7219f40ec1d4c9b0e977453b4db0d6fb6c", size = 123577, upload-time = "2025-08-12T15:11:12.015Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2b/e4/cf23c3f4231d2a9a043940ab045f799f84a6df1b4fb6c9b4412cdc3ebf8c/orjson-3.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5a8243e73690cc6e9151c9e1dd046a8f21778d775f7d478fa1eb4daa4897c61", size = 128260, upload-time = "2025-07-15T16:07:19.651Z" },
|
{ url = "https://files.pythonhosted.org/packages/3a/86/09b8cb3ebd513d708ef0c92d36ac3eebda814c65c72137b0a82d6d688fc4/orjson-3.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0afb89f16f07220183fd00f5f297328ed0a68d8722ad1b0c8dcd95b12bc82804", size = 121195, upload-time = "2025-08-12T15:11:13.399Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/de/b9/2cb94d3a67edb918d19bad4a831af99cd96c3657a23daa239611bcf335d7/orjson-3.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51646f6d995df37b6e1b628f092f41c0feccf1d47e3452c6e95e2474b547d842", size = 130282, upload-time = "2025-07-15T16:07:21.022Z" },
|
{ url = "https://files.pythonhosted.org/packages/37/68/7b40b39ac2c1c644d4644e706d0de6c9999764341cd85f2a9393cb387661/orjson-3.11.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ab6e6b4e93b1573a026b6ec16fca9541354dd58e514b62c558b58554ae04307", size = 119234, upload-time = "2025-08-12T15:11:15.134Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/0b/96/df963cc973e689d4c56398647917b4ee95f47e5b6d2779338c09c015b23b/orjson-3.11.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:2fb8ca8f0b4e31b8aaec674c7540649b64ef02809410506a44dc68d31bd5647b", size = 403765, upload-time = "2025-07-15T16:07:25.469Z" },
|
{ url = "https://files.pythonhosted.org/packages/40/7c/bb6e7267cd80c19023d44d8cbc4ea4ed5429fcd4a7eb9950f50305697a28/orjson-3.11.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9cb23527efb61fb75527df55d20ee47989c4ee34e01a9c98ee9ede232abf6219", size = 392250, upload-time = "2025-08-12T15:11:16.604Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/fb/92/71429ee1badb69f53281602dbb270fa84fc2e51c83193a814d0208bb63b0/orjson-3.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:64a6a3e94a44856c3f6557e6aa56a6686544fed9816ae0afa8df9077f5759791", size = 144779, upload-time = "2025-07-15T16:07:27.339Z" },
|
{ url = "https://files.pythonhosted.org/packages/64/f2/6730ace05583dbca7c1b406d59f4266e48cd0d360566e71482420fb849fc/orjson-3.11.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a4dd1268e4035af21b8a09e4adf2e61f87ee7bf63b86d7bb0a237ac03fad5b45", size = 134572, upload-time = "2025-08-12T15:11:18.205Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c8/ab/3678b2e5ff0c622a974cb8664ed7cdda5ed26ae2b9d71ba66ec36f32d6cf/orjson-3.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69f95d484938d8fab5963e09131bcf9fbbb81fa4ec132e316eb2fb9adb8ce78", size = 132797, upload-time = "2025-07-15T16:07:28.717Z" },
|
{ url = "https://files.pythonhosted.org/packages/96/0f/7d3e03a30d5aac0432882b539a65b8c02cb6dd4221ddb893babf09c424cc/orjson-3.11.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff8b155b145eaf5a9d94d2c476fbe18d6021de93cf36c2ae2c8c5b775763f14e", size = 123869, upload-time = "2025-08-12T15:11:19.554Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/9d/8c/74509f715ff189d2aca90ebb0bd5af6658e0f9aa2512abbe6feca4c78208/orjson-3.11.0-cp312-cp312-win32.whl", hash = "sha256:8514f9f9c667ce7d7ef709ab1a73e7fcab78c297270e90b1963df7126d2b0e23", size = 134695, upload-time = "2025-07-15T16:07:30.034Z" },
|
{ url = "https://files.pythonhosted.org/packages/45/80/1513265eba6d4a960f078f4b1d2bff94a571ab2d28c6f9835e03dfc65cc6/orjson-3.11.2-cp312-cp312-win32.whl", hash = "sha256:ae3bb10279d57872f9aba68c9931aa71ed3b295fa880f25e68da79e79453f46e", size = 124430, upload-time = "2025-08-12T15:11:20.914Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/82/ba/ef25e3e223f452a01eac6a5b38d05c152d037508dcbf87ad2858cbb7d82e/orjson-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:41b38a894520b8cb5344a35ffafdf6ae8042f56d16771b2c5eb107798cee85ee", size = 129446, upload-time = "2025-07-15T16:07:31.412Z" },
|
{ url = "https://files.pythonhosted.org/packages/fb/61/eadf057b68a332351eeb3d89a4cc538d14f31cd8b5ec1b31a280426ccca2/orjson-3.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:d026e1967239ec11a2559b4146a61d13914504b396f74510a1c4d6b19dfd8732", size = 119598, upload-time = "2025-08-12T15:11:22.372Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e3/cd/6f4d93867c5d81bb4ab2d4ac870d3d6e9ba34fa580a03b8d04bf1ce1d8ad/orjson-3.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:5579acd235dd134467340b2f8a670c1c36023b5a69c6a3174c4792af7502bd92", size = 126400, upload-time = "2025-07-15T16:07:34.143Z" },
|
{ url = "https://files.pythonhosted.org/packages/6b/3f/7f4b783402143d965ab7e9a2fc116fdb887fe53bdce7d3523271cd106098/orjson-3.11.2-cp312-cp312-win_arm64.whl", hash = "sha256:59f8d5ad08602711af9589375be98477d70e1d102645430b5a7985fdbf613b36", size = 114052, upload-time = "2025-08-12T15:11:23.762Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/31/63/82d9b6b48624009d230bc6038e54778af8f84dfd54402f9504f477c5cfd5/orjson-3.11.0-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4a8ba9698655e16746fdf5266939427da0f9553305152aeb1a1cc14974a19cfb", size = 240125, upload-time = "2025-07-15T16:07:35.976Z" },
|
{ url = "https://files.pythonhosted.org/packages/c2/f3/0dd6b4750eb556ae4e2c6a9cb3e219ec642e9c6d95f8ebe5dc9020c67204/orjson-3.11.2-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a079fdba7062ab396380eeedb589afb81dc6683f07f528a03b6f7aae420a0219", size = 226419, upload-time = "2025-08-12T15:11:25.517Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/16/3a/d557ed87c63237d4c97a7bac7ac054c347ab8c4b6da09748d162ca287175/orjson-3.11.0-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:67133847f9a35a5ef5acfa3325d4a2f7fe05c11f1505c4117bb086fc06f2a58f", size = 129189, upload-time = "2025-07-15T16:07:37.486Z" },
|
{ url = "https://files.pythonhosted.org/packages/44/d5/e67f36277f78f2af8a4690e0c54da6b34169812f807fd1b4bfc4dbcf9558/orjson-3.11.2-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:6a5f62ebbc530bb8bb4b1ead103647b395ba523559149b91a6c545f7cd4110ad", size = 115803, upload-time = "2025-08-12T15:11:27.357Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/69/5e/b2c9e22e2cd10aa7d76a629cee65d661e06a61fbaf4dc226386f5636dd44/orjson-3.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f797d57814975b78f5f5423acb003db6f9be5186b72d48bd97a1000e89d331d", size = 131953, upload-time = "2025-07-15T16:07:39.254Z" },
|
{ url = "https://files.pythonhosted.org/packages/24/37/ff8bc86e0dacc48f07c2b6e20852f230bf4435611bab65e3feae2b61f0ae/orjson-3.11.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7df6c7b8b0931feb3420b72838c3e2ba98c228f7aa60d461bc050cf4ca5f7b2", size = 111337, upload-time = "2025-08-12T15:11:28.805Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e2/60/760fcd9b50eb44d1206f2b30c8d310b79714553b9d94a02f9ea3252ebe63/orjson-3.11.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:28acd19822987c5163b9e03a6e60853a52acfee384af2b394d11cb413b889246", size = 126922, upload-time = "2025-07-15T16:07:41.282Z" },
|
{ url = "https://files.pythonhosted.org/packages/b9/25/37d4d3e8079ea9784ea1625029988e7f4594ce50d4738b0c1e2bf4a9e201/orjson-3.11.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6f59dfea7da1fced6e782bb3699718088b1036cb361f36c6e4dd843c5111aefe", size = 116222, upload-time = "2025-08-12T15:11:30.18Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6a/7a/8c46daa867ccc92da6de9567608be62052774b924a77c78382e30d50b579/orjson-3.11.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8d38d9e1e2cf9729658e35956cf01e13e89148beb4cb9e794c9c10c5cb252f8", size = 128787, upload-time = "2025-07-15T16:07:42.681Z" },
|
{ url = "https://files.pythonhosted.org/packages/b7/32/a63fd9c07fce3b4193dcc1afced5dd4b0f3a24e27556604e9482b32189c9/orjson-3.11.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edf49146520fef308c31aa4c45b9925fd9c7584645caca7c0c4217d7900214ae", size = 119020, upload-time = "2025-08-12T15:11:31.59Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f2/14/a2f1b123d85f11a19e8749f7d3f9ed6c9b331c61f7b47cfd3e9a1fedb9bc/orjson-3.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05f094edd2b782650b0761fd78858d9254de1c1286f5af43145b3d08cdacfd51", size = 131895, upload-time = "2025-07-15T16:07:44.519Z" },
|
{ url = "https://files.pythonhosted.org/packages/b4/b6/400792b8adc3079a6b5d649264a3224d6342436d9fac9a0ed4abc9dc4596/orjson-3.11.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50995bbeb5d41a32ad15e023305807f561ac5dcd9bd41a12c8d8d1d2c83e44e6", size = 120721, upload-time = "2025-08-12T15:11:33.035Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c8/10/362e8192df7528e8086ea712c5cb01355c8d4e52c59a804417ba01e2eb2d/orjson-3.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d09176a4a9e04a5394a4a0edd758f645d53d903b306d02f2691b97d5c736a9e", size = 133868, upload-time = "2025-07-15T16:07:46.227Z" },
|
{ url = "https://files.pythonhosted.org/packages/40/f3/31ab8f8c699eb9e65af8907889a0b7fef74c1d2b23832719a35da7bb0c58/orjson-3.11.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2cc42960515076eb639b705f105712b658c525863d89a1704d984b929b0577d1", size = 123574, upload-time = "2025-08-12T15:11:34.433Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f8/4e/ef43582ef3e3dfd2a39bc3106fa543364fde1ba58489841120219da6e22f/orjson-3.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a585042104e90a61eda2564d11317b6a304eb4e71cd33e839f5af6be56c34d3", size = 128234, upload-time = "2025-07-15T16:07:48.123Z" },
|
{ url = "https://files.pythonhosted.org/packages/bd/a6/ce4287c412dff81878f38d06d2c80845709c60012ca8daf861cb064b4574/orjson-3.11.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c56777cab2a7b2a8ea687fedafb84b3d7fdafae382165c31a2adf88634c432fa", size = 121225, upload-time = "2025-08-12T15:11:36.133Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d7/fa/02dabb2f1d605bee8c4bb1160cfc7467976b1ed359a62cc92e0681b53c45/orjson-3.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d2218629dbfdeeb5c9e0573d59f809d42f9d49ae6464d2f479e667aee14c3ef4", size = 130232, upload-time = "2025-07-15T16:07:50.197Z" },
|
{ url = "https://files.pythonhosted.org/packages/69/b0/7a881b2aef4fed0287d2a4fbb029d01ed84fa52b4a68da82bdee5e50598e/orjson-3.11.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:07349e88025b9b5c783077bf7a9f401ffbfb07fd20e86ec6fc5b7432c28c2c5e", size = 119201, upload-time = "2025-08-12T15:11:37.642Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/16/76/951b5619605c8d2ede80cc989f32a66abc954530d86e84030db2250c63a1/orjson-3.11.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:613e54a2b10b51b656305c11235a9c4a5c5491ef5c283f86483d4e9e123ed5e4", size = 403648, upload-time = "2025-07-15T16:07:52.136Z" },
|
{ url = "https://files.pythonhosted.org/packages/cf/98/a325726b37f7512ed6338e5e65035c3c6505f4e628b09a5daf0419f054ea/orjson-3.11.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:45841fbb79c96441a8c58aa29ffef570c5df9af91f0f7a9572e5505e12412f15", size = 392193, upload-time = "2025-08-12T15:11:39.153Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/96/e2/5fa53bb411455a63b3713db90b588e6ca5ed2db59ad49b3fb8a0e94e0dda/orjson-3.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9dac7fbf3b8b05965986c5cfae051eb9a30fced7f15f1d13a5adc608436eb486", size = 144572, upload-time = "2025-07-15T16:07:54.004Z" },
|
{ url = "https://files.pythonhosted.org/packages/cb/4f/a7194f98b0ce1d28190e0c4caa6d091a3fc8d0107ad2209f75c8ba398984/orjson-3.11.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13d8d8db6cd8d89d4d4e0f4161acbbb373a4d2a4929e862d1d2119de4aa324ac", size = 134548, upload-time = "2025-08-12T15:11:40.768Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ad/d0/7d6f91e1e0f034258c3a3358f20b0c9490070e8a7ab8880085547274c7f9/orjson-3.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93b64b254414e2be55ac5257124b5602c5f0b4d06b80bd27d1165efe8f36e836", size = 132766, upload-time = "2025-07-15T16:07:55.936Z" },
|
{ url = "https://files.pythonhosted.org/packages/e8/5e/b84caa2986c3f472dc56343ddb0167797a708a8d5c3be043e1e2677b55df/orjson-3.11.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51da1ee2178ed09c00d09c1b953e45846bbc16b6420965eb7a913ba209f606d8", size = 123798, upload-time = "2025-08-12T15:11:42.164Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ff/f8/4d46481f1b3fb40dc826d62179f96c808eb470cdcc74b6593fb114d74af3/orjson-3.11.0-cp313-cp313-win32.whl", hash = "sha256:359cbe11bc940c64cb3848cf22000d2aef36aff7bfd09ca2c0b9cb309c387132", size = 134638, upload-time = "2025-07-15T16:07:57.343Z" },
|
{ url = "https://files.pythonhosted.org/packages/9c/5b/e398449080ce6b4c8fcadad57e51fa16f65768e1b142ba90b23ac5d10801/orjson-3.11.2-cp313-cp313-win32.whl", hash = "sha256:51dc033df2e4a4c91c0ba4f43247de99b3cbf42ee7a42ee2b2b2f76c8b2f2cb5", size = 124402, upload-time = "2025-08-12T15:11:44.036Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/85/3f/544938dcfb7337d85ee1e43d7685cf8f3bfd452e0b15a32fe70cb4ca5094/orjson-3.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:0759b36428067dc777b202dd286fbdd33d7f261c6455c4238ea4e8474358b1e6", size = 129411, upload-time = "2025-07-15T16:07:58.852Z" },
|
{ url = "https://files.pythonhosted.org/packages/b3/66/429e4608e124debfc4790bfc37131f6958e59510ba3b542d5fc163be8e5f/orjson-3.11.2-cp313-cp313-win_amd64.whl", hash = "sha256:29d91d74942b7436f29b5d1ed9bcfc3f6ef2d4f7c4997616509004679936650d", size = 119498, upload-time = "2025-08-12T15:11:45.864Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/43/0c/f75015669d7817d222df1bb207f402277b77d22c4833950c8c8c7cf2d325/orjson-3.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:51cdca2f36e923126d0734efaf72ddbb5d6da01dbd20eab898bdc50de80d7b5a", size = 126349, upload-time = "2025-07-15T16:08:00.322Z" },
|
{ url = "https://files.pythonhosted.org/packages/7b/04/f8b5f317cce7ad3580a9ad12d7e2df0714dfa8a83328ecddd367af802f5b/orjson-3.11.2-cp313-cp313-win_arm64.whl", hash = "sha256:4ca4fb5ac21cd1e48028d4f708b1bb13e39c42d45614befd2ead004a8bba8535", size = 114051, upload-time = "2025-08-12T15:11:47.555Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6c/41/eac31c44ce001b3da8a6b5ebbb8a4fc2c3eaf479e2d068e36b2ea6ab7095/orjson-3.11.0-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d79c180cfb3ae68f13245d0ff551dca03d96258aa560830bf8a223bd68d8272c", size = 241023, upload-time = "2025-07-15T16:08:02.233Z" },
|
{ url = "https://files.pythonhosted.org/packages/74/83/2c363022b26c3c25b3708051a19d12f3374739bb81323f05b284392080c0/orjson-3.11.2-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:3dcba7101ea6a8d4ef060746c0f2e7aa8e2453a1012083e1ecce9726d7554cb7", size = 226406, upload-time = "2025-08-12T15:11:49.445Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/b5/d6/1edc258f3eff573af7416b2b8536032e6f4ed3759fa5773c5db95a28d2f2/orjson-3.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:105bca887532dc71ce4b05a5de95dea447a310409d7a8cf0cb1c4a120469e9ad", size = 132245, upload-time = "2025-07-15T16:08:04.734Z" },
|
{ url = "https://files.pythonhosted.org/packages/b0/a7/aa3c973de0b33fc93b4bd71691665ffdfeae589ea9d0625584ab10a7d0f5/orjson-3.11.2-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:15d17bdb76a142e1f55d91913e012e6e6769659daa6bfef3ef93f11083137e81", size = 115788, upload-time = "2025-08-12T15:11:50.992Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/24/89/49236838cdc8d88b93f1c80f44531103f589307e4e783c855a6a63f28b45/orjson-3.11.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:acf5a63ae9cdb88274126af85913ceae554d8fd71122effa24a53227abbeee16", size = 126981, upload-time = "2025-07-15T16:08:06.114Z" },
|
{ url = "https://files.pythonhosted.org/packages/ef/f2/e45f233dfd09fdbb052ec46352363dca3906618e1a2b264959c18f809d0b/orjson-3.11.2-cp314-cp314-manylinux_2_34_aarch64.whl", hash = "sha256:53c9e81768c69d4b66b8876ec3c8e431c6e13477186d0db1089d82622bccd19f", size = 111318, upload-time = "2025-08-12T15:11:52.495Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/80/78/8744b86efae7693344edcf255addc2a9f9e4f5552ccf71d9581d03c3e1aa/orjson-3.11.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:894635df36c0be32f1c8c8607e853b8865edb58e7618e57892e85d06418723eb", size = 128686, upload-time = "2025-07-15T16:08:07.843Z" },
|
{ url = "https://files.pythonhosted.org/packages/3e/23/cf5a73c4da6987204cbbf93167f353ff0c5013f7c5e5ef845d4663a366da/orjson-3.11.2-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:d4f13af59a7b84c1ca6b8a7ab70d608f61f7c44f9740cd42409e6ae7b6c8d8b7", size = 121231, upload-time = "2025-08-12T15:11:53.941Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/91/8c/4c45feee9fa52488e67be2e887eb966337d4ddb6675129471f0dab98587d/orjson-3.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02dd4f0a1a2be943a104ce5f3ec092631ee3e9f0b4bb9eeee3400430bd94ddef", size = 131830, upload-time = "2025-07-15T16:08:14.423Z" },
|
{ url = "https://files.pythonhosted.org/packages/40/1d/47468a398ae68a60cc21e599144e786e035bb12829cb587299ecebc088f1/orjson-3.11.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bde64aa469b5ee46cc960ed241fae3721d6a8801dacb2ca3466547a2535951e4", size = 119204, upload-time = "2025-08-12T15:11:55.409Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/47/15/9462308306650de38d042af226e186d2fe28ee8e44c5462e011e767e6e44/orjson-3.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:720b4bb5e1b971960a62c2fa254c2d2a14e7eb791e350d05df8583025aa59d15", size = 134004, upload-time = "2025-07-15T16:08:16.024Z" },
|
{ url = "https://files.pythonhosted.org/packages/4d/d9/f99433d89b288b5bc8836bffb32a643f805e673cf840ef8bab6e73ced0d1/orjson-3.11.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:b5ca86300aeb383c8fa759566aca065878d3d98c3389d769b43f0a2e84d52c5f", size = 392237, upload-time = "2025-08-12T15:11:57.18Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/db/1d/bfa55d7681cf704d73e9c6de8138535b2f41e06a49d88bf9bdf27c8d4d7b/orjson-3.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bf058105a8aed144e0d1cfe7ac4174748c3fc7203f225abaeac7f4121abccb0", size = 127893, upload-time = "2025-07-15T16:08:17.558Z" },
|
{ url = "https://files.pythonhosted.org/packages/d4/dc/1b9d80d40cebef603325623405136a29fb7d08c877a728c0943dd066c29a/orjson-3.11.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:24e32a558ebed73a6a71c8f1cbc163a7dd5132da5270ff3d8eeb727f4b6d1bc7", size = 134578, upload-time = "2025-08-12T15:11:58.844Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/1c/bb/e91aa9e63077d8754d1578787e8917078e5c6743579290bc454bbc609241/orjson-3.11.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a2788f741e5a0e885e5eaf1d91d0c9106e03cb9575b0c55ba36fd3d48b0b1e9b", size = 130546, upload-time = "2025-07-15T16:08:19.21Z" },
|
{ url = "https://files.pythonhosted.org/packages/45/b3/72e7a4c5b6485ef4e83ef6aba7f1dd041002bad3eb5d1d106ca5b0fc02c6/orjson-3.11.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e36319a5d15b97e4344110517450396845cc6789aed712b1fbf83c1bd95792f6", size = 123799, upload-time = "2025-08-12T15:12:00.352Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/9d/67/4c53a325ac9abf883e922da214707f63efcb8b4d54529984df0e6aff1d0b/orjson-3.11.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:c60c99fe1e15894367b0340b2ff16c7c69f9c3f3a54aa3961a58c102b292ad94", size = 403849, upload-time = "2025-07-15T16:08:21.025Z" },
|
{ url = "https://files.pythonhosted.org/packages/c8/3e/a3d76b392e7acf9b34dc277171aad85efd6accc75089bb35b4c614990ea9/orjson-3.11.2-cp314-cp314-win32.whl", hash = "sha256:40193ada63fab25e35703454d65b6afc71dbc65f20041cb46c6d91709141ef7f", size = 124461, upload-time = "2025-08-12T15:12:01.854Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/5a/64/a779341bd2231e28eb09cf6e6260d9f713a39ae5163b0f1228ab5175bfee/orjson-3.11.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:99d17aab984f4d029b8f3c307e6be3c63d9ee5ef55e30d761caf05e883009949", size = 144600, upload-time = "2025-07-15T16:08:22.701Z" },
|
{ url = "https://files.pythonhosted.org/packages/fb/e3/75c6a596ff8df9e4a5894813ff56695f0a218e6ea99420b4a645c4f7795d/orjson-3.11.2-cp314-cp314-win_amd64.whl", hash = "sha256:7c8ac5f6b682d3494217085cf04dadae66efee45349ad4ee2a1da3c97e2305a8", size = 119494, upload-time = "2025-08-12T15:12:03.337Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/03/c1/fc36a6e3b40df3388ecf57b18a940f6584362652e6ee57464ccc5715b2e3/orjson-3.11.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e98f02e23611763c9e5dfcb83bd33219231091589f0d1691e721aea9c52bf329", size = 132416, upload-time = "2025-07-15T16:08:24.258Z" },
|
{ url = "https://files.pythonhosted.org/packages/5b/3d/9e74742fc261c5ca473c96bb3344d03995869e1dc6402772c60afb97736a/orjson-3.11.2-cp314-cp314-win_arm64.whl", hash = "sha256:21cf261e8e79284242e4cb1e5924df16ae28255184aafeff19be1405f6d33f67", size = 114046, upload-time = "2025-08-12T15:12:04.87Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/3b/29/eb5ed777d7ea5d0fdee5981751e3a4e9de73f47e32bb20f1ea748b04b1d2/orjson-3.11.0-cp39-cp39-win32.whl", hash = "sha256:923301f33ea866b18f8836cf41d9c6d33e3b5cab8577d20fed34ec29f0e13a0d", size = 134617, upload-time = "2025-07-15T16:08:26.052Z" },
|
{ url = "https://files.pythonhosted.org/packages/4f/08/8ebc6dcac0938376b7e61dff432c33958505ae4c185dda3fa1e6f46ac40b/orjson-3.11.2-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:957f10c7b5bce3d3f2ad577f3b307c784f5dabafcce3b836229c269c11841c86", size = 226498, upload-time = "2025-08-12T15:12:06.51Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/72/40/feba627d9349bb1a91500e0047ae526d83bb1918545ff4dfee3e1bd7195e/orjson-3.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:475491bb78af2a0170f49e90013f1a0f1286527f3617491f8940d7e5da862da7", size = 129320, upload-time = "2025-07-15T16:08:27.484Z" },
|
{ url = "https://files.pythonhosted.org/packages/ff/74/a97c8e2bc75a27dfeeb1b289645053f1889125447f3b7484a2e34ac55d2a/orjson-3.11.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a669e31ab8eb466c9142ac7a4be2bb2758ad236a31ef40dcd4cf8774ab40f33", size = 111529, upload-time = "2025-08-12T15:12:08.21Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/78/c3/55121b5722a1a4e4610a411866cfeada5314dc498cd42435b590353009d2/orjson-3.11.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:adedf7d887416c51ad49de3c53b111887e0b63db36c6eb9f846a8430952303d8", size = 116213, upload-time = "2025-08-12T15:12:09.776Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/54/d3/1c810fa36a749157f1ec68f825b09d5b6958ed5eaf66c7b89bc0f1656517/orjson-3.11.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ad8873979659ad98fc56377b9c5b93eb8059bf01e6412f7abf7dbb3d637a991", size = 118594, upload-time = "2025-08-12T15:12:11.363Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/09/9c/052a6619857aba27899246c1ac9e1566fe976dbb48c2d2d177eb269e6d92/orjson-3.11.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9482ef83b2bf796157566dd2d2742a8a1e377045fe6065fa67acb1cb1d21d9a3", size = 120706, upload-time = "2025-08-12T15:12:13.265Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/4b/91/ed0632b8bafa5534d40483ca14f4b7b7e8f27a016f52ff771420b3591574/orjson-3.11.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73cee7867c1fcbd1cc5b6688b3e13db067f968889242955780123a68b3d03316", size = 123412, upload-time = "2025-08-12T15:12:14.807Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/90/3d/058184ae52a2035098939329f8864c5e28c3bbd660f80d4f687f4fd3e629/orjson-3.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:465166773265f3cc25db10199f5d11c81898a309e26a2481acf33ddbec433fda", size = 121011, upload-time = "2025-08-12T15:12:16.352Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/57/ab/70e7a2c26a29878ad81ac551f3d11e184efafeed92c2ea15301ac71e2b44/orjson-3.11.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc000190a7b1d2d8e36cba990b3209a1e15c0efb6c7750e87f8bead01afc0d46", size = 119387, upload-time = "2025-08-12T15:12:17.88Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6f/f1/532be344579590c2faa3d9926ec446e8e030d6d04359a8d6f9b3f4d18283/orjson-3.11.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:df3fdd8efa842ccbb81135d6f58a73512f11dba02ed08d9466261c2e9417af4e", size = 392280, upload-time = "2025-08-12T15:12:20.3Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/eb/90/dfb90d82ee7447ba0c5315b1012f36336d34a4b468f5896092926eb2921b/orjson-3.11.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3dacfc621be3079ec69e0d4cb32e3764067726e0ef5a5576428f68b6dc85b4f6", size = 134127, upload-time = "2025-08-12T15:12:22.053Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/17/cb/d113d03dfaee4933b0f6e0f3d358886db1468302bb74f1f3c59d9229ce12/orjson-3.11.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9fdff73a029cde5f4a1cf5ec9dbc6acab98c9ddd69f5580c2b3f02ce43ba9f9f", size = 123722, upload-time = "2025-08-12T15:12:23.642Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/55/78/a89748f500d7cf909fe0b30093ab87d256c279106048e985269a5530c0a1/orjson-3.11.2-cp39-cp39-win32.whl", hash = "sha256:b1efbdc479c6451138c3733e415b4d0e16526644e54e2f3689f699c4cda303bf", size = 124391, upload-time = "2025-08-12T15:12:25.143Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e8/50/e436f1356650cf96ff62c386dbfeb9ef8dd9cd30c4296103244e7fae2d15/orjson-3.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:c9ec0cc0d4308cad1e38a1ee23b64567e2ff364c2a3fe3d6cbc69cf911c45712", size = 119547, upload-time = "2025-08-12T15:12:26.77Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1163,7 +1180,7 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "requests"
|
name = "requests"
|
||||||
version = "2.32.4"
|
version = "2.32.5"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "certifi", marker = "python_full_version >= '3.11'" },
|
{ name = "certifi", marker = "python_full_version >= '3.11'" },
|
||||||
@@ -1171,9 +1188,9 @@ dependencies = [
|
|||||||
{ name = "idna", marker = "python_full_version >= '3.11'" },
|
{ name = "idna", marker = "python_full_version >= '3.11'" },
|
||||||
{ name = "urllib3", marker = "python_full_version >= '3.11'" },
|
{ name = "urllib3", marker = "python_full_version >= '3.11'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" },
|
{ url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1190,27 +1207,28 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruff"
|
name = "ruff"
|
||||||
version = "0.12.4"
|
version = "0.12.9"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/9b/ce/8d7dbedede481245b489b769d27e2934730791a9a82765cb94566c6e6abd/ruff-0.12.4.tar.gz", hash = "sha256:13efa16df6c6eeb7d0f091abae50f58e9522f3843edb40d56ad52a5a4a4b6873", size = 5131435, upload-time = "2025-07-17T17:27:19.138Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/4a/45/2e403fa7007816b5fbb324cb4f8ed3c7402a927a0a0cb2b6279879a8bfdc/ruff-0.12.9.tar.gz", hash = "sha256:fbd94b2e3c623f659962934e52c2bea6fc6da11f667a427a368adaf3af2c866a", size = 5254702, upload-time = "2025-08-14T16:08:55.2Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/ae/9f/517bc5f61bad205b7f36684ffa5415c013862dee02f55f38a217bdbe7aa4/ruff-0.12.4-py3-none-linux_armv6l.whl", hash = "sha256:cb0d261dac457ab939aeb247e804125a5d521b21adf27e721895b0d3f83a0d0a", size = 10188824, upload-time = "2025-07-17T17:26:31.412Z" },
|
{ url = "https://files.pythonhosted.org/packages/ad/20/53bf098537adb7b6a97d98fcdebf6e916fcd11b2e21d15f8c171507909cc/ruff-0.12.9-py3-none-linux_armv6l.whl", hash = "sha256:fcebc6c79fcae3f220d05585229463621f5dbf24d79fdc4936d9302e177cfa3e", size = 11759705, upload-time = "2025-08-14T16:08:12.968Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/28/83/691baae5a11fbbde91df01c565c650fd17b0eabed259e8b7563de17c6529/ruff-0.12.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:55c0f4ca9769408d9b9bac530c30d3e66490bd2beb2d3dae3e4128a1f05c7442", size = 10884521, upload-time = "2025-07-17T17:26:35.084Z" },
|
{ url = "https://files.pythonhosted.org/packages/20/4d/c764ee423002aac1ec66b9d541285dd29d2c0640a8086c87de59ebbe80d5/ruff-0.12.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aed9d15f8c5755c0e74467731a007fcad41f19bcce41cd75f768bbd687f8535f", size = 12527042, upload-time = "2025-08-14T16:08:16.54Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d6/8d/756d780ff4076e6dd035d058fa220345f8c458391f7edfb1c10731eedc75/ruff-0.12.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a8224cc3722c9ad9044da7f89c4c1ec452aef2cfe3904365025dd2f51daeae0e", size = 10277653, upload-time = "2025-07-17T17:26:37.897Z" },
|
{ url = "https://files.pythonhosted.org/packages/8b/45/cfcdf6d3eb5fc78a5b419e7e616d6ccba0013dc5b180522920af2897e1be/ruff-0.12.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5b15ea354c6ff0d7423814ba6d44be2807644d0c05e9ed60caca87e963e93f70", size = 11724457, upload-time = "2025-08-14T16:08:18.686Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8d/97/8eeee0f48ece153206dce730fc9e0e0ca54fd7f261bb3d99c0a4343a1892/ruff-0.12.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9949d01d64fa3672449a51ddb5d7548b33e130240ad418884ee6efa7a229586", size = 10485993, upload-time = "2025-07-17T17:26:40.68Z" },
|
{ url = "https://files.pythonhosted.org/packages/72/e6/44615c754b55662200c48bebb02196dbb14111b6e266ab071b7e7297b4ec/ruff-0.12.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d596c2d0393c2502eaabfef723bd74ca35348a8dac4267d18a94910087807c53", size = 11949446, upload-time = "2025-08-14T16:08:21.059Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/49/b8/22a43d23a1f68df9b88f952616c8508ea6ce4ed4f15353b8168c48b2d7e7/ruff-0.12.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:be0593c69df9ad1465e8a2d10e3defd111fdb62dcd5be23ae2c06da77e8fcffb", size = 10022824, upload-time = "2025-07-17T17:26:43.564Z" },
|
{ url = "https://files.pythonhosted.org/packages/fd/d1/9b7d46625d617c7df520d40d5ac6cdcdf20cbccb88fad4b5ecd476a6bb8d/ruff-0.12.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1b15599931a1a7a03c388b9c5df1bfa62be7ede6eb7ef753b272381f39c3d0ff", size = 11566350, upload-time = "2025-08-14T16:08:23.433Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/cd/70/37c234c220366993e8cffcbd6cadbf332bfc848cbd6f45b02bade17e0149/ruff-0.12.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7dea966bcb55d4ecc4cc3270bccb6f87a337326c9dcd3c07d5b97000dbff41c", size = 11524414, upload-time = "2025-07-17T17:26:46.219Z" },
|
{ url = "https://files.pythonhosted.org/packages/59/20/b73132f66f2856bc29d2d263c6ca457f8476b0bbbe064dac3ac3337a270f/ruff-0.12.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d02faa2977fb6f3f32ddb7828e212b7dd499c59eb896ae6c03ea5c303575756", size = 13270430, upload-time = "2025-08-14T16:08:25.837Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/14/77/c30f9964f481b5e0e29dd6a1fae1f769ac3fd468eb76fdd5661936edd262/ruff-0.12.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:afcfa3ab5ab5dd0e1c39bf286d829e042a15e966b3726eea79528e2e24d8371a", size = 12419216, upload-time = "2025-07-17T17:26:48.883Z" },
|
{ url = "https://files.pythonhosted.org/packages/a2/21/eaf3806f0a3d4c6be0a69d435646fba775b65f3f2097d54898b0fd4bb12e/ruff-0.12.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:17d5b6b0b3a25259b69ebcba87908496e6830e03acfb929ef9fd4c58675fa2ea", size = 14264717, upload-time = "2025-08-14T16:08:27.907Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6e/79/af7fe0a4202dce4ef62c5e33fecbed07f0178f5b4dd9c0d2fcff5ab4a47c/ruff-0.12.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c057ce464b1413c926cdb203a0f858cd52f3e73dcb3270a3318d1630f6395bb3", size = 11976756, upload-time = "2025-07-17T17:26:51.754Z" },
|
{ url = "https://files.pythonhosted.org/packages/d2/82/1d0c53bd37dcb582b2c521d352fbf4876b1e28bc0d8894344198f6c9950d/ruff-0.12.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:72db7521860e246adbb43f6ef464dd2a532ef2ef1f5dd0d470455b8d9f1773e0", size = 13684331, upload-time = "2025-08-14T16:08:30.352Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/09/d1/33fb1fc00e20a939c305dbe2f80df7c28ba9193f7a85470b982815a2dc6a/ruff-0.12.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e64b90d1122dc2713330350626b10d60818930819623abbb56535c6466cce045", size = 11020019, upload-time = "2025-07-17T17:26:54.265Z" },
|
{ url = "https://files.pythonhosted.org/packages/3b/2f/1c5cf6d8f656306d42a686f1e207f71d7cebdcbe7b2aa18e4e8a0cb74da3/ruff-0.12.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a03242c1522b4e0885af63320ad754d53983c9599157ee33e77d748363c561ce", size = 12739151, upload-time = "2025-08-14T16:08:32.55Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/64/f4/e3cd7f7bda646526f09693e2e02bd83d85fff8a8222c52cf9681c0d30843/ruff-0.12.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2abc48f3d9667fdc74022380b5c745873499ff827393a636f7a59da1515e7c57", size = 11277890, upload-time = "2025-07-17T17:26:56.914Z" },
|
{ url = "https://files.pythonhosted.org/packages/47/09/25033198bff89b24d734e6479e39b1968e4c992e82262d61cdccaf11afb9/ruff-0.12.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fc83e4e9751e6c13b5046d7162f205d0a7bac5840183c5beebf824b08a27340", size = 12954992, upload-time = "2025-08-14T16:08:34.816Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/5e/d0/69a85fb8b94501ff1a4f95b7591505e8983f38823da6941eb5b6badb1e3a/ruff-0.12.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2b2449dc0c138d877d629bea151bee8c0ae3b8e9c43f5fcaafcd0c0d0726b184", size = 10348539, upload-time = "2025-07-17T17:26:59.381Z" },
|
{ url = "https://files.pythonhosted.org/packages/52/8e/d0dbf2f9dca66c2d7131feefc386523404014968cd6d22f057763935ab32/ruff-0.12.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:881465ed56ba4dd26a691954650de6ad389a2d1fdb130fe51ff18a25639fe4bb", size = 12899569, upload-time = "2025-08-14T16:08:36.852Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/16/a0/91372d1cb1678f7d42d4893b88c252b01ff1dffcad09ae0c51aa2542275f/ruff-0.12.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:56e45bb11f625db55f9b70477062e6a1a04d53628eda7784dce6e0f55fd549eb", size = 10009579, upload-time = "2025-07-17T17:27:02.462Z" },
|
{ url = "https://files.pythonhosted.org/packages/a0/bd/b614d7c08515b1428ed4d3f1d4e3d687deffb2479703b90237682586fa66/ruff-0.12.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:43f07a3ccfc62cdb4d3a3348bf0588358a66da756aa113e071b8ca8c3b9826af", size = 11751983, upload-time = "2025-08-14T16:08:39.314Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/23/1b/c4a833e3114d2cc0f677e58f1df6c3b20f62328dbfa710b87a1636a5e8eb/ruff-0.12.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:478fccdb82ca148a98a9ff43658944f7ab5ec41c3c49d77cd99d44da019371a1", size = 10942982, upload-time = "2025-07-17T17:27:05.343Z" },
|
{ url = "https://files.pythonhosted.org/packages/58/d6/383e9f818a2441b1a0ed898d7875f11273f10882f997388b2b51cb2ae8b5/ruff-0.12.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:07adb221c54b6bba24387911e5734357f042e5669fa5718920ee728aba3cbadc", size = 11538635, upload-time = "2025-08-14T16:08:41.297Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ff/ce/ce85e445cf0a5dd8842f2f0c6f0018eedb164a92bdf3eda51984ffd4d989/ruff-0.12.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0fc426bec2e4e5f4c4f182b9d2ce6a75c85ba9bcdbe5c6f2a74fcb8df437df4b", size = 11343331, upload-time = "2025-07-17T17:27:08.652Z" },
|
{ url = "https://files.pythonhosted.org/packages/20/9c/56f869d314edaa9fc1f491706d1d8a47747b9d714130368fbd69ce9024e9/ruff-0.12.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f5cd34fabfdea3933ab85d72359f118035882a01bff15bd1d2b15261d85d5f66", size = 12534346, upload-time = "2025-08-14T16:08:43.39Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/35/cf/441b7fc58368455233cfb5b77206c849b6dfb48b23de532adcc2e50ccc06/ruff-0.12.4-py3-none-win32.whl", hash = "sha256:4de27977827893cdfb1211d42d84bc180fceb7b72471104671c59be37041cf93", size = 10267904, upload-time = "2025-07-17T17:27:11.814Z" },
|
{ url = "https://files.pythonhosted.org/packages/bd/4b/d8b95c6795a6c93b439bc913ee7a94fda42bb30a79285d47b80074003ee7/ruff-0.12.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f6be1d2ca0686c54564da8e7ee9e25f93bdd6868263805f8c0b8fc6a449db6d7", size = 13017021, upload-time = "2025-08-14T16:08:45.889Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ce/7e/20af4a0df5e1299e7368d5ea4350412226afb03d95507faae94c80f00afd/ruff-0.12.4-py3-none-win_amd64.whl", hash = "sha256:fe0b9e9eb23736b453143d72d2ceca5db323963330d5b7859d60d101147d461a", size = 11209038, upload-time = "2025-07-17T17:27:14.417Z" },
|
{ url = "https://files.pythonhosted.org/packages/c7/c1/5f9a839a697ce1acd7af44836f7c2181cdae5accd17a5cb85fcbd694075e/ruff-0.12.9-py3-none-win32.whl", hash = "sha256:cc7a37bd2509974379d0115cc5608a1a4a6c4bff1b452ea69db83c8855d53f93", size = 11734785, upload-time = "2025-08-14T16:08:48.062Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/11/02/8857d0dfb8f44ef299a5dfd898f673edefb71e3b533b3b9d2db4c832dd13/ruff-0.12.4-py3-none-win_arm64.whl", hash = "sha256:0618ec4442a83ab545e5b71202a5c0ed7791e8471435b94e655b570a5031a98e", size = 10469336, upload-time = "2025-07-17T17:27:16.913Z" },
|
{ url = "https://files.pythonhosted.org/packages/fa/66/cdddc2d1d9a9f677520b7cfc490d234336f523d4b429c1298de359a3be08/ruff-0.12.9-py3-none-win_amd64.whl", hash = "sha256:6fb15b1977309741d7d098c8a3cb7a30bc112760a00fb6efb7abc85f00ba5908", size = 12840654, upload-time = "2025-08-14T16:08:50.158Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ac/fd/669816bc6b5b93b9586f3c1d87cd6bc05028470b3ecfebb5938252c47a35/ruff-0.12.9-py3-none-win_arm64.whl", hash = "sha256:63c8c819739d86b96d500cce885956a1a48ab056bbcbc61b747ad494b2485089", size = 11949623, upload-time = "2025-08-14T16:08:52.233Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1238,15 +1256,15 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "starlette"
|
name = "starlette"
|
||||||
version = "0.47.1"
|
version = "0.47.2"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "anyio", marker = "python_full_version >= '3.11'" },
|
{ name = "anyio", marker = "python_full_version >= '3.11'" },
|
||||||
{ name = "typing-extensions", marker = "python_full_version >= '3.11' and python_full_version < '3.13'" },
|
{ name = "typing-extensions", marker = "python_full_version >= '3.11' and python_full_version < '3.13'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/0a/69/662169fdb92fb96ec3eaee218cf540a629d629c86d7993d9651226a6789b/starlette-0.47.1.tar.gz", hash = "sha256:aef012dd2b6be325ffa16698f9dc533614fb1cebd593a906b90dc1025529a79b", size = 2583072, upload-time = "2025-06-21T04:03:17.337Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/04/57/d062573f391d062710d4088fa1369428c38d51460ab6fedff920efef932e/starlette-0.47.2.tar.gz", hash = "sha256:6ae9aa5db235e4846decc1e7b79c4f346adf41e9777aebeb49dfd09bbd7023d8", size = 2583948, upload-time = "2025-07-20T17:31:58.522Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/82/95/38ef0cd7fa11eaba6a99b3c4f5ac948d8bc6ff199aabd327a29cc000840c/starlette-0.47.1-py3-none-any.whl", hash = "sha256:5e11c9f5c7c3f24959edbf2dffdc01bba860228acf657129467d8a7468591527", size = 72747, upload-time = "2025-06-21T04:03:15.705Z" },
|
{ url = "https://files.pythonhosted.org/packages/f7/1f/b876b1f83aef204198a42dc101613fefccb32258e5428b5f9259677864b4/starlette-0.47.2-py3-none-any.whl", hash = "sha256:c5847e96134e5c5371ee9fac6fdf1a67336d5815e09eb2a01fdb57a351ef915b", size = 72984, upload-time = "2025-07-20T17:31:56.738Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1308,11 +1326,11 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "truststore"
|
name = "truststore"
|
||||||
version = "0.10.1"
|
version = "0.10.4"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/0f/a7/b7a43228762966a13598a404f3dfb4803ea29a906f449d8b0e73ed0bcd30/truststore-0.10.1.tar.gz", hash = "sha256:eda021616b59021812e800fa0a071e51b266721bef3ce092db8a699e21c63539", size = 26101, upload-time = "2025-02-07T18:57:38.201Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/53/a3/1585216310e344e8102c22482f6060c7a6ea0322b63e026372e6dcefcfd6/truststore-0.10.4.tar.gz", hash = "sha256:9d91bd436463ad5e4ee4aba766628dd6cd7010cf3e2461756b3303710eebc301", size = 26169, upload-time = "2025-08-12T18:49:02.73Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/bc/df/8ad635bdcfa8214c399e5614f7c2121dced47defb755a85ea1fa702ffb1c/truststore-0.10.1-py3-none-any.whl", hash = "sha256:b64e6025a409a43ebdd2807b0c41c8bff49ea7ae6550b5087ac6df6619352d4c", size = 18496, upload-time = "2025-02-07T18:57:36.348Z" },
|
{ url = "https://files.pythonhosted.org/packages/19/97/56608b2249fe206a67cd573bc93cd9896e1efb9e98bce9c163bcdc704b88/truststore-0.10.4-py3-none-any.whl", hash = "sha256:adaeaecf1cbb5f4de3b1959b42d41f6fab57b2b1666adb59e89cb0b53361d981", size = 18660, upload-time = "2025-08-12T18:49:01.46Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1606,91 +1624,106 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zstandard"
|
name = "zstandard"
|
||||||
version = "0.23.0"
|
version = "0.24.0"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
sdist = { url = "https://files.pythonhosted.org/packages/09/1b/c20b2ef1d987627765dcd5bf1dadb8ef6564f00a87972635099bb76b7a05/zstandard-0.24.0.tar.gz", hash = "sha256:fe3198b81c00032326342d973e526803f183f97aa9e9a98e3f897ebafe21178f", size = 905681, upload-time = "2025-08-17T18:36:36.352Z" }
|
||||||
{ name = "cffi", marker = "python_full_version >= '3.11' and platform_python_implementation == 'PyPy'" },
|
|
||||||
]
|
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/2ac0287b442160a89d726b17a9184a4c615bb5237db763791a7fd16d9df1/zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", size = 681701, upload-time = "2024-07-15T00:18:06.141Z" }
|
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/2a/55/bd0487e86679db1823fc9ee0d8c9c78ae2413d34c0b461193b5f4c31d22f/zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9", size = 788701, upload-time = "2024-07-15T00:13:27.351Z" },
|
{ url = "https://files.pythonhosted.org/packages/63/9d/d1ca1e7bff6a7938e81180322c053c080ae9e31b0e3b393434deae7a1ae5/zstandard-0.24.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af1394c2c5febc44e0bbf0fc6428263fa928b50d1b1982ce1d870dc793a8e5f4", size = 795228, upload-time = "2025-08-17T18:21:12.444Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e1/8a/ccb516b684f3ad987dfee27570d635822e3038645b1a950c5e8022df1145/zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880", size = 633678, upload-time = "2024-07-15T00:13:30.24Z" },
|
{ url = "https://files.pythonhosted.org/packages/d3/ba/a40ddfbbb9f0773127701a802338f215211b018f9222b9fab1e2d498f9cd/zstandard-0.24.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e941654cef13a1d53634ec30933722eda11f44f99e1d0bc62bbce3387580d50", size = 640522, upload-time = "2025-08-17T18:21:14.133Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/12/89/75e633d0611c028e0d9af6df199423bf43f54bea5007e6718ab7132e234c/zstandard-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc", size = 4941098, upload-time = "2024-07-15T00:13:32.526Z" },
|
{ url = "https://files.pythonhosted.org/packages/3e/7c/edeee3ef8d469a1345edd86f8d123a3825d60df033bcbbd16df417bdb9e7/zstandard-0.24.0-cp310-cp310-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:561123d05681197c0e24eb8ab3cfdaf299e2b59c293d19dad96e1610ccd8fbc6", size = 5344625, upload-time = "2025-08-17T18:21:16.067Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4a/7a/bd7f6a21802de358b63f1ee636ab823711c25ce043a3e9f043b4fcb5ba32/zstandard-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573", size = 5308798, upload-time = "2024-07-15T00:13:34.925Z" },
|
{ url = "https://files.pythonhosted.org/packages/bf/2c/2f76e5058435d96ab0187303d4e9663372893cdcc95d64fdb60824951162/zstandard-0.24.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0f6d9a146e07458cb41423ca2d783aefe3a3a97fe72838973c13b8f1ecc7343a", size = 5055074, upload-time = "2025-08-17T18:21:18.483Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/79/3b/775f851a4a65013e88ca559c8ae42ac1352db6fcd96b028d0df4d7d1d7b4/zstandard-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391", size = 5341840, upload-time = "2024-07-15T00:13:37.376Z" },
|
{ url = "https://files.pythonhosted.org/packages/e4/87/3962530a568d38e64f287e11b9a38936d873617120589611c49c29af94a8/zstandard-0.24.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bf02f915fa7934ea5dfc8d96757729c99a8868b7c340b97704795d6413cf5fe6", size = 5401308, upload-time = "2025-08-17T18:21:20.859Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/09/4f/0cc49570141dd72d4d95dd6fcf09328d1b702c47a6ec12fbed3b8aed18a5/zstandard-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e", size = 5440337, upload-time = "2024-07-15T00:13:39.772Z" },
|
{ url = "https://files.pythonhosted.org/packages/f1/69/85e65f0fb05b4475130888cf7934ff30ac14b5979527e8f1ccb6f56e21ec/zstandard-0.24.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:35f13501a8accf834457d8e40e744568287a215818778bc4d79337af2f3f0d97", size = 5448948, upload-time = "2025-08-17T18:21:23.015Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e7/7c/aaa7cd27148bae2dc095191529c0570d16058c54c4597a7d118de4b21676/zstandard-0.23.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd", size = 4861182, upload-time = "2024-07-15T00:13:42.495Z" },
|
{ url = "https://files.pythonhosted.org/packages/2b/2f/1b607274bf20ea8bcd13bea3edc0a48f984c438c09d0a050b9667dadcaed/zstandard-0.24.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:92be52ca4e6e604f03d5daa079caec9e04ab4cbf6972b995aaebb877d3d24e13", size = 5555870, upload-time = "2025-08-17T18:21:24.985Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ac/eb/4b58b5c071d177f7dc027129d20bd2a44161faca6592a67f8fcb0b88b3ae/zstandard-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4", size = 4932936, upload-time = "2024-07-15T00:13:44.234Z" },
|
{ url = "https://files.pythonhosted.org/packages/a0/9a/fadd5ffded6ab113b26704658a40444865b914de072fb460b6b51aa5fa2f/zstandard-0.24.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0c9c3cba57f5792532a3df3f895980d47d78eda94b0e5b800651b53e96e0b604", size = 5044917, upload-time = "2025-08-17T18:21:27.082Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/44/f9/21a5fb9bb7c9a274b05ad700a82ad22ce82f7ef0f485980a1e98ed6e8c5f/zstandard-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea", size = 5464705, upload-time = "2024-07-15T00:13:46.822Z" },
|
{ url = "https://files.pythonhosted.org/packages/2a/0d/c5edc3b00e070d0b4156993bd7bef9cba58c5f2571bd0003054cbe90005c/zstandard-0.24.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:dd91b0134a32dfcd8be504e8e46de44ad0045a569efc25101f2a12ccd41b5759", size = 5571834, upload-time = "2025-08-17T18:21:29.239Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/49/74/b7b3e61db3f88632776b78b1db597af3f44c91ce17d533e14a25ce6a2816/zstandard-0.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2", size = 4857882, upload-time = "2024-07-15T00:13:49.297Z" },
|
{ url = "https://files.pythonhosted.org/packages/1f/7e/9e353ed08c3d7a93050bbadbebe2f5f783b13393e0e8e08e970ef3396390/zstandard-0.24.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d6975f2d903bc354916a17b91a7aaac7299603f9ecdb788145060dde6e573a16", size = 4959108, upload-time = "2025-08-17T18:21:31.228Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4a/7f/d8eb1cb123d8e4c541d4465167080bec88481ab54cd0b31eb4013ba04b95/zstandard-0.23.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9", size = 4697672, upload-time = "2024-07-15T00:13:51.447Z" },
|
{ url = "https://files.pythonhosted.org/packages/af/28/135dffba375ab1f4d2c569de804647eba8bd682f36d3c01b5a012c560ff2/zstandard-0.24.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7ac6e4d727521d86d20ec291a3f4e64a478e8a73eaee80af8f38ec403e77a409", size = 5265997, upload-time = "2025-08-17T18:21:33.369Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/5e/05/f7dccdf3d121309b60342da454d3e706453a31073e2c4dac8e1581861e44/zstandard-0.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a", size = 5206043, upload-time = "2024-07-15T00:13:53.587Z" },
|
{ url = "https://files.pythonhosted.org/packages/cc/7a/702e7cbc51c39ce104c198ea6d069fb6a918eb24c5709ac79fe9371f7a55/zstandard-0.24.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:87ae1684bc3c02d5c35884b3726525eda85307073dbefe68c3c779e104a59036", size = 5440015, upload-time = "2025-08-17T18:21:35.023Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/86/9d/3677a02e172dccd8dd3a941307621c0cbd7691d77cb435ac3c75ab6a3105/zstandard-0.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0", size = 5667390, upload-time = "2024-07-15T00:13:56.137Z" },
|
{ url = "https://files.pythonhosted.org/packages/77/40/4a2d0faa2ae6f4c847c7f77ec626abed80873035891c4a4349b735a36fb4/zstandard-0.24.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:7de5869e616d426b56809be7dc6dba4d37b95b90411ccd3de47f421a42d4d42c", size = 5819056, upload-time = "2025-08-17T18:21:39.661Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/41/7e/0012a02458e74a7ba122cd9cafe491facc602c9a17f590367da369929498/zstandard-0.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c", size = 5198901, upload-time = "2024-07-15T00:13:58.584Z" },
|
{ url = "https://files.pythonhosted.org/packages/3e/fc/580504a2d7c71411a8e403b83f2388ee083819a68e0e740bf974e78839f8/zstandard-0.24.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:388aad2d693707f4a0f6cc687eb457b33303d6b57ecf212c8ff4468c34426892", size = 5362621, upload-time = "2025-08-17T18:21:42.605Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/65/3a/8f715b97bd7bcfc7342d8adcd99a026cb2fb550e44866a3b6c348e1b0f02/zstandard-0.23.0-cp310-cp310-win32.whl", hash = "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813", size = 430596, upload-time = "2024-07-15T00:14:00.693Z" },
|
{ url = "https://files.pythonhosted.org/packages/70/66/97f6b38eeda955eaa6b5e7cfc0528039bfcb9eb8338016aacf6d83d8a75e/zstandard-0.24.0-cp310-cp310-win32.whl", hash = "sha256:962ea3aecedcc944f8034812e23d7200d52c6e32765b8da396eeb8b8ffca71ce", size = 435575, upload-time = "2025-08-17T18:21:45.477Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/19/b7/b2b9eca5e5a01111e4fe8a8ffb56bdcdf56b12448a24effe6cfe4a252034/zstandard-0.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4", size = 495498, upload-time = "2024-07-15T00:14:02.741Z" },
|
{ url = "https://files.pythonhosted.org/packages/68/a2/5814bdd22d879b10fcc5dc37366e39603767063f06ae970f2a657f76ddac/zstandard-0.24.0-cp310-cp310-win_amd64.whl", hash = "sha256:869bf13f66b124b13be37dd6e08e4b728948ff9735308694e0b0479119e08ea7", size = 505115, upload-time = "2025-08-17T18:21:44.011Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e", size = 788699, upload-time = "2024-07-15T00:14:04.909Z" },
|
{ url = "https://files.pythonhosted.org/packages/01/1f/5c72806f76043c0ef9191a2b65281dacdf3b65b0828eb13bb2c987c4fb90/zstandard-0.24.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:addfc23e3bd5f4b6787b9ca95b2d09a1a67ad5a3c318daaa783ff90b2d3a366e", size = 795228, upload-time = "2025-08-17T18:21:46.978Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23", size = 633681, upload-time = "2024-07-15T00:14:13.99Z" },
|
{ url = "https://files.pythonhosted.org/packages/0b/ba/3059bd5cd834666a789251d14417621b5c61233bd46e7d9023ea8bc1043a/zstandard-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6b005bcee4be9c3984b355336283afe77b2defa76ed6b89332eced7b6fa68b68", size = 640520, upload-time = "2025-08-17T18:21:48.162Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a", size = 4944328, upload-time = "2024-07-15T00:14:16.588Z" },
|
{ url = "https://files.pythonhosted.org/packages/57/07/f0e632bf783f915c1fdd0bf68614c4764cae9dd46ba32cbae4dd659592c3/zstandard-0.24.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:3f96a9130171e01dbb6c3d4d9925d604e2131a97f540e223b88ba45daf56d6fb", size = 5347682, upload-time = "2025-08-17T18:21:50.266Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/59/cc/e76acb4c42afa05a9d20827116d1f9287e9c32b7ad58cc3af0721ce2b481/zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db", size = 5311955, upload-time = "2024-07-15T00:14:19.389Z" },
|
{ url = "https://files.pythonhosted.org/packages/a6/4c/63523169fe84773a7462cd090b0989cb7c7a7f2a8b0a5fbf00009ba7d74d/zstandard-0.24.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd0d3d16e63873253bad22b413ec679cf6586e51b5772eb10733899832efec42", size = 5057650, upload-time = "2025-08-17T18:21:52.634Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/78/e4/644b8075f18fc7f632130c32e8f36f6dc1b93065bf2dd87f03223b187f26/zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2", size = 5344944, upload-time = "2024-07-15T00:14:22.173Z" },
|
{ url = "https://files.pythonhosted.org/packages/c6/16/49013f7ef80293f5cebf4c4229535a9f4c9416bbfd238560edc579815dbe/zstandard-0.24.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:b7a8c30d9bf4bd5e4dcfe26900bef0fcd9749acde45cdf0b3c89e2052fda9a13", size = 5404893, upload-time = "2025-08-17T18:21:54.54Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca", size = 5442927, upload-time = "2024-07-15T00:14:24.825Z" },
|
{ url = "https://files.pythonhosted.org/packages/4d/38/78e8bcb5fc32a63b055f2b99e0be49b506f2351d0180173674f516cf8a7a/zstandard-0.24.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:52cd7d9fa0a115c9446abb79b06a47171b7d916c35c10e0c3aa6f01d57561382", size = 5452389, upload-time = "2025-08-17T18:21:56.822Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/0c/c3/d24a01a19b6733b9f218e94d1a87c477d523237e07f94899e1c10f6fd06c/zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c", size = 4864910, upload-time = "2024-07-15T00:14:26.982Z" },
|
{ url = "https://files.pythonhosted.org/packages/55/8a/81671f05619edbacd49bd84ce6899a09fc8299be20c09ae92f6618ccb92d/zstandard-0.24.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0f6fc2ea6e07e20df48752e7700e02e1892c61f9a6bfbacaf2c5b24d5ad504b", size = 5558888, upload-time = "2025-08-17T18:21:58.68Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/1c/a9/cf8f78ead4597264f7618d0875be01f9bc23c9d1d11afb6d225b867cb423/zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e", size = 4935544, upload-time = "2024-07-15T00:14:29.582Z" },
|
{ url = "https://files.pythonhosted.org/packages/49/cc/e83feb2d7d22d1f88434defbaeb6e5e91f42a4f607b5d4d2d58912b69d67/zstandard-0.24.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e46eb6702691b24ddb3e31e88b4a499e31506991db3d3724a85bd1c5fc3cfe4e", size = 5048038, upload-time = "2025-08-17T18:22:00.642Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2c/96/8af1e3731b67965fb995a940c04a2c20997a7b3b14826b9d1301cf160879/zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5", size = 5467094, upload-time = "2024-07-15T00:14:40.126Z" },
|
{ url = "https://files.pythonhosted.org/packages/08/c3/7a5c57ff49ef8943877f85c23368c104c2aea510abb339a2dc31ad0a27c3/zstandard-0.24.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5e3b9310fd7f0d12edc75532cd9a56da6293840c84da90070d692e0bb15f186", size = 5573833, upload-time = "2025-08-17T18:22:02.402Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ff/57/43ea9df642c636cb79f88a13ab07d92d88d3bfe3e550b55a25a07a26d878/zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48", size = 4860440, upload-time = "2024-07-15T00:14:42.786Z" },
|
{ url = "https://files.pythonhosted.org/packages/f9/00/64519983cd92535ba4bdd4ac26ac52db00040a52d6c4efb8d1764abcc343/zstandard-0.24.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76cdfe7f920738ea871f035568f82bad3328cbc8d98f1f6988264096b5264efd", size = 4961072, upload-time = "2025-08-17T18:22:04.384Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/46/37/edb78f33c7f44f806525f27baa300341918fd4c4af9472fbc2c3094be2e8/zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c", size = 4700091, upload-time = "2024-07-15T00:14:45.184Z" },
|
{ url = "https://files.pythonhosted.org/packages/72/ab/3a08a43067387d22994fc87c3113636aa34ccd2914a4d2d188ce365c5d85/zstandard-0.24.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3f2fe35ec84908dddf0fbf66b35d7c2878dbe349552dd52e005c755d3493d61c", size = 5268462, upload-time = "2025-08-17T18:22:06.095Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c1/f1/454ac3962671a754f3cb49242472df5c2cced4eb959ae203a377b45b1a3c/zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003", size = 5208682, upload-time = "2024-07-15T00:14:47.407Z" },
|
{ url = "https://files.pythonhosted.org/packages/49/cf/2abb3a1ad85aebe18c53e7eca73223f1546ddfa3bf4d2fb83fc5a064c5ca/zstandard-0.24.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:aa705beb74ab116563f4ce784fa94771f230c05d09ab5de9c397793e725bb1db", size = 5443319, upload-time = "2025-08-17T18:22:08.572Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/85/b2/1734b0fff1634390b1b887202d557d2dd542de84a4c155c258cf75da4773/zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78", size = 5669707, upload-time = "2024-07-15T00:15:03.529Z" },
|
{ url = "https://files.pythonhosted.org/packages/40/42/0dd59fc2f68f1664cda11c3b26abdf987f4e57cb6b6b0f329520cd074552/zstandard-0.24.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:aadf32c389bb7f02b8ec5c243c38302b92c006da565e120dfcb7bf0378f4f848", size = 5822355, upload-time = "2025-08-17T18:22:10.537Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/52/5a/87d6971f0997c4b9b09c495bf92189fb63de86a83cadc4977dc19735f652/zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473", size = 5201792, upload-time = "2024-07-15T00:15:28.372Z" },
|
{ url = "https://files.pythonhosted.org/packages/99/c0/ea4e640fd4f7d58d6f87a1e7aca11fb886ac24db277fbbb879336c912f63/zstandard-0.24.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e40cd0fc734aa1d4bd0e7ad102fd2a1aefa50ce9ef570005ffc2273c5442ddc3", size = 5365257, upload-time = "2025-08-17T18:22:13.159Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/79/02/6f6a42cc84459d399bd1a4e1adfc78d4dfe45e56d05b072008d10040e13b/zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160", size = 430586, upload-time = "2024-07-15T00:15:32.26Z" },
|
{ url = "https://files.pythonhosted.org/packages/27/a9/92da42a5c4e7e4003271f2e1f0efd1f37cfd565d763ad3604e9597980a1c/zstandard-0.24.0-cp311-cp311-win32.whl", hash = "sha256:cda61c46343809ecda43dc620d1333dd7433a25d0a252f2dcc7667f6331c7b61", size = 435559, upload-time = "2025-08-17T18:22:17.29Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0", size = 495420, upload-time = "2024-07-15T00:15:34.004Z" },
|
{ url = "https://files.pythonhosted.org/packages/e2/8e/2c8e5c681ae4937c007938f954a060fa7c74f36273b289cabdb5ef0e9a7e/zstandard-0.24.0-cp311-cp311-win_amd64.whl", hash = "sha256:3b95fc06489aa9388400d1aab01a83652bc040c9c087bd732eb214909d7fb0dd", size = 505070, upload-time = "2025-08-17T18:22:14.808Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/7b/83/f23338c963bd9de687d47bf32efe9fd30164e722ba27fb59df33e6b1719b/zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094", size = 788713, upload-time = "2024-07-15T00:15:35.815Z" },
|
{ url = "https://files.pythonhosted.org/packages/52/10/a2f27a66bec75e236b575c9f7b0d7d37004a03aa2dcde8e2decbe9ed7b4d/zstandard-0.24.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad9fd176ff6800a0cf52bcf59c71e5de4fa25bf3ba62b58800e0f84885344d34", size = 461507, upload-time = "2025-08-17T18:22:15.964Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/5b/b3/1a028f6750fd9227ee0b937a278a434ab7f7fdc3066c3173f64366fe2466/zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8", size = 633459, upload-time = "2024-07-15T00:15:37.995Z" },
|
{ url = "https://files.pythonhosted.org/packages/26/e9/0bd281d9154bba7fc421a291e263911e1d69d6951aa80955b992a48289f6/zstandard-0.24.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a2bda8f2790add22773ee7a4e43c90ea05598bffc94c21c40ae0a9000b0133c3", size = 795710, upload-time = "2025-08-17T18:22:19.189Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/26/af/36d89aae0c1f95a0a98e50711bc5d92c144939efc1f81a2fcd3e78d7f4c1/zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1", size = 4945707, upload-time = "2024-07-15T00:15:39.872Z" },
|
{ url = "https://files.pythonhosted.org/packages/36/26/b250a2eef515caf492e2d86732e75240cdac9d92b04383722b9753590c36/zstandard-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cc76de75300f65b8eb574d855c12518dc25a075dadb41dd18f6322bda3fe15d5", size = 640336, upload-time = "2025-08-17T18:22:20.466Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/cd/2e/2051f5c772f4dfc0aae3741d5fc72c3dcfe3aaeb461cc231668a4db1ce14/zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072", size = 5306545, upload-time = "2024-07-15T00:15:41.75Z" },
|
{ url = "https://files.pythonhosted.org/packages/79/bf/3ba6b522306d9bf097aac8547556b98a4f753dc807a170becaf30dcd6f01/zstandard-0.24.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:d2b3b4bda1a025b10fe0269369475f420177f2cb06e0f9d32c95b4873c9f80b8", size = 5342533, upload-time = "2025-08-17T18:22:22.326Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/0a/9e/a11c97b087f89cab030fa71206963090d2fecd8eb83e67bb8f3ffb84c024/zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20", size = 5337533, upload-time = "2024-07-15T00:15:44.114Z" },
|
{ url = "https://files.pythonhosted.org/packages/ea/ec/22bc75bf054e25accdf8e928bc68ab36b4466809729c554ff3a1c1c8bce6/zstandard-0.24.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b84c6c210684286e504022d11ec294d2b7922d66c823e87575d8b23eba7c81f", size = 5062837, upload-time = "2025-08-17T18:22:24.416Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/fc/79/edeb217c57fe1bf16d890aa91a1c2c96b28c07b46afed54a5dcf310c3f6f/zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373", size = 5436510, upload-time = "2024-07-15T00:15:46.509Z" },
|
{ url = "https://files.pythonhosted.org/packages/48/cc/33edfc9d286e517fb5b51d9c3210e5bcfce578d02a675f994308ca587ae1/zstandard-0.24.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c59740682a686bf835a1a4d8d0ed1eefe31ac07f1c5a7ed5f2e72cf577692b00", size = 5393855, upload-time = "2025-08-17T18:22:26.786Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/81/4f/c21383d97cb7a422ddf1ae824b53ce4b51063d0eeb2afa757eb40804a8ef/zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db", size = 4859973, upload-time = "2024-07-15T00:15:49.939Z" },
|
{ url = "https://files.pythonhosted.org/packages/73/36/59254e9b29da6215fb3a717812bf87192d89f190f23817d88cb8868c47ac/zstandard-0.24.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6324fde5cf5120fbf6541d5ff3c86011ec056e8d0f915d8e7822926a5377193a", size = 5451058, upload-time = "2025-08-17T18:22:28.885Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ab/15/08d22e87753304405ccac8be2493a495f529edd81d39a0870621462276ef/zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772", size = 4936968, upload-time = "2024-07-15T00:15:52.025Z" },
|
{ url = "https://files.pythonhosted.org/packages/9a/c7/31674cb2168b741bbbe71ce37dd397c9c671e73349d88ad3bca9e9fae25b/zstandard-0.24.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51a86bd963de3f36688553926a84e550d45d7f9745bd1947d79472eca27fcc75", size = 5546619, upload-time = "2025-08-17T18:22:31.115Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/eb/fa/f3670a597949fe7dcf38119a39f7da49a8a84a6f0b1a2e46b2f71a0ab83f/zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105", size = 5467179, upload-time = "2024-07-15T00:15:54.971Z" },
|
{ url = "https://files.pythonhosted.org/packages/e6/01/1a9f22239f08c00c156f2266db857545ece66a6fc0303d45c298564bc20b/zstandard-0.24.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d82ac87017b734f2fb70ff93818c66f0ad2c3810f61040f077ed38d924e19980", size = 5046676, upload-time = "2025-08-17T18:22:33.077Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4e/a9/dad2ab22020211e380adc477a1dbf9f109b1f8d94c614944843e20dc2a99/zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba", size = 4848577, upload-time = "2024-07-15T00:15:57.634Z" },
|
{ url = "https://files.pythonhosted.org/packages/a7/91/6c0cf8fa143a4988a0361380ac2ef0d7cb98a374704b389fbc38b5891712/zstandard-0.24.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92ea7855d5bcfb386c34557516c73753435fb2d4a014e2c9343b5f5ba148b5d8", size = 5576381, upload-time = "2025-08-17T18:22:35.391Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/08/03/dd28b4484b0770f1e23478413e01bee476ae8227bbc81561f9c329e12564/zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd", size = 4693899, upload-time = "2024-07-15T00:16:00.811Z" },
|
{ url = "https://files.pythonhosted.org/packages/e2/77/1526080e22e78871e786ccf3c84bf5cec9ed25110a9585507d3c551da3d6/zstandard-0.24.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3adb4b5414febf074800d264ddf69ecade8c658837a83a19e8ab820e924c9933", size = 4953403, upload-time = "2025-08-17T18:22:37.266Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2b/64/3da7497eb635d025841e958bcd66a86117ae320c3b14b0ae86e9e8627518/zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a", size = 5199964, upload-time = "2024-07-15T00:16:03.669Z" },
|
{ url = "https://files.pythonhosted.org/packages/6e/d0/a3a833930bff01eab697eb8abeafb0ab068438771fa066558d96d7dafbf9/zstandard-0.24.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6374feaf347e6b83ec13cc5dcfa70076f06d8f7ecd46cc71d58fac798ff08b76", size = 5267396, upload-time = "2025-08-17T18:22:39.757Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/43/a4/d82decbab158a0e8a6ebb7fc98bc4d903266bce85b6e9aaedea1d288338c/zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90", size = 5655398, upload-time = "2024-07-15T00:16:06.694Z" },
|
{ url = "https://files.pythonhosted.org/packages/f3/5e/90a0db9a61cd4769c06374297ecfcbbf66654f74cec89392519deba64d76/zstandard-0.24.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:13fc548e214df08d896ee5f29e1f91ee35db14f733fef8eabea8dca6e451d1e2", size = 5433269, upload-time = "2025-08-17T18:22:42.131Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f2/61/ac78a1263bc83a5cf29e7458b77a568eda5a8f81980691bbc6eb6a0d45cc/zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35", size = 5191313, upload-time = "2024-07-15T00:16:09.758Z" },
|
{ url = "https://files.pythonhosted.org/packages/ce/58/fc6a71060dd67c26a9c5566e0d7c99248cbe5abfda6b3b65b8f1a28d59f7/zstandard-0.24.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0a416814608610abf5488889c74e43ffa0343ca6cf43957c6b6ec526212422da", size = 5814203, upload-time = "2025-08-17T18:22:44.017Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e7/54/967c478314e16af5baf849b6ee9d6ea724ae5b100eb506011f045d3d4e16/zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d", size = 430877, upload-time = "2024-07-15T00:16:11.758Z" },
|
{ url = "https://files.pythonhosted.org/packages/5c/6a/89573d4393e3ecbfa425d9a4e391027f58d7810dec5cdb13a26e4cdeef5c/zstandard-0.24.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0d66da2649bb0af4471699aeb7a83d6f59ae30236fb9f6b5d20fb618ef6c6777", size = 5359622, upload-time = "2025-08-17T18:22:45.802Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/75/37/872d74bd7739639c4553bf94c84af7d54d8211b626b352bc57f0fd8d1e3f/zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b", size = 495595, upload-time = "2024-07-15T00:16:13.731Z" },
|
{ url = "https://files.pythonhosted.org/packages/60/ff/2cbab815d6f02a53a9d8d8703bc727d8408a2e508143ca9af6c3cca2054b/zstandard-0.24.0-cp312-cp312-win32.whl", hash = "sha256:ff19efaa33e7f136fe95f9bbcc90ab7fb60648453b03f95d1de3ab6997de0f32", size = 435968, upload-time = "2025-08-17T18:22:49.493Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/80/f1/8386f3f7c10261fe85fbc2c012fdb3d4db793b921c9abcc995d8da1b7a80/zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9", size = 788975, upload-time = "2024-07-15T00:16:16.005Z" },
|
{ url = "https://files.pythonhosted.org/packages/ce/a3/8f96b8ddb7ad12344218fbd0fd2805702dafd126ae9f8a1fb91eef7b33da/zstandard-0.24.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc05f8a875eb651d1cc62e12a4a0e6afa5cd0cc231381adb830d2e9c196ea895", size = 505195, upload-time = "2025-08-17T18:22:47.193Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/16/e8/cbf01077550b3e5dc86089035ff8f6fbbb312bc0983757c2d1117ebba242/zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a", size = 633448, upload-time = "2024-07-15T00:16:17.897Z" },
|
{ url = "https://files.pythonhosted.org/packages/a3/4a/bfca20679da63bfc236634ef2e4b1b4254203098b0170e3511fee781351f/zstandard-0.24.0-cp312-cp312-win_arm64.whl", hash = "sha256:b04c94718f7a8ed7cdd01b162b6caa1954b3c9d486f00ecbbd300f149d2b2606", size = 461605, upload-time = "2025-08-17T18:22:48.317Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/06/27/4a1b4c267c29a464a161aeb2589aff212b4db653a1d96bffe3598f3f0d22/zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2", size = 4945269, upload-time = "2024-07-15T00:16:20.136Z" },
|
{ url = "https://files.pythonhosted.org/packages/ec/ef/db949de3bf81ed122b8ee4db6a8d147a136fe070e1015f5a60d8a3966748/zstandard-0.24.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e4ebb000c0fe24a6d0f3534b6256844d9dbf042fdf003efe5cf40690cf4e0f3e", size = 795700, upload-time = "2025-08-17T18:22:50.851Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/7c/64/d99261cc57afd9ae65b707e38045ed8269fbdae73544fd2e4a4d50d0ed83/zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5", size = 5306228, upload-time = "2024-07-15T00:16:23.398Z" },
|
{ url = "https://files.pythonhosted.org/packages/99/56/fc04395d6f5eabd2fe6d86c0800d198969f3038385cb918bfbe94f2b0c62/zstandard-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:498f88f5109666c19531f0243a90d2fdd2252839cd6c8cc6e9213a3446670fa8", size = 640343, upload-time = "2025-08-17T18:22:51.999Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/7a/cf/27b74c6f22541f0263016a0fd6369b1b7818941de639215c84e4e94b2a1c/zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f", size = 5336891, upload-time = "2024-07-15T00:16:26.391Z" },
|
{ url = "https://files.pythonhosted.org/packages/9b/0f/0b0e0d55f2f051d5117a0d62f4f9a8741b3647440c0ee1806b7bd47ed5ae/zstandard-0.24.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0a9e95ceb180ccd12a8b3437bac7e8a8a089c9094e39522900a8917745542184", size = 5342571, upload-time = "2025-08-17T18:22:53.734Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/fa/18/89ac62eac46b69948bf35fcd90d37103f38722968e2981f752d69081ec4d/zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed", size = 5436310, upload-time = "2024-07-15T00:16:29.018Z" },
|
{ url = "https://files.pythonhosted.org/packages/5d/43/d74e49f04fbd62d4b5d89aeb7a29d693fc637c60238f820cd5afe6ca8180/zstandard-0.24.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bcf69e0bcddbf2adcfafc1a7e864edcc204dd8171756d3a8f3340f6f6cc87b7b", size = 5062723, upload-time = "2025-08-17T18:22:55.624Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a8/a8/5ca5328ee568a873f5118d5b5f70d1f36c6387716efe2e369010289a5738/zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea", size = 4859912, upload-time = "2024-07-15T00:16:31.871Z" },
|
{ url = "https://files.pythonhosted.org/packages/8e/97/df14384d4d6a004388e6ed07ded02933b5c7e0833a9150c57d0abc9545b7/zstandard-0.24.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:10e284748a7e7fbe2815ca62a9d6e84497d34cfdd0143fa9e8e208efa808d7c4", size = 5393282, upload-time = "2025-08-17T18:22:57.655Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ea/ca/3781059c95fd0868658b1cf0440edd832b942f84ae60685d0cfdb808bca1/zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847", size = 4936946, upload-time = "2024-07-15T00:16:34.593Z" },
|
{ url = "https://files.pythonhosted.org/packages/7e/09/8f5c520e59a4d41591b30b7568595eda6fd71c08701bb316d15b7ed0613a/zstandard-0.24.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:1bda8a85e5b9d5e73af2e61b23609a8cc1598c1b3b2473969912979205a1ff25", size = 5450895, upload-time = "2025-08-17T18:22:59.749Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ce/11/41a58986f809532742c2b832c53b74ba0e0a5dae7e8ab4642bf5876f35de/zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171", size = 5466994, upload-time = "2024-07-15T00:16:36.887Z" },
|
{ url = "https://files.pythonhosted.org/packages/d9/3d/02aba892327a67ead8cba160ee835cfa1fc292a9dcb763639e30c07da58b/zstandard-0.24.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1b14bc92af065d0534856bf1b30fc48753163ea673da98857ea4932be62079b1", size = 5546353, upload-time = "2025-08-17T18:23:01.457Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/83/e3/97d84fe95edd38d7053af05159465d298c8b20cebe9ccb3d26783faa9094/zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840", size = 4848681, upload-time = "2024-07-15T00:16:39.709Z" },
|
{ url = "https://files.pythonhosted.org/packages/6a/6e/96c52afcde44da6a5313a1f6c356349792079808f12d8b69a7d1d98ef353/zstandard-0.24.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:b4f20417a4f511c656762b001ec827500cbee54d1810253c6ca2df2c0a307a5f", size = 5046404, upload-time = "2025-08-17T18:23:03.418Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6e/99/cb1e63e931de15c88af26085e3f2d9af9ce53ccafac73b6e48418fd5a6e6/zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690", size = 4694239, upload-time = "2024-07-15T00:16:41.83Z" },
|
{ url = "https://files.pythonhosted.org/packages/da/b6/eefee6b92d341a7db7cd1b3885d42d30476a093720fb5c181e35b236d695/zstandard-0.24.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:337572a7340e1d92fd7fb5248c8300d0e91071002d92e0b8cabe8d9ae7b58159", size = 5576095, upload-time = "2025-08-17T18:23:05.331Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ab/50/b1e703016eebbc6501fc92f34db7b1c68e54e567ef39e6e59cf5fb6f2ec0/zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b", size = 5200149, upload-time = "2024-07-15T00:16:44.287Z" },
|
{ url = "https://files.pythonhosted.org/packages/a3/29/743de3131f6239ba6611e17199581e6b5e0f03f268924d42468e29468ca0/zstandard-0.24.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:df4be1cf6e8f0f2bbe2a3eabfff163ef592c84a40e1a20a8d7db7f27cfe08fc2", size = 4953448, upload-time = "2025-08-17T18:23:07.225Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/aa/e0/932388630aaba70197c78bdb10cce2c91fae01a7e553b76ce85471aec690/zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057", size = 5655392, upload-time = "2024-07-15T00:16:46.423Z" },
|
{ url = "https://files.pythonhosted.org/packages/c9/11/bd36ef49fba82e307d69d93b5abbdcdc47d6a0bcbc7ffbbfe0ef74c2fec5/zstandard-0.24.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6885ae4b33aee8835dbdb4249d3dfec09af55e705d74d9b660bfb9da51baaa8b", size = 5267388, upload-time = "2025-08-17T18:23:09.127Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/02/90/2633473864f67a15526324b007a9f96c96f56d5f32ef2a56cc12f9548723/zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33", size = 5191299, upload-time = "2024-07-15T00:16:49.053Z" },
|
{ url = "https://files.pythonhosted.org/packages/c0/23/a4cfe1b871d3f1ce1f88f5c68d7e922e94be0043f3ae5ed58c11578d1e21/zstandard-0.24.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:663848a8bac4fdbba27feea2926049fdf7b55ec545d5b9aea096ef21e7f0b079", size = 5433383, upload-time = "2025-08-17T18:23:11.343Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/b0/4c/315ca5c32da7e2dc3455f3b2caee5c8c2246074a61aac6ec3378a97b7136/zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd", size = 430862, upload-time = "2024-07-15T00:16:51.003Z" },
|
{ url = "https://files.pythonhosted.org/packages/77/26/f3fb85f00e732cca617d4b9cd1ffa6484f613ea07fad872a8bdc3a0ce753/zstandard-0.24.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:05d27c953f2e0a3ecc8edbe91d6827736acc4c04d0479672e0400ccdb23d818c", size = 5813988, upload-time = "2025-08-17T18:23:13.194Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a2/bf/c6aaba098e2d04781e8f4f7c0ba3c7aa73d00e4c436bcc0cf059a66691d1/zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b", size = 495578, upload-time = "2024-07-15T00:16:53.135Z" },
|
{ url = "https://files.pythonhosted.org/packages/3d/8c/d7e3b424b73f3ce66e754595cbcb6d94ff49790c9ac37d50e40e8145cd44/zstandard-0.24.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77b8b7b98893eaf47da03d262816f01f251c2aa059c063ed8a45c50eada123a5", size = 5359756, upload-time = "2025-08-17T18:23:15.021Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/fb/96/4fcafeb7e013a2386d22f974b5b97a0b9a65004ed58c87ae001599bfbd48/zstandard-0.23.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa014d55c3af933c1315eb4bb06dd0459661cc0b15cd61077afa6489bec63bb", size = 788697, upload-time = "2024-07-15T00:17:31.236Z" },
|
{ url = "https://files.pythonhosted.org/packages/90/6c/f1f0e11f1b295138f9da7e7ae22dcd9a1bb96a9544fa3b31507e431288f5/zstandard-0.24.0-cp313-cp313-win32.whl", hash = "sha256:cf7fbb4e54136e9a03c7ed7691843c4df6d2ecc854a2541f840665f4f2bb2edd", size = 435957, upload-time = "2025-08-17T18:23:18.835Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/83/ff/a52ce725be69b86a2967ecba0497a8184540cc284c0991125515449e54e2/zstandard-0.23.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7f0804bb3799414af278e9ad51be25edf67f78f916e08afdb983e74161b916", size = 633679, upload-time = "2024-07-15T00:17:32.911Z" },
|
{ url = "https://files.pythonhosted.org/packages/9f/03/ab8b82ae5eb49eca4d3662705399c44442666cc1ce45f44f2d263bb1ae31/zstandard-0.24.0-cp313-cp313-win_amd64.whl", hash = "sha256:d64899cc0f33a8f446f1e60bffc21fa88b99f0e8208750d9144ea717610a80ce", size = 505171, upload-time = "2025-08-17T18:23:16.44Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/34/0f/3dc62db122f6a9c481c335fff6fc9f4e88d8f6e2d47321ee3937328addb4/zstandard-0.23.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb2b1ecfef1e67897d336de3a0e3f52478182d6a47eda86cbd42504c5cbd009a", size = 4940416, upload-time = "2024-07-15T00:17:34.849Z" },
|
{ url = "https://files.pythonhosted.org/packages/db/12/89a2ecdea4bc73a934a30b66a7cfac5af352beac94d46cf289e103b65c34/zstandard-0.24.0-cp313-cp313-win_arm64.whl", hash = "sha256:57be3abb4313e0dd625596376bbb607f40059d801d51c1a1da94d7477e63b255", size = 461596, upload-time = "2025-08-17T18:23:17.603Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/1d/e5/9fe0dd8c85fdc2f635e6660d07872a5dc4b366db566630161e39f9f804e1/zstandard-0.23.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:837bb6764be6919963ef41235fd56a6486b132ea64afe5fafb4cb279ac44f259", size = 5307693, upload-time = "2024-07-15T00:17:37.355Z" },
|
{ url = "https://files.pythonhosted.org/packages/c9/56/f3d2c4d64aacee4aab89e788783636884786b6f8334c819f09bff1aa207b/zstandard-0.24.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b7fa260dd2731afd0dfa47881c30239f422d00faee4b8b341d3e597cface1483", size = 795747, upload-time = "2025-08-17T18:23:19.968Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/73/bf/fe62c0cd865c171ee8ed5bc83174b5382a2cb729c8d6162edfb99a83158b/zstandard-0.23.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1516c8c37d3a053b01c1c15b182f3b5f5eef19ced9b930b684a73bad121addf4", size = 5341236, upload-time = "2024-07-15T00:17:40.213Z" },
|
{ url = "https://files.pythonhosted.org/packages/32/2d/9d3e5f6627e4cb5e511803788be1feee2f0c3b94594591e92b81db324253/zstandard-0.24.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e05d66239d14a04b4717998b736a25494372b1b2409339b04bf42aa4663bf251", size = 640475, upload-time = "2025-08-17T18:23:21.5Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/39/86/4fe79b30c794286110802a6cd44a73b6a314ac8196b9338c0fbd78c2407d/zstandard-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48ef6a43b1846f6025dde6ed9fee0c24e1149c1c25f7fb0a0585572b2f3adc58", size = 5439101, upload-time = "2024-07-15T00:17:42.284Z" },
|
{ url = "https://files.pythonhosted.org/packages/be/5d/48e66abf8c146d95330e5385633a8cfdd556fa8bd14856fe721590cbab2b/zstandard-0.24.0-cp314-cp314-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:622e1e04bd8a085994e02313ba06fbcf4f9ed9a488c6a77a8dbc0692abab6a38", size = 5343866, upload-time = "2025-08-17T18:23:23.351Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/72/ed/cacec235c581ebf8c608c7fb3d4b6b70d1b490d0e5128ea6996f809ecaef/zstandard-0.23.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11e3bf3c924853a2d5835b24f03eeba7fc9b07d8ca499e247e06ff5676461a15", size = 4860320, upload-time = "2024-07-15T00:17:44.21Z" },
|
{ url = "https://files.pythonhosted.org/packages/95/6c/65fe7ba71220a551e082e4a52790487f1d6bb8dfc2156883e088f975ad6d/zstandard-0.24.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:55872e818598319f065e8192ebefecd6ac05f62a43f055ed71884b0a26218f41", size = 5062719, upload-time = "2025-08-17T18:23:25.192Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f6/1e/2c589a2930f93946b132fc852c574a19d5edc23fad2b9e566f431050c7ec/zstandard-0.23.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2fb4535137de7e244c230e24f9d1ec194f61721c86ebea04e1581d9d06ea1269", size = 4931933, upload-time = "2024-07-15T00:17:46.455Z" },
|
{ url = "https://files.pythonhosted.org/packages/cb/68/15ed0a813ff91be80cc2a610ac42e0fc8d29daa737de247bbf4bab9429a1/zstandard-0.24.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bb2446a55b3a0fd8aa02aa7194bd64740015464a2daaf160d2025204e1d7c282", size = 5393090, upload-time = "2025-08-17T18:23:27.145Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8e/f5/30eadde3686d902b5d4692bb5f286977cbc4adc082145eb3f49d834b2eae/zstandard-0.23.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8c24f21fa2af4bb9f2c492a86fe0c34e6d2c63812a839590edaf177b7398f700", size = 5463878, upload-time = "2024-07-15T00:17:48.866Z" },
|
{ url = "https://files.pythonhosted.org/packages/d4/89/e560427b74fa2da6a12b8f3af8ee29104fe2bb069a25e7d314c35eec7732/zstandard-0.24.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2825a3951f945fb2613ded0f517d402b1e5a68e87e0ee65f5bd224a8333a9a46", size = 5450383, upload-time = "2025-08-17T18:23:29.044Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e0/c8/8aed1f0ab9854ef48e5ad4431367fcb23ce73f0304f7b72335a8edc66556/zstandard-0.23.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a8c86881813a78a6f4508ef9daf9d4995b8ac2d147dcb1a450448941398091c9", size = 4857192, upload-time = "2024-07-15T00:17:51.558Z" },
|
{ url = "https://files.pythonhosted.org/packages/a3/95/0498328cbb1693885509f2fc145402b108b750a87a3af65b7250b10bd896/zstandard-0.24.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:09887301001e7a81a3618156bc1759e48588de24bddfdd5b7a4364da9a8fbc20", size = 5546142, upload-time = "2025-08-17T18:23:31.281Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a8/c6/55e666cfbcd032b9e271865e8578fec56e5594d4faeac379d371526514f5/zstandard-0.23.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe3b385d996ee0822fd46528d9f0443b880d4d05528fd26a9119a54ec3f91c69", size = 4696513, upload-time = "2024-07-15T00:17:53.924Z" },
|
{ url = "https://files.pythonhosted.org/packages/8a/8a/64aa15a726594df3bf5d8decfec14fe20cd788c60890f44fcfc74d98c2cc/zstandard-0.24.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:98ca91dc9602cf351497d5600aa66e6d011a38c085a8237b370433fcb53e3409", size = 4953456, upload-time = "2025-08-17T18:23:33.234Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/dc/bd/720b65bea63ec9de0ac7414c33b9baf271c8de8996e5ff324dc93fc90ff1/zstandard-0.23.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:82d17e94d735c99621bf8ebf9995f870a6b3e6d14543b99e201ae046dfe7de70", size = 5204823, upload-time = "2024-07-15T00:17:55.948Z" },
|
{ url = "https://files.pythonhosted.org/packages/b0/b6/e94879c5cd6017af57bcba08519ed1228b1ebb15681efd949f4a00199449/zstandard-0.24.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:e69f8e534b4e254f523e2f9d4732cf9c169c327ca1ce0922682aac9a5ee01155", size = 5268287, upload-time = "2025-08-17T18:23:35.145Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d8/40/d678db1556e3941d330cd4e95623a63ef235b18547da98fa184cbc028ecf/zstandard-0.23.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c7c517d74bea1a6afd39aa612fa025e6b8011982a0897768a2f7c8ab4ebb78a2", size = 5666490, upload-time = "2024-07-15T00:17:58.327Z" },
|
{ url = "https://files.pythonhosted.org/packages/fd/e5/1a3b3a93f953dbe9e77e2a19be146e9cd2af31b67b1419d6cc8e8898d409/zstandard-0.24.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:444633b487a711e34f4bccc46a0c5dfbe1aee82c1a511e58cdc16f6bd66f187c", size = 5433197, upload-time = "2025-08-17T18:23:36.969Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ed/cc/c89329723d7515898a1fc7ef5d251264078548c505719d13e9511800a103/zstandard-0.23.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fd7e0f1cfb70eb2f95a19b472ee7ad6d9a0a992ec0ae53286870c104ca939e5", size = 5196622, upload-time = "2024-07-15T00:18:00.404Z" },
|
{ url = "https://files.pythonhosted.org/packages/39/83/b6eb1e1181de994b29804e1e0d2dc677bece4177f588c71653093cb4f6d5/zstandard-0.24.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f7d3fe9e1483171e9183ffdb1fab07c5fef80a9c3840374a38ec2ab869ebae20", size = 5813161, upload-time = "2025-08-17T18:23:38.812Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/78/4c/634289d41e094327a94500dfc919e58841b10ea3a9efdfafbac614797ec2/zstandard-0.23.0-cp39-cp39-win32.whl", hash = "sha256:43da0f0092281bf501f9c5f6f3b4c975a8a0ea82de49ba3f7100e64d422a1274", size = 430620, upload-time = "2024-07-15T00:18:02.613Z" },
|
{ url = "https://files.pythonhosted.org/packages/f6/d3/2fb4166561591e9d75e8e35c79182aa9456644e2f4536f29e51216d1c513/zstandard-0.24.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:27b6fa72b57824a3f7901fc9cc4ce1c1c834b28f3a43d1d4254c64c8f11149d4", size = 5359831, upload-time = "2025-08-17T18:23:41.162Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a2/e2/0b0c5a0f4f7699fecd92c1ba6278ef9b01f2b0b0dd46f62bfc6729c05659/zstandard-0.23.0-cp39-cp39-win_amd64.whl", hash = "sha256:f8346bfa098532bc1fb6c7ef06783e969d87a99dd1d2a5a18a892c1d7a643c58", size = 495528, upload-time = "2024-07-15T00:18:04.452Z" },
|
{ url = "https://files.pythonhosted.org/packages/11/94/6a9227315b774f64a67445f62152c69b4e5e49a52a3c7c4dad8520a55e20/zstandard-0.24.0-cp314-cp314-win32.whl", hash = "sha256:fdc7a52a4cdaf7293e10813fd6a3abc0c7753660db12a3b864ab1fb5a0c60c16", size = 444448, upload-time = "2025-08-17T18:23:45.151Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/fc/de/67acaba311013e0798cb96d1a2685cb6edcdfc1cae378b297ea7b02c319f/zstandard-0.24.0-cp314-cp314-win_amd64.whl", hash = "sha256:656ed895b28c7e42dd5b40dfcea3217cfc166b6b7eef88c3da2f5fc62484035b", size = 516075, upload-time = "2025-08-17T18:23:42.8Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/10/ae/45fd8921263cea0228b20aa31bce47cc66016b2aba1afae1c6adcc3dbb1f/zstandard-0.24.0-cp314-cp314-win_arm64.whl", hash = "sha256:0101f835da7de08375f380192ff75135527e46e3f79bef224e3c49cb640fef6a", size = 476847, upload-time = "2025-08-17T18:23:43.892Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c1/76/1b7e61b25543a129d26cd8e037a6efc6c660a4d77cf8727750923fe4e447/zstandard-0.24.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:52788e7c489069e317fde641de41b757fa0ddc150e06488f153dd5daebac7192", size = 795242, upload-time = "2025-08-17T18:23:46.861Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3c/97/8f5ee77c1768c2bd023c11aa0c4598be818f25ed54fff2e1e861d7b22a77/zstandard-0.24.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ec194197e90ca063f5ecb935d6c10063d84208cac5423c07d0f1a09d1c2ea42b", size = 640521, upload-time = "2025-08-17T18:23:48.635Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3c/64/cdd1fe60786406081b85c3c7d9128b137a268a7057045970cee5afbc4818/zstandard-0.24.0-cp39-cp39-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:e91a4e5d62da7cb3f53e04fe254f1aa41009af578801ee6477fe56e7bef74ee2", size = 5343733, upload-time = "2025-08-17T18:23:50.3Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/93/98/607374a8c9e7e3113cd3fc9091593c13c6870e4dbae4883ab9411d03d6ed/zstandard-0.24.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fc67eb15ed573950bc6436a04b3faea6c36c7db98d2db030d48391c6736a0dc", size = 5054284, upload-time = "2025-08-17T18:23:52.451Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ec/31/7750afe872defa56fd18566f1552146c164100f259534a309b24655684ce/zstandard-0.24.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f6ae9fc67e636fc0fa9adee39db87dfbdeabfa8420bc0e678a1ac8441e01b22b", size = 5400618, upload-time = "2025-08-17T18:23:54.351Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ac/51/a8018a15958beda694e7670c13e8fae811620fef95983d683c8ccca3b3a0/zstandard-0.24.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ab2357353894a5ec084bb8508ff892aa43fb7fe8a69ad310eac58221ee7f72aa", size = 5448384, upload-time = "2025-08-17T18:23:56.57Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/36/e3/cdab1945e39c2a57288806f90f55d293646d1adf49697e14a8b690989f84/zstandard-0.24.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1f578fab202f4df67a955145c3e3ca60ccaaaf66c97808545b2625efeecdef10", size = 5554999, upload-time = "2025-08-17T18:23:58.802Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/81/4f/f594f6d828d7cf21d49c8d4f479d7299a101223b393e99a9a2bc854bee87/zstandard-0.24.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c39d2b6161f3c5c5d12e9207ecf1006bb661a647a97a6573656b09aaea3f00ef", size = 5043718, upload-time = "2025-08-17T18:24:00.835Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/45/76/d04e89dd166fb44974a2ba9762d088842464d270246c717289a84928a8ce/zstandard-0.24.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0dc5654586613aebe5405c1ba180e67b3f29e7d98cf3187c79efdcc172f39457", size = 5570940, upload-time = "2025-08-17T18:24:02.739Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6a/b6/e3cd82e8716441c6e683bb094502a3f2fcad2d195183534d2bf890b6fc2e/zstandard-0.24.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b91380aefa9c7ac831b011368daf378d3277e0bdeb6bad9535e21251e26dd55a", size = 4957957, upload-time = "2025-08-17T18:24:04.503Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/03/a5/b5ceac0800eea956240ecbfcbd3ba1f550e866c706dddda003bbde65ab1e/zstandard-0.24.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:010302face38c9a909b8934e3bf6038266d6afc69523f3efa023c5cb5d38271b", size = 5265251, upload-time = "2025-08-17T18:24:06.668Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/4d/62/1b6eab74668361fe3503324114ed4138b40f730f53caa47bc39a77ed5091/zstandard-0.24.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:3aa3b4344b206941385a425ea25e6dd63e5cb0f535a4b88d56e3f8902086be9e", size = 5439212, upload-time = "2025-08-17T18:24:08.503Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/05/7f/abfc4c7aa073f28881d3e26e3b6461d940f8b5463eac3dc8224268747269/zstandard-0.24.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:63d39b161000aeeaa06a1cb77c9806e939bfe460dfd593e4cbf24e6bc717ae94", size = 5818666, upload-time = "2025-08-17T18:24:10.737Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/06/68/84d2f478ee0613ea4258e06173ea6e4bd3de17726bf4b3b88adcd045a636/zstandard-0.24.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ed8345b504df1cab280af923ef69ec0d7d52f7b22f78ec7982fde7c33a43c4f", size = 5361954, upload-time = "2025-08-17T18:24:12.698Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b9/d2/9b9bcc15722c70aa140f5b3d55f3fa8ff01efa0fe97dbbc4a0392eb18662/zstandard-0.24.0-cp39-cp39-win32.whl", hash = "sha256:1e133a9dd51ac0bcd5fd547ba7da45a58346dbc63def883f999857b0d0c003c4", size = 435619, upload-time = "2025-08-17T18:24:15.231Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/aa/aa/6221f0b97741f660ba986c4fde20b451eb3b8c7ae9d5907cc198096487fe/zstandard-0.24.0-cp39-cp39-win_amd64.whl", hash = "sha256:8ecd3b1f7a601f79e0cd20c26057d770219c0dc2f572ea07390248da2def79a4", size = 505169, upload-time = "2025-08-17T18:24:14.103Z" },
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -0,0 +1,314 @@
|
|||||||
|
from collections.abc import Sequence
|
||||||
|
from inspect import signature
|
||||||
|
from typing import Any, Callable, cast
|
||||||
|
|
||||||
|
from langchain_core.language_models.chat_models import BaseChatModel
|
||||||
|
from langchain_core.messages import AIMessage, SystemMessage
|
||||||
|
from langchain_core.tools import BaseTool
|
||||||
|
|
||||||
|
from langgraph.agent.types import (
|
||||||
|
AgentJump,
|
||||||
|
AgentMiddleware,
|
||||||
|
AgentState,
|
||||||
|
AgentUpdate,
|
||||||
|
JumpTo,
|
||||||
|
ModelRequest,
|
||||||
|
ResponseFormat,
|
||||||
|
)
|
||||||
|
from langgraph.constants import END, START
|
||||||
|
from langgraph.graph.state import StateGraph
|
||||||
|
from langgraph.prebuilt.tool_node import ToolNode
|
||||||
|
|
||||||
|
|
||||||
|
def create_agent(
|
||||||
|
*,
|
||||||
|
model: str | BaseChatModel,
|
||||||
|
tools: Sequence[BaseTool | Callable] | ToolNode,
|
||||||
|
system_prompt: str,
|
||||||
|
middleware: Sequence[AgentMiddleware] = (),
|
||||||
|
response_format: ResponseFormat | None = None,
|
||||||
|
context_schema: type[Any] | None = None,
|
||||||
|
) -> StateGraph[AgentState, None, AgentUpdate]:
|
||||||
|
# init chat model
|
||||||
|
if isinstance(model, str):
|
||||||
|
try:
|
||||||
|
from langchain.chat_models import ( # type: ignore[import-not-found]
|
||||||
|
init_chat_model,
|
||||||
|
)
|
||||||
|
except ImportError:
|
||||||
|
raise ImportError(
|
||||||
|
"Please install langchain (`pip install langchain`) to "
|
||||||
|
"use '<provider>:<model>' string syntax for `model` parameter."
|
||||||
|
)
|
||||||
|
|
||||||
|
model = cast(BaseChatModel, init_chat_model(model))
|
||||||
|
|
||||||
|
if isinstance(tools, list):
|
||||||
|
all_tools = [t for m in middleware for t in m.tools] + list(tools)
|
||||||
|
tool_node = ToolNode(tools=all_tools)
|
||||||
|
default_tools = tools
|
||||||
|
else:
|
||||||
|
# TODO: what do we do when middleware tools are specified, plus a ToolNode is used?
|
||||||
|
tool_node = tools
|
||||||
|
default_tools = list(tool_node.tools_by_name.values())
|
||||||
|
|
||||||
|
# validate middleware
|
||||||
|
assert len({m.__class__.__name__ for m in middleware}) == len(middleware), (
|
||||||
|
"Please remove duplicate middleware instances."
|
||||||
|
) # this is just to keep the node names simple, we can change if needed
|
||||||
|
middleware_w_before = [
|
||||||
|
m
|
||||||
|
for m in middleware
|
||||||
|
if m.__class__.before_model is not AgentMiddleware.before_model
|
||||||
|
]
|
||||||
|
middleware_w_modify_model_request = [
|
||||||
|
m
|
||||||
|
for m in middleware
|
||||||
|
if m.__class__.modify_model_request is not AgentMiddleware.modify_model_request
|
||||||
|
]
|
||||||
|
middleware_w_after = [
|
||||||
|
m
|
||||||
|
for m in middleware
|
||||||
|
if m.__class__.after_model is not AgentMiddleware.after_model
|
||||||
|
]
|
||||||
|
|
||||||
|
# create graph, add nodes
|
||||||
|
graph = StateGraph(
|
||||||
|
AgentState,
|
||||||
|
input_schema=AgentUpdate,
|
||||||
|
output_schema=AgentUpdate,
|
||||||
|
context_schema=context_schema,
|
||||||
|
)
|
||||||
|
|
||||||
|
def model_request(state: AgentState) -> AgentState:
|
||||||
|
request = state.model_request or ModelRequest(
|
||||||
|
model=model,
|
||||||
|
tools=default_tools,
|
||||||
|
system_prompt=system_prompt,
|
||||||
|
response_format=response_format,
|
||||||
|
messages=state.messages,
|
||||||
|
tool_choice=None,
|
||||||
|
)
|
||||||
|
|
||||||
|
# prepare messages
|
||||||
|
print(request.system_prompt)
|
||||||
|
if request.system_prompt:
|
||||||
|
messages = [SystemMessage(request.system_prompt)] + request.messages
|
||||||
|
else:
|
||||||
|
messages = request.messages
|
||||||
|
# call model
|
||||||
|
if request.response_format:
|
||||||
|
model_ = request.model.with_structured_output(
|
||||||
|
request.response_format, include_raw=True
|
||||||
|
)
|
||||||
|
output = model_.invoke(
|
||||||
|
messages, tools=request.tools, tool_choice=request.tool_choice
|
||||||
|
)
|
||||||
|
return {"messages": output["raw"], "response": output["parsed"]}
|
||||||
|
else:
|
||||||
|
model_ = request.model.bind_tools(
|
||||||
|
request.tools,
|
||||||
|
tool_choice=request.tool_choice,
|
||||||
|
parallel_tool_calls=False,
|
||||||
|
)
|
||||||
|
output = model_.invoke(messages)
|
||||||
|
if state.response is not None:
|
||||||
|
return {"messages": output, "response": None}
|
||||||
|
else:
|
||||||
|
return {"messages": output}
|
||||||
|
|
||||||
|
graph.add_node("model_request", model_request)
|
||||||
|
graph.add_node("tools", tool_node)
|
||||||
|
|
||||||
|
for m in middleware:
|
||||||
|
if m.__class__.before_model is not AgentMiddleware.before_model:
|
||||||
|
graph.add_node(
|
||||||
|
f"{m.__class__.__name__}.before_model",
|
||||||
|
m.before_model,
|
||||||
|
input_schema=m.State,
|
||||||
|
)
|
||||||
|
if m.__class__.modify_model_request is not AgentMiddleware.modify_model_request:
|
||||||
|
|
||||||
|
def modify_model_request_node(state: AgentState) -> dict[str, ModelRequest]:
|
||||||
|
# TODO assert request.tools in tools, or pass them to tool node
|
||||||
|
|
||||||
|
default_model_request = ModelRequest(
|
||||||
|
model=model,
|
||||||
|
tools=default_tools,
|
||||||
|
system_prompt=system_prompt,
|
||||||
|
response_format=response_format,
|
||||||
|
messages=state.messages,
|
||||||
|
tool_choice=None,
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
"model_request": m.modify_model_request(
|
||||||
|
state.model_request or default_model_request, state
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
graph.add_node(
|
||||||
|
f"{m.__class__.__name__}.modify_model_request",
|
||||||
|
modify_model_request_node,
|
||||||
|
input_schema=m.State,
|
||||||
|
)
|
||||||
|
|
||||||
|
if m.__class__.after_model is not AgentMiddleware.after_model:
|
||||||
|
graph.add_node(
|
||||||
|
f"{m.__class__.__name__}.after_model",
|
||||||
|
m.after_model,
|
||||||
|
input_schema=m.State,
|
||||||
|
)
|
||||||
|
|
||||||
|
# add start edge
|
||||||
|
first_node = (
|
||||||
|
f"{middleware_w_before[0].__class__.__name__}.before_model"
|
||||||
|
if middleware_w_before
|
||||||
|
else f"{middleware_w_modify_model_request[0].__class__.__name__}.modify_model_request"
|
||||||
|
if middleware_w_modify_model_request
|
||||||
|
else "model_request"
|
||||||
|
)
|
||||||
|
last_node = (
|
||||||
|
f"{middleware_w_after[0].__class__.__name__}.after_model"
|
||||||
|
if middleware_w_after
|
||||||
|
else "model_request"
|
||||||
|
)
|
||||||
|
graph.add_edge(START, first_node)
|
||||||
|
|
||||||
|
# add cond edges
|
||||||
|
graph.add_conditional_edges(
|
||||||
|
"tools",
|
||||||
|
_make_tools_to_model_edge(tool_node, first_node),
|
||||||
|
[first_node, END],
|
||||||
|
)
|
||||||
|
graph.add_conditional_edges(
|
||||||
|
last_node, _make_model_to_tools_edge(first_node), [first_node, "tools", END]
|
||||||
|
)
|
||||||
|
|
||||||
|
# add before model edges
|
||||||
|
if middleware_w_before:
|
||||||
|
for m1, m2 in zip(middleware_w_before, middleware_w_before[1:]):
|
||||||
|
_add_middleware_edge(
|
||||||
|
graph,
|
||||||
|
m1.before_model,
|
||||||
|
f"{m1.__class__.__name__}.before_model",
|
||||||
|
f"{m2.__class__.__name__}.before_model",
|
||||||
|
first_node,
|
||||||
|
)
|
||||||
|
_add_middleware_edge(
|
||||||
|
graph,
|
||||||
|
middleware_w_before[-1].before_model,
|
||||||
|
f"{middleware_w_before[-1].__class__.__name__}.before_model",
|
||||||
|
"model_request",
|
||||||
|
first_node,
|
||||||
|
)
|
||||||
|
|
||||||
|
# add modify model request edges
|
||||||
|
if middleware_w_modify_model_request:
|
||||||
|
for m1, m2 in zip(
|
||||||
|
middleware_w_modify_model_request, middleware_w_modify_model_request[1:]
|
||||||
|
):
|
||||||
|
_add_middleware_edge(
|
||||||
|
graph,
|
||||||
|
m1.modify_model_request,
|
||||||
|
f"{m1.__class__.__name__}.modify_model_request",
|
||||||
|
f"{m2.__class__.__name__}.modify_model_request",
|
||||||
|
first_node,
|
||||||
|
)
|
||||||
|
_add_middleware_edge(
|
||||||
|
graph,
|
||||||
|
middleware_w_modify_model_request[-1].modify_model_request,
|
||||||
|
f"{middleware_w_modify_model_request[-1].__class__.__name__}.modify_model_request",
|
||||||
|
"model_request",
|
||||||
|
first_node,
|
||||||
|
)
|
||||||
|
|
||||||
|
# add after model edges
|
||||||
|
if middleware_w_after:
|
||||||
|
graph.add_edge(
|
||||||
|
"model_request", f"{middleware_w_after[-1].__class__.__name__}.after_model"
|
||||||
|
)
|
||||||
|
for idx in range(len(middleware_w_after) - 1, 0, -1):
|
||||||
|
m1 = middleware_w_after[idx]
|
||||||
|
m2 = middleware_w_after[idx - 1]
|
||||||
|
_add_middleware_edge(
|
||||||
|
graph,
|
||||||
|
m1.after_model,
|
||||||
|
f"{m1.__class__.__name__}.after_model",
|
||||||
|
f"{m2.__class__.__name__}.after_model",
|
||||||
|
first_node,
|
||||||
|
)
|
||||||
|
# _add_middleware_edge(
|
||||||
|
# graph,
|
||||||
|
# middleware_w_after[-1].after_model,
|
||||||
|
# f"{middleware_w_after[-1].__class__.__name__}.after_model",
|
||||||
|
# "model_request",
|
||||||
|
# first_node,
|
||||||
|
# )
|
||||||
|
|
||||||
|
return graph
|
||||||
|
|
||||||
|
|
||||||
|
def _resolve_jump(jump_to: JumpTo | None, first_node: str) -> str | None:
|
||||||
|
if jump_to == "model":
|
||||||
|
return first_node
|
||||||
|
elif jump_to:
|
||||||
|
return jump_to
|
||||||
|
|
||||||
|
|
||||||
|
def _make_model_to_tools_edge(first_node: str) -> Callable[[AgentState], str | None]:
|
||||||
|
def model_to_tools(state: AgentState) -> str | None:
|
||||||
|
if state.jump_to:
|
||||||
|
return _resolve_jump(state.jump_to, first_node)
|
||||||
|
message = state.messages[-1]
|
||||||
|
if isinstance(message, AIMessage) and message.tool_calls:
|
||||||
|
return "tools"
|
||||||
|
|
||||||
|
return END
|
||||||
|
|
||||||
|
return model_to_tools
|
||||||
|
|
||||||
|
|
||||||
|
def _make_tools_to_model_edge(
|
||||||
|
tool_node: ToolNode, next_node: str
|
||||||
|
) -> Callable[[AgentState], str | None]:
|
||||||
|
def tools_to_model(state: AgentState) -> str | None:
|
||||||
|
ai_message = [m for m in state.messages if isinstance(m, AIMessage)][-1]
|
||||||
|
if all(
|
||||||
|
tool_node.tools_by_name[c["name"]].return_direct
|
||||||
|
for c in ai_message.tool_calls
|
||||||
|
if c["name"] in tool_node.tools_by_name
|
||||||
|
):
|
||||||
|
return END
|
||||||
|
|
||||||
|
return next_node
|
||||||
|
|
||||||
|
return tools_to_model
|
||||||
|
|
||||||
|
|
||||||
|
def _add_middleware_edge(
|
||||||
|
graph: StateGraph,
|
||||||
|
method: Callable[[AgentState], AgentUpdate | AgentJump | None],
|
||||||
|
name: str,
|
||||||
|
default_destination: str,
|
||||||
|
model_destination: str,
|
||||||
|
) -> None:
|
||||||
|
sig = signature(method)
|
||||||
|
uses_jump = sig.return_annotation is AgentJump or AgentJump in getattr(
|
||||||
|
sig.return_annotation, "__args__", ()
|
||||||
|
)
|
||||||
|
|
||||||
|
if uses_jump:
|
||||||
|
|
||||||
|
def jump_edge(state: AgentState) -> str:
|
||||||
|
return (
|
||||||
|
_resolve_jump(state.jump_to, model_destination) or default_destination
|
||||||
|
)
|
||||||
|
|
||||||
|
destinations = [default_destination, END, "tools"]
|
||||||
|
if name != model_destination:
|
||||||
|
destinations.append(model_destination)
|
||||||
|
|
||||||
|
graph.add_conditional_edges(name, jump_edge, destinations)
|
||||||
|
else:
|
||||||
|
graph.add_edge(name, default_destination)
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
from dataclasses import dataclass
|
||||||
|
from typing import Literal
|
||||||
|
|
||||||
|
from langchain_core.language_models.chat_models import BaseChatModel
|
||||||
|
|
||||||
|
from langgraph.agent.types import (
|
||||||
|
AgentJump,
|
||||||
|
AgentMiddleware,
|
||||||
|
AgentState,
|
||||||
|
AgentUpdate,
|
||||||
|
ModelRequest,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class DynamicModelMiddleware(AgentMiddleware):
|
||||||
|
"""Selects different models based on task complexity"""
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
basic_model: BaseChatModel,
|
||||||
|
complex_model: BaseChatModel,
|
||||||
|
message_threshold: int = 5,
|
||||||
|
):
|
||||||
|
self.basic_model = basic_model
|
||||||
|
self.complex_model = complex_model
|
||||||
|
self.message_threshold = message_threshold
|
||||||
|
|
||||||
|
def modify_model_request(
|
||||||
|
self, request: ModelRequest, state: AgentState
|
||||||
|
) -> ModelRequest:
|
||||||
|
if len(state.messages) > self.message_threshold:
|
||||||
|
request.model = self.complex_model
|
||||||
|
else:
|
||||||
|
request.model = self.basic_model
|
||||||
|
return request
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
from langgraph.agent.types import AgentJump, AgentMiddleware, AgentState, AgentUpdate
|
||||||
|
from langgraph.prebuilt.interrupt import (
|
||||||
|
ActionRequest,
|
||||||
|
HumanInterrupt,
|
||||||
|
HumanInterruptConfig,
|
||||||
|
HumanResponse,
|
||||||
|
)
|
||||||
|
from langgraph.types import interrupt
|
||||||
|
|
||||||
|
ToolInterruptConfig = dict[str, HumanInterruptConfig]
|
||||||
|
|
||||||
|
|
||||||
|
class HumanInTheLoopMiddleware(AgentMiddleware):
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
tool_configs: ToolInterruptConfig,
|
||||||
|
message_prefix: str = "Tool execution requires approval",
|
||||||
|
):
|
||||||
|
super().__init__()
|
||||||
|
self.tool_configs = tool_configs
|
||||||
|
self.message_prefix = message_prefix
|
||||||
|
|
||||||
|
def after_model(self, state: AgentState) -> AgentUpdate | AgentJump | None:
|
||||||
|
messages = state.messages
|
||||||
|
if not messages:
|
||||||
|
return
|
||||||
|
|
||||||
|
last_message = messages[-1]
|
||||||
|
|
||||||
|
if not hasattr(last_message, "tool_calls") or not last_message.tool_calls:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Separate tool calls that need interrupts from those that don't
|
||||||
|
interrupt_tool_calls = []
|
||||||
|
auto_approved_tool_calls = []
|
||||||
|
|
||||||
|
for tool_call in last_message.tool_calls:
|
||||||
|
tool_name = tool_call["name"]
|
||||||
|
if tool_name in self.tool_configs:
|
||||||
|
interrupt_tool_calls.append(tool_call)
|
||||||
|
else:
|
||||||
|
auto_approved_tool_calls.append(tool_call)
|
||||||
|
|
||||||
|
# If no interrupts needed, return early
|
||||||
|
if not interrupt_tool_calls:
|
||||||
|
return
|
||||||
|
|
||||||
|
approved_tool_calls = auto_approved_tool_calls.copy()
|
||||||
|
|
||||||
|
# Process all tool calls that need interrupts in parallel
|
||||||
|
requests = []
|
||||||
|
|
||||||
|
for tool_call in interrupt_tool_calls:
|
||||||
|
tool_name = tool_call["name"]
|
||||||
|
tool_args = tool_call["args"]
|
||||||
|
description = (
|
||||||
|
f"{self.message_prefix}\n\nTool: {tool_name}\nArgs: {tool_args}"
|
||||||
|
)
|
||||||
|
tool_config = self.tool_configs[tool_name]
|
||||||
|
|
||||||
|
request: HumanInterrupt = {
|
||||||
|
"action_request": ActionRequest(
|
||||||
|
action=tool_name,
|
||||||
|
args=tool_args,
|
||||||
|
),
|
||||||
|
"config": tool_config,
|
||||||
|
"description": description,
|
||||||
|
}
|
||||||
|
requests.append(request)
|
||||||
|
|
||||||
|
responses: list[HumanResponse] = interrupt(requests)
|
||||||
|
|
||||||
|
for i, response in enumerate(responses):
|
||||||
|
tool_call = interrupt_tool_calls[i]
|
||||||
|
|
||||||
|
if response["type"] == "accept":
|
||||||
|
approved_tool_calls.append(tool_call)
|
||||||
|
elif response["type"] == "edit":
|
||||||
|
edited: ActionRequest = response["args"]
|
||||||
|
new_tool_call = {
|
||||||
|
"name": tool_call["name"],
|
||||||
|
"args": edited["args"],
|
||||||
|
"id": tool_call["id"],
|
||||||
|
}
|
||||||
|
approved_tool_calls.append(new_tool_call)
|
||||||
|
elif response["type"] == "ignore":
|
||||||
|
# NOTE: does not work with multiple interrupts
|
||||||
|
return {"goto": "__end__"}
|
||||||
|
elif response["type"] == "response":
|
||||||
|
# NOTE: does not work with multiple interrupts
|
||||||
|
tool_message = {
|
||||||
|
"role": "tool",
|
||||||
|
"tool_call_id": tool_call["id"],
|
||||||
|
"content": response["args"],
|
||||||
|
}
|
||||||
|
return {"messages": [tool_message], "goto": "model"}
|
||||||
|
else:
|
||||||
|
raise ValueError(f"Unknown response type: {response['type']}")
|
||||||
|
|
||||||
|
last_message.tool_calls = approved_tool_calls
|
||||||
|
|
||||||
|
return {"messages": [last_message]}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
import operator
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from typing import Annotated
|
||||||
|
|
||||||
|
from langgraph.agent.types import AgentJump, AgentMiddleware, AgentState, AgentUpdate
|
||||||
|
|
||||||
|
|
||||||
|
class ModelRequestLimitMiddleware(AgentMiddleware):
|
||||||
|
"""Terminates after N model requests"""
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class State(AgentMiddleware.State):
|
||||||
|
model_request_count: Annotated[int, operator.add] = 0
|
||||||
|
|
||||||
|
def __init__(self, max_requests: int = 10):
|
||||||
|
self.max_requests = max_requests
|
||||||
|
|
||||||
|
def before_model(self, state: State) -> AgentUpdate | AgentJump | None:
|
||||||
|
# TODO: want to be able to configure end behavior here
|
||||||
|
if state.model_request_count == self.max_requests:
|
||||||
|
return {"jump_to": "__end__"}
|
||||||
|
|
||||||
|
return {"model_request_count": 1}
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
import uuid
|
||||||
|
from collections.abc import Sequence
|
||||||
|
from typing import Callable, Iterable
|
||||||
|
|
||||||
|
from langchain_core.language_models import LanguageModelLike
|
||||||
|
from langchain_core.messages import (
|
||||||
|
AIMessage,
|
||||||
|
AnyMessage,
|
||||||
|
MessageLikeRepresentation,
|
||||||
|
RemoveMessage,
|
||||||
|
ToolMessage,
|
||||||
|
)
|
||||||
|
from langchain_core.messages.utils import count_tokens_approximately
|
||||||
|
|
||||||
|
TokenCounter = Callable[[Iterable[MessageLikeRepresentation]], int]
|
||||||
|
|
||||||
|
|
||||||
|
from langgraph.agent.types import AgentMiddleware, AgentState
|
||||||
|
|
||||||
|
DEFAULT_SUMMARY_PROMPT = """<role>
|
||||||
|
Context Extraction Assistant
|
||||||
|
</role>
|
||||||
|
|
||||||
|
<primary_objective>
|
||||||
|
Your sole objective in this task is to extract the highest quality/most relevant context from the conversation history below.
|
||||||
|
</primary_objective>
|
||||||
|
|
||||||
|
<objective_information>
|
||||||
|
You're nearing the total number of input tokens you can accept, so you must extract the highest quality/most relevant pieces of information from your conversation history.
|
||||||
|
This context will then overwrite the conversation history presented below. Because of this, ensure the context you extract is only the most important information to your overall goal.
|
||||||
|
</objective_information>
|
||||||
|
|
||||||
|
<instructions>
|
||||||
|
The conversation history below will be replaced with the context you extract in this step. Because of this, you must do your very best to extract and record all of the most important context from the conversation history.
|
||||||
|
You want to ensure that you don't repeat any actions you've already completed, so the context you extract from the conversation history should be focused on the most important information to your overall goal.
|
||||||
|
</instructions>
|
||||||
|
|
||||||
|
The user will message you with the full message history you'll be extracting context from, to then replace. Carefully read over it all, and think deeply about what information is most important to your overall goal that should be saved:
|
||||||
|
|
||||||
|
With all of this in mind, please carefully read over the entire conversation history, and extract the most important and relevant context to replace it so that you can free up space in the conversation history.
|
||||||
|
Respond ONLY with the extracted context. Do not include any additional information, or text before or after the extracted context."""
|
||||||
|
|
||||||
|
|
||||||
|
class SummarizationMiddleware(AgentMiddleware):
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
model: LanguageModelLike,
|
||||||
|
max_tokens_before_summary: int | None = None,
|
||||||
|
token_counter: TokenCounter = count_tokens_approximately,
|
||||||
|
messages_to_leave: int = 20,
|
||||||
|
summary_system_prompt: str = DEFAULT_SUMMARY_PROMPT,
|
||||||
|
fake_tool_call_name: str = "summarize_convo",
|
||||||
|
):
|
||||||
|
super().__init__()
|
||||||
|
self.model = model
|
||||||
|
self.max_tokens_before_summary = max_tokens_before_summary
|
||||||
|
self.token_counter = token_counter
|
||||||
|
self.messages_to_leave = messages_to_leave
|
||||||
|
self.summary_system_prompt = summary_system_prompt
|
||||||
|
self.fake_tool_call_name = fake_tool_call_name
|
||||||
|
|
||||||
|
def before_model(self, state: AgentState) -> AgentState | None:
|
||||||
|
messages = state.messages
|
||||||
|
token_counts = self.token_counter(messages)
|
||||||
|
# If token counts are less than max allowed, then end this hook early
|
||||||
|
if token_counts < self.max_tokens_before_summary:
|
||||||
|
return None
|
||||||
|
# Otherwise, we create a summary!
|
||||||
|
# Get messages that we want to create a summary for
|
||||||
|
messages_to_summarize = messages[: -self.messages_to_leave]
|
||||||
|
# Create summary text
|
||||||
|
summary = self._summarize_messages(messages_to_summarize)
|
||||||
|
# Create fake messages to add to history
|
||||||
|
fake_tool_call_id = str(uuid.uuid4())
|
||||||
|
fake_messages = [
|
||||||
|
AIMessage(
|
||||||
|
content="Looks like I'm running out of tokens. I'm going to summarize the conversation history to free up space.",
|
||||||
|
tool_calls={
|
||||||
|
"id": fake_tool_call_id,
|
||||||
|
"name": self.fake_tool_call_name,
|
||||||
|
"args": {
|
||||||
|
"reasoning": "I'm running out of tokens. I'm going to summarize all of the messages since my last summary message to free up space.",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
),
|
||||||
|
ToolMessage(tool_call_id=fake_tool_call_id, content=summary),
|
||||||
|
]
|
||||||
|
return {
|
||||||
|
"messages": [RemoveMessage(id=m.id) for m in messages_to_summarize]
|
||||||
|
+ fake_messages
|
||||||
|
}
|
||||||
|
|
||||||
|
def _summarize_messages(self, messages_to_summarize: Sequence[AnyMessage]) -> str:
|
||||||
|
system_message = self.summary_system_prompt
|
||||||
|
user_message = self._format_messages(messages_to_summarize)
|
||||||
|
response = self.model.invoke(
|
||||||
|
[
|
||||||
|
{"role": "system", "content": system_message},
|
||||||
|
{"role": "user", "content": user_message},
|
||||||
|
]
|
||||||
|
)
|
||||||
|
# Use new .text attribute when ready
|
||||||
|
return response.content
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _format_messages(messages_to_summarize: Sequence[AnyMessage]) -> str:
|
||||||
|
# TODO: better formatting logic
|
||||||
|
return "\n".join([m.content for m in messages_to_summarize])
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
from dataclasses import dataclass
|
||||||
|
from typing import cast
|
||||||
|
|
||||||
|
from langchain_core.messages import AIMessage, HumanMessage, ToolMessage
|
||||||
|
from langchain_core.tools import BaseTool, tool
|
||||||
|
|
||||||
|
from langgraph.agent import create_agent
|
||||||
|
from langgraph.agent.types import AgentJump, AgentMiddleware, ModelRequest
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class SwarmAgent:
|
||||||
|
name: str
|
||||||
|
system_prompt: str
|
||||||
|
tools: list[BaseTool]
|
||||||
|
|
||||||
|
|
||||||
|
class MultiAgentMiddleware(AgentMiddleware):
|
||||||
|
"""Multi agent middleware (enabling swarm like behavior).
|
||||||
|
|
||||||
|
TODOs:
|
||||||
|
* Support create_agent for handoffs
|
||||||
|
* Support handoff customization
|
||||||
|
* do we want to include handoff messages / enable togglging
|
||||||
|
* default active agent
|
||||||
|
* handoff tool naming / descriptions
|
||||||
|
"""
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class State(AgentMiddleware.State):
|
||||||
|
active_agent: str | None = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _create_handoff_tools(agents: list[SwarmAgent]) -> list[BaseTool]:
|
||||||
|
handoff_tools: list[BaseTool] = []
|
||||||
|
|
||||||
|
for agent in agents:
|
||||||
|
|
||||||
|
def handoff_tool() -> str:
|
||||||
|
return f"Handing off to {agent.name}"
|
||||||
|
|
||||||
|
handoff_tools.append(
|
||||||
|
tool(
|
||||||
|
f"handoff_to_{agent.name}",
|
||||||
|
description=f"Handoff tool to trigger a handoff to {agent.name}",
|
||||||
|
)(handoff_tool)
|
||||||
|
)
|
||||||
|
|
||||||
|
return handoff_tools
|
||||||
|
|
||||||
|
def __init__(self, agents: list[SwarmAgent]):
|
||||||
|
self.agents: dict[str, SwarmAgent] = {agent.name: agent for agent in agents}
|
||||||
|
self.handoff_tools = self._create_handoff_tools(agents)
|
||||||
|
|
||||||
|
def modify_model_request(self, request: ModelRequest, state: State) -> ModelRequest:
|
||||||
|
if (active_agent := getattr(state, "active_agent", None)) is not None:
|
||||||
|
agent = self.agents[active_agent]
|
||||||
|
request.system_prompt = agent.system_prompt
|
||||||
|
request.tools = agent.tools
|
||||||
|
|
||||||
|
request.tools.extend(self.handoff_tools)
|
||||||
|
|
||||||
|
return request
|
||||||
|
|
||||||
|
def after_model(self, state) -> State | None:
|
||||||
|
# TODO: handle parallel handoffs, we don't do this currently
|
||||||
|
|
||||||
|
ai_msg: AIMessage = cast(AIMessage, state.messages[-1])
|
||||||
|
if ai_msg.tool_calls:
|
||||||
|
for call in ai_msg.tool_calls:
|
||||||
|
if call["name"].startswith("handoff_to_"):
|
||||||
|
active_agent = call["name"].replace("handoff_to_", "")
|
||||||
|
return {
|
||||||
|
"messages": [
|
||||||
|
ToolMessage(
|
||||||
|
name=call["name"],
|
||||||
|
content=f"Successfully transferred to {active_agent}",
|
||||||
|
tool_call_id=call["id"],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
"active_agent": active_agent,
|
||||||
|
"jump_to": "model",
|
||||||
|
}
|
||||||
|
return None
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
from dataclasses import dataclass, field
|
||||||
|
from typing import Annotated, Any, Dict, List, cast
|
||||||
|
|
||||||
|
from langchain_core.messages import AIMessage
|
||||||
|
from typing_extensions import Annotated
|
||||||
|
|
||||||
|
from langgraph.agent.types import AgentJump, AgentMiddleware, AgentState, AgentUpdate
|
||||||
|
|
||||||
|
|
||||||
|
class ToolCallLimitMiddleware(AgentMiddleware):
|
||||||
|
"""Terminates after a specific tool is called N times"""
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class State(AgentMiddleware.State):
|
||||||
|
important: Annotated[dict[str, int], Input, Output] = field(default_factory=dict)
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class InputState(AgentMiddleware.State):
|
||||||
|
important: dict[str, int]
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class OutputState(AgentMiddleware.State):
|
||||||
|
important: dict[str, int]
|
||||||
|
|
||||||
|
def __init__(self, tool_limits: dict[str, int]):
|
||||||
|
self.tool_limits = tool_limits
|
||||||
|
|
||||||
|
def after_model(self, state: State) -> AgentUpdate | AgentJump | None:
|
||||||
|
ai_msg: AIMessage = cast(AIMessage, state.messages[-1])
|
||||||
|
|
||||||
|
tool_calls = {}
|
||||||
|
for call in ai_msg.tool_calls or []:
|
||||||
|
tool_calls[call["name"]] = tool_calls.get(call["name"], 0) + 1
|
||||||
|
|
||||||
|
aggregate_calls = state.tool_call_count.copy()
|
||||||
|
for tool_name in tool_calls.keys():
|
||||||
|
aggregate_calls[tool_name] = aggregate_calls.get(tool_name, 0) + 1
|
||||||
|
|
||||||
|
for tool_name, max_calls in self.tool_limits.items():
|
||||||
|
count = aggregate_calls.get(tool_name, 0)
|
||||||
|
if count == max_calls:
|
||||||
|
return {"tool_call_count": aggregate_calls, "jump_to": "__end__"}
|
||||||
|
|
||||||
|
return {"tool_call_count": aggregate_calls}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from collections.abc import Sequence
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from typing import Annotated, Any, Literal
|
||||||
|
|
||||||
|
from langchain_core.language_models.chat_models import BaseChatModel
|
||||||
|
from langchain_core.messages import AnyMessage
|
||||||
|
from langchain_core.tools import BaseTool
|
||||||
|
from pydantic import BaseModel
|
||||||
|
from typing_extensions import TypedDict
|
||||||
|
|
||||||
|
from langgraph.channels.ephemeral_value import EphemeralValue
|
||||||
|
from langgraph.graph.message import Messages, add_messages
|
||||||
|
from langgraph.runtime import Runtime
|
||||||
|
|
||||||
|
ResponseFormat = dict | type[BaseModel]
|
||||||
|
JumpTo = Literal["tools", "model", "__end__"]
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ModelRequest:
|
||||||
|
model: BaseChatModel
|
||||||
|
system_prompt: str
|
||||||
|
messages: list[AnyMessage] # excluding system prompt
|
||||||
|
tool_choice: Any
|
||||||
|
tools: list[BaseTool]
|
||||||
|
response_format: ResponseFormat | None
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class AgentState:
|
||||||
|
messages: Annotated[list[AnyMessage], add_messages]
|
||||||
|
model_request: Annotated[ModelRequest | None, EphemeralValue] = None
|
||||||
|
jump_to: Annotated[JumpTo | None, EphemeralValue] = None
|
||||||
|
response: dict | None = None
|
||||||
|
|
||||||
|
|
||||||
|
class AgentMiddleware:
|
||||||
|
class State(AgentState):
|
||||||
|
pass
|
||||||
|
|
||||||
|
tools: list[BaseTool]
|
||||||
|
|
||||||
|
def before_model(self, state: State) -> AgentUpdate | AgentJump | None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def modify_model_request(self, request: ModelRequest, state: State) -> ModelRequest:
|
||||||
|
return request
|
||||||
|
|
||||||
|
def after_model(self, state: State) -> AgentUpdate | AgentJump | None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class AgentUpdate(TypedDict, total=False):
|
||||||
|
messages: Messages
|
||||||
|
response: dict
|
||||||
|
|
||||||
|
|
||||||
|
class AgentJump(TypedDict, total=False):
|
||||||
|
messages: Messages
|
||||||
|
jump_to: JumpTo
|
||||||
@@ -198,11 +198,8 @@ def local_read(
|
|||||||
# apply writes
|
# apply writes
|
||||||
local_channels: dict[str, BaseChannel] = {}
|
local_channels: dict[str, BaseChannel] = {}
|
||||||
for k in channels:
|
for k in channels:
|
||||||
if k in updated:
|
cc = channels[k].copy()
|
||||||
cc = channels[k].copy()
|
cc.update(updated[k])
|
||||||
cc.update(updated[k])
|
|
||||||
else:
|
|
||||||
cc = channels[k]
|
|
||||||
local_channels[k] = cc
|
local_channels[k] = cc
|
||||||
# read fresh values
|
# read fresh values
|
||||||
values = read_channels(local_channels, select)
|
values = read_channels(local_channels, select)
|
||||||
|
|||||||
@@ -25,9 +25,17 @@ from langgraph_sdk.client import (
|
|||||||
get_client,
|
get_client,
|
||||||
get_sync_client,
|
get_sync_client,
|
||||||
)
|
)
|
||||||
from langgraph_sdk.schema import Checkpoint, ThreadState
|
from langgraph_sdk.schema import (
|
||||||
from langgraph_sdk.schema import Command as CommandSDK
|
Checkpoint,
|
||||||
from langgraph_sdk.schema import StreamMode as StreamModeSDK
|
QueryParamTypes,
|
||||||
|
ThreadState,
|
||||||
|
)
|
||||||
|
from langgraph_sdk.schema import (
|
||||||
|
Command as CommandSDK,
|
||||||
|
)
|
||||||
|
from langgraph_sdk.schema import (
|
||||||
|
StreamMode as StreamModeSDK,
|
||||||
|
)
|
||||||
from typing_extensions import Self
|
from typing_extensions import Self
|
||||||
|
|
||||||
from langgraph._internal._config import merge_configs
|
from langgraph._internal._config import merge_configs
|
||||||
@@ -208,6 +216,8 @@ class RemoteGraph(PregelProtocol):
|
|||||||
config: RunnableConfig | None = None,
|
config: RunnableConfig | None = None,
|
||||||
*,
|
*,
|
||||||
xray: int | bool = False,
|
xray: int | bool = False,
|
||||||
|
headers: dict[str, str] | None = None,
|
||||||
|
params: QueryParamTypes | None = None,
|
||||||
) -> DrawableGraph:
|
) -> DrawableGraph:
|
||||||
"""Get graph by graph name.
|
"""Get graph by graph name.
|
||||||
|
|
||||||
@@ -226,6 +236,8 @@ class RemoteGraph(PregelProtocol):
|
|||||||
graph = sync_client.assistants.get_graph(
|
graph = sync_client.assistants.get_graph(
|
||||||
assistant_id=self.assistant_id,
|
assistant_id=self.assistant_id,
|
||||||
xray=xray,
|
xray=xray,
|
||||||
|
headers=headers,
|
||||||
|
params=params,
|
||||||
)
|
)
|
||||||
return DrawableGraph(
|
return DrawableGraph(
|
||||||
nodes=self._get_drawable_nodes(graph),
|
nodes=self._get_drawable_nodes(graph),
|
||||||
@@ -237,6 +249,8 @@ class RemoteGraph(PregelProtocol):
|
|||||||
config: RunnableConfig | None = None,
|
config: RunnableConfig | None = None,
|
||||||
*,
|
*,
|
||||||
xray: int | bool = False,
|
xray: int | bool = False,
|
||||||
|
headers: dict[str, str] | None = None,
|
||||||
|
params: QueryParamTypes | None = None,
|
||||||
) -> DrawableGraph:
|
) -> DrawableGraph:
|
||||||
"""Get graph by graph name.
|
"""Get graph by graph name.
|
||||||
|
|
||||||
@@ -255,6 +269,8 @@ class RemoteGraph(PregelProtocol):
|
|||||||
graph = await client.assistants.get_graph(
|
graph = await client.assistants.get_graph(
|
||||||
assistant_id=self.assistant_id,
|
assistant_id=self.assistant_id,
|
||||||
xray=xray,
|
xray=xray,
|
||||||
|
headers=headers,
|
||||||
|
params=params,
|
||||||
)
|
)
|
||||||
return DrawableGraph(
|
return DrawableGraph(
|
||||||
nodes=self._get_drawable_nodes(graph),
|
nodes=self._get_drawable_nodes(graph),
|
||||||
@@ -376,7 +392,12 @@ class RemoteGraph(PregelProtocol):
|
|||||||
return sanitized
|
return sanitized
|
||||||
|
|
||||||
def get_state(
|
def get_state(
|
||||||
self, config: RunnableConfig, *, subgraphs: bool = False
|
self,
|
||||||
|
config: RunnableConfig,
|
||||||
|
*,
|
||||||
|
subgraphs: bool = False,
|
||||||
|
headers: dict[str, str] | None = None,
|
||||||
|
params: QueryParamTypes | None = None,
|
||||||
) -> StateSnapshot:
|
) -> StateSnapshot:
|
||||||
"""Get the state of a thread.
|
"""Get the state of a thread.
|
||||||
|
|
||||||
@@ -388,6 +409,8 @@ class RemoteGraph(PregelProtocol):
|
|||||||
config: A `RunnableConfig` that includes `thread_id` in the
|
config: A `RunnableConfig` that includes `thread_id` in the
|
||||||
`configurable` field.
|
`configurable` field.
|
||||||
subgraphs: Include subgraphs in the state.
|
subgraphs: Include subgraphs in the state.
|
||||||
|
headers: Optional custom headers to include with the request.
|
||||||
|
params: Optional query parameters to include with the request.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
The latest state of the thread.
|
The latest state of the thread.
|
||||||
@@ -399,11 +422,18 @@ class RemoteGraph(PregelProtocol):
|
|||||||
thread_id=merged_config["configurable"]["thread_id"],
|
thread_id=merged_config["configurable"]["thread_id"],
|
||||||
checkpoint=self._get_checkpoint(merged_config),
|
checkpoint=self._get_checkpoint(merged_config),
|
||||||
subgraphs=subgraphs,
|
subgraphs=subgraphs,
|
||||||
|
headers=headers,
|
||||||
|
params=params,
|
||||||
)
|
)
|
||||||
return self._create_state_snapshot(state)
|
return self._create_state_snapshot(state)
|
||||||
|
|
||||||
async def aget_state(
|
async def aget_state(
|
||||||
self, config: RunnableConfig, *, subgraphs: bool = False
|
self,
|
||||||
|
config: RunnableConfig,
|
||||||
|
*,
|
||||||
|
subgraphs: bool = False,
|
||||||
|
headers: dict[str, str] | None = None,
|
||||||
|
params: QueryParamTypes | None = None,
|
||||||
) -> StateSnapshot:
|
) -> StateSnapshot:
|
||||||
"""Get the state of a thread.
|
"""Get the state of a thread.
|
||||||
|
|
||||||
@@ -415,6 +445,8 @@ class RemoteGraph(PregelProtocol):
|
|||||||
config: A `RunnableConfig` that includes `thread_id` in the
|
config: A `RunnableConfig` that includes `thread_id` in the
|
||||||
`configurable` field.
|
`configurable` field.
|
||||||
subgraphs: Include subgraphs in the state.
|
subgraphs: Include subgraphs in the state.
|
||||||
|
headers: Optional custom headers to include with the request.
|
||||||
|
params: Optional query parameters to include with the request.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
The latest state of the thread.
|
The latest state of the thread.
|
||||||
@@ -426,6 +458,8 @@ class RemoteGraph(PregelProtocol):
|
|||||||
thread_id=merged_config["configurable"]["thread_id"],
|
thread_id=merged_config["configurable"]["thread_id"],
|
||||||
checkpoint=self._get_checkpoint(merged_config),
|
checkpoint=self._get_checkpoint(merged_config),
|
||||||
subgraphs=subgraphs,
|
subgraphs=subgraphs,
|
||||||
|
headers=headers,
|
||||||
|
params=params,
|
||||||
)
|
)
|
||||||
return self._create_state_snapshot(state)
|
return self._create_state_snapshot(state)
|
||||||
|
|
||||||
@@ -436,6 +470,8 @@ class RemoteGraph(PregelProtocol):
|
|||||||
filter: dict[str, Any] | None = None,
|
filter: dict[str, Any] | None = None,
|
||||||
before: RunnableConfig | None = None,
|
before: RunnableConfig | None = None,
|
||||||
limit: int | None = None,
|
limit: int | None = None,
|
||||||
|
headers: dict[str, str] | None = None,
|
||||||
|
params: QueryParamTypes | None = None,
|
||||||
) -> Iterator[StateSnapshot]:
|
) -> Iterator[StateSnapshot]:
|
||||||
"""Get the state history of a thread.
|
"""Get the state history of a thread.
|
||||||
|
|
||||||
@@ -460,6 +496,8 @@ class RemoteGraph(PregelProtocol):
|
|||||||
before=self._get_checkpoint(before),
|
before=self._get_checkpoint(before),
|
||||||
metadata=filter,
|
metadata=filter,
|
||||||
checkpoint=self._get_checkpoint(merged_config),
|
checkpoint=self._get_checkpoint(merged_config),
|
||||||
|
headers=headers,
|
||||||
|
params=params,
|
||||||
)
|
)
|
||||||
for state in states:
|
for state in states:
|
||||||
yield self._create_state_snapshot(state)
|
yield self._create_state_snapshot(state)
|
||||||
@@ -471,6 +509,8 @@ class RemoteGraph(PregelProtocol):
|
|||||||
filter: dict[str, Any] | None = None,
|
filter: dict[str, Any] | None = None,
|
||||||
before: RunnableConfig | None = None,
|
before: RunnableConfig | None = None,
|
||||||
limit: int | None = None,
|
limit: int | None = None,
|
||||||
|
headers: dict[str, str] | None = None,
|
||||||
|
params: QueryParamTypes | None = None,
|
||||||
) -> AsyncIterator[StateSnapshot]:
|
) -> AsyncIterator[StateSnapshot]:
|
||||||
"""Get the state history of a thread.
|
"""Get the state history of a thread.
|
||||||
|
|
||||||
@@ -482,6 +522,8 @@ class RemoteGraph(PregelProtocol):
|
|||||||
filter: Metadata to filter on.
|
filter: Metadata to filter on.
|
||||||
before: A `RunnableConfig` that includes checkpoint metadata.
|
before: A `RunnableConfig` that includes checkpoint metadata.
|
||||||
limit: Max number of states to return.
|
limit: Max number of states to return.
|
||||||
|
headers: Optional custom headers to include with the request.
|
||||||
|
params: Optional query parameters to include with the request.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
States of the thread.
|
States of the thread.
|
||||||
@@ -495,6 +537,8 @@ class RemoteGraph(PregelProtocol):
|
|||||||
before=self._get_checkpoint(before),
|
before=self._get_checkpoint(before),
|
||||||
metadata=filter,
|
metadata=filter,
|
||||||
checkpoint=self._get_checkpoint(merged_config),
|
checkpoint=self._get_checkpoint(merged_config),
|
||||||
|
headers=headers,
|
||||||
|
params=params,
|
||||||
)
|
)
|
||||||
for state in states:
|
for state in states:
|
||||||
yield self._create_state_snapshot(state)
|
yield self._create_state_snapshot(state)
|
||||||
@@ -518,6 +562,9 @@ class RemoteGraph(PregelProtocol):
|
|||||||
config: RunnableConfig,
|
config: RunnableConfig,
|
||||||
values: dict[str, Any] | Any | None,
|
values: dict[str, Any] | Any | None,
|
||||||
as_node: str | None = None,
|
as_node: str | None = None,
|
||||||
|
*,
|
||||||
|
headers: dict[str, str] | None = None,
|
||||||
|
params: QueryParamTypes | None = None,
|
||||||
) -> RunnableConfig:
|
) -> RunnableConfig:
|
||||||
"""Update the state of a thread.
|
"""Update the state of a thread.
|
||||||
|
|
||||||
@@ -540,6 +587,8 @@ class RemoteGraph(PregelProtocol):
|
|||||||
values=values,
|
values=values,
|
||||||
as_node=as_node,
|
as_node=as_node,
|
||||||
checkpoint=self._get_checkpoint(merged_config),
|
checkpoint=self._get_checkpoint(merged_config),
|
||||||
|
headers=headers,
|
||||||
|
params=params,
|
||||||
)
|
)
|
||||||
return self._get_config(response["checkpoint"])
|
return self._get_config(response["checkpoint"])
|
||||||
|
|
||||||
@@ -548,6 +597,9 @@ class RemoteGraph(PregelProtocol):
|
|||||||
config: RunnableConfig,
|
config: RunnableConfig,
|
||||||
values: dict[str, Any] | Any | None,
|
values: dict[str, Any] | Any | None,
|
||||||
as_node: str | None = None,
|
as_node: str | None = None,
|
||||||
|
*,
|
||||||
|
headers: dict[str, str] | None = None,
|
||||||
|
params: QueryParamTypes | None = None,
|
||||||
) -> RunnableConfig:
|
) -> RunnableConfig:
|
||||||
"""Update the state of a thread.
|
"""Update the state of a thread.
|
||||||
|
|
||||||
@@ -570,6 +622,8 @@ class RemoteGraph(PregelProtocol):
|
|||||||
values=values,
|
values=values,
|
||||||
as_node=as_node,
|
as_node=as_node,
|
||||||
checkpoint=self._get_checkpoint(merged_config),
|
checkpoint=self._get_checkpoint(merged_config),
|
||||||
|
headers=headers,
|
||||||
|
params=params,
|
||||||
)
|
)
|
||||||
return self._get_config(response["checkpoint"])
|
return self._get_config(response["checkpoint"])
|
||||||
|
|
||||||
@@ -634,6 +688,7 @@ class RemoteGraph(PregelProtocol):
|
|||||||
interrupt_after: All | Sequence[str] | None = None,
|
interrupt_after: All | Sequence[str] | None = None,
|
||||||
subgraphs: bool = False,
|
subgraphs: bool = False,
|
||||||
headers: dict[str, str] | None = None,
|
headers: dict[str, str] | None = None,
|
||||||
|
params: QueryParamTypes | None = None,
|
||||||
**kwargs: Any,
|
**kwargs: Any,
|
||||||
) -> Iterator[dict[str, Any] | Any]:
|
) -> Iterator[dict[str, Any] | Any]:
|
||||||
"""Create a run and stream the results.
|
"""Create a run and stream the results.
|
||||||
@@ -678,9 +733,10 @@ class RemoteGraph(PregelProtocol):
|
|||||||
interrupt_after=interrupt_after,
|
interrupt_after=interrupt_after,
|
||||||
stream_subgraphs=subgraphs or stream is not None,
|
stream_subgraphs=subgraphs or stream is not None,
|
||||||
if_not_exists="create",
|
if_not_exists="create",
|
||||||
headers=_merge_tracing_headers(headers)
|
headers=(
|
||||||
if self.distributed_tracing
|
_merge_tracing_headers(headers) if self.distributed_tracing else headers
|
||||||
else headers,
|
),
|
||||||
|
params=params,
|
||||||
**kwargs,
|
**kwargs,
|
||||||
):
|
):
|
||||||
# split mode and ns
|
# split mode and ns
|
||||||
@@ -741,6 +797,7 @@ class RemoteGraph(PregelProtocol):
|
|||||||
interrupt_after: All | Sequence[str] | None = None,
|
interrupt_after: All | Sequence[str] | None = None,
|
||||||
subgraphs: bool = False,
|
subgraphs: bool = False,
|
||||||
headers: dict[str, str] | None = None,
|
headers: dict[str, str] | None = None,
|
||||||
|
params: QueryParamTypes | None = None,
|
||||||
**kwargs: Any,
|
**kwargs: Any,
|
||||||
) -> AsyncIterator[dict[str, Any] | Any]:
|
) -> AsyncIterator[dict[str, Any] | Any]:
|
||||||
"""Create a run and stream the results.
|
"""Create a run and stream the results.
|
||||||
@@ -785,9 +842,10 @@ class RemoteGraph(PregelProtocol):
|
|||||||
interrupt_after=interrupt_after,
|
interrupt_after=interrupt_after,
|
||||||
stream_subgraphs=subgraphs or stream is not None,
|
stream_subgraphs=subgraphs or stream is not None,
|
||||||
if_not_exists="create",
|
if_not_exists="create",
|
||||||
headers=_merge_tracing_headers(headers)
|
headers=(
|
||||||
if self.distributed_tracing
|
_merge_tracing_headers(headers) if self.distributed_tracing else headers
|
||||||
else headers,
|
),
|
||||||
|
params=params,
|
||||||
**kwargs,
|
**kwargs,
|
||||||
):
|
):
|
||||||
# split mode and ns
|
# split mode and ns
|
||||||
@@ -862,6 +920,7 @@ class RemoteGraph(PregelProtocol):
|
|||||||
interrupt_before: All | Sequence[str] | None = None,
|
interrupt_before: All | Sequence[str] | None = None,
|
||||||
interrupt_after: All | Sequence[str] | None = None,
|
interrupt_after: All | Sequence[str] | None = None,
|
||||||
headers: dict[str, str] | None = None,
|
headers: dict[str, str] | None = None,
|
||||||
|
params: QueryParamTypes | None = None,
|
||||||
**kwargs: Any,
|
**kwargs: Any,
|
||||||
) -> dict[str, Any] | Any:
|
) -> dict[str, Any] | Any:
|
||||||
"""Create a run, wait until it finishes and return the final state.
|
"""Create a run, wait until it finishes and return the final state.
|
||||||
@@ -884,6 +943,7 @@ class RemoteGraph(PregelProtocol):
|
|||||||
interrupt_after=interrupt_after,
|
interrupt_after=interrupt_after,
|
||||||
headers=headers,
|
headers=headers,
|
||||||
stream_mode="values",
|
stream_mode="values",
|
||||||
|
params=params,
|
||||||
**kwargs,
|
**kwargs,
|
||||||
):
|
):
|
||||||
pass
|
pass
|
||||||
@@ -900,6 +960,7 @@ class RemoteGraph(PregelProtocol):
|
|||||||
interrupt_before: All | Sequence[str] | None = None,
|
interrupt_before: All | Sequence[str] | None = None,
|
||||||
interrupt_after: All | Sequence[str] | None = None,
|
interrupt_after: All | Sequence[str] | None = None,
|
||||||
headers: dict[str, str] | None = None,
|
headers: dict[str, str] | None = None,
|
||||||
|
params: QueryParamTypes | None = None,
|
||||||
**kwargs: Any,
|
**kwargs: Any,
|
||||||
) -> dict[str, Any] | Any:
|
) -> dict[str, Any] | Any:
|
||||||
"""Create a run, wait until it finishes and return the final state.
|
"""Create a run, wait until it finishes and return the final state.
|
||||||
@@ -922,6 +983,7 @@ class RemoteGraph(PregelProtocol):
|
|||||||
interrupt_after=interrupt_after,
|
interrupt_after=interrupt_after,
|
||||||
headers=headers,
|
headers=headers,
|
||||||
stream_mode="values",
|
stream_mode="values",
|
||||||
|
params=params,
|
||||||
**kwargs,
|
**kwargs,
|
||||||
):
|
):
|
||||||
pass
|
pass
|
||||||
@@ -934,11 +996,11 @@ class RemoteGraph(PregelProtocol):
|
|||||||
def _merge_tracing_headers(headers: dict[str, str] | None) -> dict[str, str] | None:
|
def _merge_tracing_headers(headers: dict[str, str] | None) -> dict[str, str] | None:
|
||||||
if rt := ls.get_current_run_tree():
|
if rt := ls.get_current_run_tree():
|
||||||
tracing_headers = rt.to_headers()
|
tracing_headers = rt.to_headers()
|
||||||
baggage = tracing_headers.pop("baggage")
|
|
||||||
if headers:
|
if headers:
|
||||||
if "baggage" in headers:
|
if "baggage" in headers:
|
||||||
baggage = headers["baggage"] + "," + baggage
|
tracing_headers["baggage"] = (
|
||||||
tracing_headers["baggage"] = baggage
|
f"{headers['baggage']},{tracing_headers['baggage']}"
|
||||||
|
)
|
||||||
headers.update(tracing_headers)
|
headers.update(tracing_headers)
|
||||||
else:
|
else:
|
||||||
headers = tracing_headers
|
headers = tracing_headers
|
||||||
|
|||||||
@@ -507,6 +507,7 @@ def interrupt(value: Any) -> Any:
|
|||||||
# find previous resume values
|
# find previous resume values
|
||||||
if scratchpad.resume:
|
if scratchpad.resume:
|
||||||
if idx < len(scratchpad.resume):
|
if idx < len(scratchpad.resume):
|
||||||
|
conf[CONFIG_KEY_SEND]([(RESUME, scratchpad.resume)])
|
||||||
return scratchpad.resume[idx]
|
return scratchpad.resume[idx]
|
||||||
# find current resume value
|
# find current resume value
|
||||||
v = scratchpad.get_null_resume(True)
|
v = scratchpad.get_null_resume(True)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "langgraph"
|
name = "langgraph"
|
||||||
version = "0.6.4"
|
version = "0.6.6"
|
||||||
description = "Building stateful, multi-actor applications with LLMs"
|
description = "Building stateful, multi-actor applications with LLMs"
|
||||||
authors = []
|
authors = []
|
||||||
requires-python = ">=3.9"
|
requires-python = ">=3.9"
|
||||||
@@ -14,7 +14,7 @@ license-files = ['LICENSE']
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"langchain-core>=0.1",
|
"langchain-core>=0.1",
|
||||||
"langgraph-checkpoint>=2.1.0,<3.0.0",
|
"langgraph-checkpoint>=2.1.0,<3.0.0",
|
||||||
"langgraph-sdk>=0.2.0,<0.3.0",
|
"langgraph-sdk>=0.2.2,<0.3.0",
|
||||||
"langgraph-prebuilt>=0.6.0,<0.7.0",
|
"langgraph-prebuilt>=0.6.0,<0.7.0",
|
||||||
"xxhash>=3.5.0",
|
"xxhash>=3.5.0",
|
||||||
"pydantic>=2.7.4",
|
"pydantic>=2.7.4",
|
||||||
|
|||||||
@@ -0,0 +1,313 @@
|
|||||||
|
# serializer version: 1
|
||||||
|
# name: test_create_agent_diagram
|
||||||
|
'''
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
flowchart:
|
||||||
|
curve: linear
|
||||||
|
---
|
||||||
|
graph TD;
|
||||||
|
__start__([<p>__start__</p>]):::first
|
||||||
|
model_request(model_request)
|
||||||
|
tools(tools)
|
||||||
|
__end__([<p>__end__</p>]):::last
|
||||||
|
__start__ --> model_request;
|
||||||
|
model_request -.-> __end__;
|
||||||
|
model_request -.-> tools;
|
||||||
|
tools -.-> __end__;
|
||||||
|
tools -.-> model_request;
|
||||||
|
classDef default fill:#f2f0ff,line-height:1.2
|
||||||
|
classDef first fill-opacity:0
|
||||||
|
classDef last fill:#bfb6fc
|
||||||
|
|
||||||
|
'''
|
||||||
|
# ---
|
||||||
|
# name: test_create_agent_diagram.1
|
||||||
|
'''
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
flowchart:
|
||||||
|
curve: linear
|
||||||
|
---
|
||||||
|
graph TD;
|
||||||
|
__start__([<p>__start__</p>]):::first
|
||||||
|
model_request(model_request)
|
||||||
|
tools(tools)
|
||||||
|
NoopOne_before_model(NoopOne.before_model)
|
||||||
|
__end__([<p>__end__</p>]):::last
|
||||||
|
NoopOne_before_model --> model_request;
|
||||||
|
__start__ --> NoopOne_before_model;
|
||||||
|
model_request -.-> __end__;
|
||||||
|
model_request -.-> tools;
|
||||||
|
tools -.-> NoopOne_before_model;
|
||||||
|
tools -.-> __end__;
|
||||||
|
classDef default fill:#f2f0ff,line-height:1.2
|
||||||
|
classDef first fill-opacity:0
|
||||||
|
classDef last fill:#bfb6fc
|
||||||
|
|
||||||
|
'''
|
||||||
|
# ---
|
||||||
|
# name: test_create_agent_diagram.2
|
||||||
|
'''
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
flowchart:
|
||||||
|
curve: linear
|
||||||
|
---
|
||||||
|
graph TD;
|
||||||
|
__start__([<p>__start__</p>]):::first
|
||||||
|
model_request(model_request)
|
||||||
|
tools(tools)
|
||||||
|
NoopOne_before_model(NoopOne.before_model)
|
||||||
|
NoopTwo_before_model(NoopTwo.before_model)
|
||||||
|
__end__([<p>__end__</p>]):::last
|
||||||
|
NoopOne_before_model --> NoopTwo_before_model;
|
||||||
|
NoopTwo_before_model --> model_request;
|
||||||
|
__start__ --> NoopOne_before_model;
|
||||||
|
model_request -.-> __end__;
|
||||||
|
model_request -.-> tools;
|
||||||
|
tools -.-> NoopOne_before_model;
|
||||||
|
tools -.-> __end__;
|
||||||
|
classDef default fill:#f2f0ff,line-height:1.2
|
||||||
|
classDef first fill-opacity:0
|
||||||
|
classDef last fill:#bfb6fc
|
||||||
|
|
||||||
|
'''
|
||||||
|
# ---
|
||||||
|
# name: test_create_agent_diagram.3
|
||||||
|
'''
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
flowchart:
|
||||||
|
curve: linear
|
||||||
|
---
|
||||||
|
graph TD;
|
||||||
|
__start__([<p>__start__</p>]):::first
|
||||||
|
model_request(model_request)
|
||||||
|
tools(tools)
|
||||||
|
NoopOne_before_model(NoopOne.before_model)
|
||||||
|
NoopTwo_before_model(NoopTwo.before_model)
|
||||||
|
NoopThree_before_model(NoopThree.before_model)
|
||||||
|
__end__([<p>__end__</p>]):::last
|
||||||
|
NoopOne_before_model --> NoopTwo_before_model;
|
||||||
|
NoopThree_before_model --> model_request;
|
||||||
|
NoopTwo_before_model --> NoopThree_before_model;
|
||||||
|
__start__ --> NoopOne_before_model;
|
||||||
|
model_request -.-> __end__;
|
||||||
|
model_request -.-> tools;
|
||||||
|
tools -.-> NoopOne_before_model;
|
||||||
|
tools -.-> __end__;
|
||||||
|
classDef default fill:#f2f0ff,line-height:1.2
|
||||||
|
classDef first fill-opacity:0
|
||||||
|
classDef last fill:#bfb6fc
|
||||||
|
|
||||||
|
'''
|
||||||
|
# ---
|
||||||
|
# name: test_create_agent_diagram.4
|
||||||
|
'''
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
flowchart:
|
||||||
|
curve: linear
|
||||||
|
---
|
||||||
|
graph TD;
|
||||||
|
__start__([<p>__start__</p>]):::first
|
||||||
|
model_request(model_request)
|
||||||
|
tools(tools)
|
||||||
|
NoopFour_after_model(NoopFour.after_model)
|
||||||
|
__end__([<p>__end__</p>]):::last
|
||||||
|
NoopFour_after_model -.-> __end__;
|
||||||
|
NoopFour_after_model -.-> tools;
|
||||||
|
__start__ --> model_request;
|
||||||
|
model_request --> NoopFour_after_model;
|
||||||
|
tools -.-> __end__;
|
||||||
|
tools -.-> model_request;
|
||||||
|
classDef default fill:#f2f0ff,line-height:1.2
|
||||||
|
classDef first fill-opacity:0
|
||||||
|
classDef last fill:#bfb6fc
|
||||||
|
|
||||||
|
'''
|
||||||
|
# ---
|
||||||
|
# name: test_create_agent_diagram.5
|
||||||
|
'''
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
flowchart:
|
||||||
|
curve: linear
|
||||||
|
---
|
||||||
|
graph TD;
|
||||||
|
__start__([<p>__start__</p>]):::first
|
||||||
|
model_request(model_request)
|
||||||
|
tools(tools)
|
||||||
|
NoopFour_after_model(NoopFour.after_model)
|
||||||
|
NoopFive_after_model(NoopFive.after_model)
|
||||||
|
__end__([<p>__end__</p>]):::last
|
||||||
|
NoopFive_after_model --> NoopFour_after_model;
|
||||||
|
NoopFour_after_model -.-> __end__;
|
||||||
|
NoopFour_after_model -.-> tools;
|
||||||
|
__start__ --> model_request;
|
||||||
|
model_request --> NoopFive_after_model;
|
||||||
|
tools -.-> __end__;
|
||||||
|
tools -.-> model_request;
|
||||||
|
classDef default fill:#f2f0ff,line-height:1.2
|
||||||
|
classDef first fill-opacity:0
|
||||||
|
classDef last fill:#bfb6fc
|
||||||
|
|
||||||
|
'''
|
||||||
|
# ---
|
||||||
|
# name: test_create_agent_diagram.6
|
||||||
|
'''
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
flowchart:
|
||||||
|
curve: linear
|
||||||
|
---
|
||||||
|
graph TD;
|
||||||
|
__start__([<p>__start__</p>]):::first
|
||||||
|
model_request(model_request)
|
||||||
|
tools(tools)
|
||||||
|
NoopFour_after_model(NoopFour.after_model)
|
||||||
|
NoopFive_after_model(NoopFive.after_model)
|
||||||
|
NoopSix_after_model(NoopSix.after_model)
|
||||||
|
__end__([<p>__end__</p>]):::last
|
||||||
|
NoopFive_after_model --> NoopFour_after_model;
|
||||||
|
NoopFour_after_model -.-> __end__;
|
||||||
|
NoopFour_after_model -.-> tools;
|
||||||
|
NoopSix_after_model --> NoopFive_after_model;
|
||||||
|
__start__ --> model_request;
|
||||||
|
model_request --> NoopSix_after_model;
|
||||||
|
tools -.-> __end__;
|
||||||
|
tools -.-> model_request;
|
||||||
|
classDef default fill:#f2f0ff,line-height:1.2
|
||||||
|
classDef first fill-opacity:0
|
||||||
|
classDef last fill:#bfb6fc
|
||||||
|
|
||||||
|
'''
|
||||||
|
# ---
|
||||||
|
# name: test_create_agent_diagram.7
|
||||||
|
'''
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
flowchart:
|
||||||
|
curve: linear
|
||||||
|
---
|
||||||
|
graph TD;
|
||||||
|
__start__([<p>__start__</p>]):::first
|
||||||
|
model_request(model_request)
|
||||||
|
tools(tools)
|
||||||
|
NoopSeven_before_model(NoopSeven.before_model)
|
||||||
|
NoopSeven_after_model(NoopSeven.after_model)
|
||||||
|
__end__([<p>__end__</p>]):::last
|
||||||
|
NoopSeven_after_model -.-> __end__;
|
||||||
|
NoopSeven_after_model -.-> tools;
|
||||||
|
NoopSeven_before_model --> model_request;
|
||||||
|
__start__ --> NoopSeven_before_model;
|
||||||
|
model_request --> NoopSeven_after_model;
|
||||||
|
tools -.-> NoopSeven_before_model;
|
||||||
|
tools -.-> __end__;
|
||||||
|
classDef default fill:#f2f0ff,line-height:1.2
|
||||||
|
classDef first fill-opacity:0
|
||||||
|
classDef last fill:#bfb6fc
|
||||||
|
|
||||||
|
'''
|
||||||
|
# ---
|
||||||
|
# name: test_create_agent_diagram.8
|
||||||
|
'''
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
flowchart:
|
||||||
|
curve: linear
|
||||||
|
---
|
||||||
|
graph TD;
|
||||||
|
__start__([<p>__start__</p>]):::first
|
||||||
|
model_request(model_request)
|
||||||
|
tools(tools)
|
||||||
|
NoopSeven_before_model(NoopSeven.before_model)
|
||||||
|
NoopSeven_after_model(NoopSeven.after_model)
|
||||||
|
NoopEight_before_model(NoopEight.before_model)
|
||||||
|
NoopEight_after_model(NoopEight.after_model)
|
||||||
|
__end__([<p>__end__</p>]):::last
|
||||||
|
NoopEight_after_model --> NoopSeven_after_model;
|
||||||
|
NoopEight_before_model --> model_request;
|
||||||
|
NoopSeven_after_model -.-> __end__;
|
||||||
|
NoopSeven_after_model -.-> tools;
|
||||||
|
NoopSeven_before_model --> NoopEight_before_model;
|
||||||
|
__start__ --> NoopSeven_before_model;
|
||||||
|
model_request --> NoopEight_after_model;
|
||||||
|
tools -.-> NoopSeven_before_model;
|
||||||
|
tools -.-> __end__;
|
||||||
|
classDef default fill:#f2f0ff,line-height:1.2
|
||||||
|
classDef first fill-opacity:0
|
||||||
|
classDef last fill:#bfb6fc
|
||||||
|
|
||||||
|
'''
|
||||||
|
# ---
|
||||||
|
# name: test_create_agent_diagram.9
|
||||||
|
'''
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
flowchart:
|
||||||
|
curve: linear
|
||||||
|
---
|
||||||
|
graph TD;
|
||||||
|
__start__([<p>__start__</p>]):::first
|
||||||
|
model_request(model_request)
|
||||||
|
tools(tools)
|
||||||
|
NoopSeven_before_model(NoopSeven.before_model)
|
||||||
|
NoopSeven_after_model(NoopSeven.after_model)
|
||||||
|
NoopEight_before_model(NoopEight.before_model)
|
||||||
|
NoopEight_after_model(NoopEight.after_model)
|
||||||
|
NoopNine_before_model(NoopNine.before_model)
|
||||||
|
NoopNine_after_model(NoopNine.after_model)
|
||||||
|
__end__([<p>__end__</p>]):::last
|
||||||
|
NoopEight_after_model --> NoopSeven_after_model;
|
||||||
|
NoopEight_before_model --> NoopNine_before_model;
|
||||||
|
NoopNine_after_model --> NoopEight_after_model;
|
||||||
|
NoopNine_before_model --> model_request;
|
||||||
|
NoopSeven_after_model -.-> __end__;
|
||||||
|
NoopSeven_after_model -.-> tools;
|
||||||
|
NoopSeven_before_model --> NoopEight_before_model;
|
||||||
|
__start__ --> NoopSeven_before_model;
|
||||||
|
model_request --> NoopNine_after_model;
|
||||||
|
tools -.-> NoopSeven_before_model;
|
||||||
|
tools -.-> __end__;
|
||||||
|
classDef default fill:#f2f0ff,line-height:1.2
|
||||||
|
classDef first fill-opacity:0
|
||||||
|
classDef last fill:#bfb6fc
|
||||||
|
|
||||||
|
'''
|
||||||
|
# ---
|
||||||
|
# name: test_create_agent_jump[memory]
|
||||||
|
'''
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
flowchart:
|
||||||
|
curve: linear
|
||||||
|
---
|
||||||
|
graph TD;
|
||||||
|
__start__([<p>__start__</p>]):::first
|
||||||
|
model_request(model_request)
|
||||||
|
tools(tools)
|
||||||
|
NoopSeven_before_model(NoopSeven.before_model)
|
||||||
|
NoopSeven_after_model(NoopSeven.after_model)
|
||||||
|
NoopEight_before_model(NoopEight.before_model)
|
||||||
|
NoopEight_after_model(NoopEight.after_model)
|
||||||
|
__end__([<p>__end__</p>]):::last
|
||||||
|
NoopEight_after_model --> NoopSeven_after_model;
|
||||||
|
NoopEight_before_model -.-> NoopSeven_before_model;
|
||||||
|
NoopEight_before_model -.-> __end__;
|
||||||
|
NoopEight_before_model -.-> model_request;
|
||||||
|
NoopEight_before_model -.-> tools;
|
||||||
|
NoopSeven_after_model -.-> __end__;
|
||||||
|
NoopSeven_after_model -.-> tools;
|
||||||
|
NoopSeven_before_model --> NoopEight_before_model;
|
||||||
|
__start__ --> NoopSeven_before_model;
|
||||||
|
model_request --> NoopEight_after_model;
|
||||||
|
tools -.-> NoopSeven_before_model;
|
||||||
|
tools -.-> __end__;
|
||||||
|
classDef default fill:#f2f0ff,line-height:1.2
|
||||||
|
classDef first fill-opacity:0
|
||||||
|
classDef last fill:#bfb6fc
|
||||||
|
|
||||||
|
'''
|
||||||
|
# ---
|
||||||
@@ -69,7 +69,7 @@ def cache(request: pytest.FixtureRequest) -> Iterator[BaseCache]:
|
|||||||
elif request.param == "redis":
|
elif request.param == "redis":
|
||||||
# Get worker ID for parallel test isolation
|
# Get worker ID for parallel test isolation
|
||||||
worker_id = getattr(request.config, "workerinput", {}).get("workerid", "master")
|
worker_id = getattr(request.config, "workerinput", {}).get("workerid", "master")
|
||||||
|
|
||||||
redis_client = redis.Redis(
|
redis_client = redis.Redis(
|
||||||
host="localhost", port=6379, db=0, decode_responses=False
|
host="localhost", port=6379, db=0, decode_responses=False
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -0,0 +1,298 @@
|
|||||||
|
from langchain_core.messages import AIMessage, ToolCall
|
||||||
|
from syrupy import SnapshotAssertion
|
||||||
|
|
||||||
|
from langgraph.agent import create_agent
|
||||||
|
from langgraph.agent.types import AgentJump, AgentMiddleware
|
||||||
|
from langgraph.checkpoint.base import BaseCheckpointSaver
|
||||||
|
from langgraph.checkpoint.memory import InMemorySaver
|
||||||
|
from langgraph.constants import END
|
||||||
|
from tests.fake_chat import FakeChatModel
|
||||||
|
from tests.messages import _AnyIdToolMessage
|
||||||
|
|
||||||
|
|
||||||
|
def test_create_agent_diagram(
|
||||||
|
snapshot: SnapshotAssertion,
|
||||||
|
):
|
||||||
|
class NoopOne(AgentMiddleware):
|
||||||
|
def before_model(self, state):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class NoopTwo(AgentMiddleware):
|
||||||
|
def before_model(self, state):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class NoopThree(AgentMiddleware):
|
||||||
|
def before_model(self, state):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class NoopFour(AgentMiddleware):
|
||||||
|
def after_model(self, state):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class NoopFive(AgentMiddleware):
|
||||||
|
def after_model(self, state):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class NoopSix(AgentMiddleware):
|
||||||
|
def after_model(self, state):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class NoopSeven(AgentMiddleware):
|
||||||
|
def before_model(self, state):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def after_model(self, state):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class NoopEight(AgentMiddleware):
|
||||||
|
def before_model(self, state):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def after_model(self, state):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class NoopNine(AgentMiddleware):
|
||||||
|
def before_model(self, state):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def after_model(self, state):
|
||||||
|
pass
|
||||||
|
|
||||||
|
agent_zero = create_agent(
|
||||||
|
model=FakeChatModel(messages=[]),
|
||||||
|
tools=[],
|
||||||
|
system_prompt="You are a helpful assistant.",
|
||||||
|
)
|
||||||
|
|
||||||
|
assert agent_zero.compile().get_graph().draw_mermaid() == snapshot
|
||||||
|
|
||||||
|
agent_one = create_agent(
|
||||||
|
model=FakeChatModel(messages=[]),
|
||||||
|
tools=[],
|
||||||
|
system_prompt="You are a helpful assistant.",
|
||||||
|
middleware=[NoopOne()],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert agent_one.compile().get_graph().draw_mermaid() == snapshot
|
||||||
|
|
||||||
|
agent_two = create_agent(
|
||||||
|
model=FakeChatModel(messages=[]),
|
||||||
|
tools=[],
|
||||||
|
system_prompt="You are a helpful assistant.",
|
||||||
|
middleware=[NoopOne(), NoopTwo()],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert agent_two.compile().get_graph().draw_mermaid() == snapshot
|
||||||
|
|
||||||
|
agent_three = create_agent(
|
||||||
|
model=FakeChatModel(messages=[]),
|
||||||
|
tools=[],
|
||||||
|
system_prompt="You are a helpful assistant.",
|
||||||
|
middleware=[NoopOne(), NoopTwo(), NoopThree()],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert agent_three.compile().get_graph().draw_mermaid() == snapshot
|
||||||
|
|
||||||
|
agent_four = create_agent(
|
||||||
|
model=FakeChatModel(messages=[]),
|
||||||
|
tools=[],
|
||||||
|
system_prompt="You are a helpful assistant.",
|
||||||
|
middleware=[NoopFour()],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert agent_four.compile().get_graph().draw_mermaid() == snapshot
|
||||||
|
|
||||||
|
agent_five = create_agent(
|
||||||
|
model=FakeChatModel(messages=[]),
|
||||||
|
tools=[],
|
||||||
|
system_prompt="You are a helpful assistant.",
|
||||||
|
middleware=[NoopFour(), NoopFive()],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert agent_five.compile().get_graph().draw_mermaid() == snapshot
|
||||||
|
|
||||||
|
agent_six = create_agent(
|
||||||
|
model=FakeChatModel(messages=[]),
|
||||||
|
tools=[],
|
||||||
|
system_prompt="You are a helpful assistant.",
|
||||||
|
middleware=[NoopFour(), NoopFive(), NoopSix()],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert agent_six.compile().get_graph().draw_mermaid() == snapshot
|
||||||
|
|
||||||
|
agent_seven = create_agent(
|
||||||
|
model=FakeChatModel(messages=[]),
|
||||||
|
tools=[],
|
||||||
|
system_prompt="You are a helpful assistant.",
|
||||||
|
middleware=[NoopSeven()],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert agent_seven.compile().get_graph().draw_mermaid() == snapshot
|
||||||
|
|
||||||
|
agent_eight = create_agent(
|
||||||
|
model=FakeChatModel(messages=[]),
|
||||||
|
tools=[],
|
||||||
|
system_prompt="You are a helpful assistant.",
|
||||||
|
middleware=[NoopSeven(), NoopEight()],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert agent_eight.compile().get_graph().draw_mermaid() == snapshot
|
||||||
|
|
||||||
|
agent_nine = create_agent(
|
||||||
|
model=FakeChatModel(messages=[]),
|
||||||
|
tools=[],
|
||||||
|
system_prompt="You are a helpful assistant.",
|
||||||
|
middleware=[NoopSeven(), NoopEight(), NoopNine()],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert agent_nine.compile().get_graph().draw_mermaid() == snapshot
|
||||||
|
|
||||||
|
|
||||||
|
def test_create_agent_invoke(
|
||||||
|
snapshot: SnapshotAssertion,
|
||||||
|
sync_checkpointer: BaseCheckpointSaver,
|
||||||
|
):
|
||||||
|
calls = []
|
||||||
|
|
||||||
|
class NoopSeven(AgentMiddleware):
|
||||||
|
def before_model(self, state):
|
||||||
|
calls.append("NoopSeven.before_model")
|
||||||
|
|
||||||
|
def modify_model_request(self, request, state):
|
||||||
|
calls.append("NoopSeven.modify_model_request")
|
||||||
|
return request
|
||||||
|
|
||||||
|
def after_model(self, state):
|
||||||
|
calls.append("NoopSeven.after_model")
|
||||||
|
|
||||||
|
class NoopEight(AgentMiddleware):
|
||||||
|
def before_model(self, state):
|
||||||
|
calls.append("NoopEight.before_model")
|
||||||
|
|
||||||
|
def modify_model_request(self, request, state):
|
||||||
|
calls.append("NoopEight.modify_model_request")
|
||||||
|
return request
|
||||||
|
|
||||||
|
def after_model(self, state):
|
||||||
|
calls.append("NoopEight.after_model")
|
||||||
|
|
||||||
|
def my_tool(input: str) -> str:
|
||||||
|
"""A great tool"""
|
||||||
|
calls.append("my_tool")
|
||||||
|
return input.upper()
|
||||||
|
|
||||||
|
agent_one = create_agent(
|
||||||
|
model=FakeChatModel(
|
||||||
|
messages=[
|
||||||
|
AIMessage(
|
||||||
|
"",
|
||||||
|
id="ai1",
|
||||||
|
tool_calls=[ToolCall(id="1", name="my_tool", args={"input": "yo"})],
|
||||||
|
),
|
||||||
|
AIMessage(id="ai2", content="Hello, how can I assist you today?"),
|
||||||
|
]
|
||||||
|
),
|
||||||
|
tools=[my_tool],
|
||||||
|
system_prompt="You are a helpful assistant.",
|
||||||
|
middleware=[NoopSeven(), NoopEight()],
|
||||||
|
).compile(checkpointer=sync_checkpointer)
|
||||||
|
|
||||||
|
thread1 = {"configurable": {"thread_id": "1"}}
|
||||||
|
assert agent_one.invoke({"messages": []}, thread1) == {
|
||||||
|
"messages": [
|
||||||
|
AIMessage(
|
||||||
|
content="",
|
||||||
|
additional_kwargs={},
|
||||||
|
response_metadata={},
|
||||||
|
id="ai1",
|
||||||
|
tool_calls=[
|
||||||
|
{
|
||||||
|
"name": "my_tool",
|
||||||
|
"args": {"input": "yo"},
|
||||||
|
"id": "1",
|
||||||
|
"type": "tool_call",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
),
|
||||||
|
_AnyIdToolMessage(content="YO", name="my_tool", tool_call_id="1"),
|
||||||
|
AIMessage(
|
||||||
|
content="Hello, how can I assist you today?",
|
||||||
|
additional_kwargs={},
|
||||||
|
response_metadata={},
|
||||||
|
id="ai2",
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}
|
||||||
|
assert calls == [
|
||||||
|
"NoopSeven.before_model",
|
||||||
|
"NoopEight.before_model",
|
||||||
|
"NoopSeven.modify_model_request",
|
||||||
|
"NoopEight.modify_model_request",
|
||||||
|
"NoopEight.after_model",
|
||||||
|
"NoopSeven.after_model",
|
||||||
|
"my_tool",
|
||||||
|
"NoopSeven.before_model",
|
||||||
|
"NoopEight.before_model",
|
||||||
|
"NoopSeven.modify_model_request",
|
||||||
|
"NoopEight.modify_model_request",
|
||||||
|
"NoopEight.after_model",
|
||||||
|
"NoopSeven.after_model",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_create_agent_jump(
|
||||||
|
snapshot: SnapshotAssertion,
|
||||||
|
sync_checkpointer: BaseCheckpointSaver,
|
||||||
|
):
|
||||||
|
calls = []
|
||||||
|
|
||||||
|
class NoopSeven(AgentMiddleware):
|
||||||
|
def before_model(self, state):
|
||||||
|
calls.append("NoopSeven.before_model")
|
||||||
|
|
||||||
|
def modify_model_request(self, request, state):
|
||||||
|
calls.append("NoopSeven.modify_model_request")
|
||||||
|
return request
|
||||||
|
|
||||||
|
def after_model(self, state):
|
||||||
|
calls.append("NoopSeven.after_model")
|
||||||
|
|
||||||
|
class NoopEight(AgentMiddleware):
|
||||||
|
def before_model(self, state) -> AgentJump:
|
||||||
|
calls.append("NoopEight.before_model")
|
||||||
|
return {"jump_to": END}
|
||||||
|
|
||||||
|
def modify_model_request(self, request, state):
|
||||||
|
calls.append("NoopEight.modify_model_request")
|
||||||
|
return request
|
||||||
|
|
||||||
|
def after_model(self, state):
|
||||||
|
calls.append("NoopEight.after_model")
|
||||||
|
|
||||||
|
def my_tool(input: str) -> str:
|
||||||
|
"""A great tool"""
|
||||||
|
calls.append("my_tool")
|
||||||
|
return input.upper()
|
||||||
|
|
||||||
|
agent_one = create_agent(
|
||||||
|
model=FakeChatModel(
|
||||||
|
messages=[
|
||||||
|
AIMessage(
|
||||||
|
"",
|
||||||
|
id="ai1",
|
||||||
|
tool_calls=[ToolCall(id="1", name="my_tool", args={"input": "yo"})],
|
||||||
|
),
|
||||||
|
AIMessage(id="ai2", content="Hello, how can I assist you today?"),
|
||||||
|
]
|
||||||
|
),
|
||||||
|
tools=[my_tool],
|
||||||
|
system_prompt="You are a helpful assistant.",
|
||||||
|
middleware=[NoopSeven(), NoopEight()],
|
||||||
|
).compile(checkpointer=sync_checkpointer)
|
||||||
|
|
||||||
|
if isinstance(sync_checkpointer, InMemorySaver):
|
||||||
|
assert agent_one.get_graph().draw_mermaid() == snapshot
|
||||||
|
|
||||||
|
thread1 = {"configurable": {"thread_id": "1"}}
|
||||||
|
assert agent_one.invoke({"messages": []}, thread1) == {"messages": []}
|
||||||
|
assert calls == ["NoopSeven.before_model", "NoopEight.before_model"]
|
||||||
@@ -4805,7 +4805,10 @@ def test_interrupt_subgraph(sync_checkpointer: BaseCheckpointSaver):
|
|||||||
assert graph.invoke(Command(resume="bar"), thread1)
|
assert graph.invoke(Command(resume="bar"), thread1)
|
||||||
|
|
||||||
|
|
||||||
def test_interrupt_multiple(sync_checkpointer: BaseCheckpointSaver):
|
@pytest.mark.parametrize("resume_style", ["null", "map"])
|
||||||
|
def test_interrupt_multiple(
|
||||||
|
sync_checkpointer: BaseCheckpointSaver, resume_style: Literal["null", "map"]
|
||||||
|
):
|
||||||
class State(TypedDict):
|
class State(TypedDict):
|
||||||
my_key: Annotated[str, operator.add]
|
my_key: Annotated[str, operator.add]
|
||||||
|
|
||||||
@@ -4821,7 +4824,8 @@ def test_interrupt_multiple(sync_checkpointer: BaseCheckpointSaver):
|
|||||||
graph = builder.compile(checkpointer=sync_checkpointer)
|
graph = builder.compile(checkpointer=sync_checkpointer)
|
||||||
thread1 = {"configurable": {"thread_id": "1"}}
|
thread1 = {"configurable": {"thread_id": "1"}}
|
||||||
|
|
||||||
assert [e for e in graph.stream({"my_key": "DE", "market": "DE"}, thread1)] == [
|
result = [e for e in graph.stream({"my_key": "DE", "market": "DE"}, thread1)]
|
||||||
|
assert result == [
|
||||||
{
|
{
|
||||||
"__interrupt__": (
|
"__interrupt__": (
|
||||||
Interrupt(
|
Interrupt(
|
||||||
@@ -4832,12 +4836,19 @@ def test_interrupt_multiple(sync_checkpointer: BaseCheckpointSaver):
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
assert [
|
result = [
|
||||||
event
|
event
|
||||||
for event in graph.stream(
|
for event in graph.stream(
|
||||||
Command(resume="answer 1", update={"my_key": " foofoo "}), thread1
|
Command(
|
||||||
|
resume="answer 1"
|
||||||
|
if resume_style == "null"
|
||||||
|
else {result[0]["__interrupt__"][0].id: "answer 1"},
|
||||||
|
update={"my_key": " foofoo "},
|
||||||
|
),
|
||||||
|
thread1,
|
||||||
)
|
)
|
||||||
] == [
|
]
|
||||||
|
assert result == [
|
||||||
{
|
{
|
||||||
"__interrupt__": (
|
"__interrupt__": (
|
||||||
Interrupt(
|
Interrupt(
|
||||||
@@ -4851,7 +4862,13 @@ def test_interrupt_multiple(sync_checkpointer: BaseCheckpointSaver):
|
|||||||
assert [
|
assert [
|
||||||
event
|
event
|
||||||
for event in graph.stream(
|
for event in graph.stream(
|
||||||
Command(resume="answer 2"), thread1, stream_mode="values"
|
Command(
|
||||||
|
resume="answer 2"
|
||||||
|
if resume_style == "null"
|
||||||
|
else {result[0]["__interrupt__"][0].id: "answer 2"}
|
||||||
|
),
|
||||||
|
thread1,
|
||||||
|
stream_mode="values",
|
||||||
)
|
)
|
||||||
] == [
|
] == [
|
||||||
{"my_key": "DE foofoo "},
|
{"my_key": "DE foofoo "},
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
from typing import Annotated, Union
|
from typing import Annotated, Optional, Union
|
||||||
from unittest.mock import AsyncMock, MagicMock
|
from unittest.mock import AsyncMock, MagicMock
|
||||||
|
|
||||||
import langsmith as ls
|
import langsmith as ls
|
||||||
@@ -1183,7 +1183,10 @@ async def test_remote_graph_stream_messages_tuple(
|
|||||||
@pytest.mark.anyio
|
@pytest.mark.anyio
|
||||||
@pytest.mark.parametrize("distributed_tracing", [False, True])
|
@pytest.mark.parametrize("distributed_tracing", [False, True])
|
||||||
@pytest.mark.parametrize("stream", [False, True])
|
@pytest.mark.parametrize("stream", [False, True])
|
||||||
async def test_include_headers(distributed_tracing: bool, stream: bool):
|
@pytest.mark.parametrize("headers", [None, {"foo": "bar"}])
|
||||||
|
async def test_include_headers(
|
||||||
|
distributed_tracing: bool, stream: bool, headers: Optional[dict[str, str]]
|
||||||
|
):
|
||||||
mock_async_client = MagicMock()
|
mock_async_client = MagicMock()
|
||||||
async_iter = MagicMock()
|
async_iter = MagicMock()
|
||||||
return_value = [
|
return_value = [
|
||||||
@@ -1213,7 +1216,7 @@ async def test_include_headers(distributed_tracing: bool, stream: bool):
|
|||||||
async for _ in remote_pregel.astream(
|
async for _ in remote_pregel.astream(
|
||||||
{"input": {"messages": [{"type": "human", "content": "hello"}]}},
|
{"input": {"messages": [{"type": "human", "content": "hello"}]}},
|
||||||
config,
|
config,
|
||||||
headers={"foo": "bar"},
|
headers=headers,
|
||||||
):
|
):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -1221,12 +1224,14 @@ async def test_include_headers(distributed_tracing: bool, stream: bool):
|
|||||||
await remote_pregel.ainvoke(
|
await remote_pregel.ainvoke(
|
||||||
{"input": {"messages": [{"type": "human", "content": "hello"}]}},
|
{"input": {"messages": [{"type": "human", "content": "hello"}]}},
|
||||||
config,
|
config,
|
||||||
headers={"foo": "bar"},
|
headers=headers,
|
||||||
)
|
)
|
||||||
expected = {"foo": "bar"}
|
expected = headers.copy() if headers else None
|
||||||
if distributed_tracing:
|
if distributed_tracing:
|
||||||
|
if expected is None:
|
||||||
|
expected = {}
|
||||||
expected["langsmith-trace"] = AnyStr()
|
expected["langsmith-trace"] = AnyStr()
|
||||||
expected["baggage"] = AnyStr()
|
expected["baggage"] = AnyStr("langsmith-metadata=")
|
||||||
|
|
||||||
assert astream_mock.call_args.kwargs["headers"] == expected
|
assert astream_mock.call_args.kwargs["headers"] == expected
|
||||||
stream_mock.assert_not_called()
|
stream_mock.assert_not_called()
|
||||||
@@ -1237,7 +1242,7 @@ async def test_include_headers(distributed_tracing: bool, stream: bool):
|
|||||||
for _ in remote_pregel.stream(
|
for _ in remote_pregel.stream(
|
||||||
{"input": {"messages": [{"type": "human", "content": "hello"}]}},
|
{"input": {"messages": [{"type": "human", "content": "hello"}]}},
|
||||||
config,
|
config,
|
||||||
headers={"foo": "bar"},
|
headers=headers,
|
||||||
):
|
):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -1245,6 +1250,6 @@ async def test_include_headers(distributed_tracing: bool, stream: bool):
|
|||||||
remote_pregel.invoke(
|
remote_pregel.invoke(
|
||||||
{"input": {"messages": [{"type": "human", "content": "hello"}]}},
|
{"input": {"messages": [{"type": "human", "content": "hello"}]}},
|
||||||
config,
|
config,
|
||||||
headers={"foo": "bar"},
|
headers=headers,
|
||||||
)
|
)
|
||||||
assert stream_mock.call_args.kwargs["headers"] == expected
|
assert stream_mock.call_args.kwargs["headers"] == expected
|
||||||
|
|||||||
Generated
+828
-684
File diff suppressed because it is too large
Load Diff
@@ -38,6 +38,7 @@ from typing_extensions import Annotated, NotRequired, TypedDict
|
|||||||
|
|
||||||
from langgraph._internal._runnable import RunnableCallable, RunnableLike
|
from langgraph._internal._runnable import RunnableCallable, RunnableLike
|
||||||
from langgraph._internal._typing import MISSING
|
from langgraph._internal._typing import MISSING
|
||||||
|
from langgraph.agent.types import AgentMiddleware
|
||||||
from langgraph.errors import ErrorCode, create_error_message
|
from langgraph.errors import ErrorCode, create_error_message
|
||||||
from langgraph.graph import END, StateGraph
|
from langgraph.graph import END, StateGraph
|
||||||
from langgraph.graph.message import add_messages
|
from langgraph.graph.message import add_messages
|
||||||
@@ -261,6 +262,7 @@ def create_react_agent(
|
|||||||
],
|
],
|
||||||
tools: Union[Sequence[Union[BaseTool, Callable, dict[str, Any]]], ToolNode],
|
tools: Union[Sequence[Union[BaseTool, Callable, dict[str, Any]]], ToolNode],
|
||||||
*,
|
*,
|
||||||
|
middleware: Sequence[AgentMiddleware] = (),
|
||||||
prompt: Optional[Prompt] = None,
|
prompt: Optional[Prompt] = None,
|
||||||
response_format: Optional[
|
response_format: Optional[
|
||||||
Union[StructuredResponseSchema, tuple[str, StructuredResponseSchema]]
|
Union[StructuredResponseSchema, tuple[str, StructuredResponseSchema]]
|
||||||
@@ -462,6 +464,32 @@ def create_react_agent(
|
|||||||
print(chunk)
|
print(chunk)
|
||||||
```
|
```
|
||||||
"""
|
"""
|
||||||
|
if middleware:
|
||||||
|
assert isinstance(model, str | BaseChatModel)
|
||||||
|
assert isinstance(prompt, str | None)
|
||||||
|
assert not isinstance(response_format, tuple)
|
||||||
|
assert pre_model_hook is None
|
||||||
|
assert post_model_hook is None
|
||||||
|
assert state_schema is None
|
||||||
|
|
||||||
|
from langgraph.agent import create_agent
|
||||||
|
|
||||||
|
return create_agent(
|
||||||
|
model=model,
|
||||||
|
tools=tools,
|
||||||
|
system_prompt=prompt,
|
||||||
|
middleware=middleware,
|
||||||
|
response_format=response_format,
|
||||||
|
context_schema=context_schema,
|
||||||
|
).compile(
|
||||||
|
checkpointer=checkpointer,
|
||||||
|
store=store,
|
||||||
|
name=name,
|
||||||
|
interrupt_after=interrupt_after,
|
||||||
|
interrupt_before=interrupt_before,
|
||||||
|
debug=debug,
|
||||||
|
)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
config_schema := deprecated_kwargs.pop("config_schema", MISSING)
|
config_schema := deprecated_kwargs.pop("config_schema", MISSING)
|
||||||
) is not MISSING:
|
) is not MISSING:
|
||||||
|
|||||||
Generated
+1
-2
@@ -316,7 +316,7 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "langgraph"
|
name = "langgraph"
|
||||||
version = "0.6.4"
|
version = "0.6.6"
|
||||||
source = { editable = "../langgraph" }
|
source = { editable = "../langgraph" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "langchain-core" },
|
{ name = "langchain-core" },
|
||||||
@@ -509,7 +509,6 @@ dev = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "langgraph-sdk"
|
name = "langgraph-sdk"
|
||||||
version = "0.2.0"
|
|
||||||
source = { editable = "../sdk-py" }
|
source = { editable = "../sdk-py" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "httpx" },
|
{ name = "httpx" },
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
.PHONY: lint format
|
.PHONY: lint format test
|
||||||
|
|
||||||
test:
|
test:
|
||||||
echo "No tests to run"
|
uv run pytest tests
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# LINTING AND FORMATTING
|
# LINTING AND FORMATTING
|
||||||
@@ -17,7 +17,7 @@ lint lint_diff:
|
|||||||
uv run ruff check .
|
uv run ruff check .
|
||||||
[ "$(PYTHON_FILES)" = "" ] || uv run ruff format $(PYTHON_FILES) --diff
|
[ "$(PYTHON_FILES)" = "" ] || uv run ruff format $(PYTHON_FILES) --diff
|
||||||
[ "$(PYTHON_FILES)" = "" ] || uv run ruff check --select I $(PYTHON_FILES)
|
[ "$(PYTHON_FILES)" = "" ] || uv run ruff check --select I $(PYTHON_FILES)
|
||||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) || uv run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
uvx ty check .
|
||||||
|
|
||||||
format format_diff:
|
format format_diff:
|
||||||
uv run ruff check --select I --fix $(PYTHON_FILES)
|
uv run ruff check --select I --fix $(PYTHON_FILES)
|
||||||
|
|||||||
@@ -1,11 +1,6 @@
|
|||||||
from langgraph_sdk.auth import Auth
|
from langgraph_sdk.auth import Auth
|
||||||
from langgraph_sdk.client import get_client, get_sync_client
|
from langgraph_sdk.client import get_client, get_sync_client
|
||||||
|
|
||||||
try:
|
__version__ = "0.2.3"
|
||||||
from importlib import metadata
|
|
||||||
|
|
||||||
__version__ = metadata.version(__package__)
|
|
||||||
except metadata.PackageNotFoundError:
|
|
||||||
__version__ = "unknown"
|
|
||||||
|
|
||||||
__all__ = ["Auth", "get_client", "get_sync_client"]
|
__all__ = ["Auth", "get_client", "get_sync_client"]
|
||||||
|
|||||||
@@ -385,6 +385,8 @@ class _ResourceOn(typing.Generic[VCreate, VRead, VUpdate, VDelete, VSearch]):
|
|||||||
_register_handler(self.auth, self.resource, "*", handler),
|
_register_handler(self.auth, self.resource, "*", handler),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Accept keyword-only parameters for future filtering behavior; referenced to satisfy linters.
|
||||||
|
_ = resources, actions
|
||||||
return decorator
|
return decorator
|
||||||
|
|
||||||
|
|
||||||
@@ -701,7 +703,7 @@ def _validate_handler(fn: Callable[..., typing.Any]) -> None:
|
|||||||
"""
|
"""
|
||||||
if not inspect.iscoroutinefunction(fn):
|
if not inspect.iscoroutinefunction(fn):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"Auth handler '{fn.__name__}' must be an async function. "
|
f"Auth handler '{getattr(fn, '__name__', fn)}' must be an async function. "
|
||||||
"Add 'async' before 'def' to make it asynchronous and ensure"
|
"Add 'async' before 'def' to make it asynchronous and ensure"
|
||||||
" any IO operations are non-blocking."
|
" any IO operations are non-blocking."
|
||||||
)
|
)
|
||||||
@@ -709,18 +711,20 @@ def _validate_handler(fn: Callable[..., typing.Any]) -> None:
|
|||||||
sig = inspect.signature(fn)
|
sig = inspect.signature(fn)
|
||||||
if "ctx" not in sig.parameters:
|
if "ctx" not in sig.parameters:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"Auth handler '{fn.__name__}' must have a 'ctx: AuthContext' parameter. "
|
f"Auth handler '{getattr(fn, '__name__', fn)}' must have a 'ctx: AuthContext' parameter. "
|
||||||
"Update the function signature to include this required parameter."
|
"Update the function signature to include this required parameter."
|
||||||
)
|
)
|
||||||
if "value" not in sig.parameters:
|
if "value" not in sig.parameters:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"Auth handler '{fn.__name__}' must have a 'value' parameter. "
|
f"Auth handler '{getattr(fn, '__name__', fn)}' must have a 'value' parameter. "
|
||||||
" The value contains the mutable data being sent to the endpoint."
|
" The value contains the mutable data being sent to the endpoint."
|
||||||
"Update the function signature to include this required parameter."
|
"Update the function signature to include this required parameter."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def is_studio_user(user: types.MinimalUser | types.User | types.UserDict) -> bool:
|
def is_studio_user(
|
||||||
|
user: types.MinimalUser | types.BaseUser | types.MinimalUserDict,
|
||||||
|
) -> bool:
|
||||||
return (
|
return (
|
||||||
isinstance(user, types.StudioUser)
|
isinstance(user, types.StudioUser)
|
||||||
or isinstance(user, dict)
|
or isinstance(user, dict)
|
||||||
|
|||||||
+853
-257
File diff suppressed because it is too large
Load Diff
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from collections.abc import Sequence
|
from collections.abc import Mapping, Sequence
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import (
|
from typing import (
|
||||||
Any,
|
Any,
|
||||||
@@ -10,6 +10,7 @@ from typing import (
|
|||||||
NamedTuple,
|
NamedTuple,
|
||||||
Optional,
|
Optional,
|
||||||
TypedDict,
|
TypedDict,
|
||||||
|
Union,
|
||||||
)
|
)
|
||||||
|
|
||||||
from typing_extensions import TypeAlias
|
from typing_extensions import TypeAlias
|
||||||
@@ -348,6 +349,72 @@ class Cron(TypedDict):
|
|||||||
"""The metadata of the cron."""
|
"""The metadata of the cron."""
|
||||||
|
|
||||||
|
|
||||||
|
# Select field aliases for client-side typing of `select` parameters.
|
||||||
|
# These mirror the server's allowed field sets.
|
||||||
|
|
||||||
|
AssistantSelectField = Literal[
|
||||||
|
"assistant_id",
|
||||||
|
"graph_id",
|
||||||
|
"name",
|
||||||
|
"description",
|
||||||
|
"config",
|
||||||
|
"context",
|
||||||
|
"created_at",
|
||||||
|
"updated_at",
|
||||||
|
"metadata",
|
||||||
|
"version",
|
||||||
|
]
|
||||||
|
|
||||||
|
ThreadSelectField = Literal[
|
||||||
|
"thread_id",
|
||||||
|
"created_at",
|
||||||
|
"updated_at",
|
||||||
|
"metadata",
|
||||||
|
"config",
|
||||||
|
"context",
|
||||||
|
"status",
|
||||||
|
"values",
|
||||||
|
"interrupts",
|
||||||
|
]
|
||||||
|
|
||||||
|
RunSelectField = Literal[
|
||||||
|
"run_id",
|
||||||
|
"thread_id",
|
||||||
|
"assistant_id",
|
||||||
|
"created_at",
|
||||||
|
"updated_at",
|
||||||
|
"status",
|
||||||
|
"metadata",
|
||||||
|
"kwargs",
|
||||||
|
"multitask_strategy",
|
||||||
|
]
|
||||||
|
|
||||||
|
CronSelectField = Literal[
|
||||||
|
"cron_id",
|
||||||
|
"assistant_id",
|
||||||
|
"thread_id",
|
||||||
|
"end_time",
|
||||||
|
"schedule",
|
||||||
|
"created_at",
|
||||||
|
"updated_at",
|
||||||
|
"user_id",
|
||||||
|
"payload",
|
||||||
|
"next_run_date",
|
||||||
|
"metadata",
|
||||||
|
"now",
|
||||||
|
]
|
||||||
|
|
||||||
|
PrimitiveData = Optional[Union[str, int, float, bool]]
|
||||||
|
|
||||||
|
QueryParamTypes = Union[
|
||||||
|
Mapping[str, Union[PrimitiveData, Sequence[PrimitiveData]]],
|
||||||
|
list[tuple[str, PrimitiveData]],
|
||||||
|
tuple[tuple[str, PrimitiveData], ...],
|
||||||
|
str,
|
||||||
|
bytes,
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
class RunCreate(TypedDict):
|
class RunCreate(TypedDict):
|
||||||
"""Defines the parameters for initiating a background run."""
|
"""Defines the parameters for initiating a background run."""
|
||||||
|
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ class SSEDecoder:
|
|||||||
|
|
||||||
sse = StreamPart(
|
sse = StreamPart(
|
||||||
event=self._event,
|
event=self._event,
|
||||||
data=orjson.loads(self._data) if self._data else None,
|
data=orjson.loads(self._data) if self._data else None, # type: ignore[invalid-argument-type]
|
||||||
)
|
)
|
||||||
|
|
||||||
# NOTE: as per the SSE spec, do not reset last_event_id.
|
# NOTE: as per the SSE spec, do not reset last_event_id.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "langgraph-sdk"
|
name = "langgraph-sdk"
|
||||||
version = "0.2.0"
|
dynamic = ["version"]
|
||||||
description = "SDK for interacting with LangGraph API"
|
description = "SDK for interacting with LangGraph API"
|
||||||
authors = []
|
authors = []
|
||||||
requires-python = ">=3.9"
|
requires-python = ">=3.9"
|
||||||
@@ -16,6 +16,9 @@ dependencies = [
|
|||||||
"orjson>=3.10.1",
|
"orjson>=3.10.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[tool.hatch.version]
|
||||||
|
path = "langgraph_sdk/__init__.py"
|
||||||
|
|
||||||
[project.urls]
|
[project.urls]
|
||||||
Repository = "https://www.github.com/langchain-ai/langgraph"
|
Repository = "https://www.github.com/langchain-ai/langgraph"
|
||||||
|
|
||||||
@@ -47,5 +50,6 @@ lint.select = [
|
|||||||
"UP", # pyupgrade
|
"UP", # pyupgrade
|
||||||
"B", # flake8-bugbear
|
"B", # flake8-bugbear
|
||||||
"I", # isort
|
"I", # isort
|
||||||
|
"ARG", # flake8-unused-arguments
|
||||||
]
|
]
|
||||||
lint.ignore = ["E501", "B008"]
|
lint.ignore = ["E501", "B008"]
|
||||||
|
|||||||
@@ -0,0 +1,120 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import inspect
|
||||||
|
import re
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from langgraph_sdk.client import (
|
||||||
|
AssistantsClient,
|
||||||
|
CronClient,
|
||||||
|
RunsClient,
|
||||||
|
StoreClient,
|
||||||
|
SyncAssistantsClient,
|
||||||
|
SyncCronClient,
|
||||||
|
SyncRunsClient,
|
||||||
|
SyncStoreClient,
|
||||||
|
SyncThreadsClient,
|
||||||
|
ThreadsClient,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _public_methods(cls) -> dict[str, object]:
|
||||||
|
methods: dict[str, object] = {}
|
||||||
|
# Use the raw class dict to avoid runtime wrappers from plugins/decorators
|
||||||
|
for name, member in cls.__dict__.items():
|
||||||
|
if name.startswith("_"):
|
||||||
|
continue
|
||||||
|
if inspect.isfunction(member):
|
||||||
|
methods[name] = member
|
||||||
|
return methods
|
||||||
|
|
||||||
|
|
||||||
|
def _strip_self(sig: inspect.Signature) -> inspect.Signature:
|
||||||
|
params = list(sig.parameters.values())
|
||||||
|
if params and params[0].name == "self":
|
||||||
|
params = params[1:]
|
||||||
|
return sig.replace(parameters=params)
|
||||||
|
|
||||||
|
|
||||||
|
def _normalize_return_annotation(ann: object) -> str:
|
||||||
|
s = str(ann)
|
||||||
|
s = re.sub(r"\s+", "", s)
|
||||||
|
s = s.replace("typing.", "").replace("collections.abc.", "")
|
||||||
|
s = re.sub(r"AsyncGenerator\[([^,\]]+)(?:,[^\]]*)?\]", r"Iterator[\1]", s)
|
||||||
|
s = re.sub(r"Generator\[([^,\]]+)(?:,[^\]]*)?\]", r"Iterator[\1]", s)
|
||||||
|
s = re.sub(r"AsyncIterator\[(.+)\]", r"Iterator[\1]", s)
|
||||||
|
s = re.sub(r"AsyncIterable\[(.+)\]", r"Iterable[\1]", s)
|
||||||
|
return s
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"async_cls,sync_cls",
|
||||||
|
[
|
||||||
|
(AssistantsClient, SyncAssistantsClient),
|
||||||
|
(ThreadsClient, SyncThreadsClient),
|
||||||
|
(RunsClient, SyncRunsClient),
|
||||||
|
(CronClient, SyncCronClient),
|
||||||
|
(StoreClient, SyncStoreClient),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_sync_api_matches_async(async_cls, sync_cls):
|
||||||
|
async_methods = _public_methods(async_cls)
|
||||||
|
sync_methods = _public_methods(sync_cls)
|
||||||
|
|
||||||
|
# Method name parity
|
||||||
|
assert set(sync_methods.keys()) == set(async_methods.keys()), (
|
||||||
|
f"Method sets differ: async-only={set(async_methods) - set(sync_methods)}, sync-only={set(sync_methods) - set(async_methods)}"
|
||||||
|
)
|
||||||
|
|
||||||
|
for name, async_fn in async_methods.items():
|
||||||
|
sync_fn = sync_methods[name]
|
||||||
|
|
||||||
|
# Use inspect.signature for parameter names (robust across versions)
|
||||||
|
async_sig = _strip_self(inspect.signature(async_fn))
|
||||||
|
sync_sig = _strip_self(inspect.signature(sync_fn))
|
||||||
|
|
||||||
|
a_names = list(async_sig.parameters.keys())
|
||||||
|
s_names = list(sync_sig.parameters.keys())
|
||||||
|
|
||||||
|
assert set(a_names) == set(s_names), (
|
||||||
|
f"Parameter names differ for {async_cls.__name__}.{name}: "
|
||||||
|
f"async={a_names}, sync={s_names}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Compare default presence and parameter kinds (with some tolerance)
|
||||||
|
a_params = async_sig.parameters
|
||||||
|
s_params = sync_sig.parameters
|
||||||
|
|
||||||
|
def kinds_compatible(
|
||||||
|
akind: inspect._ParameterKind, skind: inspect._ParameterKind
|
||||||
|
) -> bool:
|
||||||
|
if akind == skind:
|
||||||
|
return True
|
||||||
|
return {
|
||||||
|
inspect.Parameter.KEYWORD_ONLY,
|
||||||
|
inspect.Parameter.POSITIONAL_OR_KEYWORD,
|
||||||
|
} == {akind, skind}
|
||||||
|
|
||||||
|
for pname in set(a_names) & set(s_names):
|
||||||
|
apar = a_params[pname]
|
||||||
|
spar = s_params[pname]
|
||||||
|
assert kinds_compatible(apar.kind, spar.kind), (
|
||||||
|
f"Parameter kind mismatch for {async_cls.__name__}.{name}.{pname}: "
|
||||||
|
f"async={apar.kind}, sync={spar.kind}"
|
||||||
|
)
|
||||||
|
assert (apar.default is inspect._empty) == (
|
||||||
|
spar.default is inspect._empty
|
||||||
|
), (
|
||||||
|
f"Default presence mismatch for {async_cls.__name__}.{name}.{pname}: "
|
||||||
|
f"async_has_default={apar.default is not inspect._empty}, "
|
||||||
|
f"sync_has_default={spar.default is not inspect._empty}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Return annotations must match or be iterator-equivalent
|
||||||
|
a_ret = _normalize_return_annotation(async_sig.return_annotation)
|
||||||
|
s_ret = _normalize_return_annotation(sync_sig.return_annotation)
|
||||||
|
assert a_ret == s_ret, (
|
||||||
|
f"Return annotation mismatch for {async_cls.__name__}.{name}: "
|
||||||
|
f"async={a_ret}, sync={s_ret}"
|
||||||
|
)
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
import functools
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import get_args
|
||||||
|
|
||||||
|
from langgraph_sdk.schema import (
|
||||||
|
AssistantSelectField,
|
||||||
|
CronSelectField,
|
||||||
|
RunSelectField,
|
||||||
|
ThreadSelectField,
|
||||||
|
)
|
||||||
|
|
||||||
|
current_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
|
||||||
|
|
||||||
|
@functools.cache
|
||||||
|
def _load_spec() -> dict:
|
||||||
|
with (
|
||||||
|
Path(current_dir).parents[2]
|
||||||
|
/ "docs"
|
||||||
|
/ "docs"
|
||||||
|
/ "cloud"
|
||||||
|
/ "reference"
|
||||||
|
/ "api"
|
||||||
|
/ "openapi.json"
|
||||||
|
).open() as f:
|
||||||
|
return json.load(f)
|
||||||
|
|
||||||
|
|
||||||
|
def _enum_from_request_select(spec: dict, path: str, method: str) -> set[str]:
|
||||||
|
schema = spec["paths"][path][method]["requestBody"]["content"]["application/json"][
|
||||||
|
"schema"
|
||||||
|
]
|
||||||
|
if "properties" in schema:
|
||||||
|
props = schema["properties"]
|
||||||
|
elif "$ref" in schema:
|
||||||
|
component = spec
|
||||||
|
index = schema["$ref"].split("/")[1:]
|
||||||
|
for part in index:
|
||||||
|
component = component[part]
|
||||||
|
props = component["properties"]
|
||||||
|
else:
|
||||||
|
raise ValueError(f"Unknown schema: {schema}")
|
||||||
|
sel = props["select"]
|
||||||
|
return set(sel["items"]["enum"])
|
||||||
|
|
||||||
|
|
||||||
|
def _enum_from_query_select(spec: dict, path: str, method: str) -> set[str]:
|
||||||
|
params = spec["paths"][path][method]["parameters"]
|
||||||
|
sel = next(p for p in params if p["name"] == "select")
|
||||||
|
return set(sel["schema"]["items"]["enum"])
|
||||||
|
|
||||||
|
|
||||||
|
def test_assistants_select_enum_matches_sdk():
|
||||||
|
spec = _load_spec()
|
||||||
|
expected = set(get_args(AssistantSelectField))
|
||||||
|
assert _enum_from_request_select(spec, "/assistants/search", "post") == expected
|
||||||
|
|
||||||
|
|
||||||
|
def test_threads_select_enum_matches_sdk():
|
||||||
|
spec = _load_spec()
|
||||||
|
expected = set(get_args(ThreadSelectField))
|
||||||
|
assert _enum_from_request_select(spec, "/threads/search", "post") == expected
|
||||||
|
|
||||||
|
|
||||||
|
def test_runs_select_enum_matches_sdk():
|
||||||
|
spec = _load_spec()
|
||||||
|
expected = set(get_args(RunSelectField))
|
||||||
|
assert _enum_from_query_select(spec, "/threads/{thread_id}/runs", "get") == expected
|
||||||
|
|
||||||
|
|
||||||
|
def test_crons_select_enum_matches_sdk():
|
||||||
|
spec = _load_spec()
|
||||||
|
expected = set(get_args(CronSelectField))
|
||||||
|
assert _enum_from_request_select(spec, "/runs/crons/search", "post") == expected
|
||||||
Generated
+162
-135
@@ -4,7 +4,7 @@ requires-python = ">=3.9"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anyio"
|
name = "anyio"
|
||||||
version = "4.9.0"
|
version = "4.10.0"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "exceptiongroup", marker = "python_full_version < '3.11'" },
|
{ name = "exceptiongroup", marker = "python_full_version < '3.11'" },
|
||||||
@@ -12,18 +12,27 @@ dependencies = [
|
|||||||
{ name = "sniffio" },
|
{ name = "sniffio" },
|
||||||
{ name = "typing-extensions", marker = "python_full_version < '3.13'" },
|
{ name = "typing-extensions", marker = "python_full_version < '3.13'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload-time = "2025-03-17T00:02:54.77Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/f1/b4/636b3b65173d3ce9a38ef5f0522789614e590dab6a8d505340a4efe4c567/anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6", size = 213252, upload-time = "2025-08-04T08:54:26.451Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" },
|
{ url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "backports-asyncio-runner"
|
||||||
|
version = "1.2.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/8e/ff/70dca7d7cb1cbc0edb2c6cc0c38b65cba36cccc491eca64cabd5fe7f8670/backports_asyncio_runner-1.2.0.tar.gz", hash = "sha256:a5aa7b2b7d8f8bfcaa2b57313f70792df84e32a2a746f585213373f900b42162", size = 69893, upload-time = "2025-07-02T02:27:15.685Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a0/59/76ab57e3fe74484f48a53f8e337171b4a2349e506eabe136d7e01d059086/backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5", size = 12313, upload-time = "2025-07-02T02:27:14.263Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "certifi"
|
name = "certifi"
|
||||||
version = "2025.7.14"
|
version = "2025.8.3"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/b3/76/52c535bcebe74590f296d6c77c86dabf761c41980e1347a2422e4aa2ae41/certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995", size = 163981, upload-time = "2025-07-14T03:29:28.449Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/4f/52/34c6cf5bb9285074dc3531c437b3919e825d976fde097a7a73f79e726d03/certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2", size = 162722, upload-time = "2025-07-14T03:29:26.863Z" },
|
{ url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -119,7 +128,6 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "langgraph-sdk"
|
name = "langgraph-sdk"
|
||||||
version = "0.2.0"
|
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "httpx" },
|
{ name = "httpx" },
|
||||||
@@ -156,7 +164,7 @@ dev = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mypy"
|
name = "mypy"
|
||||||
version = "1.17.0"
|
version = "1.17.1"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "mypy-extensions" },
|
{ name = "mypy-extensions" },
|
||||||
@@ -164,39 +172,45 @@ dependencies = [
|
|||||||
{ name = "tomli", marker = "python_full_version < '3.11'" },
|
{ name = "tomli", marker = "python_full_version < '3.11'" },
|
||||||
{ name = "typing-extensions" },
|
{ name = "typing-extensions" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/1e/e3/034322d5a779685218ed69286c32faa505247f1f096251ef66c8fd203b08/mypy-1.17.0.tar.gz", hash = "sha256:e5d7ccc08ba089c06e2f5629c660388ef1fee708444f1dee0b9203fa031dee03", size = 3352114, upload-time = "2025-07-14T20:34:30.181Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/8e/22/ea637422dedf0bf36f3ef238eab4e455e2a0dcc3082b5cc067615347ab8e/mypy-1.17.1.tar.gz", hash = "sha256:25e01ec741ab5bb3eec8ba9cdb0f769230368a22c959c4937360efb89b7e9f01", size = 3352570, upload-time = "2025-07-31T07:54:19.204Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/6a/31/e762baa3b73905c856d45ab77b4af850e8159dffffd86a52879539a08c6b/mypy-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8e08de6138043108b3b18f09d3f817a4783912e48828ab397ecf183135d84d6", size = 10998313, upload-time = "2025-07-14T20:33:24.519Z" },
|
{ url = "https://files.pythonhosted.org/packages/77/a9/3d7aa83955617cdf02f94e50aab5c830d205cfa4320cf124ff64acce3a8e/mypy-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3fbe6d5555bf608c47203baa3e72dbc6ec9965b3d7c318aa9a4ca76f465bd972", size = 11003299, upload-time = "2025-07-31T07:54:06.425Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/1c/c1/25b2f0d46fb7e0b5e2bee61ec3a47fe13eff9e3c2f2234f144858bbe6485/mypy-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce4a17920ec144647d448fc43725b5873548b1aae6c603225626747ededf582d", size = 10128922, upload-time = "2025-07-14T20:34:06.414Z" },
|
{ url = "https://files.pythonhosted.org/packages/83/e8/72e62ff837dd5caaac2b4a5c07ce769c8e808a00a65e5d8f94ea9c6f20ab/mypy-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80ef5c058b7bce08c83cac668158cb7edea692e458d21098c7d3bce35a5d43e7", size = 10125451, upload-time = "2025-07-31T07:53:52.974Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/02/78/6d646603a57aa8a2886df1b8881fe777ea60f28098790c1089230cd9c61d/mypy-1.17.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ff25d151cc057fdddb1cb1881ef36e9c41fa2a5e78d8dd71bee6e4dcd2bc05b", size = 11913524, upload-time = "2025-07-14T20:33:19.109Z" },
|
{ url = "https://files.pythonhosted.org/packages/7d/10/f3f3543f6448db11881776f26a0ed079865926b0c841818ee22de2c6bbab/mypy-1.17.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a580f8a70c69e4a75587bd925d298434057fe2a428faaf927ffe6e4b9a98df", size = 11916211, upload-time = "2025-07-31T07:53:18.879Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4f/19/dae6c55e87ee426fb76980f7e78484450cad1c01c55a1dc4e91c930bea01/mypy-1.17.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93468cf29aa9a132bceb103bd8475f78cacde2b1b9a94fd978d50d4bdf616c9a", size = 12650527, upload-time = "2025-07-14T20:32:44.095Z" },
|
{ url = "https://files.pythonhosted.org/packages/06/bf/63e83ed551282d67bb3f7fea2cd5561b08d2bb6eb287c096539feb5ddbc5/mypy-1.17.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd86bb649299f09d987a2eebb4d52d10603224500792e1bee18303bbcc1ce390", size = 12652687, upload-time = "2025-07-31T07:53:30.544Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/86/e1/f916845a235235a6c1e4d4d065a3930113767001d491b8b2e1b61ca56647/mypy-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:98189382b310f16343151f65dd7e6867386d3e35f7878c45cfa11383d175d91f", size = 12897284, upload-time = "2025-07-14T20:33:38.168Z" },
|
{ url = "https://files.pythonhosted.org/packages/69/66/68f2eeef11facf597143e85b694a161868b3b006a5fbad50e09ea117ef24/mypy-1.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a76906f26bd8d51ea9504966a9c25419f2e668f012e0bdf3da4ea1526c534d94", size = 12896322, upload-time = "2025-07-31T07:53:50.74Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ae/dc/414760708a4ea1b096bd214d26a24e30ac5e917ef293bc33cdb6fe22d2da/mypy-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:c004135a300ab06a045c1c0d8e3f10215e71d7b4f5bb9a42ab80236364429937", size = 9506493, upload-time = "2025-07-14T20:34:01.093Z" },
|
{ url = "https://files.pythonhosted.org/packages/a3/87/8e3e9c2c8bd0d7e071a89c71be28ad088aaecbadf0454f46a540bda7bca6/mypy-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:e79311f2d904ccb59787477b7bd5d26f3347789c06fcd7656fa500875290264b", size = 9507962, upload-time = "2025-07-31T07:53:08.431Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d4/24/82efb502b0b0f661c49aa21cfe3e1999ddf64bf5500fc03b5a1536a39d39/mypy-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d4fe5c72fd262d9c2c91c1117d16aac555e05f5beb2bae6a755274c6eec42be", size = 10914150, upload-time = "2025-07-14T20:31:51.985Z" },
|
{ url = "https://files.pythonhosted.org/packages/46/cf/eadc80c4e0a70db1c08921dcc220357ba8ab2faecb4392e3cebeb10edbfa/mypy-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad37544be07c5d7fba814eb370e006df58fed8ad1ef33ed1649cb1889ba6ff58", size = 10921009, upload-time = "2025-07-31T07:53:23.037Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/03/96/8ef9a6ff8cedadff4400e2254689ca1dc4b420b92c55255b44573de10c54/mypy-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d96b196e5c16f41b4f7736840e8455958e832871990c7ba26bf58175e357ed61", size = 10039845, upload-time = "2025-07-14T20:32:30.527Z" },
|
{ url = "https://files.pythonhosted.org/packages/5d/c1/c869d8c067829ad30d9bdae051046561552516cfb3a14f7f0347b7d973ee/mypy-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:064e2ff508e5464b4bd807a7c1625bc5047c5022b85c70f030680e18f37273a5", size = 10047482, upload-time = "2025-07-31T07:53:26.151Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/df/32/7ce359a56be779d38021d07941cfbb099b41411d72d827230a36203dbb81/mypy-1.17.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73a0ff2dd10337ceb521c080d4147755ee302dcde6e1a913babd59473904615f", size = 11837246, upload-time = "2025-07-14T20:32:01.28Z" },
|
{ url = "https://files.pythonhosted.org/packages/98/b9/803672bab3fe03cee2e14786ca056efda4bb511ea02dadcedde6176d06d0/mypy-1.17.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70401bbabd2fa1aa7c43bb358f54037baf0586f41e83b0ae67dd0534fc64edfd", size = 11832883, upload-time = "2025-07-31T07:53:47.948Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/82/16/b775047054de4d8dbd668df9137707e54b07fe18c7923839cd1e524bf756/mypy-1.17.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24cfcc1179c4447854e9e406d3af0f77736d631ec87d31c6281ecd5025df625d", size = 12571106, upload-time = "2025-07-14T20:34:26.942Z" },
|
{ url = "https://files.pythonhosted.org/packages/88/fb/fcdac695beca66800918c18697b48833a9a6701de288452b6715a98cfee1/mypy-1.17.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e92bdc656b7757c438660f775f872a669b8ff374edc4d18277d86b63edba6b8b", size = 12566215, upload-time = "2025-07-31T07:54:04.031Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a1/cf/fa33eaf29a606102c8d9ffa45a386a04c2203d9ad18bf4eef3e20c43ebc8/mypy-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c56f180ff6430e6373db7a1d569317675b0a451caf5fef6ce4ab365f5f2f6c3", size = 12759960, upload-time = "2025-07-14T20:33:42.882Z" },
|
{ url = "https://files.pythonhosted.org/packages/7f/37/a932da3d3dace99ee8eb2043b6ab03b6768c36eb29a02f98f46c18c0da0e/mypy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c1fdf4abb29ed1cb091cf432979e162c208a5ac676ce35010373ff29247bcad5", size = 12751956, upload-time = "2025-07-31T07:53:36.263Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/94/75/3f5a29209f27e739ca57e6350bc6b783a38c7621bdf9cac3ab8a08665801/mypy-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:eafaf8b9252734400f9b77df98b4eee3d2eecab16104680d51341c75702cad70", size = 9503888, upload-time = "2025-07-14T20:32:34.392Z" },
|
{ url = "https://files.pythonhosted.org/packages/8c/cf/6438a429e0f2f5cab8bc83e53dbebfa666476f40ee322e13cac5e64b79e7/mypy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:ff2933428516ab63f961644bc49bc4cbe42bbffb2cd3b71cc7277c07d16b1a8b", size = 9507307, upload-time = "2025-07-31T07:53:59.734Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/12/e9/e6824ed620bbf51d3bf4d6cbbe4953e83eaf31a448d1b3cfb3620ccb641c/mypy-1.17.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f986f1cab8dbec39ba6e0eaa42d4d3ac6686516a5d3dccd64be095db05ebc6bb", size = 11086395, upload-time = "2025-07-14T20:34:11.452Z" },
|
{ url = "https://files.pythonhosted.org/packages/17/a2/7034d0d61af8098ec47902108553122baa0f438df8a713be860f7407c9e6/mypy-1.17.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:69e83ea6553a3ba79c08c6e15dbd9bfa912ec1e493bf75489ef93beb65209aeb", size = 11086295, upload-time = "2025-07-31T07:53:28.124Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ba/51/a4afd1ae279707953be175d303f04a5a7bd7e28dc62463ad29c1c857927e/mypy-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:51e455a54d199dd6e931cd7ea987d061c2afbaf0960f7f66deef47c90d1b304d", size = 10120052, upload-time = "2025-07-14T20:33:09.897Z" },
|
{ url = "https://files.pythonhosted.org/packages/14/1f/19e7e44b594d4b12f6ba8064dbe136505cec813549ca3e5191e40b1d3cc2/mypy-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b16708a66d38abb1e6b5702f5c2c87e133289da36f6a1d15f6a5221085c6403", size = 10112355, upload-time = "2025-07-31T07:53:21.121Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8a/71/19adfeac926ba8205f1d1466d0d360d07b46486bf64360c54cb5a2bd86a8/mypy-1.17.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3204d773bab5ff4ebbd1f8efa11b498027cd57017c003ae970f310e5b96be8d8", size = 11861806, upload-time = "2025-07-14T20:32:16.028Z" },
|
{ url = "https://files.pythonhosted.org/packages/5b/69/baa33927e29e6b4c55d798a9d44db5d394072eef2bdc18c3e2048c9ed1e9/mypy-1.17.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:89e972c0035e9e05823907ad5398c5a73b9f47a002b22359b177d40bdaee7056", size = 11875285, upload-time = "2025-07-31T07:53:55.293Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/0b/64/d6120eca3835baf7179e6797a0b61d6c47e0bc2324b1f6819d8428d5b9ba/mypy-1.17.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1051df7ec0886fa246a530ae917c473491e9a0ba6938cfd0ec2abc1076495c3e", size = 12744371, upload-time = "2025-07-14T20:33:33.503Z" },
|
{ url = "https://files.pythonhosted.org/packages/90/13/f3a89c76b0a41e19490b01e7069713a30949d9a6c147289ee1521bcea245/mypy-1.17.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03b6d0ed2b188e35ee6d5c36b5580cffd6da23319991c49ab5556c023ccf1341", size = 12737895, upload-time = "2025-07-31T07:53:43.623Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/1f/dc/56f53b5255a166f5bd0f137eed960e5065f2744509dfe69474ff0ba772a5/mypy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f773c6d14dcc108a5b141b4456b0871df638eb411a89cd1c0c001fc4a9d08fc8", size = 12914558, upload-time = "2025-07-14T20:33:56.961Z" },
|
{ url = "https://files.pythonhosted.org/packages/23/a1/c4ee79ac484241301564072e6476c5a5be2590bc2e7bfd28220033d2ef8f/mypy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c837b896b37cd103570d776bda106eabb8737aa6dd4f248451aecf53030cdbeb", size = 12931025, upload-time = "2025-07-31T07:54:17.125Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/69/ac/070bad311171badc9add2910e7f89271695a25c136de24bbafc7eded56d5/mypy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:1619a485fd0e9c959b943c7b519ed26b712de3002d7de43154a489a2d0fd817d", size = 9585447, upload-time = "2025-07-14T20:32:20.594Z" },
|
{ url = "https://files.pythonhosted.org/packages/89/b8/7409477be7919a0608900e6320b155c72caab4fef46427c5cc75f85edadd/mypy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:665afab0963a4b39dff7c1fa563cc8b11ecff7910206db4b2e64dd1ba25aed19", size = 9584664, upload-time = "2025-07-31T07:54:12.842Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/be/7b/5f8ab461369b9e62157072156935cec9d272196556bdc7c2ff5f4c7c0f9b/mypy-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c41aa59211e49d717d92b3bb1238c06d387c9325d3122085113c79118bebb06", size = 11070019, upload-time = "2025-07-14T20:32:07.99Z" },
|
{ url = "https://files.pythonhosted.org/packages/5b/82/aec2fc9b9b149f372850291827537a508d6c4d3664b1750a324b91f71355/mypy-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93378d3203a5c0800c6b6d850ad2f19f7a3cdf1a3701d3416dbf128805c6a6a7", size = 11075338, upload-time = "2025-07-31T07:53:38.873Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/9c/f8/c49c9e5a2ac0badcc54beb24e774d2499748302c9568f7f09e8730e953fa/mypy-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e69db1fb65b3114f98c753e3930a00514f5b68794ba80590eb02090d54a5d4a", size = 10114457, upload-time = "2025-07-14T20:33:47.285Z" },
|
{ url = "https://files.pythonhosted.org/packages/07/ac/ee93fbde9d2242657128af8c86f5d917cd2887584cf948a8e3663d0cd737/mypy-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:15d54056f7fe7a826d897789f53dd6377ec2ea8ba6f776dc83c2902b899fee81", size = 10113066, upload-time = "2025-07-31T07:54:14.707Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/89/0c/fb3f9c939ad9beed3e328008b3fb90b20fda2cddc0f7e4c20dbefefc3b33/mypy-1.17.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:03ba330b76710f83d6ac500053f7727270b6b8553b0423348ffb3af6f2f7b889", size = 11857838, upload-time = "2025-07-14T20:33:14.462Z" },
|
{ url = "https://files.pythonhosted.org/packages/5a/68/946a1e0be93f17f7caa56c45844ec691ca153ee8b62f21eddda336a2d203/mypy-1.17.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:209a58fed9987eccc20f2ca94afe7257a8f46eb5df1fb69958650973230f91e6", size = 11875473, upload-time = "2025-07-31T07:53:14.504Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4c/66/85607ab5137d65e4f54d9797b77d5a038ef34f714929cf8ad30b03f628df/mypy-1.17.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:037bc0f0b124ce46bfde955c647f3e395c6174476a968c0f22c95a8d2f589bba", size = 12731358, upload-time = "2025-07-14T20:32:25.579Z" },
|
{ url = "https://files.pythonhosted.org/packages/9f/0f/478b4dce1cb4f43cf0f0d00fba3030b21ca04a01b74d1cd272a528cf446f/mypy-1.17.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:099b9a5da47de9e2cb5165e581f158e854d9e19d2e96b6698c0d64de911dd849", size = 12744296, upload-time = "2025-07-31T07:53:03.896Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/73/d0/341dbbfb35ce53d01f8f2969facbb66486cee9804048bf6c01b048127501/mypy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c38876106cb6132259683632b287238858bd58de267d80defb6f418e9ee50658", size = 12917480, upload-time = "2025-07-14T20:34:21.868Z" },
|
{ url = "https://files.pythonhosted.org/packages/ca/70/afa5850176379d1b303f992a828de95fc14487429a7139a4e0bdd17a8279/mypy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ffadfbe6994d724c5a1bb6123a7d27dd68fc9c059561cd33b664a79578e14", size = 12914657, upload-time = "2025-07-31T07:54:08.576Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/64/63/70c8b7dbfc520089ac48d01367a97e8acd734f65bd07813081f508a8c94c/mypy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:d30ba01c0f151998f367506fab31c2ac4527e6a7b2690107c7a7f9e3cb419a9c", size = 9589666, upload-time = "2025-07-14T20:34:16.841Z" },
|
{ url = "https://files.pythonhosted.org/packages/53/f9/4a83e1c856a3d9c8f6edaa4749a4864ee98486e9b9dbfbc93842891029c2/mypy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:9a2b7d9180aed171f033c9f2fc6c204c1245cf60b0cb61cf2e7acc24eea78e0a", size = 9593320, upload-time = "2025-07-31T07:53:01.341Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/9f/a0/6263dd11941231f688f0a8f2faf90ceac1dc243d148d314a089d2fe25108/mypy-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:63e751f1b5ab51d6f3d219fe3a2fe4523eaa387d854ad06906c63883fde5b1ab", size = 10988185, upload-time = "2025-07-14T20:33:04.797Z" },
|
{ url = "https://files.pythonhosted.org/packages/38/56/79c2fac86da57c7d8c48622a05873eaab40b905096c33597462713f5af90/mypy-1.17.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:15a83369400454c41ed3a118e0cc58bd8123921a602f385cb6d6ea5df050c733", size = 11040037, upload-time = "2025-07-31T07:54:10.942Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/02/13/b8f16d6b0dc80277129559c8e7dbc9011241a0da8f60d031edb0e6e9ac8f/mypy-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f7fb09d05e0f1c329a36dcd30e27564a3555717cde87301fae4fb542402ddfad", size = 10120169, upload-time = "2025-07-14T20:32:38.84Z" },
|
{ url = "https://files.pythonhosted.org/packages/4d/c3/adabe6ff53638e3cad19e3547268482408323b1e68bf082c9119000cd049/mypy-1.17.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:55b918670f692fc9fba55c3298d8a3beae295c5cded0a55dccdc5bbead814acd", size = 10131550, upload-time = "2025-07-31T07:53:41.307Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/14/ef/978ba79df0d65af680e20d43121363cf643eb79b04bf3880d01fc8afeb6f/mypy-1.17.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b72c34ce05ac3a1361ae2ebb50757fb6e3624032d91488d93544e9f82db0ed6c", size = 11918121, upload-time = "2025-07-14T20:33:52.328Z" },
|
{ url = "https://files.pythonhosted.org/packages/b8/c5/2e234c22c3bdeb23a7817af57a58865a39753bde52c74e2c661ee0cfc640/mypy-1.17.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:62761474061feef6f720149d7ba876122007ddc64adff5ba6f374fda35a018a0", size = 11872963, upload-time = "2025-07-31T07:53:16.878Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f4/10/55ef70b104151a0d8280474f05268ff0a2a79be8d788d5e647257d121309/mypy-1.17.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:434ad499ad8dde8b2f6391ddfa982f41cb07ccda8e3c67781b1bfd4e5f9450a8", size = 12648821, upload-time = "2025-07-14T20:32:59.631Z" },
|
{ url = "https://files.pythonhosted.org/packages/ab/26/c13c130f35ca8caa5f2ceab68a247775648fdcd6c9a18f158825f2bc2410/mypy-1.17.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c49562d3d908fd49ed0938e5423daed8d407774a479b595b143a3d7f87cdae6a", size = 12710189, upload-time = "2025-07-31T07:54:01.962Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/26/8c/7781fcd2e1eef48fbedd3a422c21fe300a8e03ed5be2eb4bd10246a77f4e/mypy-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f105f61a5eff52e137fd73bee32958b2add9d9f0a856f17314018646af838e97", size = 12896955, upload-time = "2025-07-14T20:32:49.543Z" },
|
{ url = "https://files.pythonhosted.org/packages/82/df/c7d79d09f6de8383fe800521d066d877e54d30b4fb94281c262be2df84ef/mypy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:397fba5d7616a5bc60b45c7ed204717eaddc38f826e3645402c426057ead9a91", size = 12900322, upload-time = "2025-07-31T07:53:10.551Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/78/13/03ac759dabe86e98ca7b6681f114f90ee03f3ff8365a57049d311bd4a4e3/mypy-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:ba06254a5a22729853209550d80f94e28690d5530c661f9416a68ac097b13fc4", size = 9512957, upload-time = "2025-07-14T20:33:28.619Z" },
|
{ url = "https://files.pythonhosted.org/packages/b8/98/3d5a48978b4f708c55ae832619addc66d677f6dc59f3ebad71bae8285ca6/mypy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:9d6b20b97d373f41617bd0708fd46aa656059af57f2ef72aa8c7d6a2b73b74ed", size = 9751879, upload-time = "2025-07-31T07:52:56.683Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e3/fc/ee058cc4316f219078464555873e99d170bde1d9569abd833300dbeb484a/mypy-1.17.0-py3-none-any.whl", hash = "sha256:15d9d0018237ab058e5de3d8fce61b6fa72cc59cc78fd91f1b474bce12abf496", size = 2283195, upload-time = "2025-07-14T20:31:54.753Z" },
|
{ url = "https://files.pythonhosted.org/packages/29/cb/673e3d34e5d8de60b3a61f44f80150a738bff568cd6b7efb55742a605e98/mypy-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5d1092694f166a7e56c805caaf794e0585cabdbf1df36911c414e4e9abb62ae9", size = 10992466, upload-time = "2025-07-31T07:53:57.574Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0c/d0/fe1895836eea3a33ab801561987a10569df92f2d3d4715abf2cfeaa29cb2/mypy-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:79d44f9bfb004941ebb0abe8eff6504223a9c1ac51ef967d1263c6572bbebc99", size = 10117638, upload-time = "2025-07-31T07:53:34.256Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/97/f3/514aa5532303aafb95b9ca400a31054a2bd9489de166558c2baaeea9c522/mypy-1.17.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b01586eed696ec905e61bd2568f48740f7ac4a45b3a468e6423a03d3788a51a8", size = 11915673, upload-time = "2025-07-31T07:52:59.361Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ab/c3/c0805f0edec96fe8e2c048b03769a6291523d509be8ee7f56ae922fa3882/mypy-1.17.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43808d9476c36b927fbcd0b0255ce75efe1b68a080154a38ae68a7e62de8f0f8", size = 12649022, upload-time = "2025-07-31T07:53:45.92Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/45/3e/d646b5a298ada21a8512fa7e5531f664535a495efa672601702398cea2b4/mypy-1.17.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:feb8cc32d319edd5859da2cc084493b3e2ce5e49a946377663cc90f6c15fb259", size = 12895536, upload-time = "2025-07-31T07:53:06.17Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/14/55/e13d0dcd276975927d1f4e9e2ec4fd409e199f01bdc671717e673cc63a22/mypy-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d7598cf74c3e16539d4e2f0b8d8c318e00041553d83d4861f87c7a72e95ac24d", size = 9512564, upload-time = "2025-07-31T07:53:12.346Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1d/f3/8fcd2af0f5b806f6cf463efaffd3c9548a28f84220493ecd38d127b6b66d/mypy-1.17.1-py3-none-any.whl", hash = "sha256:a9f52c0351c21fe24c21d8c0eb1f62967b262d6729393397b6f443c3b773c3b9", size = 2283411, upload-time = "2025-07-31T07:53:24.664Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -210,81 +224,92 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "orjson"
|
name = "orjson"
|
||||||
version = "3.10.18"
|
version = "3.11.2"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/81/0b/fea456a3ffe74e70ba30e01ec183a9b26bec4d497f61dcfce1b601059c60/orjson-3.10.18.tar.gz", hash = "sha256:e8da3947d92123eda795b68228cafe2724815621fe35e8e320a9e9593a4bcd53", size = 5422810, upload-time = "2025-04-29T23:30:08.423Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/df/1d/5e0ae38788bdf0721326695e65fdf41405ed535f633eb0df0f06f57552fa/orjson-3.11.2.tar.gz", hash = "sha256:91bdcf5e69a8fd8e8bdb3de32b31ff01d2bd60c1e8d5fe7d5afabdcf19920309", size = 5470739, upload-time = "2025-08-12T15:12:28.626Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/27/16/2ceb9fb7bc2b11b1e4a3ea27794256e93dee2309ebe297fd131a778cd150/orjson-3.10.18-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a45e5d68066b408e4bc383b6e4ef05e717c65219a9e1390abc6155a520cac402", size = 248927, upload-time = "2025-04-29T23:28:08.643Z" },
|
{ url = "https://files.pythonhosted.org/packages/a1/7b/7aebe925c6b1c46c8606a960fe1d6b681fccd4aaf3f37cd647c3309d6582/orjson-3.11.2-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d6b8a78c33496230a60dc9487118c284c15ebdf6724386057239641e1eb69761", size = 226896, upload-time = "2025-08-12T15:10:22.02Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/3d/e1/d3c0a2bba5b9906badd121da449295062b289236c39c3a7801f92c4682b0/orjson-3.10.18-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be3b9b143e8b9db05368b13b04c84d37544ec85bb97237b3a923f076265ec89c", size = 136995, upload-time = "2025-04-29T23:28:11.503Z" },
|
{ url = "https://files.pythonhosted.org/packages/7d/39/c952c9b0d51063e808117dd1e53668a2e4325cc63cfe7df453d853ee8680/orjson-3.11.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc04036eeae11ad4180d1f7b5faddb5dab1dee49ecd147cd431523869514873b", size = 111845, upload-time = "2025-08-12T15:10:24.963Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d7/51/698dd65e94f153ee5ecb2586c89702c9e9d12f165a63e74eb9ea1299f4e1/orjson-3.10.18-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9b0aa09745e2c9b3bf779b096fa71d1cc2d801a604ef6dd79c8b1bfef52b2f92", size = 132893, upload-time = "2025-04-29T23:28:12.751Z" },
|
{ url = "https://files.pythonhosted.org/packages/f5/dc/90b7f29be38745eeacc30903b693f29fcc1097db0c2a19a71ffb3e9f2a5f/orjson-3.11.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c04325839c5754c253ff301cee8aaed7442d974860a44447bb3be785c411c27", size = 116395, upload-time = "2025-08-12T15:10:26.314Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/b3/e5/155ce5a2c43a85e790fcf8b985400138ce5369f24ee6770378ee6b691036/orjson-3.10.18-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53a245c104d2792e65c8d225158f2b8262749ffe64bc7755b00024757d957a13", size = 137017, upload-time = "2025-04-29T23:28:14.498Z" },
|
{ url = "https://files.pythonhosted.org/packages/10/c2/fe84ba63164c22932b8d59b8810e2e58590105293a259e6dd1bfaf3422c9/orjson-3.11.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32769e04cd7fdc4a59854376211145a1bbbc0aea5e9d6c9755d3d3c301d7c0df", size = 118768, upload-time = "2025-08-12T15:10:27.605Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/46/bb/6141ec3beac3125c0b07375aee01b5124989907d61c72c7636136e4bd03e/orjson-3.10.18-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9495ab2611b7f8a0a8a505bcb0f0cbdb5469caafe17b0e404c3c746f9900469", size = 138290, upload-time = "2025-04-29T23:28:16.211Z" },
|
{ url = "https://files.pythonhosted.org/packages/a9/ce/d9748ec69b1a4c29b8e2bab8233e8c41c583c69f515b373f1fb00247d8c9/orjson-3.11.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ff285d14917ea1408a821786e3677c5261fa6095277410409c694b8e7720ae0", size = 120887, upload-time = "2025-08-12T15:10:29.153Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/77/36/6961eca0b66b7809d33c4ca58c6bd4c23a1b914fb23aba2fa2883f791434/orjson-3.10.18-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73be1cbcebadeabdbc468f82b087df435843c809cd079a565fb16f0f3b23238f", size = 142828, upload-time = "2025-04-29T23:28:18.065Z" },
|
{ url = "https://files.pythonhosted.org/packages/c1/66/b90fac8e4a76e83f981912d7f9524d402b31f6c1b8bff3e498aa321c326c/orjson-3.11.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2662f908114864b63ff75ffe6ffacf996418dd6cc25e02a72ad4bda81b1ec45a", size = 123650, upload-time = "2025-08-12T15:10:30.602Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8b/2f/0c646d5fd689d3be94f4d83fa9435a6c4322c9b8533edbb3cd4bc8c5f69a/orjson-3.10.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8936ee2679e38903df158037a2f1c108129dee218975122e37847fb1d4ac68", size = 132806, upload-time = "2025-04-29T23:28:19.782Z" },
|
{ url = "https://files.pythonhosted.org/packages/33/81/56143898d1689c7f915ac67703efb97e8f2f8d5805ce8c2c3fd0f2bb6e3d/orjson-3.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab463cf5d08ad6623a4dac1badd20e88a5eb4b840050c4812c782e3149fe2334", size = 121287, upload-time = "2025-08-12T15:10:31.868Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ea/af/65907b40c74ef4c3674ef2bcfa311c695eb934710459841b3c2da212215c/orjson-3.10.18-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7115fcbc8525c74e4c2b608129bef740198e9a120ae46184dac7683191042056", size = 135005, upload-time = "2025-04-29T23:28:21.367Z" },
|
{ url = "https://files.pythonhosted.org/packages/80/de/f9c6d00c127be766a3739d0d85b52a7c941e437d8dd4d573e03e98d0f89c/orjson-3.11.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:64414241bde943cbf3c00d45fcb5223dca6d9210148ba984aae6b5d63294502b", size = 119637, upload-time = "2025-08-12T15:10:33.078Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c7/d1/68bd20ac6a32cd1f1b10d23e7cc58ee1e730e80624e3031d77067d7150fc/orjson-3.10.18-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:771474ad34c66bc4d1c01f645f150048030694ea5b2709b87d3bda273ffe505d", size = 413418, upload-time = "2025-04-29T23:28:23.097Z" },
|
{ url = "https://files.pythonhosted.org/packages/67/4c/ab70c7627022d395c1b4eb5badf6196b7144e82b46a3a17ed2354f9e592d/orjson-3.11.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:7773e71c0ae8c9660192ff144a3d69df89725325e3d0b6a6bb2c50e5ebaf9b84", size = 392478, upload-time = "2025-08-12T15:10:34.669Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/31/31/c701ec0bcc3e80e5cb6e319c628ef7b768aaa24b0f3b4c599df2eaacfa24/orjson-3.10.18-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7c14047dbbea52886dd87169f21939af5d55143dad22d10db6a7514f058156a8", size = 153288, upload-time = "2025-04-29T23:28:25.02Z" },
|
{ url = "https://files.pythonhosted.org/packages/77/91/d890b873b69311db4fae2624c5603c437df9c857fb061e97706dac550a77/orjson-3.11.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:652ca14e283b13ece35bf3a86503c25592f294dbcfc5bb91b20a9c9a62a3d4be", size = 134343, upload-time = "2025-08-12T15:10:35.978Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d9/31/5e1aa99a10893a43cfc58009f9da840990cc8a9ebb75aa452210ba18587e/orjson-3.10.18-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:641481b73baec8db14fdf58f8967e52dc8bda1f2aba3aa5f5c1b07ed6df50b7f", size = 137181, upload-time = "2025-04-29T23:28:26.318Z" },
|
{ url = "https://files.pythonhosted.org/packages/47/16/1aa248541b4830274a079c4aeb2aa5d1ff17c3f013b1d0d8d16d0848f3de/orjson-3.11.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:26e99e98df8990ecfe3772bbdd7361f602149715c2cbc82e61af89bfad9528a4", size = 123887, upload-time = "2025-08-12T15:10:37.601Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/bf/8c/daba0ac1b8690011d9242a0f37235f7d17df6d0ad941021048523b76674e/orjson-3.10.18-cp310-cp310-win32.whl", hash = "sha256:607eb3ae0909d47280c1fc657c4284c34b785bae371d007595633f4b1a2bbe06", size = 142694, upload-time = "2025-04-29T23:28:28.092Z" },
|
{ url = "https://files.pythonhosted.org/packages/95/e4/7419833c55ac8b5f385d00c02685a260da1f391e900fc5c3e0b797e0d506/orjson-3.11.2-cp310-cp310-win32.whl", hash = "sha256:5814313b3e75a2be7fe6c7958201c16c4560e21a813dbad25920752cecd6ad66", size = 124560, upload-time = "2025-08-12T15:10:38.966Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/16/62/8b687724143286b63e1d0fab3ad4214d54566d80b0ba9d67c26aaf28a2f8/orjson-3.10.18-cp310-cp310-win_amd64.whl", hash = "sha256:8770432524ce0eca50b7efc2a9a5f486ee0113a5fbb4231526d414e6254eba92", size = 134600, upload-time = "2025-04-29T23:28:29.422Z" },
|
{ url = "https://files.pythonhosted.org/packages/74/f8/27ca7ef3e194c462af32ce1883187f5ec483650c559166f0de59c4c2c5f0/orjson-3.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:dc471ce2225ab4c42ca672f70600d46a8b8e28e8d4e536088c1ccdb1d22b35ce", size = 119700, upload-time = "2025-08-12T15:10:40.911Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/97/c7/c54a948ce9a4278794f669a353551ce7db4ffb656c69a6e1f2264d563e50/orjson-3.10.18-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e0a183ac3b8e40471e8d843105da6fbe7c070faab023be3b08188ee3f85719b8", size = 248929, upload-time = "2025-04-29T23:28:30.716Z" },
|
{ url = "https://files.pythonhosted.org/packages/78/7d/e295df1ac9920cbb19fb4c1afa800e86f175cb657143aa422337270a4782/orjson-3.11.2-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:888b64ef7eaeeff63f773881929434a5834a6a140a63ad45183d59287f07fc6a", size = 226502, upload-time = "2025-08-12T15:10:42.284Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/9e/60/a9c674ef1dd8ab22b5b10f9300e7e70444d4e3cda4b8258d6c2488c32143/orjson-3.10.18-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:5ef7c164d9174362f85238d0cd4afdeeb89d9e523e4651add6a5d458d6f7d42d", size = 133364, upload-time = "2025-04-29T23:28:32.392Z" },
|
{ url = "https://files.pythonhosted.org/packages/65/21/ffb0f10ea04caf418fb4e7ad1fda4b9ab3179df9d7a33b69420f191aadd5/orjson-3.11.2-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:83387cc8b26c9fa0ae34d1ea8861a7ae6cff8fb3e346ab53e987d085315a728e", size = 115999, upload-time = "2025-08-12T15:10:43.738Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c1/4e/f7d1bdd983082216e414e6d7ef897b0c2957f99c545826c06f371d52337e/orjson-3.10.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd14c5d99cdc7bf93f22b12ec3b294931518aa019e2a147e8aa2f31fd3240f7", size = 136995, upload-time = "2025-04-29T23:28:34.024Z" },
|
{ url = "https://files.pythonhosted.org/packages/90/d5/8da1e252ac3353d92e6f754ee0c85027c8a2cda90b6899da2be0df3ef83d/orjson-3.11.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7e35f003692c216d7ee901b6b916b5734d6fc4180fcaa44c52081f974c08e17", size = 111563, upload-time = "2025-08-12T15:10:45.301Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/17/89/46b9181ba0ea251c9243b0c8ce29ff7c9796fa943806a9c8b02592fce8ea/orjson-3.10.18-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7b672502323b6cd133c4af6b79e3bea36bad2d16bca6c1f645903fce83909a7a", size = 132894, upload-time = "2025-04-29T23:28:35.318Z" },
|
{ url = "https://files.pythonhosted.org/packages/4f/81/baabc32e52c570b0e4e1044b1bd2ccbec965e0de3ba2c13082255efa2006/orjson-3.11.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4a0a4c29ae90b11d0c00bcc31533854d89f77bde2649ec602f512a7e16e00640", size = 116222, upload-time = "2025-08-12T15:10:46.92Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ca/dd/7bce6fcc5b8c21aef59ba3c67f2166f0a1a9b0317dcca4a9d5bd7934ecfd/orjson-3.10.18-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51f8c63be6e070ec894c629186b1c0fe798662b8687f3d9fdfa5e401c6bd7679", size = 137016, upload-time = "2025-04-29T23:28:36.674Z" },
|
{ url = "https://files.pythonhosted.org/packages/8d/b7/da2ad55ad80b49b560dce894c961477d0e76811ee6e614b301de9f2f8728/orjson-3.11.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:585d712b1880f68370108bc5534a257b561672d1592fae54938738fe7f6f1e33", size = 118594, upload-time = "2025-08-12T15:10:48.488Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/1c/4a/b8aea1c83af805dcd31c1f03c95aabb3e19a016b2a4645dd822c5686e94d/orjson-3.10.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f9478ade5313d724e0495d167083c6f3be0dd2f1c9c8a38db9a9e912cdaf947", size = 138290, upload-time = "2025-04-29T23:28:38.3Z" },
|
{ url = "https://files.pythonhosted.org/packages/61/be/014f7eab51449f3c894aa9bbda2707b5340c85650cb7d0db4ec9ae280501/orjson-3.11.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d08e342a7143f8a7c11f1c4033efe81acbd3c98c68ba1b26b96080396019701f", size = 120700, upload-time = "2025-08-12T15:10:49.811Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/36/d6/7eb05c85d987b688707f45dcf83c91abc2251e0dd9fb4f7be96514f838b1/orjson-3.10.18-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:187aefa562300a9d382b4b4eb9694806e5848b0cedf52037bb5c228c61bb66d4", size = 142829, upload-time = "2025-04-29T23:28:39.657Z" },
|
{ url = "https://files.pythonhosted.org/packages/cf/ae/c217903a30c51341868e2d8c318c59a8413baa35af54d7845071c8ccd6fe/orjson-3.11.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29c0f84fc50398773a702732c87cd622737bf11c0721e6db3041ac7802a686fb", size = 123433, upload-time = "2025-08-12T15:10:51.06Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d2/78/ddd3ee7873f2b5f90f016bc04062713d567435c53ecc8783aab3a4d34915/orjson-3.10.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9da552683bc9da222379c7a01779bddd0ad39dd699dd6300abaf43eadee38334", size = 132805, upload-time = "2025-04-29T23:28:40.969Z" },
|
{ url = "https://files.pythonhosted.org/packages/57/c2/b3c346f78b1ff2da310dd300cb0f5d32167f872b4d3bb1ad122c889d97b0/orjson-3.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:140f84e3c8d4c142575898c91e3981000afebf0333df753a90b3435d349a5fe5", size = 121061, upload-time = "2025-08-12T15:10:52.381Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8c/09/c8e047f73d2c5d21ead9c180203e111cddeffc0848d5f0f974e346e21c8e/orjson-3.10.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e450885f7b47a0231979d9c49b567ed1c4e9f69240804621be87c40bc9d3cf17", size = 135008, upload-time = "2025-04-29T23:28:42.284Z" },
|
{ url = "https://files.pythonhosted.org/packages/00/c8/c97798f6010327ffc75ad21dd6bca11ea2067d1910777e798c2849f1c68f/orjson-3.11.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96304a2b7235e0f3f2d9363ddccdbfb027d27338722fe469fe656832a017602e", size = 119410, upload-time = "2025-08-12T15:10:53.692Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/0c/4b/dccbf5055ef8fb6eda542ab271955fc1f9bf0b941a058490293f8811122b/orjson-3.10.18-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5e3c9cc2ba324187cd06287ca24f65528f16dfc80add48dc99fa6c836bb3137e", size = 413419, upload-time = "2025-04-29T23:28:43.673Z" },
|
{ url = "https://files.pythonhosted.org/packages/37/fd/df720f7c0e35694617b7f95598b11a2cb0374661d8389703bea17217da53/orjson-3.11.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3d7612bb227d5d9582f1f50a60bd55c64618fc22c4a32825d233a4f2771a428a", size = 392294, upload-time = "2025-08-12T15:10:55.079Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8a/f3/1eac0c5e2d6d6790bd2025ebfbefcbd37f0d097103d76f9b3f9302af5a17/orjson-3.10.18-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:50ce016233ac4bfd843ac5471e232b865271d7d9d44cf9d33773bcd883ce442b", size = 153292, upload-time = "2025-04-29T23:28:45.573Z" },
|
{ url = "https://files.pythonhosted.org/packages/ba/52/0120d18f60ab0fe47531d520372b528a45c9a25dcab500f450374421881c/orjson-3.11.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a134587d18fe493befc2defffef2a8d27cfcada5696cb7234de54a21903ae89a", size = 134134, upload-time = "2025-08-12T15:10:56.568Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/1f/b4/ef0abf64c8f1fabf98791819ab502c2c8c1dc48b786646533a93637d8999/orjson-3.10.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b3ceff74a8f7ffde0b2785ca749fc4e80e4315c0fd887561144059fb1c138aa7", size = 137182, upload-time = "2025-04-29T23:28:47.229Z" },
|
{ url = "https://files.pythonhosted.org/packages/ec/10/1f967671966598366de42f07e92b0fc694ffc66eafa4b74131aeca84915f/orjson-3.11.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0b84455e60c4bc12c1e4cbaa5cfc1acdc7775a9da9cec040e17232f4b05458bd", size = 123745, upload-time = "2025-08-12T15:10:57.907Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a9/a3/6ea878e7b4a0dc5c888d0370d7752dcb23f402747d10e2257478d69b5e63/orjson-3.10.18-cp311-cp311-win32.whl", hash = "sha256:fdba703c722bd868c04702cac4cb8c6b8ff137af2623bc0ddb3b3e6a2c8996c1", size = 142695, upload-time = "2025-04-29T23:28:48.564Z" },
|
{ url = "https://files.pythonhosted.org/packages/43/eb/76081238671461cfd0f47e0c24f408ffa66184237d56ef18c33e86abb612/orjson-3.11.2-cp311-cp311-win32.whl", hash = "sha256:f0660efeac223f0731a70884e6914a5f04d613b5ae500744c43f7bf7b78f00f9", size = 124393, upload-time = "2025-08-12T15:10:59.267Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/79/2a/4048700a3233d562f0e90d5572a849baa18ae4e5ce4c3ba6247e4ece57b0/orjson-3.10.18-cp311-cp311-win_amd64.whl", hash = "sha256:c28082933c71ff4bc6ccc82a454a2bffcef6e1d7379756ca567c772e4fb3278a", size = 134603, upload-time = "2025-04-29T23:28:50.442Z" },
|
{ url = "https://files.pythonhosted.org/packages/26/76/cc598c1811ba9ba935171267b02e377fc9177489efce525d478a2999d9cc/orjson-3.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:955811c8405251d9e09cbe8606ad8fdef49a451bcf5520095a5ed38c669223d8", size = 119561, upload-time = "2025-08-12T15:11:00.559Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/03/45/10d934535a4993d27e1c84f1810e79ccf8b1b7418cef12151a22fe9bb1e1/orjson-3.10.18-cp311-cp311-win_arm64.whl", hash = "sha256:a6c7c391beaedd3fa63206e5c2b7b554196f14debf1ec9deb54b5d279b1b46f5", size = 131400, upload-time = "2025-04-29T23:28:51.838Z" },
|
{ url = "https://files.pythonhosted.org/packages/d8/17/c48011750f0489006f7617b0a3cebc8230f36d11a34e7e9aca2085f07792/orjson-3.11.2-cp311-cp311-win_arm64.whl", hash = "sha256:2e4d423a6f838552e3a6d9ec734b729f61f88b1124fd697eab82805ea1a2a97d", size = 114186, upload-time = "2025-08-12T15:11:01.931Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/21/1a/67236da0916c1a192d5f4ccbe10ec495367a726996ceb7614eaa687112f2/orjson-3.10.18-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:50c15557afb7f6d63bc6d6348e0337a880a04eaa9cd7c9d569bcb4e760a24753", size = 249184, upload-time = "2025-04-29T23:28:53.612Z" },
|
{ url = "https://files.pythonhosted.org/packages/40/02/46054ebe7996a8adee9640dcad7d39d76c2000dc0377efa38e55dc5cbf78/orjson-3.11.2-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:901d80d349d8452162b3aa1afb82cec5bee79a10550660bc21311cc61a4c5486", size = 226528, upload-time = "2025-08-12T15:11:03.317Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/b3/bc/c7f1db3b1d094dc0c6c83ed16b161a16c214aaa77f311118a93f647b32dc/orjson-3.10.18-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:356b076f1662c9813d5fa56db7d63ccceef4c271b1fb3dd522aca291375fcf17", size = 133279, upload-time = "2025-04-29T23:28:55.055Z" },
|
{ url = "https://files.pythonhosted.org/packages/e2/c6/6b6f0b4d8aea1137436546b990f71be2cd8bd870aa2f5aa14dba0fcc95dc/orjson-3.11.2-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:cf3bd3967a360e87ee14ed82cb258b7f18c710dacf3822fb0042a14313a673a1", size = 115931, upload-time = "2025-08-12T15:11:04.759Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/af/84/664657cd14cc11f0d81e80e64766c7ba5c9b7fc1ec304117878cc1b4659c/orjson-3.10.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:559eb40a70a7494cd5beab2d73657262a74a2c59aff2068fdba8f0424ec5b39d", size = 136799, upload-time = "2025-04-29T23:28:56.828Z" },
|
{ url = "https://files.pythonhosted.org/packages/ae/05/4205cc97c30e82a293dd0d149b1a89b138ebe76afeca66fc129fa2aa4e6a/orjson-3.11.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26693dde66910078229a943e80eeb99fdce6cd2c26277dc80ead9f3ab97d2131", size = 111382, upload-time = "2025-08-12T15:11:06.468Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/9a/bb/f50039c5bb05a7ab024ed43ba25d0319e8722a0ac3babb0807e543349978/orjson-3.10.18-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f3c29eb9a81e2fbc6fd7ddcfba3e101ba92eaff455b8d602bf7511088bbc0eae", size = 132791, upload-time = "2025-04-29T23:28:58.751Z" },
|
{ url = "https://files.pythonhosted.org/packages/50/c7/b8a951a93caa821f9272a7c917115d825ae2e4e8768f5ddf37968ec9de01/orjson-3.11.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4ad4c8acb50a28211c33fc7ef85ddf5cb18d4636a5205fd3fa2dce0411a0e30c", size = 116271, upload-time = "2025-08-12T15:11:07.845Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/93/8c/ee74709fc072c3ee219784173ddfe46f699598a1723d9d49cbc78d66df65/orjson-3.10.18-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6612787e5b0756a171c7d81ba245ef63a3533a637c335aa7fcb8e665f4a0966f", size = 137059, upload-time = "2025-04-29T23:29:00.129Z" },
|
{ url = "https://files.pythonhosted.org/packages/17/03/1006c7f8782d5327439e26d9b0ec66500ea7b679d4bbb6b891d2834ab3ee/orjson-3.11.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:994181e7f1725bb5f2d481d7d228738e0743b16bf319ca85c29369c65913df14", size = 119086, upload-time = "2025-08-12T15:11:09.329Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6a/37/e6d3109ee004296c80426b5a62b47bcadd96a3deab7443e56507823588c5/orjson-3.10.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ac6bd7be0dcab5b702c9d43d25e70eb456dfd2e119d512447468f6405b4a69c", size = 138359, upload-time = "2025-04-29T23:29:01.704Z" },
|
{ url = "https://files.pythonhosted.org/packages/44/61/57d22bc31f36a93878a6f772aea76b2184102c6993dea897656a66d18c74/orjson-3.11.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbb79a0476393c07656b69c8e763c3cc925fa8e1d9e9b7d1f626901bb5025448", size = 120724, upload-time = "2025-08-12T15:11:10.674Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4f/5d/387dafae0e4691857c62bd02839a3bf3fa648eebd26185adfac58d09f207/orjson-3.10.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9f72f100cee8dde70100406d5c1abba515a7df926d4ed81e20a9730c062fe9ad", size = 142853, upload-time = "2025-04-29T23:29:03.576Z" },
|
{ url = "https://files.pythonhosted.org/packages/78/a9/4550e96b4c490c83aea697d5347b8f7eb188152cd7b5a38001055ca5b379/orjson-3.11.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:191ed27a1dddb305083d8716af413d7219f40ec1d4c9b0e977453b4db0d6fb6c", size = 123577, upload-time = "2025-08-12T15:11:12.015Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/27/6f/875e8e282105350b9a5341c0222a13419758545ae32ad6e0fcf5f64d76aa/orjson-3.10.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dca85398d6d093dd41dc0983cbf54ab8e6afd1c547b6b8a311643917fbf4e0c", size = 133131, upload-time = "2025-04-29T23:29:05.753Z" },
|
{ url = "https://files.pythonhosted.org/packages/3a/86/09b8cb3ebd513d708ef0c92d36ac3eebda814c65c72137b0a82d6d688fc4/orjson-3.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0afb89f16f07220183fd00f5f297328ed0a68d8722ad1b0c8dcd95b12bc82804", size = 121195, upload-time = "2025-08-12T15:11:13.399Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/48/b2/73a1f0b4790dcb1e5a45f058f4f5dcadc8a85d90137b50d6bbc6afd0ae50/orjson-3.10.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22748de2a07fcc8781a70edb887abf801bb6142e6236123ff93d12d92db3d406", size = 134834, upload-time = "2025-04-29T23:29:07.35Z" },
|
{ url = "https://files.pythonhosted.org/packages/37/68/7b40b39ac2c1c644d4644e706d0de6c9999764341cd85f2a9393cb387661/orjson-3.11.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ab6e6b4e93b1573a026b6ec16fca9541354dd58e514b62c558b58554ae04307", size = 119234, upload-time = "2025-08-12T15:11:15.134Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/56/f5/7ed133a5525add9c14dbdf17d011dd82206ca6840811d32ac52a35935d19/orjson-3.10.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:3a83c9954a4107b9acd10291b7f12a6b29e35e8d43a414799906ea10e75438e6", size = 413368, upload-time = "2025-04-29T23:29:09.301Z" },
|
{ url = "https://files.pythonhosted.org/packages/40/7c/bb6e7267cd80c19023d44d8cbc4ea4ed5429fcd4a7eb9950f50305697a28/orjson-3.11.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9cb23527efb61fb75527df55d20ee47989c4ee34e01a9c98ee9ede232abf6219", size = 392250, upload-time = "2025-08-12T15:11:16.604Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/11/7c/439654221ed9c3324bbac7bdf94cf06a971206b7b62327f11a52544e4982/orjson-3.10.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:303565c67a6c7b1f194c94632a4a39918e067bd6176a48bec697393865ce4f06", size = 153359, upload-time = "2025-04-29T23:29:10.813Z" },
|
{ url = "https://files.pythonhosted.org/packages/64/f2/6730ace05583dbca7c1b406d59f4266e48cd0d360566e71482420fb849fc/orjson-3.11.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a4dd1268e4035af21b8a09e4adf2e61f87ee7bf63b86d7bb0a237ac03fad5b45", size = 134572, upload-time = "2025-08-12T15:11:18.205Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/48/e7/d58074fa0cc9dd29a8fa2a6c8d5deebdfd82c6cfef72b0e4277c4017563a/orjson-3.10.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:86314fdb5053a2f5a5d881f03fca0219bfdf832912aa88d18676a5175c6916b5", size = 137466, upload-time = "2025-04-29T23:29:12.26Z" },
|
{ url = "https://files.pythonhosted.org/packages/96/0f/7d3e03a30d5aac0432882b539a65b8c02cb6dd4221ddb893babf09c424cc/orjson-3.11.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff8b155b145eaf5a9d94d2c476fbe18d6021de93cf36c2ae2c8c5b775763f14e", size = 123869, upload-time = "2025-08-12T15:11:19.554Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/57/4d/fe17581cf81fb70dfcef44e966aa4003360e4194d15a3f38cbffe873333a/orjson-3.10.18-cp312-cp312-win32.whl", hash = "sha256:187ec33bbec58c76dbd4066340067d9ece6e10067bb0cc074a21ae3300caa84e", size = 142683, upload-time = "2025-04-29T23:29:13.865Z" },
|
{ url = "https://files.pythonhosted.org/packages/45/80/1513265eba6d4a960f078f4b1d2bff94a571ab2d28c6f9835e03dfc65cc6/orjson-3.11.2-cp312-cp312-win32.whl", hash = "sha256:ae3bb10279d57872f9aba68c9931aa71ed3b295fa880f25e68da79e79453f46e", size = 124430, upload-time = "2025-08-12T15:11:20.914Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e6/22/469f62d25ab5f0f3aee256ea732e72dc3aab6d73bac777bd6277955bceef/orjson-3.10.18-cp312-cp312-win_amd64.whl", hash = "sha256:f9f94cf6d3f9cd720d641f8399e390e7411487e493962213390d1ae45c7814fc", size = 134754, upload-time = "2025-04-29T23:29:15.338Z" },
|
{ url = "https://files.pythonhosted.org/packages/fb/61/eadf057b68a332351eeb3d89a4cc538d14f31cd8b5ec1b31a280426ccca2/orjson-3.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:d026e1967239ec11a2559b4146a61d13914504b396f74510a1c4d6b19dfd8732", size = 119598, upload-time = "2025-08-12T15:11:22.372Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/10/b0/1040c447fac5b91bc1e9c004b69ee50abb0c1ffd0d24406e1350c58a7fcb/orjson-3.10.18-cp312-cp312-win_arm64.whl", hash = "sha256:3d600be83fe4514944500fa8c2a0a77099025ec6482e8087d7659e891f23058a", size = 131218, upload-time = "2025-04-29T23:29:17.324Z" },
|
{ url = "https://files.pythonhosted.org/packages/6b/3f/7f4b783402143d965ab7e9a2fc116fdb887fe53bdce7d3523271cd106098/orjson-3.11.2-cp312-cp312-win_arm64.whl", hash = "sha256:59f8d5ad08602711af9589375be98477d70e1d102645430b5a7985fdbf613b36", size = 114052, upload-time = "2025-08-12T15:11:23.762Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/04/f0/8aedb6574b68096f3be8f74c0b56d36fd94bcf47e6c7ed47a7bd1474aaa8/orjson-3.10.18-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:69c34b9441b863175cc6a01f2935de994025e773f814412030f269da4f7be147", size = 249087, upload-time = "2025-04-29T23:29:19.083Z" },
|
{ url = "https://files.pythonhosted.org/packages/c2/f3/0dd6b4750eb556ae4e2c6a9cb3e219ec642e9c6d95f8ebe5dc9020c67204/orjson-3.11.2-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a079fdba7062ab396380eeedb589afb81dc6683f07f528a03b6f7aae420a0219", size = 226419, upload-time = "2025-08-12T15:11:25.517Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/bc/f7/7118f965541aeac6844fcb18d6988e111ac0d349c9b80cda53583e758908/orjson-3.10.18-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:1ebeda919725f9dbdb269f59bc94f861afbe2a27dce5608cdba2d92772364d1c", size = 133273, upload-time = "2025-04-29T23:29:20.602Z" },
|
{ url = "https://files.pythonhosted.org/packages/44/d5/e67f36277f78f2af8a4690e0c54da6b34169812f807fd1b4bfc4dbcf9558/orjson-3.11.2-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:6a5f62ebbc530bb8bb4b1ead103647b395ba523559149b91a6c545f7cd4110ad", size = 115803, upload-time = "2025-08-12T15:11:27.357Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/fb/d9/839637cc06eaf528dd8127b36004247bf56e064501f68df9ee6fd56a88ee/orjson-3.10.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5adf5f4eed520a4959d29ea80192fa626ab9a20b2ea13f8f6dc58644f6927103", size = 136779, upload-time = "2025-04-29T23:29:22.062Z" },
|
{ url = "https://files.pythonhosted.org/packages/24/37/ff8bc86e0dacc48f07c2b6e20852f230bf4435611bab65e3feae2b61f0ae/orjson-3.11.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7df6c7b8b0931feb3420b72838c3e2ba98c228f7aa60d461bc050cf4ca5f7b2", size = 111337, upload-time = "2025-08-12T15:11:28.805Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2b/6d/f226ecfef31a1f0e7d6bf9a31a0bbaf384c7cbe3fce49cc9c2acc51f902a/orjson-3.10.18-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7592bb48a214e18cd670974f289520f12b7aed1fa0b2e2616b8ed9e069e08595", size = 132811, upload-time = "2025-04-29T23:29:23.602Z" },
|
{ url = "https://files.pythonhosted.org/packages/b9/25/37d4d3e8079ea9784ea1625029988e7f4594ce50d4738b0c1e2bf4a9e201/orjson-3.11.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6f59dfea7da1fced6e782bb3699718088b1036cb361f36c6e4dd843c5111aefe", size = 116222, upload-time = "2025-08-12T15:11:30.18Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/73/2d/371513d04143c85b681cf8f3bce743656eb5b640cb1f461dad750ac4b4d4/orjson-3.10.18-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f872bef9f042734110642b7a11937440797ace8c87527de25e0c53558b579ccc", size = 137018, upload-time = "2025-04-29T23:29:25.094Z" },
|
{ url = "https://files.pythonhosted.org/packages/b7/32/a63fd9c07fce3b4193dcc1afced5dd4b0f3a24e27556604e9482b32189c9/orjson-3.11.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edf49146520fef308c31aa4c45b9925fd9c7584645caca7c0c4217d7900214ae", size = 119020, upload-time = "2025-08-12T15:11:31.59Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/69/cb/a4d37a30507b7a59bdc484e4a3253c8141bf756d4e13fcc1da760a0b00cb/orjson-3.10.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0315317601149c244cb3ecef246ef5861a64824ccbcb8018d32c66a60a84ffbc", size = 138368, upload-time = "2025-04-29T23:29:26.609Z" },
|
{ url = "https://files.pythonhosted.org/packages/b4/b6/400792b8adc3079a6b5d649264a3224d6342436d9fac9a0ed4abc9dc4596/orjson-3.11.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50995bbeb5d41a32ad15e023305807f561ac5dcd9bd41a12c8d8d1d2c83e44e6", size = 120721, upload-time = "2025-08-12T15:11:33.035Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/1e/ae/cd10883c48d912d216d541eb3db8b2433415fde67f620afe6f311f5cd2ca/orjson-3.10.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0da26957e77e9e55a6c2ce2e7182a36a6f6b180ab7189315cb0995ec362e049", size = 142840, upload-time = "2025-04-29T23:29:28.153Z" },
|
{ url = "https://files.pythonhosted.org/packages/40/f3/31ab8f8c699eb9e65af8907889a0b7fef74c1d2b23832719a35da7bb0c58/orjson-3.11.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2cc42960515076eb639b705f105712b658c525863d89a1704d984b929b0577d1", size = 123574, upload-time = "2025-08-12T15:11:34.433Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6d/4c/2bda09855c6b5f2c055034c9eda1529967b042ff8d81a05005115c4e6772/orjson-3.10.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb70d489bc79b7519e5803e2cc4c72343c9dc1154258adf2f8925d0b60da7c58", size = 133135, upload-time = "2025-04-29T23:29:29.726Z" },
|
{ url = "https://files.pythonhosted.org/packages/bd/a6/ce4287c412dff81878f38d06d2c80845709c60012ca8daf861cb064b4574/orjson-3.11.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c56777cab2a7b2a8ea687fedafb84b3d7fdafae382165c31a2adf88634c432fa", size = 121225, upload-time = "2025-08-12T15:11:36.133Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/13/4a/35971fd809a8896731930a80dfff0b8ff48eeb5d8b57bb4d0d525160017f/orjson-3.10.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e9e86a6af31b92299b00736c89caf63816f70a4001e750bda179e15564d7a034", size = 134810, upload-time = "2025-04-29T23:29:31.269Z" },
|
{ url = "https://files.pythonhosted.org/packages/69/b0/7a881b2aef4fed0287d2a4fbb029d01ed84fa52b4a68da82bdee5e50598e/orjson-3.11.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:07349e88025b9b5c783077bf7a9f401ffbfb07fd20e86ec6fc5b7432c28c2c5e", size = 119201, upload-time = "2025-08-12T15:11:37.642Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/99/70/0fa9e6310cda98365629182486ff37a1c6578e34c33992df271a476ea1cd/orjson-3.10.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:c382a5c0b5931a5fc5405053d36c1ce3fd561694738626c77ae0b1dfc0242ca1", size = 413491, upload-time = "2025-04-29T23:29:33.315Z" },
|
{ url = "https://files.pythonhosted.org/packages/cf/98/a325726b37f7512ed6338e5e65035c3c6505f4e628b09a5daf0419f054ea/orjson-3.11.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:45841fbb79c96441a8c58aa29ffef570c5df9af91f0f7a9572e5505e12412f15", size = 392193, upload-time = "2025-08-12T15:11:39.153Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/32/cb/990a0e88498babddb74fb97855ae4fbd22a82960e9b06eab5775cac435da/orjson-3.10.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8e4b2ae732431127171b875cb2668f883e1234711d3c147ffd69fe5be51a8012", size = 153277, upload-time = "2025-04-29T23:29:34.946Z" },
|
{ url = "https://files.pythonhosted.org/packages/cb/4f/a7194f98b0ce1d28190e0c4caa6d091a3fc8d0107ad2209f75c8ba398984/orjson-3.11.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13d8d8db6cd8d89d4d4e0f4161acbbb373a4d2a4929e862d1d2119de4aa324ac", size = 134548, upload-time = "2025-08-12T15:11:40.768Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/92/44/473248c3305bf782a384ed50dd8bc2d3cde1543d107138fd99b707480ca1/orjson-3.10.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2d808e34ddb24fc29a4d4041dcfafbae13e129c93509b847b14432717d94b44f", size = 137367, upload-time = "2025-04-29T23:29:36.52Z" },
|
{ url = "https://files.pythonhosted.org/packages/e8/5e/b84caa2986c3f472dc56343ddb0167797a708a8d5c3be043e1e2677b55df/orjson-3.11.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51da1ee2178ed09c00d09c1b953e45846bbc16b6420965eb7a913ba209f606d8", size = 123798, upload-time = "2025-08-12T15:11:42.164Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ad/fd/7f1d3edd4ffcd944a6a40e9f88af2197b619c931ac4d3cfba4798d4d3815/orjson-3.10.18-cp313-cp313-win32.whl", hash = "sha256:ad8eacbb5d904d5591f27dee4031e2c1db43d559edb8f91778efd642d70e6bea", size = 142687, upload-time = "2025-04-29T23:29:38.292Z" },
|
{ url = "https://files.pythonhosted.org/packages/9c/5b/e398449080ce6b4c8fcadad57e51fa16f65768e1b142ba90b23ac5d10801/orjson-3.11.2-cp313-cp313-win32.whl", hash = "sha256:51dc033df2e4a4c91c0ba4f43247de99b3cbf42ee7a42ee2b2b2f76c8b2f2cb5", size = 124402, upload-time = "2025-08-12T15:11:44.036Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4b/03/c75c6ad46be41c16f4cfe0352a2d1450546f3c09ad2c9d341110cd87b025/orjson-3.10.18-cp313-cp313-win_amd64.whl", hash = "sha256:aed411bcb68bf62e85588f2a7e03a6082cc42e5a2796e06e72a962d7c6310b52", size = 134794, upload-time = "2025-04-29T23:29:40.349Z" },
|
{ url = "https://files.pythonhosted.org/packages/b3/66/429e4608e124debfc4790bfc37131f6958e59510ba3b542d5fc163be8e5f/orjson-3.11.2-cp313-cp313-win_amd64.whl", hash = "sha256:29d91d74942b7436f29b5d1ed9bcfc3f6ef2d4f7c4997616509004679936650d", size = 119498, upload-time = "2025-08-12T15:11:45.864Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c2/28/f53038a5a72cc4fd0b56c1eafb4ef64aec9685460d5ac34de98ca78b6e29/orjson-3.10.18-cp313-cp313-win_arm64.whl", hash = "sha256:f54c1385a0e6aba2f15a40d703b858bedad36ded0491e55d35d905b2c34a4cc3", size = 131186, upload-time = "2025-04-29T23:29:41.922Z" },
|
{ url = "https://files.pythonhosted.org/packages/7b/04/f8b5f317cce7ad3580a9ad12d7e2df0714dfa8a83328ecddd367af802f5b/orjson-3.11.2-cp313-cp313-win_arm64.whl", hash = "sha256:4ca4fb5ac21cd1e48028d4f708b1bb13e39c42d45614befd2ead004a8bba8535", size = 114051, upload-time = "2025-08-12T15:11:47.555Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/df/db/69488acaa2316788b7e171f024912c6fe8193aa2e24e9cfc7bc41c3669ba/orjson-3.10.18-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c95fae14225edfd699454e84f61c3dd938df6629a00c6ce15e704f57b58433bb", size = 249301, upload-time = "2025-04-29T23:29:44.719Z" },
|
{ url = "https://files.pythonhosted.org/packages/74/83/2c363022b26c3c25b3708051a19d12f3374739bb81323f05b284392080c0/orjson-3.11.2-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:3dcba7101ea6a8d4ef060746c0f2e7aa8e2453a1012083e1ecce9726d7554cb7", size = 226406, upload-time = "2025-08-12T15:11:49.445Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/23/21/d816c44ec5d1482c654e1d23517d935bb2716e1453ff9380e861dc6efdd3/orjson-3.10.18-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5232d85f177f98e0cefabb48b5e7f60cff6f3f0365f9c60631fecd73849b2a82", size = 136786, upload-time = "2025-04-29T23:29:46.517Z" },
|
{ url = "https://files.pythonhosted.org/packages/b0/a7/aa3c973de0b33fc93b4bd71691665ffdfeae589ea9d0625584ab10a7d0f5/orjson-3.11.2-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:15d17bdb76a142e1f55d91913e012e6e6769659daa6bfef3ef93f11083137e81", size = 115788, upload-time = "2025-08-12T15:11:50.992Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a5/9f/f68d8a9985b717e39ba7bf95b57ba173fcd86aeca843229ec60d38f1faa7/orjson-3.10.18-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2783e121cafedf0d85c148c248a20470018b4ffd34494a68e125e7d5857655d1", size = 132711, upload-time = "2025-04-29T23:29:48.605Z" },
|
{ url = "https://files.pythonhosted.org/packages/ef/f2/e45f233dfd09fdbb052ec46352363dca3906618e1a2b264959c18f809d0b/orjson-3.11.2-cp314-cp314-manylinux_2_34_aarch64.whl", hash = "sha256:53c9e81768c69d4b66b8876ec3c8e431c6e13477186d0db1089d82622bccd19f", size = 111318, upload-time = "2025-08-12T15:11:52.495Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/b5/63/447f5955439bf7b99bdd67c38a3f689d140d998ac58e3b7d57340520343c/orjson-3.10.18-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e54ee3722caf3db09c91f442441e78f916046aa58d16b93af8a91500b7bbf273", size = 136841, upload-time = "2025-04-29T23:29:50.31Z" },
|
{ url = "https://files.pythonhosted.org/packages/3e/23/cf5a73c4da6987204cbbf93167f353ff0c5013f7c5e5ef845d4663a366da/orjson-3.11.2-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:d4f13af59a7b84c1ca6b8a7ab70d608f61f7c44f9740cd42409e6ae7b6c8d8b7", size = 121231, upload-time = "2025-08-12T15:11:53.941Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/68/9e/4855972f2be74097242e4681ab6766d36638a079e09d66f3d6a5d1188ce7/orjson-3.10.18-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2daf7e5379b61380808c24f6fc182b7719301739e4271c3ec88f2984a2d61f89", size = 138082, upload-time = "2025-04-29T23:29:51.992Z" },
|
{ url = "https://files.pythonhosted.org/packages/40/1d/47468a398ae68a60cc21e599144e786e035bb12829cb587299ecebc088f1/orjson-3.11.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bde64aa469b5ee46cc960ed241fae3721d6a8801dacb2ca3466547a2535951e4", size = 119204, upload-time = "2025-08-12T15:11:55.409Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/08/0f/e68431e53a39698d2355faf1f018c60a3019b4b54b4ea6be9dc6b8208a3d/orjson-3.10.18-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f39b371af3add20b25338f4b29a8d6e79a8c7ed0e9dd49e008228a065d07781", size = 142618, upload-time = "2025-04-29T23:29:53.642Z" },
|
{ url = "https://files.pythonhosted.org/packages/4d/d9/f99433d89b288b5bc8836bffb32a643f805e673cf840ef8bab6e73ced0d1/orjson-3.11.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:b5ca86300aeb383c8fa759566aca065878d3d98c3389d769b43f0a2e84d52c5f", size = 392237, upload-time = "2025-08-12T15:11:57.18Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/32/da/bdcfff239ddba1b6ef465efe49d7e43cc8c30041522feba9fd4241d47c32/orjson-3.10.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b819ed34c01d88c6bec290e6842966f8e9ff84b7694632e88341363440d4cc0", size = 132627, upload-time = "2025-04-29T23:29:55.318Z" },
|
{ url = "https://files.pythonhosted.org/packages/d4/dc/1b9d80d40cebef603325623405136a29fb7d08c877a728c0943dd066c29a/orjson-3.11.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:24e32a558ebed73a6a71c8f1cbc163a7dd5132da5270ff3d8eeb727f4b6d1bc7", size = 134578, upload-time = "2025-08-12T15:11:58.844Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/0c/28/bc634da09bbe972328f615b0961f1e7d91acb3cc68bddbca9e8dd64e8e24/orjson-3.10.18-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2f6c57debaef0b1aa13092822cbd3698a1fb0209a9ea013a969f4efa36bdea57", size = 134832, upload-time = "2025-04-29T23:29:56.985Z" },
|
{ url = "https://files.pythonhosted.org/packages/45/b3/72e7a4c5b6485ef4e83ef6aba7f1dd041002bad3eb5d1d106ca5b0fc02c6/orjson-3.11.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e36319a5d15b97e4344110517450396845cc6789aed712b1fbf83c1bd95792f6", size = 123799, upload-time = "2025-08-12T15:12:00.352Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/1d/d2/e8ac0c2d0ec782ed8925b4eb33f040cee1f1fbd1d8b268aeb84b94153e49/orjson-3.10.18-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:755b6d61ffdb1ffa1e768330190132e21343757c9aa2308c67257cc81a1a6f5a", size = 413161, upload-time = "2025-04-29T23:29:59.148Z" },
|
{ url = "https://files.pythonhosted.org/packages/c8/3e/a3d76b392e7acf9b34dc277171aad85efd6accc75089bb35b4c614990ea9/orjson-3.11.2-cp314-cp314-win32.whl", hash = "sha256:40193ada63fab25e35703454d65b6afc71dbc65f20041cb46c6d91709141ef7f", size = 124461, upload-time = "2025-08-12T15:12:01.854Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/28/f0/397e98c352a27594566e865999dc6b88d6f37d5bbb87b23c982af24114c4/orjson-3.10.18-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce8d0a875a85b4c8579eab5ac535fb4b2a50937267482be402627ca7e7570ee3", size = 153012, upload-time = "2025-04-29T23:30:01.066Z" },
|
{ url = "https://files.pythonhosted.org/packages/fb/e3/75c6a596ff8df9e4a5894813ff56695f0a218e6ea99420b4a645c4f7795d/orjson-3.11.2-cp314-cp314-win_amd64.whl", hash = "sha256:7c8ac5f6b682d3494217085cf04dadae66efee45349ad4ee2a1da3c97e2305a8", size = 119494, upload-time = "2025-08-12T15:12:03.337Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/93/bf/2c7334caeb48bdaa4cae0bde17ea417297ee136598653b1da7ae1f98c785/orjson-3.10.18-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57b5d0673cbd26781bebc2bf86f99dd19bd5a9cb55f71cc4f66419f6b50f3d77", size = 136999, upload-time = "2025-04-29T23:30:02.93Z" },
|
{ url = "https://files.pythonhosted.org/packages/5b/3d/9e74742fc261c5ca473c96bb3344d03995869e1dc6402772c60afb97736a/orjson-3.11.2-cp314-cp314-win_arm64.whl", hash = "sha256:21cf261e8e79284242e4cb1e5924df16ae28255184aafeff19be1405f6d33f67", size = 114046, upload-time = "2025-08-12T15:12:04.87Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/35/72/4827b1c0c31621c2aa1e661a899cdd2cfac0565c6cd7131890daa4ef7535/orjson-3.10.18-cp39-cp39-win32.whl", hash = "sha256:951775d8b49d1d16ca8818b1f20c4965cae9157e7b562a2ae34d3967b8f21c8e", size = 142560, upload-time = "2025-04-29T23:30:04.805Z" },
|
{ url = "https://files.pythonhosted.org/packages/4f/08/8ebc6dcac0938376b7e61dff432c33958505ae4c185dda3fa1e6f46ac40b/orjson-3.11.2-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:957f10c7b5bce3d3f2ad577f3b307c784f5dabafcce3b836229c269c11841c86", size = 226498, upload-time = "2025-08-12T15:12:06.51Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/72/91/ef8e76868e7eed478887c82f60607a8abf58dadd24e95817229a4b2e2639/orjson-3.10.18-cp39-cp39-win_amd64.whl", hash = "sha256:fdd9d68f83f0bc4406610b1ac68bdcded8c5ee58605cc69e643a06f4d075f429", size = 134455, upload-time = "2025-04-29T23:30:06.588Z" },
|
{ url = "https://files.pythonhosted.org/packages/ff/74/a97c8e2bc75a27dfeeb1b289645053f1889125447f3b7484a2e34ac55d2a/orjson-3.11.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a669e31ab8eb466c9142ac7a4be2bb2758ad236a31ef40dcd4cf8774ab40f33", size = 111529, upload-time = "2025-08-12T15:12:08.21Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/78/c3/55121b5722a1a4e4610a411866cfeada5314dc498cd42435b590353009d2/orjson-3.11.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:adedf7d887416c51ad49de3c53b111887e0b63db36c6eb9f846a8430952303d8", size = 116213, upload-time = "2025-08-12T15:12:09.776Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/54/d3/1c810fa36a749157f1ec68f825b09d5b6958ed5eaf66c7b89bc0f1656517/orjson-3.11.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ad8873979659ad98fc56377b9c5b93eb8059bf01e6412f7abf7dbb3d637a991", size = 118594, upload-time = "2025-08-12T15:12:11.363Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/09/9c/052a6619857aba27899246c1ac9e1566fe976dbb48c2d2d177eb269e6d92/orjson-3.11.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9482ef83b2bf796157566dd2d2742a8a1e377045fe6065fa67acb1cb1d21d9a3", size = 120706, upload-time = "2025-08-12T15:12:13.265Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/4b/91/ed0632b8bafa5534d40483ca14f4b7b7e8f27a016f52ff771420b3591574/orjson-3.11.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73cee7867c1fcbd1cc5b6688b3e13db067f968889242955780123a68b3d03316", size = 123412, upload-time = "2025-08-12T15:12:14.807Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/90/3d/058184ae52a2035098939329f8864c5e28c3bbd660f80d4f687f4fd3e629/orjson-3.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:465166773265f3cc25db10199f5d11c81898a309e26a2481acf33ddbec433fda", size = 121011, upload-time = "2025-08-12T15:12:16.352Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/57/ab/70e7a2c26a29878ad81ac551f3d11e184efafeed92c2ea15301ac71e2b44/orjson-3.11.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc000190a7b1d2d8e36cba990b3209a1e15c0efb6c7750e87f8bead01afc0d46", size = 119387, upload-time = "2025-08-12T15:12:17.88Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6f/f1/532be344579590c2faa3d9926ec446e8e030d6d04359a8d6f9b3f4d18283/orjson-3.11.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:df3fdd8efa842ccbb81135d6f58a73512f11dba02ed08d9466261c2e9417af4e", size = 392280, upload-time = "2025-08-12T15:12:20.3Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/eb/90/dfb90d82ee7447ba0c5315b1012f36336d34a4b468f5896092926eb2921b/orjson-3.11.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3dacfc621be3079ec69e0d4cb32e3764067726e0ef5a5576428f68b6dc85b4f6", size = 134127, upload-time = "2025-08-12T15:12:22.053Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/17/cb/d113d03dfaee4933b0f6e0f3d358886db1468302bb74f1f3c59d9229ce12/orjson-3.11.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9fdff73a029cde5f4a1cf5ec9dbc6acab98c9ddd69f5580c2b3f02ce43ba9f9f", size = 123722, upload-time = "2025-08-12T15:12:23.642Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/55/78/a89748f500d7cf909fe0b30093ab87d256c279106048e985269a5530c0a1/orjson-3.11.2-cp39-cp39-win32.whl", hash = "sha256:b1efbdc479c6451138c3733e415b4d0e16526644e54e2f3689f699c4cda303bf", size = 124391, upload-time = "2025-08-12T15:12:25.143Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e8/50/e436f1356650cf96ff62c386dbfeb9ef8dd9cd30c4296103244e7fae2d15/orjson-3.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:c9ec0cc0d4308cad1e38a1ee23b64567e2ff364c2a3fe3d6cbc69cf911c45712", size = 119547, upload-time = "2025-08-12T15:12:26.77Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -343,15 +368,16 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pytest-asyncio"
|
name = "pytest-asyncio"
|
||||||
version = "1.0.0"
|
version = "1.1.0"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
{ name = "backports-asyncio-runner", marker = "python_full_version < '3.11'" },
|
||||||
{ name = "pytest" },
|
{ name = "pytest" },
|
||||||
{ name = "typing-extensions", marker = "python_full_version < '3.10'" },
|
{ name = "typing-extensions", marker = "python_full_version < '3.10'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/d0/d4/14f53324cb1a6381bef29d698987625d80052bb33932d8e7cbf9b337b17c/pytest_asyncio-1.0.0.tar.gz", hash = "sha256:d15463d13f4456e1ead2594520216b225a16f781e144f8fdf6c5bb4667c48b3f", size = 46960, upload-time = "2025-05-26T04:54:40.484Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/4e/51/f8794af39eeb870e87a8c8068642fc07bce0c854d6865d7dd0f2a9d338c2/pytest_asyncio-1.1.0.tar.gz", hash = "sha256:796aa822981e01b68c12e4827b8697108f7205020f24b5793b3c41555dab68ea", size = 46652, upload-time = "2025-07-16T04:29:26.393Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/30/05/ce271016e351fddc8399e546f6e23761967ee09c8c568bbfbecb0c150171/pytest_asyncio-1.0.0-py3-none-any.whl", hash = "sha256:4f024da9f1ef945e680dc68610b52550e36590a67fd31bb3b4943979a1f90ef3", size = 15976, upload-time = "2025-05-26T04:54:39.035Z" },
|
{ url = "https://files.pythonhosted.org/packages/c7/9d/bf86eddabf8c6c9cb1ea9a869d6873b46f105a5d292d3a6f7071f5b07935/pytest_asyncio-1.1.0-py3-none-any.whl", hash = "sha256:5fe2d69607b0bd75c656d1211f969cadba035030156745ee09e7d71740e58ecf", size = 15157, upload-time = "2025-07-16T04:29:24.929Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -380,27 +406,28 @@ sdist = { url = "https://files.pythonhosted.org/packages/36/47/ab65fc1d682befc31
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruff"
|
name = "ruff"
|
||||||
version = "0.12.3"
|
version = "0.12.9"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/c3/2a/43955b530c49684d3c38fcda18c43caf91e99204c2a065552528e0552d4f/ruff-0.12.3.tar.gz", hash = "sha256:f1b5a4b6668fd7b7ea3697d8d98857390b40c1320a63a178eee6be0899ea2d77", size = 4459341, upload-time = "2025-07-11T13:21:16.086Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/4a/45/2e403fa7007816b5fbb324cb4f8ed3c7402a927a0a0cb2b6279879a8bfdc/ruff-0.12.9.tar.gz", hash = "sha256:fbd94b2e3c623f659962934e52c2bea6fc6da11f667a427a368adaf3af2c866a", size = 5254702, upload-time = "2025-08-14T16:08:55.2Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/e2/fd/b44c5115539de0d598d75232a1cc7201430b6891808df111b8b0506aae43/ruff-0.12.3-py3-none-linux_armv6l.whl", hash = "sha256:47552138f7206454eaf0c4fe827e546e9ddac62c2a3d2585ca54d29a890137a2", size = 10430499, upload-time = "2025-07-11T13:20:26.321Z" },
|
{ url = "https://files.pythonhosted.org/packages/ad/20/53bf098537adb7b6a97d98fcdebf6e916fcd11b2e21d15f8c171507909cc/ruff-0.12.9-py3-none-linux_armv6l.whl", hash = "sha256:fcebc6c79fcae3f220d05585229463621f5dbf24d79fdc4936d9302e177cfa3e", size = 11759705, upload-time = "2025-08-14T16:08:12.968Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/43/c5/9eba4f337970d7f639a37077be067e4ec80a2ad359e4cc6c5b56805cbc66/ruff-0.12.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0a9153b000c6fe169bb307f5bd1b691221c4286c133407b8827c406a55282041", size = 11213413, upload-time = "2025-07-11T13:20:30.017Z" },
|
{ url = "https://files.pythonhosted.org/packages/20/4d/c764ee423002aac1ec66b9d541285dd29d2c0640a8086c87de59ebbe80d5/ruff-0.12.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aed9d15f8c5755c0e74467731a007fcad41f19bcce41cd75f768bbd687f8535f", size = 12527042, upload-time = "2025-08-14T16:08:16.54Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e2/2c/fac3016236cf1fe0bdc8e5de4f24c76ce53c6dd9b5f350d902549b7719b2/ruff-0.12.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fa6b24600cf3b750e48ddb6057e901dd5b9aa426e316addb2a1af185a7509882", size = 10586941, upload-time = "2025-07-11T13:20:33.046Z" },
|
{ url = "https://files.pythonhosted.org/packages/8b/45/cfcdf6d3eb5fc78a5b419e7e616d6ccba0013dc5b180522920af2897e1be/ruff-0.12.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5b15ea354c6ff0d7423814ba6d44be2807644d0c05e9ed60caca87e963e93f70", size = 11724457, upload-time = "2025-08-14T16:08:18.686Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c5/0f/41fec224e9dfa49a139f0b402ad6f5d53696ba1800e0f77b279d55210ca9/ruff-0.12.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2506961bf6ead54887ba3562604d69cb430f59b42133d36976421bc8bd45901", size = 10783001, upload-time = "2025-07-11T13:20:35.534Z" },
|
{ url = "https://files.pythonhosted.org/packages/72/e6/44615c754b55662200c48bebb02196dbb14111b6e266ab071b7e7297b4ec/ruff-0.12.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d596c2d0393c2502eaabfef723bd74ca35348a8dac4267d18a94910087807c53", size = 11949446, upload-time = "2025-08-14T16:08:21.059Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/0d/ca/dd64a9ce56d9ed6cad109606ac014860b1c217c883e93bf61536400ba107/ruff-0.12.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c4faaff1f90cea9d3033cbbcdf1acf5d7fb11d8180758feb31337391691f3df0", size = 10269641, upload-time = "2025-07-11T13:20:38.459Z" },
|
{ url = "https://files.pythonhosted.org/packages/fd/d1/9b7d46625d617c7df520d40d5ac6cdcdf20cbccb88fad4b5ecd476a6bb8d/ruff-0.12.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1b15599931a1a7a03c388b9c5df1bfa62be7ede6eb7ef753b272381f39c3d0ff", size = 11566350, upload-time = "2025-08-14T16:08:23.433Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/63/5c/2be545034c6bd5ce5bb740ced3e7014d7916f4c445974be11d2a406d5088/ruff-0.12.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40dced4a79d7c264389de1c59467d5d5cefd79e7e06d1dfa2c75497b5269a5a6", size = 11875059, upload-time = "2025-07-11T13:20:41.517Z" },
|
{ url = "https://files.pythonhosted.org/packages/59/20/b73132f66f2856bc29d2d263c6ca457f8476b0bbbe064dac3ac3337a270f/ruff-0.12.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d02faa2977fb6f3f32ddb7828e212b7dd499c59eb896ae6c03ea5c303575756", size = 13270430, upload-time = "2025-08-14T16:08:25.837Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8e/d4/a74ef1e801ceb5855e9527dae105eaff136afcb9cc4d2056d44feb0e4792/ruff-0.12.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:0262d50ba2767ed0fe212aa7e62112a1dcbfd46b858c5bf7bbd11f326998bafc", size = 12658890, upload-time = "2025-07-11T13:20:44.442Z" },
|
{ url = "https://files.pythonhosted.org/packages/a2/21/eaf3806f0a3d4c6be0a69d435646fba775b65f3f2097d54898b0fd4bb12e/ruff-0.12.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:17d5b6b0b3a25259b69ebcba87908496e6830e03acfb929ef9fd4c58675fa2ea", size = 14264717, upload-time = "2025-08-14T16:08:27.907Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/13/c8/1057916416de02e6d7c9bcd550868a49b72df94e3cca0aeb77457dcd9644/ruff-0.12.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12371aec33e1a3758597c5c631bae9a5286f3c963bdfb4d17acdd2d395406687", size = 12232008, upload-time = "2025-07-11T13:20:47.374Z" },
|
{ url = "https://files.pythonhosted.org/packages/d2/82/1d0c53bd37dcb582b2c521d352fbf4876b1e28bc0d8894344198f6c9950d/ruff-0.12.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:72db7521860e246adbb43f6ef464dd2a532ef2ef1f5dd0d470455b8d9f1773e0", size = 13684331, upload-time = "2025-08-14T16:08:30.352Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f5/59/4f7c130cc25220392051fadfe15f63ed70001487eca21d1796db46cbcc04/ruff-0.12.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:560f13b6baa49785665276c963edc363f8ad4b4fc910a883e2625bdb14a83a9e", size = 11499096, upload-time = "2025-07-11T13:20:50.348Z" },
|
{ url = "https://files.pythonhosted.org/packages/3b/2f/1c5cf6d8f656306d42a686f1e207f71d7cebdcbe7b2aa18e4e8a0cb74da3/ruff-0.12.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a03242c1522b4e0885af63320ad754d53983c9599157ee33e77d748363c561ce", size = 12739151, upload-time = "2025-08-14T16:08:32.55Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d4/01/a0ad24a5d2ed6be03a312e30d32d4e3904bfdbc1cdbe63c47be9d0e82c79/ruff-0.12.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023040a3499f6f974ae9091bcdd0385dd9e9eb4942f231c23c57708147b06311", size = 11688307, upload-time = "2025-07-11T13:20:52.945Z" },
|
{ url = "https://files.pythonhosted.org/packages/47/09/25033198bff89b24d734e6479e39b1968e4c992e82262d61cdccaf11afb9/ruff-0.12.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fc83e4e9751e6c13b5046d7162f205d0a7bac5840183c5beebf824b08a27340", size = 12954992, upload-time = "2025-08-14T16:08:34.816Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/93/72/08f9e826085b1f57c9a0226e48acb27643ff19b61516a34c6cab9d6ff3fa/ruff-0.12.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:883d844967bffff5ab28bba1a4d246c1a1b2933f48cb9840f3fdc5111c603b07", size = 10661020, upload-time = "2025-07-11T13:20:55.799Z" },
|
{ url = "https://files.pythonhosted.org/packages/52/8e/d0dbf2f9dca66c2d7131feefc386523404014968cd6d22f057763935ab32/ruff-0.12.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:881465ed56ba4dd26a691954650de6ad389a2d1fdb130fe51ff18a25639fe4bb", size = 12899569, upload-time = "2025-08-14T16:08:36.852Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/80/a0/68da1250d12893466c78e54b4a0ff381370a33d848804bb51279367fc688/ruff-0.12.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2120d3aa855ff385e0e562fdee14d564c9675edbe41625c87eeab744a7830d12", size = 10246300, upload-time = "2025-07-11T13:20:58.222Z" },
|
{ url = "https://files.pythonhosted.org/packages/a0/bd/b614d7c08515b1428ed4d3f1d4e3d687deffb2479703b90237682586fa66/ruff-0.12.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:43f07a3ccfc62cdb4d3a3348bf0588358a66da756aa113e071b8ca8c3b9826af", size = 11751983, upload-time = "2025-08-14T16:08:39.314Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6a/22/5f0093d556403e04b6fd0984fc0fb32fbb6f6ce116828fd54306a946f444/ruff-0.12.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6b16647cbb470eaf4750d27dddc6ebf7758b918887b56d39e9c22cce2049082b", size = 11263119, upload-time = "2025-07-11T13:21:01.503Z" },
|
{ url = "https://files.pythonhosted.org/packages/58/d6/383e9f818a2441b1a0ed898d7875f11273f10882f997388b2b51cb2ae8b5/ruff-0.12.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:07adb221c54b6bba24387911e5734357f042e5669fa5718920ee728aba3cbadc", size = 11538635, upload-time = "2025-08-14T16:08:41.297Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/92/c9/f4c0b69bdaffb9968ba40dd5fa7df354ae0c73d01f988601d8fac0c639b1/ruff-0.12.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e1417051edb436230023575b149e8ff843a324557fe0a265863b7602df86722f", size = 11746990, upload-time = "2025-07-11T13:21:04.524Z" },
|
{ url = "https://files.pythonhosted.org/packages/20/9c/56f869d314edaa9fc1f491706d1d8a47747b9d714130368fbd69ce9024e9/ruff-0.12.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f5cd34fabfdea3933ab85d72359f118035882a01bff15bd1d2b15261d85d5f66", size = 12534346, upload-time = "2025-08-14T16:08:43.39Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/fe/84/7cc7bd73924ee6be4724be0db5414a4a2ed82d06b30827342315a1be9e9c/ruff-0.12.3-py3-none-win32.whl", hash = "sha256:dfd45e6e926deb6409d0616078a666ebce93e55e07f0fb0228d4b2608b2c248d", size = 10589263, upload-time = "2025-07-11T13:21:07.148Z" },
|
{ url = "https://files.pythonhosted.org/packages/bd/4b/d8b95c6795a6c93b439bc913ee7a94fda42bb30a79285d47b80074003ee7/ruff-0.12.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f6be1d2ca0686c54564da8e7ee9e25f93bdd6868263805f8c0b8fc6a449db6d7", size = 13017021, upload-time = "2025-08-14T16:08:45.889Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/07/87/c070f5f027bd81f3efee7d14cb4d84067ecf67a3a8efb43aadfc72aa79a6/ruff-0.12.3-py3-none-win_amd64.whl", hash = "sha256:a946cf1e7ba3209bdef039eb97647f1c77f6f540e5845ec9c114d3af8df873e7", size = 11695072, upload-time = "2025-07-11T13:21:11.004Z" },
|
{ url = "https://files.pythonhosted.org/packages/c7/c1/5f9a839a697ce1acd7af44836f7c2181cdae5accd17a5cb85fcbd694075e/ruff-0.12.9-py3-none-win32.whl", hash = "sha256:cc7a37bd2509974379d0115cc5608a1a4a6c4bff1b452ea69db83c8855d53f93", size = 11734785, upload-time = "2025-08-14T16:08:48.062Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e0/30/f3eaf6563c637b6e66238ed6535f6775480db973c836336e4122161986fc/ruff-0.12.3-py3-none-win_arm64.whl", hash = "sha256:5f9c7c9c8f84c2d7f27e93674d27136fbf489720251544c4da7fb3d742e011b1", size = 10805855, upload-time = "2025-07-11T13:21:13.547Z" },
|
{ url = "https://files.pythonhosted.org/packages/fa/66/cdddc2d1d9a9f677520b7cfc490d234336f523d4b429c1298de359a3be08/ruff-0.12.9-py3-none-win_amd64.whl", hash = "sha256:6fb15b1977309741d7d098c8a3cb7a30bc112760a00fb6efb7abc85f00ba5908", size = 12840654, upload-time = "2025-08-14T16:08:50.158Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ac/fd/669816bc6b5b93b9586f3c1d87cd6bc05028470b3ecfebb5938252c47a35/ruff-0.12.9-py3-none-win_arm64.whl", hash = "sha256:63c8c819739d86b96d500cce885956a1a48ab056bbcbc61b747ad494b2485089", size = 11949623, upload-time = "2025-08-14T16:08:52.233Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|||||||
Reference in New Issue
Block a user