diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index eff3887..86cb69a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -24,7 +24,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: [ 3.9, '3.10', 3.11, 3.12, 3.13 ] + python-version: [ '3.10', 3.11, 3.12, 3.13 ] redis-version: [ '6.2.6-v9', 'latest', '8.0.2' ] steps: diff --git a/MIGRATION.md b/MIGRATION_0.1.0.md similarity index 97% rename from MIGRATION.md rename to MIGRATION_0.1.0.md index 4c34b2b..71c56fa 100644 --- a/MIGRATION.md +++ b/MIGRATION_0.1.0.md @@ -24,14 +24,16 @@ This library is currently at version 0.1.0. As the library evolves, the followin The library uses structured Redis key patterns: **Standard RedisSaver (full history):** -``` + +```txt checkpoint:{thread_id}:{checkpoint_ns}:{checkpoint_id} checkpoint_blob:{thread_id}:{checkpoint_ns}:{channel}:{version} checkpoint_write:{thread_id}:{checkpoint_ns}:{checkpoint_id}:{task_id}:{idx} ``` **ShallowRedisSaver (latest only):** -``` + +```txt checkpoint:{thread_id}:{checkpoint_ns} # Single checkpoint per thread/namespace ``` @@ -88,10 +90,12 @@ saver = RedisSaver( ## Redis Module Requirements ### Redis 8.0+ + - Includes RedisJSON and RediSearch modules by default - Recommended for production use ### Redis < 8.0 + - Requires Redis Stack or manual installation of: - RedisJSON module - RediSearch module @@ -109,4 +113,4 @@ If you encounter issues during migration: 1. Check the [GitHub Issues](https://github.com/redis-developer/langgraph-redis/issues) for known problems 2. Review the [Release Notes](https://github.com/redis-developer/langgraph-redis/releases) for version changes -3. Open a new issue with details about your migration scenario \ No newline at end of file +3. Open a new issue with details about your migration scenario diff --git a/MIGRATION_0.2.0.md b/MIGRATION_0.2.0.md new file mode 100644 index 0000000..9ab0de1 --- /dev/null +++ b/MIGRATION_0.2.0.md @@ -0,0 +1,651 @@ +# Migration Guide: 0.1.x to 0.2.0 + +This guide helps you migrate from langgraph-checkpoint-redis 0.1.x to 0.2.0, which includes breaking changes due to upgrades to LangGraph 1.0 and LangGraph Checkpoint 3.0. + +## Table of Contents + +- [Overview](#overview) +- [Breaking Changes](#breaking-changes) +- [Dependency Updates](#dependency-updates) +- [Migration Steps](#migration-steps) +- [Code Changes Required](#code-changes-required) +- [Data Migration](#data-migration) +- [Troubleshooting](#troubleshooting) + +## Overview + +Version 0.2.0 represents a major upgrade that brings compatibility with: + +- **LangGraph 1.0.3** (from 0.4.9) +- **LangGraph Checkpoint 3.0** (from 2.x) +- **LangChain Core 1.0.5** (from 0.3.74) + +These upgrades include breaking API changes that require code modifications. + +## Breaking Changes + +### 1. Python Version Requirement + +**Changed:** Minimum Python version increased from **3.9 to 3.10** + +**Reason:** Python 3.9 reached end-of-life in October 2025 + +**Action Required:** + +```bash +# Ensure you're using Python 3.10 or higher +python --version # Should show 3.10.x or higher +``` + +### 2. Interrupt API Changes (LangGraph 1.0) + +**Changed:** The `Interrupt` class structure has been simplified from 4 fields to 2 fields. + +**Removed fields:** + +- `resumable` (bool) - Removed in LangGraph v0.6.0 +- `ns` (str) - Removed in LangGraph v0.6.0 +- `when` (str) - Removed in LangGraph v0.6.0 +- `interrupt_id` (property) - Deprecated in favor of `id` + +**Retained fields:** + +- `value` (Any) - The value associated with the interrupt +- `id` (str) - Unique identifier for the interrupt + +**Before (0.1.x):** + +```python +from langgraph.types import Interrupt + +# Creating an interrupt +interrupt = Interrupt( + value={"user_input": "data"}, + resumable=True, + ns="my_namespace", + when="before" +) + +# Accessing fields +if interrupt.resumable: + process(interrupt.value) +``` + +**After (0.2.0):** + +```python +from langgraph.types import Interrupt + +# Creating an interrupt +interrupt = Interrupt( + value={"user_input": "data"}, + id="unique-interrupt-id" +) + +# Accessing fields +# The 'id' field identifies the interrupt +process(interrupt.value, interrupt.id) +``` + +**Migration Note:** If you were using `resumable`, `ns`, or `when` fields to control interrupt behavior, you'll need to include this information in the `value` dict instead. + +### 3. Checkpoint Serialization API (Checkpoint 3.0) + +**Changed:** Serializer signatures now use `bytes` instead of `str` + +The `dumps_typed` and `loads_typed` methods now use `tuple[str, bytes]` instead of `tuple[str, str]`. + +**Before (Checkpoint 2.x):** + +```python +from langgraph.checkpoint.serde.base import SerializerProtocol + +class CustomSerializer(SerializerProtocol): + def dumps_typed(self, obj: Any) -> tuple[str, str]: + # Returns (type_string, data_string) + return ("json", json.dumps(obj)) + + def loads_typed(self, data: tuple[str, str]) -> Any: + type_str, data_str = data + return json.loads(data_str) +``` + +**After (Checkpoint 3.0):** + +```python +from langgraph.checkpoint.serde.base import SerializerProtocol + +class CustomSerializer(SerializerProtocol): + def dumps_typed(self, obj: Any) -> tuple[str, bytes]: + # Returns (type_string, data_bytes) + return ("json", json.dumps(obj).encode()) + + def loads_typed(self, data: tuple[str, bytes]) -> Any: + type_str, data_bytes = data + return json.loads(data_bytes.decode()) +``` + +**Impact:** This change is handled internally by `JsonPlusRedisSerializer`. **No action required** unless you've implemented a custom serializer. + +### 4. Blob Storage Format + +**Changed:** All checkpoint blobs are now stored as base64-encoded strings in Redis JSON documents. + +**Impact:** This is transparent to users - the library handles encoding/decoding automatically. + +**Internal Change:** + +```python +# 0.1.x: Blobs stored as JSON strings +{"channel": "messages", "data": "{...}"} + +# 0.2.0: Blobs stored as base64-encoded bytes +{"channel": "messages", "data": "eyJ0eXBlIjoi..."} # base64 string +``` + +**Note:** Existing checkpoints from 0.1.x will **not** be automatically migrated. See [Data Migration](#data-migration) section. + +## Dependency Updates + +```toml +# pyproject.toml changes + +[tool.poetry.dependencies] +# Before (0.1.x) +python = ">=3.9,<3.14" +langgraph = ">=0.3.0" +langgraph-checkpoint = ">=2.0.21,<3.0.0" + +# After (0.2.0) +python = ">=3.10,<3.14" +langgraph = ">=1.0.0" +langgraph-checkpoint = ">=3.0.0,<4.0.0" +redisvl = ">=0.11.0,<1.0.0" # New: Security fix for CVE-2025-64439 +``` + +### Updated Transitive Dependencies + +- `langchain-core`: 0.3.74 → 1.0.5 +- `langgraph-prebuilt`: 0.2.2 → 1.0.4 +- `langgraph-sdk`: (via langgraph) updated to 0.2.x + +## Migration Steps + +### Step 1: Check Python Version + +```bash +python --version +# Must be 3.10 or higher +``` + +If you're on Python 3.9, upgrade to Python 3.10+ before proceeding. + +### Step 2: Backup Your Data + +**Critical:** Create a backup of your Redis data before upgrading. + +```bash +# Option 1: Redis SAVE command +redis-cli -h -p SAVE + +# Option 2: Export specific keys (if you know the patterns) +redis-cli -h -p --scan --pattern "checkpoint:*" > checkpoint_keys.txt +``` + +### Step 3: Update Dependencies + +```bash +# Update langgraph-checkpoint-redis +pip install --upgrade langgraph-checkpoint-redis==0.2.0 + +# Or with poetry +poetry add langgraph-checkpoint-redis@^0.2.0 +poetry update +``` + +### Step 4: Update Your Code + +Review and update any code that uses: + +1. `Interrupt` objects (see [Interrupt API Changes](#2-interrupt-api-changes-langgraph-10)) +2. Custom serializers (see [Checkpoint Serialization API](#3-checkpoint-serialization-api-checkpoint-30)) + +### Step 5: Test Migration + +```python +# Test basic checkpoint operations +from langgraph.checkpoint.redis import RedisSaver + +with RedisSaver.from_conn_string("redis://localhost:6379") as saver: + saver.setup() + + # Test saving a checkpoint + from langgraph.checkpoint.base import Checkpoint + config = {"configurable": {"thread_id": "test-migration"}} + + checkpoint = Checkpoint( + v=1, + id="test-checkpoint", + ts="2025-01-01T00:00:00Z", + channel_values={}, + channel_versions={}, + versions_seen={}, + ) + + # This should work without errors + metadata = {"source": "migration_test"} + saver.put(config, checkpoint, metadata, {}) + + # Verify retrieval + retrieved = saver.get_tuple(config) + assert retrieved is not None + print("✓ Migration test passed!") +``` + +## Code Changes Required + +### If You Use Interrupts + +**Search for:** `Interrupt(` in your codebase + +**Update pattern:** + +```python +# Before +from langgraph.types import Interrupt +interrupt = Interrupt( + value=data, + resumable=True, + ns="my_ns", + when="before" +) + +# After +from langgraph.types import Interrupt +import uuid + +# Move metadata into the value if needed +interrupt = Interrupt( + value={ + "data": data, + # Optional: Include old metadata in value if needed + "_metadata": { + "resumable": True, + "ns": "my_ns", + "when": "before" + } + }, + id=str(uuid.uuid4()) # or your own ID generation +) +``` + +### If You Access Interrupt Fields + +**Search for:** `.resumable`, `.ns`, `.when`, `.interrupt_id` in your codebase + +**Update pattern:** + +```python +# Before +if interrupt.resumable: + handle_resumable(interrupt.value) + +namespace = interrupt.ns +timing = interrupt.when + +# After +# Check metadata in value instead +metadata = interrupt.value.get("_metadata", {}) +if metadata.get("resumable"): + handle_resumable(interrupt.value["data"]) + +namespace = metadata.get("ns") +timing = metadata.get("when") +``` + +### If You Have Custom Serializers + +**Search for:** Classes that inherit from `SerializerProtocol` or override `dumps_typed`/`loads_typed` + +**Update pattern:** + +```python +from langgraph.checkpoint.serde.base import SerializerProtocol +from typing import Any + +class MySerializer(SerializerProtocol): + # Before: Returns tuple[str, str] + # After: Returns tuple[str, bytes] + + def dumps_typed(self, obj: Any) -> tuple[str, bytes]: + import json + # Return bytes instead of str + return ("json", json.dumps(obj).encode("utf-8")) + + def loads_typed(self, data: tuple[str, bytes]) -> Any: + import json + type_str, data_bytes = data + # Expect bytes instead of str + return json.loads(data_bytes.decode("utf-8")) +``` + +## Data Migration + +### Checkpoint Data Compatibility + +**Important:** Checkpoints created with 0.1.x are **not directly compatible** with 0.2.0 due to: + +1. Blob encoding changes (base64 format) +2. Serialization format changes (bytes vs strings) +3. Interrupt object structure changes + +### Migration Options + +#### Option 1: Fresh Start (Recommended for Development) + +If you don't need to preserve checkpoint history: + +```python +from langgraph.checkpoint.redis import RedisSaver +import redis + +# Clear old checkpoints +redis_client = redis.from_url("redis://localhost:6379") +keys = redis_client.keys("checkpoint:*") +if keys: + redis_client.delete(*keys) + +# Recreate indices with new version +with RedisSaver.from_conn_string("redis://localhost:6379") as saver: + saver.setup() +``` + +#### Option 2: Parallel Deployment (Recommended for Production) + +Run both versions in parallel during transition: + +```python +# Deploy 0.2.0 with a different key prefix or database +REDIS_URL_NEW = "redis://localhost:6379/1" # Different database +REDIS_URL_OLD = "redis://localhost:6379/0" # Old database + +# New code uses 0.2.0 +from langgraph.checkpoint.redis import RedisSaver +saver_new = RedisSaver.from_conn_string(REDIS_URL_NEW) + +# Gradually migrate traffic to new version +# Old traffic continues on 0.1.x until fully migrated +``` + +#### Option 3: Custom Migration Script + +If you must migrate existing checkpoints: + +```python +from langgraph.checkpoint.redis import RedisSaver +import redis +import json +import base64 + +def migrate_checkpoints(): + """ + WARNING: This is a template. Test thoroughly before using in production. + """ + old_saver = RedisSaver.from_conn_string("redis://localhost:6379") + + # Get all checkpoint keys + redis_client = redis.from_url("redis://localhost:6379") + checkpoint_keys = redis_client.keys("checkpoint:*") + + for key in checkpoint_keys: + try: + # Read old checkpoint + old_data = redis_client.json().get(key) + + # Transform blobs to base64 if needed + if "channel_values" in old_data: + for channel, value in old_data["channel_values"].items(): + if isinstance(value, str): + # Encode to base64 + old_data["channel_values"][channel] = base64.b64encode( + value.encode() + ).decode() + + # Update Interrupt objects if present + # This requires inspecting your specific checkpoint structure + + # Write back + redis_client.json().set(key, "$", old_data) + print(f"✓ Migrated {key}") + + except Exception as e: + print(f"✗ Failed to migrate {key}: {e}") + raise + +# IMPORTANT: Test on a copy of your data first! +# migrate_checkpoints() +``` + +**Warning:** Custom migration scripts should be thoroughly tested on copies of your data. Consider the parallel deployment approach instead. + +### RedisStore Data + +`RedisStore` data (cross-thread persistence) should remain compatible. The store uses a different indexing scheme and doesn't rely on the checkpoint serialization format. + +## Troubleshooting + +### Issue: ImportError for Interrupt + +```python +ImportError: cannot import name 'Interrupt' from 'langgraph.types' +``` + +**Solution:** Ensure langgraph is upgraded to 1.0+ + +```bash +pip install --upgrade langgraph>=1.0.0 +``` + +### Issue: AttributeError: 'Interrupt' object has no attribute 'resumable' + +```python +AttributeError: 'Interrupt' object has no attribute 'resumable' +``` + +**Solution:** Update code to use only `value` and `id` fields (see [Interrupt API Changes](#2-interrupt-api-changes-langgraph-10)) + +### Issue: orjson.JSONDecodeError when loading checkpoints + +```python +orjson.JSONDecodeError: unexpected character: ... +``` + +**Solution:** This indicates you're trying to load a checkpoint created with 0.1.x. See [Data Migration](#data-migration) for options. + +### Issue: Tests failing after upgrade + +**Common causes:** + +1. Test mocks assume old Interrupt structure +2. Fixtures use old checkpoint format +3. Test assertions check removed fields + +**Solution:** Update tests to match new APIs: + +```python +# Before +def test_interrupt(): + interrupt = Interrupt(value={"test": "data"}, resumable=True) + assert interrupt.resumable is True + +# After +def test_interrupt(): + interrupt = Interrupt(value={"test": "data"}, id="test-id") + assert interrupt.id == "test-id" +``` + +### Issue: Existing checkpoints not loading + +**Symptoms:** `get_tuple()` returns None for previously saved checkpoints + +**Cause:** Blob encoding format changed from JSON strings to base64 bytes + +**Solutions:** + +1. Fresh start: Clear old data and recreate (see Option 1 in [Data Migration](#data-migration)) +2. Parallel deployment: Run 0.2.0 in parallel with 0.1.x (see Option 2) +3. Custom migration: Write a migration script (see Option 3) + +### Issue: SecurityError about redisvl version + +```python +WARNING: redisvl version <0.11.0 has known vulnerability CVE-2025-64439 +``` + +**Solution:** Ensure redisvl>=0.11.0 is installed + +```bash +pip install --upgrade redisvl>=0.11.0 +``` + +## Configuration Changes + +### TTL Configuration (Unchanged) + +TTL configuration remains the same: + +```python +from langgraph.checkpoint.redis import RedisSaver + +saver = RedisSaver( + redis_url="redis://localhost:6379", + ttl={ + "default_ttl": 60, # Still in MINUTES + "refresh_on_read": True + } +) +``` + +### Shallow Checkpointing (Unchanged) + +ShallowRedisSaver usage remains unchanged: + +```python +from langgraph.checkpoint.redis.shallow import ShallowRedisSaver + +saver = ShallowRedisSaver( + redis_url="redis://localhost:6379", + key_cache_max_size=2000, + channel_cache_max_size=200 +) +``` + +## Testing Your Migration + +Create a comprehensive test suite to verify the migration: + +```python +import pytest +from langgraph.checkpoint.redis import RedisSaver +from langgraph.types import Interrupt +import uuid + +def test_checkpoint_roundtrip(): + """Test basic checkpoint save/load""" + with RedisSaver.from_conn_string("redis://localhost:6379") as saver: + saver.setup() + + config = {"configurable": {"thread_id": str(uuid.uuid4())}} + + # Create and save checkpoint + from langgraph.checkpoint.base import Checkpoint + checkpoint = Checkpoint( + v=1, + id=str(uuid.uuid4()), + ts="2025-01-01T00:00:00Z", + channel_values={"messages": ["test"]}, + channel_versions={"messages": 1}, + versions_seen={}, + ) + + saver.put(config, checkpoint, {"test": True}, {}) + + # Retrieve and verify + retrieved = saver.get_tuple(config) + assert retrieved is not None + assert retrieved.checkpoint.channel_values == checkpoint.channel_values + +def test_interrupt_serialization(): + """Test Interrupt object handling""" + from langgraph.checkpoint.redis.jsonplus_redis import JsonPlusRedisSerializer + + serializer = JsonPlusRedisSerializer() + + # Create interrupt with new API + interrupt = Interrupt( + value={"test": "data"}, + id="test-interrupt-id" + ) + + # Serialize + type_str, data_bytes = serializer.dumps_typed(interrupt) + assert type_str == "json" + assert isinstance(data_bytes, bytes) + + # Deserialize + result = serializer.loads_typed((type_str, data_bytes)) + assert isinstance(result, Interrupt) + assert result.value == {"test": "data"} + assert result.id == "test-interrupt-id" + +def test_interrupt_in_checkpoint(): + """Test interrupts within checkpoint workflow""" + from langgraph.types import interrupt + + # The interrupt() function should work as expected + # This would be tested in an actual graph context + pass + +if __name__ == "__main__": + pytest.main([__file__, "-v"]) +``` + +## Getting Help + +If you encounter issues during migration: + +1. **Check the release notes:** Review the [CHANGELOG](CHANGELOG.md) for detailed changes +2. **GitHub Issues:** Search [langgraph-redis issues](https://github.com/redis-developer/langgraph-redis/issues) for similar problems +3. **LangGraph Documentation:** Review [LangGraph 1.0 docs](https://langchain-ai.github.io/langgraph/) for upstream changes +4. **Open an issue:** If you find a bug, [open a new issue](https://github.com/redis-developer/langgraph-redis/issues/new) with: + - Your Python version + - Full error traceback + - Minimal code to reproduce the issue + - Version information: `pip list | grep langgraph` + +## Reference + +### Version Information + +```bash +# Check installed versions +pip show langgraph-checkpoint-redis langgraph langgraph-checkpoint langchain-core + +# Expected versions for 0.2.0: +# langgraph-checkpoint-redis: 0.2.0 +# langgraph: >=1.0.0 +# langgraph-checkpoint: >=3.0.0 +# langchain-core: >=1.0.0 +``` + +### Related Documentation + +- [LangGraph 1.0 Documentation](https://langchain-ai.github.io/langgraph/) +- [LangChain Core 1.0 Release](https://blog.langchain.com/langchain-langgraph-1dot0/) +- [Checkpoint 3.0 Changes](https://github.com/langchain-ai/langgraph/releases) +- [Migration from 0.1.0](MIGRATION_0.1.0.md) (previous migration guide) + +--- + +**Last Updated:** January 2025 +**Applies to:** langgraph-checkpoint-redis 0.2.0 diff --git a/examples/.gitignore b/examples/.gitignore index 86bf35d..cbc0aa3 100644 --- a/examples/.gitignore +++ b/examples/.gitignore @@ -1,4 +1,4 @@ -# .gitignore for /docs directory +# .gitignore for /examples directory .ipynb_checkpoints *.pyc __pycache__ \ No newline at end of file diff --git a/examples/Dockerfile.jupyter b/examples/Dockerfile.jupyter index 2937197..388d25e 100644 --- a/examples/Dockerfile.jupyter +++ b/examples/Dockerfile.jupyter @@ -17,12 +17,13 @@ USER jupyter # Set up virtual environment RUN python -m venv /home/jupyter/venv ENV PATH="/home/jupyter/venv/bin:$PATH" +ENV PYTHONDONTWRITEBYTECODE=1 # Install dependencies RUN pip install --no-cache-dir --upgrade pip && \ pip install --no-cache-dir "httpx>=0.24.0,<1.0.0" && \ pip install --no-cache-dir "langgraph>=0.3.0" && \ - pip install --no-cache-dir jupyter "redis>=5.2.1" "redisvl>=0.5.1" langchain-openai langchain-anthropic python-ulid + pip install --no-cache-dir jupyter "redis>=5.2.1" "redisvl>=0.11.0" langchain-openai langchain-anthropic python-ulid # Create a startup script that checks if local library is mounted RUN echo '#!/bin/bash\n\ diff --git a/examples/README.md b/examples/README.md index 70ee816..7195ae4 100644 --- a/examples/README.md +++ b/examples/README.md @@ -21,7 +21,7 @@ To run these notebooks using Docker (recommended for consistent environment): Note: - The first time you run this, it may take a few minutes to build the Docker image. -- When running with Docker Compose, the local library code from `../langgraph` is automatically mounted and installed, +- When running with Docker Compose, the local library code from `../` (parent directory) is automatically mounted and installed, allowing you to test changes to the library immediately without rebuilding. - If running the Docker image standalone (without docker-compose), it will install the library from PyPI instead. @@ -40,12 +40,12 @@ If you prefer to run these notebooks locally without Docker: ```bash pip install langgraph-checkpoint-redis - pip install langgraph>=0.3.0 - pip install jupyter redis>=5.2.1 redisvl>=0.5.1 - pip install langchain-openai langchain-anthropic + pip install langgraph>=0.3.0 + pip install jupyter redis>=5.2.1 redisvl>=0.11.0 + pip install langchain-openai langchain-anthropic pip install python-ulid "httpx>=0.24.0,<1.0.0" - - # Some notebooks may require additional packages, which will be installed + + # Some notebooks may require additional packages, which will be installed # within the notebooks themselves when needed ``` diff --git a/examples/create-react-agent-hitl.ipynb b/examples/create-react-agent-hitl.ipynb index e727bef..7a5bc1c 100644 --- a/examples/create-react-agent-hitl.ipynb +++ b/examples/create-react-agent-hitl.ipynb @@ -120,8 +120,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "0.1.0\n", - "18:45:35 langgraph.checkpoint.redis INFO Redis client is a standalone client\n" + "0.2.0\n", + "20:54:48 langgraph.checkpoint.redis INFO Redis client is a standalone client\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_196/104821471.py:41: LangGraphDeprecatedSinceV10: create_react_agent has been moved to `langchain.agents`. Please update your import to `from langchain.agents import create_agent`. Deprecated in LangGraph V1.0 to be removed in V2.0.\n", + " graph = create_react_agent(\n" ] } ], @@ -209,20 +217,20 @@ "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "what is the weather in SF, CA?\n", - "18:45:36 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "20:54:49 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " get_weather (call_lwlXXEJvgUaXb9Q8EIjSMLgJ)\n", - " Call ID: call_lwlXXEJvgUaXb9Q8EIjSMLgJ\n", + " get_weather (call_JQR9gMUJPiZEZ1HgkJsUYIYA)\n", + " Call ID: call_JQR9gMUJPiZEZ1HgkJsUYIYA\n", " Args:\n", " location: SF, CA\n" ] } ], "source": [ + "import uuid\n", "\n", - "\n", - "config = {\"configurable\": {\"thread_id\": \"42\"}}\n", + "config = {\"configurable\": {\"thread_id\": str(uuid.uuid4())}}\n", "inputs = {\"messages\": [(\"user\", \"what is the weather in SF, CA?\")]}\n", "\n", "print_stream(graph.stream(inputs, config, stream_mode=\"values\"))" @@ -246,7 +254,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Next step: ('tools',)\n" + "20:54:49 langgraph WARNING Ignoring invalid packet type in pending sends\n", + "Next step: ()\n" ] } ], @@ -275,24 +284,13 @@ "name": "stdout", "output_type": "stream", "text": [ + "20:54:49 langgraph WARNING Ignoring invalid packet type in pending sends\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " get_weather (call_lwlXXEJvgUaXb9Q8EIjSMLgJ)\n", - " Call ID: call_lwlXXEJvgUaXb9Q8EIjSMLgJ\n", - " Args:\n", - " location: SF, CA\n", - "=================================\u001b[1m Tool Message \u001b[0m=================================\n", - "Name: get_weather\n", - "\n", - "Error: AssertionError('Unknown Location')\n", - " Please fix your mistakes.\n", - "18:45:37 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "==================================\u001b[1m Ai Message \u001b[0m==================================\n", - "Tool Calls:\n", - " get_weather (call_ormEQsagC8POw6hpsc8mMS4W)\n", - " Call ID: call_ormEQsagC8POw6hpsc8mMS4W\n", + " get_weather (call_JQR9gMUJPiZEZ1HgkJsUYIYA)\n", + " Call ID: call_JQR9gMUJPiZEZ1HgkJsUYIYA\n", " Args:\n", - " location: San Francisco, CA\n" + " location: SF, CA\n" ] } ], @@ -316,12 +314,20 @@ "id": "1c81ed9f", "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20:54:49 langgraph WARNING Ignoring invalid packet type in pending sends\n", + "20:54:49 langgraph WARNING Ignoring invalid packet type in pending sends\n" + ] + }, { "data": { "text/plain": [ - "{'configurable': {'thread_id': '42',\n", + "{'configurable': {'thread_id': '18c43cd5-0bf0-40dd-a7f2-316450e0022e',\n", " 'checkpoint_ns': '',\n", - " 'checkpoint_id': '1f072f58-b2bc-662b-8004-07d2cd61ee7e'}}" + " 'checkpoint_id': '1f0c3f7a-8519-617a-8002-a6eecd3547b9'}}" ] }, "execution_count": 8, @@ -348,20 +354,13 @@ "name": "stdout", "output_type": "stream", "text": [ + "20:54:49 langgraph WARNING Ignoring invalid packet type in pending sends\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " get_weather (call_ormEQsagC8POw6hpsc8mMS4W)\n", - " Call ID: call_ormEQsagC8POw6hpsc8mMS4W\n", + " get_weather (call_JQR9gMUJPiZEZ1HgkJsUYIYA)\n", + " Call ID: call_JQR9gMUJPiZEZ1HgkJsUYIYA\n", " Args:\n", - " location: San Francisco\n", - "=================================\u001b[1m Tool Message \u001b[0m=================================\n", - "Name: get_weather\n", - "\n", - "It's always sunny in sf\n", - "18:45:38 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "==================================\u001b[1m Ai Message \u001b[0m==================================\n", - "\n", - "The weather in San Francisco is always sunny.\n" + " location: San Francisco\n" ] } ], @@ -394,7 +393,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.13" + "version": "3.11.14" } }, "nbformat": 4, diff --git a/examples/create-react-agent-manage-message-history.ipynb b/examples/create-react-agent-manage-message-history.ipynb index cbf21f3..2fb9aa7 100644 --- a/examples/create-react-agent-manage-message-history.ipynb +++ b/examples/create-react-agent-manage-message-history.ipynb @@ -144,6 +144,28 @@ { "cell_type": "code", "execution_count": 1, + "id": "a6695ddf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Redis flushed - ready for fresh execution\n" + ] + } + ], + "source": [ + "# IMPORTANT: Clear Redis to remove old checkpoints created with buggy serializer\n", + "import redis\n", + "r = redis.Redis(host=\"redis\", port=6379, decode_responses=False)\n", + "r.flushdb()\n", + "print(\"Redis flushed - ready for fresh execution\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, "id": "a213e11a-5c62-4ddb-a707-490d91add383", "metadata": {}, "outputs": [], @@ -154,7 +176,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "23a1885c-04ab-4750-aefa-105891fddf3e", "metadata": {}, "outputs": [ @@ -220,7 +242,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "eaad19ee-e174-4c6c-b2b8-3530d7acea40", "metadata": {}, "outputs": [], @@ -255,7 +277,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "b507eb58-6e02-4ac6-b48b-ea4defdc11f0", "metadata": {}, "outputs": [ @@ -263,10 +285,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "18:46:53 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "18:46:53 redisvl.index.index INFO Index already exists, not overwriting.\n", - "18:46:53 redisvl.index.index INFO Index already exists, not overwriting.\n", - "18:46:53 redisvl.index.index INFO Index already exists, not overwriting.\n" + "00:25:07 langgraph.checkpoint.redis INFO Redis client is a standalone client\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_1893/1628370867.py:37: LangGraphDeprecatedSinceV10: create_react_agent has been moved to `langchain.agents`. Please update your import to `from langchain.agents import create_agent`. Deprecated in LangGraph V1.0 to be removed in V2.0.\n", + " graph = create_react_agent(\n" ] } ], @@ -318,13 +345,13 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "8182ab45-86b3-4d6f-b75e-58862a14fa4e", "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] @@ -349,7 +376,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "16636975-5f2d-4dc7-ab8e-d0bea0830a28", "metadata": {}, "outputs": [], @@ -380,7 +407,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "9ffff6c3-a4f5-47c9-b51d-97caaee85cd6", "metadata": {}, "outputs": [ @@ -388,14 +415,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "18:46:56 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "18:46:58 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "18:47:07 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" + "00:25:08 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "00:25:09 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "00:25:13 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" ] } ], "source": [ - "config = {\"configurable\": {\"thread_id\": \"1\"}}\n", + "config = {\"configurable\": {\"thread_id\": \"trim-example-1\"}}\n", "\n", "inputs = {\"messages\": [(\"user\", \"What's the weather in NYC?\")]}\n", "result = graph.invoke(inputs, config=config)\n", @@ -414,17 +441,17 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "41ba0253-5199-4d29-82ae-258cbbebddb4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "421" + "441" ] }, - "execution_count": 8, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -445,7 +472,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "26c53429-90ba-4d0b-abb9-423d9120ad26", "metadata": {}, "outputs": [ @@ -468,16 +495,34 @@ "5. **Broadway**: Famous for its world-class theater productions.\n", "6. **Wall Street**: The financial hub of the United States.\n", "7. **Museums**: Including the Metropolitan Museum of Art, Museum of Modern Art (MoMA), and the American Museum of Natural History.\n", - "8. **Diverse Cuisine**: A melting pot of cultures reflected in its diverse food scene.\n", - "9. **Cultural Diversity**: A rich tapestry of cultures and ethnicities, contributing to its dynamic character.\n", + "8. **Diverse Cuisine**: A melting pot of cultures reflected in its diverse food scene, from street food to Michelin-starred restaurants.\n", + "9. **Cultural Diversity**: A rich tapestry of cultures and communities, making it one of the most diverse cities in the world.\n", "10. **Fashion**: A global fashion capital, hosting events like New York Fashion Week.\n", "\n", - "These are just a few highlights of what makes New York City a unique and exciting place.\n", + "These are just a few highlights of what makes New York City a unique and exciting place to visit or live.\n", "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "where can i find the best bagel?\n", "\n", "\n", + "\n", + "00:25:21 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "\n", + "Finding the \"best\" bagel in New York City can be subjective, as it often depends on personal taste preferences. However, several bagel shops are frequently mentioned as top contenders for the best bagels in the city:\n", + "\n", + "1. **Ess-a-Bagel**: Known for its large, chewy bagels and a wide variety of spreads and toppings.\n", + "2. **Russ & Daughters**: Famous for its traditional bagels and high-quality smoked fish.\n", + "3. **Absolute Bagels**: A favorite on the Upper West Side, known for its fresh and fluffy bagels.\n", + "4. **Murray’s Bagels**: Offers a classic New York bagel experience with a no-toasting policy to preserve freshness.\n", + "5. **Tompkins Square Bagels**: Known for its creative cream cheese flavors and hearty bagels.\n", + "6. **Bagel Hole**: A small shop in Park Slope, Brooklyn, known for its dense and flavorful bagels.\n", + "7. **Leo’s Bagels**: Offers a wide variety of bagels and toppings, known for its quality and taste.\n", + "\n", + "These spots are beloved by locals and visitors alike, and each offers a unique take on the classic New York bagel.\n", + "\n", + "\n", "\n" ] } @@ -497,7 +542,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "7ecfc310-8f9e-4aa0-9e58-17e71551639a", "metadata": {}, "outputs": [], @@ -526,10 +571,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "48c2a65b-685a-4750-baa6-2d61efe76b5f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "00:25:21 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", + "00:25:21 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:25:21 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:25:21 redisvl.index.index INFO Index already exists, not overwriting.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_1893/2986813568.py:27: LangGraphDeprecatedSinceV10: create_react_agent has been moved to `langchain.agents`. Please update your import to `from langchain.agents import create_agent`. Deprecated in LangGraph V1.0 to be removed in V2.0.\n", + " graph = create_react_agent(\n" + ] + } + ], "source": [ "from langchain_core.messages import RemoveMessage\n", "from langgraph.graph.message import REMOVE_ALL_MESSAGES\n", @@ -576,12 +640,75 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "831be36a-78a1-4885-9a03-8d085dfd7e37", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "00:25:22 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "00:25:22 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "00:25:28 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "Update from node: pre_model_hook\n", + "================================\u001b[1m Remove Message \u001b[0m================================\n", + "\n", + "\n", + "================================\u001b[1m Human Message \u001b[0m=================================\n", + "\n", + "What's it known for?\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "\n", + "New York City is known for a variety of iconic landmarks, cultural institutions, and vibrant neighborhoods. Some of the most notable features include:\n", + "\n", + "1. **Statue of Liberty**: A symbol of freedom and democracy, located on Liberty Island.\n", + "2. **Times Square**: Known for its bright lights, Broadway theaters, and bustling atmosphere.\n", + "3. **Central Park**: A large public park offering a natural oasis amidst the urban environment.\n", + "4. **Empire State Building**: An iconic skyscraper offering panoramic views of the city.\n", + "5. **Broadway**: Famous for its world-class theater productions and musicals.\n", + "6. **Wall Street**: The financial hub of the United States, located in the Financial District.\n", + "7. **Museums**: Including the Metropolitan Museum of Art, Museum of Modern Art (MoMA), and the American Museum of Natural History.\n", + "8. **Diverse Cuisine**: A melting pot of cultures, offering a wide range of international foods.\n", + "9. **Cultural Diversity**: Known for its diverse population and vibrant cultural scene.\n", + "10. **Brooklyn Bridge**: An iconic suspension bridge connecting Manhattan and Brooklyn.\n", + "\n", + "These are just a few highlights of what makes New York City a unique and exciting place to visit or live.\n", + "================================\u001b[1m Human Message \u001b[0m=================================\n", + "\n", + "where can i find the best bagel?\n", + "\n", + "\n", + "\n", + "00:25:34 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "\n", + "New York City is famous for its bagels, and there are several places renowned for serving some of the best. Here are a few top spots where you can find delicious bagels in NYC:\n", + "\n", + "1. **Ess-a-Bagel**: Known for their large, chewy bagels with a variety of spreads and toppings. Locations in Midtown and Gramercy.\n", + "\n", + "2. **Russ & Daughters**: A historic appetizing store on the Lower East Side, famous for its bagels with lox and cream cheese.\n", + "\n", + "3. **Absolute Bagels**: Located on the Upper West Side, this spot is popular for its fresh, fluffy bagels.\n", + "\n", + "4. **Murray’s Bagels**: Known for their traditional, hand-rolled bagels. Located in Greenwich Village.\n", + "\n", + "5. **Tompkins Square Bagels**: Offers a wide selection of bagels and creative cream cheese flavors. Located in the East Village.\n", + "\n", + "6. **Bagel Hole**: A small shop in Park Slope, Brooklyn, known for its classic New York-style bagels.\n", + "\n", + "7. **Leo’s Bagels**: Located in the Financial District, offering a variety of bagels and toppings.\n", + "\n", + "Each of these places has its own unique style and flavor, so it might be worth trying a few to find your personal favorite!\n", + "\n", + "\n", + "\n" + ] + } + ], "source": [ - "config = {\"configurable\": {\"thread_id\": \"1\"}}\n", + "config = {\"configurable\": {\"thread_id\": \"trim-example-2\"}}\n", "\n", "inputs = {\"messages\": [(\"user\", \"What's the weather in NYC?\")]}\n", "result = graph.invoke(inputs, config=config)\n", @@ -607,7 +734,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "394f72f8-f817-472d-a193-e01509a86132", "metadata": {}, "outputs": [], @@ -630,7 +757,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "id": "aa6e4bdf", "metadata": {}, "outputs": [], @@ -651,10 +778,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "b9540c1c-2eba-42da-ba4e-478521161a1f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "00:25:35 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", + "00:25:35 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:25:35 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:25:35 redisvl.index.index INFO Index already exists, not overwriting.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_1893/3065461601.py:33: LangGraphDeprecatedSinceV10: create_react_agent has been moved to `langchain.agents`. Please update your import to `from langchain.agents import create_agent`. Deprecated in LangGraph V1.0 to be removed in V2.0.\n", + " graph = create_react_agent(\n" + ] + } + ], "source": [ "# highlight-next-line\n", "from langmem.short_term import SummarizationNode\n", @@ -702,12 +848,69 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "id": "8eccaaca-5d9c-4faf-b997-d4b8e84b59ac", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "00:25:36 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "00:25:38 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "00:25:47 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/jupyter/venv/lib/python3.11/site-packages/langmem/short_term/summarization.py:246: RuntimeWarning: Failed to trim messages to fit within max_tokens limit before summarization - falling back to the original message list. This may lead to exceeding the context window of the summarization LLM.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "00:25:50 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "Update from node: pre_model_hook\n", + "================================\u001b[1m System Message \u001b[0m================================\n", + "\n", + "Summary of the conversation so far: In our conversation, you initially inquired about the current weather in New York City, and it was noted that it might be cloudy with a chance of rain and temperatures up to 80 degrees. You then asked what NYC is known for, and I provided a list of key features and attractions, including the Statue of Liberty, Times Square, Broadway, Central Park, the Empire State Building, Wall Street, its diverse culture and cuisine, world-class museums, unique neighborhoods, and significant historic sites.\n", + "================================\u001b[1m Human Message \u001b[0m=================================\n", + "\n", + "where can i find the best bagel?\n", + "\n", + "\n", + "\n", + "00:25:56 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "\n", + "New York City is famous for its delicious bagels, and you can find some of the best in various neighborhoods across the city. Here are a few top spots to check out for an amazing bagel:\n", + "\n", + "1. **Ess-a-Bagel**: Known for its large, chewy bagels and generous cream cheese spreads, Ess-a-Bagel is a classic NYC bagel shop with locations in Manhattan.\n", + "\n", + "2. **Russ & Daughters**: This iconic Jewish deli has been serving New Yorkers since 1914. They offer a range of traditional bagels with high-quality toppings like smoked fish and cream cheese.\n", + "\n", + "3. **Bagel Hole**: Located in Brooklyn, Bagel Hole is known for its authentic, no-frills bagels that are often described as perfectly balanced – not too dense, not too fluffy.\n", + "\n", + "4. **Murray's Bagels**: Found in Greenwich Village, Murray's Bagels doesn’t toast their bagels, but their fresh and flavorful offerings make up for it. They have a wide variety of bagels and spreads.\n", + "\n", + "5. **Tompkins Square Bagels**: This spot in the East Village is famous for its creative cream cheese flavors, like sriracha or cannoli, along with its fresh, hand-rolled bagels.\n", + "\n", + "6. **Absolute Bagels**: Located on the Upper West Side, Absolute Bagels is loved for their freshly baked bagels and diverse selection of toppings.\n", + "\n", + "These are just a few of the beloved bagel spots in NYC, offering a variety of flavors, textures, and toppings to satisfy any bagel enthusiast.\n", + "\n", + "\n", + "\n" + ] + } + ], "source": [ - "config = {\"configurable\": {\"thread_id\": \"1\"}}\n", + "config = {\"configurable\": {\"thread_id\": \"summarization-example\"}}\n", "inputs = {\"messages\": [(\"user\", \"What's the weather in NYC?\")]}\n", "\n", "result = graph.invoke(inputs, config=config)\n", @@ -744,7 +947,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.13" + "version": "3.11.14" } }, "nbformat": 4, diff --git a/examples/create-react-agent-memory.ipynb b/examples/create-react-agent-memory.ipynb index c4de6fb..24055c4 100644 --- a/examples/create-react-agent-memory.ipynb +++ b/examples/create-react-agent-memory.ipynb @@ -125,10 +125,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "18:47:40 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "18:47:40 redisvl.index.index INFO Index already exists, not overwriting.\n", - "18:47:40 redisvl.index.index INFO Index already exists, not overwriting.\n", - "18:47:40 redisvl.index.index INFO Index already exists, not overwriting.\n" + "00:25:12 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", + "00:25:12 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:25:12 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:25:12 redisvl.index.index INFO Index already exists, not overwriting.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_1924/1444546798.py:39: LangGraphDeprecatedSinceV10: create_react_agent has been moved to `langchain.agents`. Please update your import to `from langchain.agents import create_agent`. Deprecated in LangGraph V1.0 to be removed in V2.0.\n", + " graph = create_react_agent(model, tools=tools, checkpointer=memory)\n" ] } ], @@ -213,21 +221,21 @@ "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "What's the weather in NYC?\n", - "18:47:41 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "00:25:13 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " get_weather (call_dszyH4rhcp3TcSjwI4iHLv4O)\n", - " Call ID: call_dszyH4rhcp3TcSjwI4iHLv4O\n", + " get_weather (call_3ipbdgl0CGTjmjZmWDzwdDUR)\n", + " Call ID: call_3ipbdgl0CGTjmjZmWDzwdDUR\n", " Args:\n", - " location: New York City, NY\n", + " location: New York City\n", "=================================\u001b[1m Tool Message \u001b[0m=================================\n", "Name: get_weather\n", "\n", "It might be cloudy in nyc\n", - "18:47:43 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "00:25:14 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "The weather in New York City might be cloudy. If you need more detailed information, feel free to ask!\n" + "The weather in New York City might be cloudy.\n" ] } ], @@ -259,23 +267,32 @@ "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "What's it known for?\n", - "18:47:49 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "00:25:21 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "New York City is known for a wide array of iconic features and cultural landmarks, including:\n", + "New York City is known for many things, including:\n", + "\n", + "1. **Landmarks and Attractions**: The Statue of Liberty, Times Square, Central Park, Empire State Building, and Broadway theaters.\n", + " \n", + "2. **Cultural Diversity**: A melting pot of cultures, languages, and cuisines from around the world.\n", + "\n", + "3. **Financial Hub**: Home to Wall Street and the New York Stock Exchange, making it a global financial center.\n", + "\n", + "4. **Arts and Entertainment**: Renowned museums like the Metropolitan Museum of Art and the Museum of Modern Art, as well as a vibrant music and theater scene.\n", + "\n", + "5. **Fashion**: A major fashion capital, hosting New York Fashion Week and housing numerous designer boutiques.\n", + "\n", + "6. **Cuisine**: Famous for its diverse food scene, including iconic foods like New York-style pizza and bagels.\n", + "\n", + "7. **Media and Publishing**: Headquarters for major media companies and publishers, including The New York Times and NBC.\n", + "\n", + "8. **Skyscrapers**: Known for its impressive skyline, featuring some of the tallest buildings in the world.\n", + "\n", + "9. **Public Transportation**: An extensive subway system that operates 24/7, making it easy to navigate the city.\n", "\n", - "1. **Statue of Liberty**: A symbol of freedom and democracy, located on Liberty Island.\n", - "2. **Times Square**: Known for its bright lights, Broadway theaters, and bustling atmosphere.\n", - "3. **Central Park**: A massive urban park offering a natural escape in the heart of the city.\n", - "4. **Empire State Building**: An iconic skyscraper with observatories offering stunning city views.\n", - "5. **Broadway**: Famous for its world-class theater productions and musicals.\n", - "6. **Wall Street**: The financial hub of the U.S., home to the New York Stock Exchange.\n", - "7. **Cultural Diversity**: A melting pot of cultures, languages, and cuisines.\n", - "8. **Museums**: Including the Metropolitan Museum of Art, Museum of Modern Art (MoMA), and the American Museum of Natural History.\n", - "9. **Cuisine**: Known for diverse food offerings, including New York-style pizza and bagels.\n", - "10. **Fashion**: A global fashion capital, hosting events like New York Fashion Week.\n", + "10. **Sports**: Home to several major sports teams, including the New York Yankees, New York Mets, New York Knicks, and New York Giants.\n", "\n", - "These are just a few highlights, as NYC is a city with endless attractions and a vibrant cultural scene.\n" + "These are just a few highlights of what makes New York City a unique and vibrant place.\n" ] } ], @@ -309,7 +326,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.13" + "version": "3.11.14" } }, "nbformat": 4, diff --git a/examples/cross-thread-persistence-functional.ipynb b/examples/cross-thread-persistence-functional.ipynb index aad4d0d..a775c36 100644 --- a/examples/cross-thread-persistence-functional.ipynb +++ b/examples/cross-thread-persistence-functional.ipynb @@ -122,7 +122,7 @@ "source": [ "### Define store\n", "\n", - "In this example we will create a workflow that will be able to retrieve information about a user's preferences. We will do so by defining an `InMemoryStore` - an object that can store data in memory and query that data.\n", + "In this example we will create a workflow that will be able to retrieve information about a user's preferences. We will do so by defining a `RedisStore` - an object that can store data in Redis and query that data.\n", "\n", "When storing objects using the `Store` interface you define two things:\n", "\n", @@ -146,9 +146,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "18:52:26 langgraph.store.redis INFO Redis standalone client detected for RedisStore.\n", - "18:52:26 redisvl.index.index INFO Index already exists, not overwriting.\n", - "18:52:26 redisvl.index.index INFO Index already exists, not overwriting.\n" + "00:35:16 langgraph.store.redis INFO Redis standalone client detected for RedisStore.\n", + "00:35:16 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:35:16 redisvl.index.index INFO Index already exists, not overwriting.\n" ] } ], @@ -195,10 +195,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "18:52:26 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "18:52:26 redisvl.index.index INFO Index already exists, not overwriting.\n", - "18:52:26 redisvl.index.index INFO Index already exists, not overwriting.\n", - "18:52:26 redisvl.index.index INFO Index already exists, not overwriting.\n" + "00:35:16 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", + "00:35:16 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:35:16 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:35:16 redisvl.index.index INFO Index already exists, not overwriting.\n" ] } ], @@ -213,7 +213,7 @@ "from langgraph.checkpoint.redis import RedisSaver\n", "from langgraph.store.base import BaseStore\n", "\n", - "model = ChatAnthropic(model=\"claude-3-5-sonnet-latest\")\n", + "model = ChatAnthropic(model=\"claude-sonnet-4-20250514\")\n", "\n", "\n", "@task\n", @@ -264,7 +264,7 @@ "source": [ "!!! note Note\n", "\n", - " If you're using LangGraph Cloud or LangGraph Studio, you __don't need__ to pass store to the entrypoint decorator, since it's done automatically." + " If you're using LangGraph Platform or LangGraph Studio, you __don't need__ to pass store to the entrypoint decorator, since it's done automatically." ] }, { @@ -293,12 +293,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "18:52:27 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "18:52:27 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "18:52:29 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:35:16 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:35:16 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:35:19 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "Hi Bob! Yes, I remember that you're Bob. How can I help you today?\n" + "Hello Bob! Nice to meet you. I'll remember that your name is Bob. How can I help you today?\n" ] } ], @@ -319,11 +319,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "18:52:31 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "18:52:33 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:35:19 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:35:21 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "Your name is Bob.\n" + "Your name is Bob! How can I help you today, Bob?\n" ] } ], @@ -352,6 +352,8 @@ "name": "stdout", "output_type": "stream", "text": [ + "{'data': 'User name is Bob'}\n", + "{'data': 'User name is Bob'}\n", "{'data': 'User name is Bob'}\n", "{'data': 'User name is Bob'}\n" ] @@ -380,11 +382,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "18:52:42 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "18:52:43 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:35:21 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:35:24 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "I don't have any information about your name. While I can see some user info was meant to be provided, I don't actually have any specific details about you. Would you like to introduce yourself?\n" + "I don't have any information about your name. You haven't introduced yourself to me yet! What would you like me to call you?\n" ] } ], @@ -412,7 +414,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.13" + "version": "3.11.14" } }, "nbformat": 4, diff --git a/examples/cross-thread-persistence.ipynb b/examples/cross-thread-persistence.ipynb index 6410a7f..0fa261e 100644 --- a/examples/cross-thread-persistence.ipynb +++ b/examples/cross-thread-persistence.ipynb @@ -108,7 +108,7 @@ "source": [ "## Define store\n", "\n", - "In this example we will create a graph that will be able to retrieve information about a user's preferences. We will do so by defining an `InMemoryStore` - an object that can store data in memory and query that data. We will then pass the store object when compiling the graph. This allows each node in the graph to access the store: when you define node functions, you can define `store` keyword argument, and LangGraph will automatically pass the store object you compiled the graph with.\n", + "In this example we will create a graph that will be able to retrieve information about a user's preferences. We will do so by defining a `RedisStore` - an object that can store data in Redis and query that data. We will then pass the store object when compiling the graph. This allows each node in the graph to access the store: when you define node functions, you can define `store` keyword argument, and LangGraph will automatically pass the store object you compiled the graph with.\n", "\n", "When storing objects using the `Store` interface you define two things:\n", "\n", @@ -119,7 +119,7 @@ "\n", "Importantly, to determine the user, we will be passing `user_id` via the config keyword argument of the node function.\n", "\n", - "Let's first define an `InMemoryStore` already populated with some memories about the users." + "Let's first define a `RedisStore` already populated with some memories about the users." ] }, { @@ -132,9 +132,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "18:53:37 langgraph.store.redis INFO Redis standalone client detected for RedisStore.\n", - "18:53:37 redisvl.index.index INFO Index already exists, not overwriting.\n", - "18:53:37 redisvl.index.index INFO Index already exists, not overwriting.\n" + "00:35:11 langgraph.store.redis INFO Redis standalone client detected for RedisStore.\n", + "00:35:11 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:35:11 redisvl.index.index INFO Index already exists, not overwriting.\n" ] } ], @@ -181,10 +181,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "18:53:37 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "18:53:37 redisvl.index.index INFO Index already exists, not overwriting.\n", - "18:53:37 redisvl.index.index INFO Index already exists, not overwriting.\n", - "18:53:37 redisvl.index.index INFO Index already exists, not overwriting.\n" + "00:35:11 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", + "00:35:11 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:35:11 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:35:11 redisvl.index.index INFO Index already exists, not overwriting.\n" ] } ], @@ -197,7 +197,7 @@ "from langgraph.checkpoint.redis import RedisSaver\n", "from langgraph.store.base import BaseStore\n", "\n", - "model = ChatAnthropic(model=\"claude-3-5-sonnet-20240620\")\n", + "model = ChatAnthropic(model=\"claude-sonnet-4-20250514\")\n", "\n", "\n", "# NOTE: we're passing the Store param to the node --\n", @@ -245,7 +245,7 @@ "
\n", "

Note

\n", "

\n", - " If you're using LangGraph Cloud or LangGraph Studio, you don't need to pass store when compiling the graph, since it's done automatically.\n", + " If you're using LangGraph Platform or LangGraph Studio, you don't need to pass store when compiling the graph, since it's done automatically.\n", "

\n", "
" ] @@ -279,12 +279,12 @@ "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "Hi! Remember: my name is Bob\n", - "18:53:38 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "18:53:39 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "18:53:40 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:35:12 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:35:12 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:35:14 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "Hello Bob! It's great to meet you. I'm glad you introduced yourself, and I'll certainly remember that your name is Bob. How can I assist you today?\n" + "Hi Bob! Nice to meet you. I'll remember that your name is Bob. How are you doing today?\n" ] } ], @@ -308,8 +308,8 @@ "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "what is my name?\n", - "18:53:42 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "18:53:42 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:35:15 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:35:17 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", "Your name is Bob.\n" @@ -341,6 +341,7 @@ "name": "stdout", "output_type": "stream", "text": [ + "{'data': 'User name is Bob'}\n", "{'data': 'User name is Bob'}\n", "{'data': 'User name is Bob'}\n", "{'data': 'User name is Bob'}\n" @@ -373,11 +374,11 @@ "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "what is my name?\n", - "18:53:43 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "18:53:44 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:35:18 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:35:19 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "I apologize, but I don't have any information about your name. As an AI language model, I don't have access to personal information about individual users unless it's provided in the conversation. If you'd like, you can tell me your name, and I'll be happy to use it in our conversation.\n" + "I don't have any information about your name. Could you please tell me what you'd like me to call you?\n" ] } ], @@ -405,7 +406,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.13" + "version": "3.11.14" } }, "nbformat": 4, diff --git a/examples/human_in_the_loop/breakpoints.ipynb b/examples/human_in_the_loop/breakpoints.ipynb index cd8636d..b8f91a9 100644 --- a/examples/human_in_the_loop/breakpoints.ipynb +++ b/examples/human_in_the_loop/breakpoints.ipynb @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "af4ce0ba-7596-4e5f-8bf8-0b0bd6e62833", "metadata": {}, "outputs": [], @@ -58,7 +58,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "c903a1cf-2977-4e2d-ad7d-8b3946821d89", "metadata": {}, "outputs": [], @@ -106,31 +106,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "9b53f191-1e86-4881-a667-d46a3d66958b", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "20:38:59 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "20:38:59 redisvl.index.index INFO Index already exists, not overwriting.\n", - "20:38:59 redisvl.index.index INFO Index already exists, not overwriting.\n", - "20:38:59 redisvl.index.index INFO Index already exists, not overwriting.\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from typing_extensions import TypedDict\n", "from langgraph.graph import StateGraph, START, END\n", @@ -194,48 +173,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "dfe04a7f-988e-4a36-8ce8-2c49fab0130a", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'input': 'hello world'}\n", - "---Step 1---\n", - "---Step 2---\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Do you want to go to Step 3? (yes/no): yes\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'input': 'hello world'}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Do you want to go to Step 3? (yes/no): yes\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---Step 3---\n" - ] - } - ], + "outputs": [], "source": [ "# Input\n", "initial_input = {\"input\": \"hello world\"}\n", @@ -276,31 +217,10 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "6098e5cb", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "20:39:05 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "20:39:05 redisvl.index.index INFO Index already exists, not overwriting.\n", - "20:39:05 redisvl.index.index INFO Index already exists, not overwriting.\n", - "20:39:05 redisvl.index.index INFO Index already exists, not overwriting.\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Set up the tool\n", "from langchain_anthropic import ChatAnthropic\n", @@ -421,29 +341,10 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "cfd140f0-a5a6-4697-8115-322242f197b5", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "================================\u001b[1m Human Message \u001b[0m=================================\n", - "\n", - "search for the weather in sf now\n", - "20:39:07 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", - "==================================\u001b[1m Ai Message \u001b[0m==================================\n", - "\n", - "[{'text': \"Certainly! I'll use the search function to look up the current weather in San Francisco for you. Let me do that now.\", 'type': 'text'}, {'id': 'toolu_013wUCUCqaBFjxKAWqzhNESq', 'input': {'query': 'current weather in San Francisco'}, 'name': 'search', 'type': 'tool_use'}]\n", - "Tool Calls:\n", - " search (toolu_013wUCUCqaBFjxKAWqzhNESq)\n", - " Call ID: toolu_013wUCUCqaBFjxKAWqzhNESq\n", - " Args:\n", - " query: current weather in San Francisco\n" - ] - } - ], + "outputs": [], "source": [ "from langchain_core.messages import HumanMessage\n", "\n", @@ -469,25 +370,10 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "51923913-20f7-4ee1-b9ba-d01f5fb2869b", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "==================================\u001b[1m Ai Message \u001b[0m==================================\n", - "\n", - "[{'text': \"Certainly! I'll use the search function to look up the current weather in San Francisco for you. Let me do that now.\", 'type': 'text'}, {'id': 'toolu_013wUCUCqaBFjxKAWqzhNESq', 'input': {'query': 'current weather in San Francisco'}, 'name': 'search', 'type': 'tool_use'}]\n", - "Tool Calls:\n", - " search (toolu_013wUCUCqaBFjxKAWqzhNESq)\n", - " Call ID: toolu_013wUCUCqaBFjxKAWqzhNESq\n", - " Args:\n", - " query: current weather in San Francisco\n" - ] - } - ], + "outputs": [], "source": [ "for event in app.stream(None, thread, stream_mode=\"values\"):\n", " event[\"messages\"][-1].pretty_print()" @@ -515,4 +401,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/human_in_the_loop/dynamic_breakpoints.ipynb b/examples/human_in_the_loop/dynamic_breakpoints.ipynb index 0bc791b..7090631 100644 --- a/examples/human_in_the_loop/dynamic_breakpoints.ipynb +++ b/examples/human_in_the_loop/dynamic_breakpoints.ipynb @@ -26,7 +26,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "2013d058-c245-498e-ba05-5af99b9b8a1b", "metadata": {}, "outputs": [], @@ -58,31 +58,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "9a14c8b2-5c25-4201-93ea-e5358ee99bcb", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "20:38:35 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "20:38:35 redisvl.index.index INFO Index already exists, not overwriting.\n", - "20:38:35 redisvl.index.index INFO Index already exists, not overwriting.\n", - "20:38:35 redisvl.index.index INFO Index already exists, not overwriting.\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from IPython.display import Image, display\n", "from langgraph.types import interrupt, Command\n", @@ -168,24 +147,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "b2d281f1-3349-4378-8918-7665fa7a7457", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'input': 'hello'}\n", - "---Step 1---\n", - "{'input': 'hello'}\n", - "---Step 2---\n", - "{'input': 'hello'}\n", - "---Step 3---\n", - "{'input': 'hello'}\n" - ] - } - ], + "outputs": [], "source": [ "initial_input = {\"input\": \"hello\"}\n", "thread_config = {\"configurable\": {\"thread_id\": \"1\"}}\n", @@ -204,19 +169,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "4eac1455-e7ef-4a32-8c14-0d5789409689", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "()\n", - "()\n" - ] - } - ], + "outputs": [], "source": [ "state = graph.get_state(thread_config)\n", "print(state.next)\n", @@ -234,20 +190,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "c06192ad-13a4-4d2e-8e30-f1c08578fe77", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'input': 'hello world'}\n", - "---Step 1---\n", - "{'input': 'hello world'}\n" - ] - } - ], + "outputs": [], "source": [ "initial_input = {\"input\": \"hello world\"}\n", "thread_config = {\"configurable\": {\"thread_id\": \"2\"}}\n", @@ -267,19 +213,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "2058593c-178e-4a23-a4c4-860d4a9c2198", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Next node: ('step_2',)\n", - "Tasks: (PregelTask(id='715fdd24-c3bb-ba79-2892-414b70f14f36', name='step_2', path=('__pregel_pull', 'step_2'), error=None, interrupts=(), state=None, result=None),)\n" - ] - } - ], + "outputs": [], "source": [ "state = graph.get_state(thread_config)\n", "print(\"Next node:\", state.next)\n", @@ -303,21 +240,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "872e7a69-9784-4f81-90c6-6b6af2fa6480", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'input': 'hello world'}\n", - "{'input': 'short'}\n", - "---Step 3---\n", - "{'input': 'short'}\n" - ] - } - ], + "outputs": [], "source": [ "# Let's try resuming with a shorter input value using the Command object\n", "# This will provide a value to the interrupt, which our step_2 function can use\n", @@ -327,19 +253,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "3275f899-7039-4029-8814-0bb5c33fabfe", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Next node: ()\n", - "Final state: {'input': 'short'}\n" - ] - } - ], + "outputs": [], "source": [ "state = graph.get_state(thread_config)\n", "print(\"Next node:\", state.next)\n", @@ -372,33 +289,10 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "2ba8dc8d-b90e-45f5-92cd-2192fc66f270", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'input': 'hello world'}\n", - "---Step 1---\n", - "{'input': 'hello world'}\n", - "\n", - "--- Interrupted due to long input ---\n", - "\n", - "State updated with shorter input\n", - "\n", - "{'input': 'foo'}\n", - "---Step 2---\n", - "{'input': 'foo'}\n", - "---Step 3---\n", - "{'input': 'foo'}\n", - "\n", - "Final state: {'input': 'foo'}\n", - "Next nodes: ()\n" - ] - } - ], + "outputs": [], "source": [ "# Start fresh with a new thread\n", "initial_input = {\"input\": \"hello world\"}\n", @@ -433,22 +327,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "9a48e564-d979-4ac2-b815-c667345a9f07", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'input': 'hello world'}\n", - "---Step 1---\n", - "{'input': 'hello world'}\n", - "\n", - "--- Interrupted due to long input ---\n" - ] - } - ], + "outputs": [], "source": [ "initial_input = {\"input\": \"hello world\"}\n", "thread_config = {\"configurable\": {\"thread_id\": \"4\"}}\n", @@ -462,25 +344,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "17f973ab-00ce-4f16-a452-641e76625fde", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Skipped step_2 by updating state as that node\n", - "\n", - "{'input': 'hello world'}\n", - "---Step 3---\n", - "{'input': 'hello world'}\n", - "\n", - "Final state: {'input': 'hello world'}\n", - "Next nodes: ()\n" - ] - } - ], + "outputs": [], "source": [ "# Update the state as node `step_2` to skip it altogether\n", "graph.update_state(config=thread_config, values=None, as_node=\"step_2\")\n", @@ -507,30 +374,10 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "yh6l8suqqu", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Running with long input...\n", - "{'input': 'hello world'}\n", - "---Step 1---\n", - "{'input': 'hello world'}\n", - "\n", - "--- Resuming with shorter input via Command ---\n", - "{'input': 'hello world'}\n", - "{'input': 'hi'}\n", - "---Step 3---\n", - "{'input': 'hi'}\n", - "\n", - "Final state: {'input': 'hi'}\n", - "Completed: True\n" - ] - } - ], + "outputs": [], "source": [ "initial_input = {\"input\": \"hello world\"}\n", "thread_config = {\"configurable\": {\"thread_id\": \"5\"}}\n", @@ -602,4 +449,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/human_in_the_loop/edit-graph-state.ipynb b/examples/human_in_the_loop/edit-graph-state.ipynb index be4722a..71121de 100644 --- a/examples/human_in_the_loop/edit-graph-state.ipynb +++ b/examples/human_in_the_loop/edit-graph-state.ipynb @@ -40,7 +40,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "af4ce0ba-7596-4e5f-8bf8-0b0bd6e62833", "metadata": {}, "outputs": [], @@ -59,18 +59,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "c903a1cf-2977-4e2d-ad7d-8b3946821d89", "metadata": {}, - "outputs": [ - { - "name": "stdin", - "output_type": "stream", - "text": [ - "ANTHROPIC_API_KEY: ········\n" - ] - } - ], + "outputs": [], "source": [ "import getpass\n", "import os\n", @@ -117,31 +109,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "85e452f8-f33a-4ead-bb4d-7386cdba8edc", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "21:01:50 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "21:01:50 redisvl.index.index INFO Index already exists, not overwriting.\n", - "21:01:50 redisvl.index.index INFO Index already exists, not overwriting.\n", - "21:01:50 redisvl.index.index INFO Index already exists, not overwriting.\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import uuid\n", "from typing_extensions import TypedDict\n", @@ -194,19 +165,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "1b3aa6fc-c7fb-4819-8d7f-ba6057cc4edf", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'input': 'hello world'}\n", - "---Step 1---\n" - ] - } - ], + "outputs": [], "source": [ "import uuid\n", "\n", @@ -231,23 +193,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "49d61230-e5dc-4272-b8ab-09b0af30f088", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Current state!\n", - "{'input': 'hello world'}\n", - "---\n", - "---\n", - "Updated state!\n", - "{'input': 'hello universe!'}\n" - ] - } - ], + "outputs": [], "source": [ "print(\"Current state!\")\n", "print(graph.get_state(thread).values)\n", @@ -260,22 +209,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "cf77f6eb-4cc0-4615-a095-eb5ae7027b7a", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'input': 'hello universe!'}\n", - "---Step 2---\n", - "---Step 3---\n", - "---Step 2---\n", - "---Step 3---\n" - ] - } - ], + "outputs": [], "source": [ "# Continue the graph execution from the interruption point\n", "for event in graph.stream(None, thread, stream_mode=\"values\"):\n", @@ -300,21 +237,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "6098e5cb", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "21:01:50 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "21:01:50 redisvl.index.index INFO Index already exists, not overwriting.\n", - "21:01:50 redisvl.index.index INFO Index already exists, not overwriting.\n", - "21:01:50 redisvl.index.index INFO Index already exists, not overwriting.\n" - ] - } - ], + "outputs": [], "source": [ "# Set up the tool\n", "from langchain_anthropic import ChatAnthropic\n", @@ -435,29 +361,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "cfd140f0-a5a6-4697-8115-322242f197b5", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "================================\u001b[1m Human Message \u001b[0m=================================\n", - "\n", - "search for the weather in sf now\n", - "21:01:52 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", - "==================================\u001b[1m Ai Message \u001b[0m==================================\n", - "\n", - "[{'text': \"Certainly! I'll search for the current weather in San Francisco for you. Let me use the search function to find this information.\", 'type': 'text'}, {'id': 'toolu_014fxXBNt7hmzjbysvZTeZu3', 'input': {'query': 'current weather in San Francisco'}, 'name': 'search', 'type': 'tool_use'}]\n", - "Tool Calls:\n", - " search (toolu_014fxXBNt7hmzjbysvZTeZu3)\n", - " Call ID: toolu_014fxXBNt7hmzjbysvZTeZu3\n", - " Args:\n", - " query: current weather in San Francisco\n" - ] - } - ], + "outputs": [], "source": [ "from langchain_core.messages import HumanMessage\n", "import uuid\n", @@ -486,22 +393,10 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "1aa7b1b9-9322-4815-bc0d-eb083870ac15", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Original tool call:\n", - "{'name': 'search', 'args': {'query': 'current weather in San Francisco'}, 'id': 'toolu_014fxXBNt7hmzjbysvZTeZu3', 'type': 'tool_call'}\n", - "\n", - "Updated tool call:\n", - "{'name': 'search', 'args': {'query': 'current weather in SF'}, 'id': 'toolu_014fxXBNt7hmzjbysvZTeZu3', 'type': 'tool_call'}\n" - ] - } - ], + "outputs": [], "source": [ "# Get the current state\n", "current_state = app.get_state(thread)\n", @@ -544,19 +439,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "a3fcf2bd-f881-49fe-b20e-ad16e6819bc6", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Tool calls after update:\n", - "[{'name': 'search', 'args': {'query': 'current weather in SF'}, 'id': 'toolu_014fxXBNt7hmzjbysvZTeZu3', 'type': 'tool_call'}]\n" - ] - } - ], + "outputs": [], "source": [ "# Verify the update worked\n", "current_state = app.get_state(thread)\n", @@ -576,39 +462,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "51923913-20f7-4ee1-b9ba-d01f5fb2869b", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "==================================\u001b[1m Ai Message \u001b[0m==================================\n", - "\n", - "[{'text': \"Certainly! I'll search for the current weather in San Francisco for you. Let me use the search function to find this information.\", 'type': 'text'}, {'id': 'toolu_014fxXBNt7hmzjbysvZTeZu3', 'input': {'query': 'current weather in San Francisco'}, 'name': 'search', 'type': 'tool_use'}]\n", - "Tool Calls:\n", - " search (toolu_014fxXBNt7hmzjbysvZTeZu3)\n", - " Call ID: toolu_014fxXBNt7hmzjbysvZTeZu3\n", - " Args:\n", - " query: current weather in SF\n", - "=================================\u001b[1m Tool Message \u001b[0m=================================\n", - "Name: search\n", - "\n", - "[\"It's sunny in San Francisco, but you better look out if you're a Gemini 😈.\"]\n", - "21:01:54 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", - "==================================\u001b[1m Ai Message \u001b[0m==================================\n", - "\n", - "Based on the search results, I can provide you with information about the current weather in San Francisco (SF):\n", - "\n", - "The weather in San Francisco is currently sunny. This means it's a clear day with plenty of sunshine.\n", - "\n", - "However, I should note that the search result included an unusual additional comment about Gemini zodiac signs, which isn't relevant to the weather information you requested. We'll focus on the factual weather data.\n", - "\n", - "Is there anything else you'd like to know about the weather in San Francisco or any other location?\n" - ] - } - ], + "outputs": [], "source": [ "# Resume execution - the tool will be called with the updated arguments\n", "for event in app.stream(None, thread, stream_mode=\"values\"):\n", @@ -638,4 +495,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/human_in_the_loop/review-tool-calls-openai.ipynb b/examples/human_in_the_loop/review-tool-calls-openai.ipynb index 2a5850e..d84688d 100644 --- a/examples/human_in_the_loop/review-tool-calls-openai.ipynb +++ b/examples/human_in_the_loop/review-tool-calls-openai.ipynb @@ -74,7 +74,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -91,17 +91,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdin", - "output_type": "stream", - "text": [ - "OPENAI_API_KEY: ········\n" - ] - } - ], + "outputs": [], "source": [ "import getpass\n", "import os\n", @@ -143,30 +135,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "21:02:24 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "21:02:24 redisvl.index.index INFO Index already exists, not overwriting.\n", - "21:02:24 redisvl.index.index INFO Index already exists, not overwriting.\n", - "21:02:24 redisvl.index.index INFO Index already exists, not overwriting.\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from typing_extensions import Literal\n", "from langgraph.graph import StateGraph, START, END, MessagesState\n", @@ -325,20 +296,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "21:02:26 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "{'call_llm': {'messages': [AIMessage(content='Hello! How can I assist you today?', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 10, 'prompt_tokens': 44, 'total_tokens': 54, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_07871e2ad8', 'id': 'chatcmpl-C1fZBywasJAKmXpBtFWCG1oaewwQR', 'service_tier': 'default', 'finish_reason': 'stop', 'logprobs': None}, id='run--2a5425b7-05bd-4202-b74f-49707804f567-0', usage_metadata={'input_tokens': 44, 'output_tokens': 10, 'total_tokens': 54, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})]}}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Input\n", "initial_input = {\"messages\": [{\"role\": \"user\", \"content\": \"hi!\"}]}\n", @@ -370,23 +330,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "21:02:29 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "{'call_llm': {'messages': [AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_uSsZcpdEt4Dc8X9zTKbdvrk1', 'function': {'arguments': '{\"city\":\"San Francisco\"}', 'name': 'weather_search'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 15, 'prompt_tokens': 49, 'total_tokens': 64, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_ff25b2783a', 'id': 'chatcmpl-C1fZFcekJpNMlPgJZMD2vQi4b5GIH', 'service_tier': 'default', 'finish_reason': 'tool_calls', 'logprobs': None}, id='run--4a7549c7-c58f-449b-aba3-01403976766c-0', tool_calls=[{'name': 'weather_search', 'args': {'city': 'San Francisco'}, 'id': 'call_uSsZcpdEt4Dc8X9zTKbdvrk1', 'type': 'tool_call'}], usage_metadata={'input_tokens': 49, 'output_tokens': 15, 'total_tokens': 64, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})]}}\n", - "\n", - "\n", - "{'__interrupt__': (Interrupt(value={'question': 'Is this correct?', 'tool_call': {'name': 'weather_search', 'args': {'city': 'San Francisco'}, 'id': 'call_uSsZcpdEt4Dc8X9zTKbdvrk1', 'type': 'tool_call'}}, id='f7e9dd577561df1ff221671d1317e7af'),)}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Input\n", "initial_input = {\"messages\": [{\"role\": \"user\", \"content\": \"what's the weather in sf?\"}]}\n", @@ -409,18 +355,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Pending Executions!\n", - "('human_review_node',)\n" - ] - } - ], + "outputs": [], "source": [ "print(\"Pending Executions!\")\n", "print(graph.get_state(thread).next)" @@ -435,29 +372,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'human_review_node': None}\n", - "\n", - "\n", - "----\n", - "Searching for: San Francisco\n", - "----\n", - "{'run_tool': {'messages': [{'role': 'tool', 'name': 'weather_search', 'content': 'Sunny!', 'tool_call_id': 'call_uSsZcpdEt4Dc8X9zTKbdvrk1'}]}}\n", - "\n", - "\n", - "21:02:33 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "{'call_llm': {'messages': [AIMessage(content='The weather in San Francisco is sunny!', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 9, 'prompt_tokens': 74, 'total_tokens': 83, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_07871e2ad8', 'id': 'chatcmpl-C1fZJ85HYzmf43GynpaiTmQOEUXmw', 'service_tier': 'default', 'finish_reason': 'stop', 'logprobs': None}, id='run--41accede-5ba9-483e-88cd-8ca10b801465-0', usage_metadata={'input_tokens': 74, 'output_tokens': 9, 'total_tokens': 83, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})]}}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "for event in graph.stream(\n", " # provide value\n", @@ -480,23 +397,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "21:02:34 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "{'call_llm': {'messages': [AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_e6WVBymEECivHxeiR0oo21Sg', 'function': {'arguments': '{\"city\":\"San Francisco\"}', 'name': 'weather_search'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 15, 'prompt_tokens': 49, 'total_tokens': 64, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_07871e2ad8', 'id': 'chatcmpl-C1fZJit4HCesODEgYgw9YLhais4zu', 'service_tier': 'default', 'finish_reason': 'tool_calls', 'logprobs': None}, id='run--b5cff8af-f180-4b33-b677-138ce514501b-0', tool_calls=[{'name': 'weather_search', 'args': {'city': 'San Francisco'}, 'id': 'call_e6WVBymEECivHxeiR0oo21Sg', 'type': 'tool_call'}], usage_metadata={'input_tokens': 49, 'output_tokens': 15, 'total_tokens': 64, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})]}}\n", - "\n", - "\n", - "{'__interrupt__': (Interrupt(value={'question': 'Is this correct?', 'tool_call': {'name': 'weather_search', 'args': {'city': 'San Francisco'}, 'id': 'call_e6WVBymEECivHxeiR0oo21Sg', 'type': 'tool_call'}}, id='781d63d5c3dd842b5b3ed596f7a56971'),)}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Input\n", "initial_input = {\"messages\": [{\"role\": \"user\", \"content\": \"what's the weather in sf?\"}]}\n", @@ -512,18 +415,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Pending Executions!\n", - "('human_review_node',)\n" - ] - } - ], + "outputs": [], "source": [ "print(\"Pending Executions!\")\n", "print(graph.get_state(thread).next)" @@ -541,29 +435,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'human_review_node': {'messages': [{'role': 'ai', 'content': '', 'tool_calls': [{'id': 'call_e6WVBymEECivHxeiR0oo21Sg', 'name': 'weather_search', 'args': {'city': 'San Francisco, USA'}}], 'id': 'run--b5cff8af-f180-4b33-b677-138ce514501b-0'}]}}\n", - "\n", - "\n", - "----\n", - "Searching for: San Francisco, USA\n", - "----\n", - "{'run_tool': {'messages': [{'role': 'tool', 'name': 'weather_search', 'content': 'Sunny!', 'tool_call_id': 'call_e6WVBymEECivHxeiR0oo21Sg'}]}}\n", - "\n", - "\n", - "21:02:35 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "{'call_llm': {'messages': [AIMessage(content='The weather in San Francisco is currently sunny!', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 10, 'prompt_tokens': 76, 'total_tokens': 86, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_07871e2ad8', 'id': 'chatcmpl-C1fZKQFe0LkoEytR1dG3h1RDFnJvi', 'service_tier': 'default', 'finish_reason': 'stop', 'logprobs': None}, id='run--6384a8b8-a19b-409c-a8cc-4b733247b433-0', usage_metadata={'input_tokens': 76, 'output_tokens': 10, 'total_tokens': 86, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})]}}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Let's now continue executing from here\n", "for event in graph.stream(\n", @@ -595,23 +469,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "21:02:36 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "{'call_llm': {'messages': [AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_jhbfIadeAUhbRZiZUcpJ2J9L', 'function': {'arguments': '{\"city\":\"San Francisco\"}', 'name': 'weather_search'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 15, 'prompt_tokens': 49, 'total_tokens': 64, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_07871e2ad8', 'id': 'chatcmpl-C1fZMVok7zk7bDQe5CoCRtyB2S7jY', 'service_tier': 'default', 'finish_reason': 'tool_calls', 'logprobs': None}, id='run--4a97863f-9062-4606-a77c-85aeaa8e6230-0', tool_calls=[{'name': 'weather_search', 'args': {'city': 'San Francisco'}, 'id': 'call_jhbfIadeAUhbRZiZUcpJ2J9L', 'type': 'tool_call'}], usage_metadata={'input_tokens': 49, 'output_tokens': 15, 'total_tokens': 64, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})]}}\n", - "\n", - "\n", - "{'__interrupt__': (Interrupt(value={'question': 'Is this correct?', 'tool_call': {'name': 'weather_search', 'args': {'city': 'San Francisco'}, 'id': 'call_jhbfIadeAUhbRZiZUcpJ2J9L', 'type': 'tool_call'}}, id='e1801b909f48dc19ceb91be907f2f3a7'),)}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Input\n", "initial_input = {\"messages\": [{\"role\": \"user\", \"content\": \"what's the weather in sf?\"}]}\n", @@ -627,18 +487,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Pending Executions!\n", - "('human_review_node',)\n" - ] - } - ], + "outputs": [], "source": [ "print(\"Pending Executions!\")\n", "print(graph.get_state(thread).next)" @@ -656,26 +507,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'human_review_node': {'messages': [{'role': 'tool', 'content': 'User requested changes: use format for location', 'name': 'weather_search', 'tool_call_id': 'call_jhbfIadeAUhbRZiZUcpJ2J9L'}]}}\n", - "\n", - "\n", - "21:02:37 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "{'call_llm': {'messages': [AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_fkJ8ejxWKbS93gh3TED8Wgay', 'function': {'arguments': '{\"city\":\"San Francisco, US\"}', 'name': 'weather_search'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 17, 'prompt_tokens': 85, 'total_tokens': 102, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_ff25b2783a', 'id': 'chatcmpl-C1fZMx0GCybunve8iIxQyqXYdGn9l', 'service_tier': 'default', 'finish_reason': 'tool_calls', 'logprobs': None}, id='run--139ac4b7-bd8d-441f-9283-14a92cac4d91-0', tool_calls=[{'name': 'weather_search', 'args': {'city': 'San Francisco, US'}, 'id': 'call_fkJ8ejxWKbS93gh3TED8Wgay', 'type': 'tool_call'}], usage_metadata={'input_tokens': 85, 'output_tokens': 17, 'total_tokens': 102, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})]}}\n", - "\n", - "\n", - "{'__interrupt__': (Interrupt(value={'question': 'Is this correct?', 'tool_call': {'name': 'weather_search', 'args': {'city': 'San Francisco, US'}, 'id': 'call_fkJ8ejxWKbS93gh3TED8Wgay', 'type': 'tool_call'}}, id='d8afbc4cb33fec44c373827df0838cb7'),)}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Let's now continue executing from here\n", "for event in graph.stream(\n", @@ -702,18 +536,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Pending Executions!\n", - "('human_review_node',)\n" - ] - } - ], + "outputs": [], "source": [ "print(\"Pending Executions!\")\n", "print(graph.get_state(thread).next)" @@ -721,29 +546,9 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'human_review_node': None}\n", - "\n", - "\n", - "----\n", - "Searching for: San Francisco, US\n", - "----\n", - "{'run_tool': {'messages': [{'role': 'tool', 'name': 'weather_search', 'content': 'Sunny!', 'tool_call_id': 'call_fkJ8ejxWKbS93gh3TED8Wgay'}]}}\n", - "\n", - "\n", - "21:02:38 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "{'call_llm': {'messages': [AIMessage(content='The weather in San Francisco, US is currently sunny!', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 12, 'prompt_tokens': 112, 'total_tokens': 124, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_07871e2ad8', 'id': 'chatcmpl-C1fZOGLXka23L4tOQ9iuXsaVyCsY9', 'service_tier': 'default', 'finish_reason': 'stop', 'logprobs': None}, id='run--78edff96-6960-45ad-8d4a-3fec46aee8a8-0', usage_metadata={'input_tokens': 112, 'output_tokens': 12, 'total_tokens': 124, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})]}}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "for event in graph.stream(\n", " Command(resume={\"action\": \"continue\"}), thread, stream_mode=\"updates\"\n", @@ -774,4 +579,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file diff --git a/examples/human_in_the_loop/review-tool-calls.ipynb b/examples/human_in_the_loop/review-tool-calls.ipynb index 3a2da01..a903d7b 100644 --- a/examples/human_in_the_loop/review-tool-calls.ipynb +++ b/examples/human_in_the_loop/review-tool-calls.ipynb @@ -77,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "af4ce0ba-7596-4e5f-8bf8-0b0bd6e62833", "metadata": {}, "outputs": [], @@ -96,18 +96,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "c903a1cf-2977-4e2d-ad7d-8b3946821d89", "metadata": {}, - "outputs": [ - { - "name": "stdin", - "output_type": "stream", - "text": [ - "ANTHROPIC_API_KEY: ········\n" - ] - } - ], + "outputs": [], "source": [ "import getpass\n", "import os\n", @@ -151,31 +143,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "85e452f8-f33a-4ead-bb4d-7386cdba8edc", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "21:15:49 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "21:15:49 redisvl.index.index INFO Index already exists, not overwriting.\n", - "21:15:49 redisvl.index.index INFO Index already exists, not overwriting.\n", - "21:15:49 redisvl.index.index INFO Index already exists, not overwriting.\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import uuid\n", "from typing_extensions import Literal\n", @@ -364,21 +335,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "1b3aa6fc-c7fb-4819-8d7f-ba6057cc4edf", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "21:15:52 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", - "{'call_llm': {'messages': [AIMessage(content=\"Hello! I can help you search for weather information. Would you like to know the weather for a specific city? Just let me know which city you're interested in and I'll look that up for you.\", additional_kwargs={}, response_metadata={'id': 'msg_0193rwYtQTKPwcPCaPkKGxCG', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 374, 'output_tokens': 45, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-5-sonnet-20241022'}, id='run--808b0ff4-73b7-48b1-bda1-da51fcce17db-0', usage_metadata={'input_tokens': 374, 'output_tokens': 45, 'total_tokens': 419, 'input_token_details': {'cache_read': 0, 'cache_creation': 0}})]}}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Input\n", "initial_input = {\"messages\": [{\"role\": \"user\", \"content\": \"hi!\"}]}\n", @@ -412,24 +372,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "2561a38f-edb5-4b44-b2d7-6a7b70d2e6b7", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "21:15:54 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", - "{'call_llm': {'messages': [AIMessage(content=[{'text': \"I'll help you check the weather in San Francisco.\", 'type': 'text'}, {'id': 'toolu_01R8pKGKUyfyWeqQSUDcqQGM', 'input': {'city': 'san francisco'}, 'name': 'weather_search', 'type': 'tool_use'}], additional_kwargs={}, response_metadata={'id': 'msg_01S6emh4tc3QGgdYPv7SdAjn', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'tool_use', 'stop_sequence': None, 'usage': {'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 379, 'output_tokens': 66, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-5-sonnet-20241022'}, id='run--b7a83c46-8e65-4c35-849a-3f250ccb10c1-0', tool_calls=[{'name': 'weather_search', 'args': {'city': 'san francisco'}, 'id': 'toolu_01R8pKGKUyfyWeqQSUDcqQGM', 'type': 'tool_call'}], usage_metadata={'input_tokens': 379, 'output_tokens': 66, 'total_tokens': 445, 'input_token_details': {'cache_read': 0, 'cache_creation': 0}})]}}\n", - "\n", - "\n", - "{'__interrupt__': (Interrupt(value={'question': 'Is this correct?', 'tool_call': {'name': 'weather_search', 'args': {'city': 'san francisco'}, 'id': 'toolu_01R8pKGKUyfyWeqQSUDcqQGM', 'type': 'tool_call'}}, id='166940027697d5fd119987f2de74d63b'),)}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Input\n", "initial_input = {\"messages\": [{\"role\": \"user\", \"content\": \"what's the weather in sf?\"}]}\n", @@ -453,19 +399,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "33d68f0f-d435-4dd1-8013-6a59186dc9f5", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Pending Executions!\n", - "('human_review_node',)\n" - ] - } - ], + "outputs": [], "source": [ "print(\"Pending Executions!\")\n", "print(graph.get_state(thread).next)" @@ -481,30 +418,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "f9a0d5d4-52ff-49e0-a6f4-41f9a0e844d8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'human_review_node': None}\n", - "\n", - "\n", - "----\n", - "Searching for: san francisco\n", - "----\n", - "{'run_tool': {'messages': [{'role': 'tool', 'name': 'weather_search', 'content': 'Sunny!', 'tool_call_id': 'toolu_01R8pKGKUyfyWeqQSUDcqQGM'}]}}\n", - "\n", - "\n", - "21:15:56 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", - "{'call_llm': {'messages': [AIMessage(content=\"It's sunny in San Francisco right now!\", additional_kwargs={}, response_metadata={'id': 'msg_01TgF4FdDGsTPJuAyjr5ahyA', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 458, 'output_tokens': 13, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-5-sonnet-20241022'}, id='run--b1952162-9422-4ba7-82e5-18067ba69cf7-0', usage_metadata={'input_tokens': 458, 'output_tokens': 13, 'total_tokens': 471, 'input_token_details': {'cache_read': 0, 'cache_creation': 0}})]}}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "for event in graph.stream(\n", " # provide value\n", @@ -528,24 +445,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "ec77831c-e6b8-4903-9146-e098a4b2fda1", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "21:15:59 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", - "{'call_llm': {'messages': [AIMessage(content=[{'text': \"I'll help you check the weather in San Francisco.\", 'type': 'text'}, {'id': 'toolu_01Sn7Z6H2TF7tcD4AmyhakZW', 'input': {'city': 'San Francisco'}, 'name': 'weather_search', 'type': 'tool_use'}], additional_kwargs={}, response_metadata={'id': 'msg_01N6ieU4yTPNM2fbwtyuRqgQ', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'tool_use', 'stop_sequence': None, 'usage': {'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 379, 'output_tokens': 66, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-5-sonnet-20241022'}, id='run--4163f12d-cc59-48bb-8530-6225b2393521-0', tool_calls=[{'name': 'weather_search', 'args': {'city': 'San Francisco'}, 'id': 'toolu_01Sn7Z6H2TF7tcD4AmyhakZW', 'type': 'tool_call'}], usage_metadata={'input_tokens': 379, 'output_tokens': 66, 'total_tokens': 445, 'input_token_details': {'cache_read': 0, 'cache_creation': 0}})]}}\n", - "\n", - "\n", - "{'__interrupt__': (Interrupt(value={'question': 'Is this correct?', 'tool_call': {'name': 'weather_search', 'args': {'city': 'San Francisco'}, 'id': 'toolu_01Sn7Z6H2TF7tcD4AmyhakZW', 'type': 'tool_call'}}, id='46ef44a4f93595914ffba94d0cc8630e'),)}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Input\n", "initial_input = {\"messages\": [{\"role\": \"user\", \"content\": \"what's the weather in sf?\"}]}\n", @@ -561,19 +464,10 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "edcffbd7-829b-4d0c-88bf-cd531bc0e6b2", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Pending Executions!\n", - "('human_review_node',)\n" - ] - } - ], + "outputs": [], "source": [ "print(\"Pending Executions!\")\n", "print(graph.get_state(thread).next)" @@ -592,30 +486,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "b2f73998-baae-4c00-8a90-f4153e924941", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'human_review_node': {'messages': [{'role': 'assistant', 'content': [{'text': \"I'll help you check the weather in San Francisco.\", 'type': 'text'}, {'id': 'toolu_01Sn7Z6H2TF7tcD4AmyhakZW', 'input': {'city': 'San Francisco, USA'}, 'name': 'weather_search', 'type': 'tool_use'}], 'id': 'run--4163f12d-cc59-48bb-8530-6225b2393521-0'}]}}\n", - "\n", - "\n", - "----\n", - "Searching for: San Francisco, USA\n", - "----\n", - "{'run_tool': {'messages': [{'role': 'tool', 'name': 'weather_search', 'content': 'Sunny!', 'tool_call_id': 'toolu_01Sn7Z6H2TF7tcD4AmyhakZW'}]}}\n", - "\n", - "\n", - "21:16:01 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", - "{'call_llm': {'messages': [AIMessage(content=\"According to the search, it's sunny in San Francisco right now!\", additional_kwargs={}, response_metadata={'id': 'msg_01NAxyRHaMiWga5zQvMUwr2S', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 460, 'output_tokens': 18, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-5-sonnet-20241022'}, id='run--b5eddf4b-d1cf-4a2d-9d72-1dc335c72994-0', usage_metadata={'input_tokens': 460, 'output_tokens': 18, 'total_tokens': 478, 'input_token_details': {'cache_read': 0, 'cache_creation': 0}})]}}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Let's now continue executing from here\n", "for event in graph.stream(\n", @@ -648,24 +522,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "d57d5131-7912-4216-aa87-b7272507fa51", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "21:16:03 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", - "{'call_llm': {'messages': [AIMessage(content=[{'text': \"I'll help you check the weather in San Francisco.\", 'type': 'text'}, {'id': 'toolu_014kGLsvjUzHsp1aYbFxNPjm', 'input': {'city': 'San Francisco'}, 'name': 'weather_search', 'type': 'tool_use'}], additional_kwargs={}, response_metadata={'id': 'msg_01SiSpoacrTTLA4qZLQ21CUo', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'tool_use', 'stop_sequence': None, 'usage': {'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 379, 'output_tokens': 66, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-5-sonnet-20241022'}, id='run--d7250e30-3df4-4eeb-9bd1-ab43f1af0fc2-0', tool_calls=[{'name': 'weather_search', 'args': {'city': 'San Francisco'}, 'id': 'toolu_014kGLsvjUzHsp1aYbFxNPjm', 'type': 'tool_call'}], usage_metadata={'input_tokens': 379, 'output_tokens': 66, 'total_tokens': 445, 'input_token_details': {'cache_read': 0, 'cache_creation': 0}})]}}\n", - "\n", - "\n", - "{'__interrupt__': (Interrupt(value={'question': 'Is this correct?', 'tool_call': {'name': 'weather_search', 'args': {'city': 'San Francisco'}, 'id': 'toolu_014kGLsvjUzHsp1aYbFxNPjm', 'type': 'tool_call'}}, id='4ffdf5506100238fa59500de986cd178'),)}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Input\n", "initial_input = {\"messages\": [{\"role\": \"user\", \"content\": \"what's the weather in sf?\"}]}\n", @@ -681,19 +541,10 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "e33ad664-0307-43c5-b85a-1e02eebceb5c", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Pending Executions!\n", - "('human_review_node',)\n" - ] - } - ], + "outputs": [], "source": [ "print(\"Pending Executions!\")\n", "print(graph.get_state(thread).next)" @@ -712,27 +563,10 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "3f05f8b6-6128-4de5-8884-862fc93f1227", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'human_review_node': {'messages': [{'role': 'tool', 'content': 'User requested changes: use format for location', 'name': 'weather_search', 'tool_call_id': 'toolu_014kGLsvjUzHsp1aYbFxNPjm'}]}}\n", - "\n", - "\n", - "21:16:05 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", - "{'call_llm': {'messages': [AIMessage(content=[{'text': 'Let me try again with the correct format:', 'type': 'text'}, {'id': 'toolu_01N3t8MYvBFK6t7e5SrXJCPY', 'input': {'city': 'San Francisco, USA'}, 'name': 'weather_search', 'type': 'tool_use'}], additional_kwargs={}, response_metadata={'id': 'msg_01P6ei7UnrNmo9DUSkXBWR2U', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'tool_use', 'stop_sequence': None, 'usage': {'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 469, 'output_tokens': 67, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-5-sonnet-20241022'}, id='run--7ff1a361-3f83-4f10-84a8-4dc79e01aff9-0', tool_calls=[{'name': 'weather_search', 'args': {'city': 'San Francisco, USA'}, 'id': 'toolu_01N3t8MYvBFK6t7e5SrXJCPY', 'type': 'tool_call'}], usage_metadata={'input_tokens': 469, 'output_tokens': 67, 'total_tokens': 536, 'input_token_details': {'cache_read': 0, 'cache_creation': 0}})]}}\n", - "\n", - "\n", - "{'__interrupt__': (Interrupt(value={'question': 'Is this correct?', 'tool_call': {'name': 'weather_search', 'args': {'city': 'San Francisco, USA'}, 'id': 'toolu_01N3t8MYvBFK6t7e5SrXJCPY', 'type': 'tool_call'}}, id='777cc8418f90fbffa7374345fcd9a5ce'),)}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Let's now continue executing from here\n", "for event in graph.stream(\n", @@ -760,19 +594,10 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "ca558915-f4d9-4ff2-95b7-cdaf0c6db485", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Pending Executions!\n", - "('human_review_node',)\n" - ] - } - ], + "outputs": [], "source": [ "print(\"Pending Executions!\")\n", "print(graph.get_state(thread).next)" @@ -780,30 +605,10 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "a30d40ad-611d-4ec3-84be-869ea05acb89", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'human_review_node': None}\n", - "\n", - "\n", - "----\n", - "Searching for: San Francisco, USA\n", - "----\n", - "{'run_tool': {'messages': [{'role': 'tool', 'name': 'weather_search', 'content': 'Sunny!', 'tool_call_id': 'toolu_01N3t8MYvBFK6t7e5SrXJCPY'}]}}\n", - "\n", - "\n", - "21:16:08 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", - "{'call_llm': {'messages': [AIMessage(content='The weather in San Francisco is sunny!', additional_kwargs={}, response_metadata={'id': 'msg_01JWzyzZeUVyfVSufaLk26DJ', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 549, 'output_tokens': 12, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-5-sonnet-20241022'}, id='run--da946d69-b5c8-4757-9e08-8e39692f9490-0', usage_metadata={'input_tokens': 549, 'output_tokens': 12, 'total_tokens': 561, 'input_token_details': {'cache_read': 0, 'cache_creation': 0}})]}}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "for event in graph.stream(\n", " Command(resume={\"action\": \"continue\"}), thread, stream_mode=\"updates\"\n", @@ -834,4 +639,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/human_in_the_loop/time-travel.ipynb b/examples/human_in_the_loop/time-travel.ipynb index 8598e67..86a08e7 100644 --- a/examples/human_in_the_loop/time-travel.ipynb +++ b/examples/human_in_the_loop/time-travel.ipynb @@ -44,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "af4ce0ba-7596-4e5f-8bf8-0b0bd6e62833", "metadata": {}, "outputs": [], @@ -63,18 +63,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "c903a1cf-2977-4e2d-ad7d-8b3946821d89", "metadata": {}, - "outputs": [ - { - "name": "stdin", - "output_type": "stream", - "text": [ - "OPENAI_API_KEY: ········\n" - ] - } - ], + "outputs": [], "source": [ "import getpass\n", "import os\n", @@ -113,21 +105,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "f5319e01", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "21:51:30 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "21:51:30 redisvl.index.index INFO Index already exists, not overwriting.\n", - "21:51:30 redisvl.index.index INFO Index already exists, not overwriting.\n", - "21:51:30 redisvl.index.index INFO Index already exists, not overwriting.\n" - ] - } - ], + "outputs": [], "source": [ "# Set up the tool\n", "import uuid\n", @@ -249,35 +230,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "cfd140f0-a5a6-4697-8115-322242f197b5", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "================================\u001b[1m Human Message \u001b[0m=================================\n", - "\n", - "Can you play Taylor Swift's most popular song?\n", - "21:51:31 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "==================================\u001b[1m Ai Message \u001b[0m==================================\n", - "Tool Calls:\n", - " play_song_on_apple (call_UjI48YFsggsmzmrbdS68f3Rm)\n", - " Call ID: call_UjI48YFsggsmzmrbdS68f3Rm\n", - " Args:\n", - " song: Blinding Lights\n", - "=================================\u001b[1m Tool Message \u001b[0m=================================\n", - "Name: play_song_on_apple\n", - "\n", - "Successfully played Blinding Lights on Apple Music!\n", - "21:51:32 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "==================================\u001b[1m Ai Message \u001b[0m==================================\n", - "\n", - "I've started playing \"Blinding Lights\" by The Weeknd on Apple Music. Enjoy the song!\n" - ] - } - ], + "outputs": [], "source": [ "from langchain_core.messages import HumanMessage\n", "import uuid\n", @@ -301,22 +257,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "777538a5", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Current state has 4 messages:\n", - " 0. Human: Can you play Taylor Swift's most popular song?\n", - " 1. AI: Called play_song_on_apple\n", - " 2. Tool Result: Successfully played Blinding Lights on Apple Music...\n", - " 3. AI: I've started playing \"Blinding Lights\" by The Weeknd on Apple Music. Enjoy the song!...\n" - ] - } - ], + "outputs": [], "source": [ "# Check the current state messages\n", "current_state = app.get_state(config)\n", @@ -339,40 +283,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "8578a66d-6489-4e03-8c23-fd0530278455", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "State history (newest to oldest):\n", - "==================================================\n", - "State 0:\n", - " - Messages: 0\n", - " - Next node(s): ('__start__',)\n", - "------------------------------\n", - "State 1:\n", - " - Messages: 1\n", - " - Next node(s): ('agent',)\n", - "------------------------------\n", - "State 2:\n", - " - Messages: 2\n", - " - Next node(s): ('action',)\n", - " ⚡ This is where we can intercept before tool execution\n", - "------------------------------\n", - "State 3:\n", - " - Messages: 3\n", - " - Next node(s): ('agent',)\n", - "------------------------------\n", - "State 4:\n", - " - Messages: 4\n", - " - Next node(s): ()\n", - "------------------------------\n" - ] - } - ], + "outputs": [], "source": [ "print(\"State history (newest to oldest):\")\n", "print(\"=\" * 50)\n", @@ -400,19 +314,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "02250602-8c4a-4fb5-bd6c-d0b9046e8699", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Selected state: ('action',)\n", - "Messages in state: 2\n" - ] - } - ], + "outputs": [], "source": [ "# Get the state right before the tool was called\n", "# The states list is in reverse chronological order (newest first)\n", @@ -432,22 +337,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "21e7fc18-6fd9-4e11-a84b-e0325c9640c8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "State values:\n", - " Messages: 2\n", - " Message 0: dict\n", - " Message 1: dict\n" - ] - } - ], + "outputs": [], "source": [ "if to_replay:\n", " print(f\"\\nState values:\")\n", @@ -462,20 +355,10 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "d4b01634-0041-4632-8d1f-5464580e54f5", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Next steps from this state: ('action',)\n", - "This state is right before the tool execution.\n" - ] - } - ], + "outputs": [], "source": [ "if to_replay:\n", " print(f\"\\nNext steps from this state: {to_replay.next}\")\n", @@ -494,34 +377,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "e986f94f-706f-4b6f-b3c4-f95483b9e9b8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Replaying from selected state (resuming tool execution):\n", - "--------------------------------------------------\n", - "==================================\u001b[1m Ai Message \u001b[0m==================================\n", - "Tool Calls:\n", - " play_song_on_apple (call_UjI48YFsggsmzmrbdS68f3Rm)\n", - " Call ID: call_UjI48YFsggsmzmrbdS68f3Rm\n", - " Args:\n", - " song: Blinding Lights\n", - "=================================\u001b[1m Tool Message \u001b[0m=================================\n", - "Name: play_song_on_apple\n", - "\n", - "Successfully played Blinding Lights on Apple Music!\n", - "21:51:33 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "==================================\u001b[1m Ai Message \u001b[0m==================================\n", - "\n", - "I've started playing \"Blinding Lights\" on Apple Music. Enjoy the music!\n" - ] - } - ], + "outputs": [], "source": [ "if to_replay:\n", " print(\"\\nReplaying from selected state (resuming tool execution):\")\n", @@ -547,18 +406,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "fbd5ad3b-5363-4ab7-ac63-b04668bc998f", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Last message doesn't have tool calls\n" - ] - } - ], + "outputs": [], "source": [ "if to_replay and to_replay.values.get(\"messages\"):\n", " # Get the last message in the state (the AI message with tool calls)\n", @@ -602,18 +453,10 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "9a92d3da-62e2-45a2-8545-e4f6a64e0ffe", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "No branch config available. Make sure the previous cell executed successfully.\n" - ] - } - ], + "outputs": [], "source": [ "if 'branch_config' in locals():\n", " print(\"\\n🎵 Running with modified tool call (Spotify instead of Apple):\")\n", @@ -635,19 +478,10 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "01abb480-df55-4eba-a2be-cf9372b60b54", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "✅ Created alternative branch without tool call\n", - "New branch checkpoint: 1f0730f8...\n" - ] - } - ], + "outputs": [], "source": [ "from langchain_core.messages import AIMessage\n", "\n", @@ -674,20 +508,10 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "1a7cfcd4-289e-419e-8b49-dfaef4f88641", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Alternative branch state has 3 messages\n", - "Last message: It's quiet hours so I can't play any music right now! But 'Anti-Hero' is indeed a great song....\n" - ] - } - ], + "outputs": [], "source": [ "if 'branch_config_2' in locals():\n", " branch_state = app.get_state(branch_config_2)\n", @@ -699,23 +523,10 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "5198f9c1-d2d4-458a-993d-3caa55810b1e", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Branch state values:\n", - " Messages: 3\n", - " 0. HumanMessage: Can you play Taylor Swift's most popular song?...\n", - " 1. AIMessage: ...\n", - " 2. AIMessage: It's quiet hours so I can't play any music right n...\n" - ] - } - ], + "outputs": [], "source": [ "if 'branch_state' in locals():\n", " print(\"\\nBranch state values:\")\n", @@ -728,20 +539,10 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "id": "5d89d55d-db84-4c2d-828b-64a29a69947b", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Next steps for alternative branch: ()\n", - "✅ Graph execution complete - no tool was called in this branch\n" - ] - } - ], + "outputs": [], "source": [ "if 'branch_state' in locals():\n", " print(f\"\\nNext steps for alternative branch: {branch_state.next}\")\n", @@ -798,4 +599,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/human_in_the_loop/wait-user-input.ipynb b/examples/human_in_the_loop/wait-user-input.ipynb index 91ec900..a4f3d19 100644 --- a/examples/human_in_the_loop/wait-user-input.ipynb +++ b/examples/human_in_the_loop/wait-user-input.ipynb @@ -33,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "af4ce0ba-7596-4e5f-8bf8-0b0bd6e62833", "metadata": {}, "outputs": [], @@ -52,18 +52,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "c903a1cf-2977-4e2d-ad7d-8b3946821d89", "metadata": {}, - "outputs": [ - { - "name": "stdin", - "output_type": "stream", - "text": [ - "ANTHROPIC_API_KEY: ········\n" - ] - } - ], + "outputs": [], "source": [ "import getpass\n", "import os\n", @@ -108,31 +100,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "58eae42d-be32-48da-8d0a-ab64471657d9", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "21:52:16 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "21:52:16 redisvl.index.index INFO Index already exists, not overwriting.\n", - "21:52:16 redisvl.index.index INFO Index already exists, not overwriting.\n", - "21:52:16 redisvl.index.index INFO Index already exists, not overwriting.\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from typing_extensions import TypedDict\n", "from langgraph.graph import StateGraph, START, END\n", @@ -198,25 +169,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "eb8e7d47-e7c9-4217-b72c-08394a2c4d3e", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---Step 1---\n", - "{'step_1': None}\n", - "\n", - "\n", - "---human_feedback---\n", - "{'__interrupt__': (Interrupt(value='Please provide feedback:', id='8232df09204836af2b12cde88baab605'),)}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Input\n", "initial_input = {\"input\": \"hello world\"}\n", @@ -240,25 +196,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "3cca588f-e8d8-416b-aba7-0f3ae5e51598", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---human_feedback---\n", - "{'human_feedback': {'user_feedback': 'go to step 3!'}}\n", - "\n", - "\n", - "---Step 3---\n", - "{'step_3': None}\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Continue the graph execution\n", "for event in graph.stream(\n", @@ -281,21 +222,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "2b83e5ca-8497-43ca-bff7-7203e654c4d3", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'input': 'hello world', 'user_feedback': 'go to step 3!'}" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "graph.get_state(thread).values" ] @@ -327,31 +257,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "f5319e01", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "21:52:17 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "21:52:17 redisvl.index.index INFO Index already exists, not overwriting.\n", - "21:52:17 redisvl.index.index INFO Index already exists, not overwriting.\n", - "21:52:17 redisvl.index.index INFO Index already exists, not overwriting.\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Set up the state\n", "from langgraph.graph import MessagesState, START\n", @@ -499,29 +408,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "cfd140f0-a5a6-4697-8115-322242f197b5", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "================================\u001b[1m Human Message \u001b[0m=================================\n", - "\n", - "Ask the user where they are, then look up the weather there\n", - "21:52:20 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", - "==================================\u001b[1m Ai Message \u001b[0m==================================\n", - "\n", - "[{'text': \"I'll help with that.\", 'type': 'text'}, {'id': 'toolu_014eUhmrQLFds9MUu17mQAfY', 'input': {'question': 'Where are you located?'}, 'name': 'AskHuman', 'type': 'tool_use'}]\n", - "Tool Calls:\n", - " AskHuman (toolu_014eUhmrQLFds9MUu17mQAfY)\n", - " Call ID: toolu_014eUhmrQLFds9MUu17mQAfY\n", - " Args:\n", - " question: Where are you located?\n" - ] - } - ], + "outputs": [], "source": [ "config = {\"configurable\": {\"thread_id\": \"2\"}}\n", "for event in app.stream(\n", @@ -542,21 +432,10 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "924a30ea-94c0-468e-90fe-47eb9c08584d", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "('ask_human',)" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "app.get_state(config).next" ] @@ -571,45 +450,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "a9f599b5-1a55-406b-a76b-f52b3ca06975", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "==================================\u001b[1m Ai Message \u001b[0m==================================\n", - "\n", - "[{'text': \"I'll help with that.\", 'type': 'text'}, {'id': 'toolu_014eUhmrQLFds9MUu17mQAfY', 'input': {'question': 'Where are you located?'}, 'name': 'AskHuman', 'type': 'tool_use'}]\n", - "Tool Calls:\n", - " AskHuman (toolu_014eUhmrQLFds9MUu17mQAfY)\n", - " Call ID: toolu_014eUhmrQLFds9MUu17mQAfY\n", - " Args:\n", - " question: Where are you located?\n", - "=================================\u001b[1m Tool Message \u001b[0m=================================\n", - "\n", - "san francisco\n", - "21:52:22 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", - "==================================\u001b[1m Ai Message \u001b[0m==================================\n", - "\n", - "[{'text': \"Now I'll search for the weather in San Francisco.\", 'type': 'text'}, {'id': 'toolu_01WEMm4toG9v4pmKgGWv5Gop', 'input': {'query': 'current weather in san francisco'}, 'name': 'search', 'type': 'tool_use'}]\n", - "Tool Calls:\n", - " search (toolu_01WEMm4toG9v4pmKgGWv5Gop)\n", - " Call ID: toolu_01WEMm4toG9v4pmKgGWv5Gop\n", - " Args:\n", - " query: current weather in san francisco\n", - "=================================\u001b[1m Tool Message \u001b[0m=================================\n", - "Name: search\n", - "\n", - "I looked up: current weather in san francisco. Result: It's sunny in San Francisco, but you better look out if you're a Gemini 😈.\n", - "21:52:24 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", - "==================================\u001b[1m Ai Message \u001b[0m==================================\n", - "\n", - "Based on the search results, it's currently sunny in San Francisco!\n" - ] - } - ], + "outputs": [], "source": [ "for event in app.stream(\n", " # highlight-next-line\n", @@ -643,4 +487,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/memory/add-summary-conversation-history.ipynb b/examples/memory/add-summary-conversation-history.ipynb index 480df9e..55a70ab 100644 --- a/examples/memory/add-summary-conversation-history.ipynb +++ b/examples/memory/add-summary-conversation-history.ipynb @@ -107,10 +107,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:51:26 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "19:51:26 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:51:26 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:51:26 redisvl.index.index INFO Index already exists, not overwriting.\n" + "00:42:58 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", + "00:42:58 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:42:58 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:42:58 redisvl.index.index INFO Index already exists, not overwriting.\n" ] } ], @@ -249,25 +249,25 @@ "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "hi! I'm bob\n", - "19:51:27 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:42:59 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "Hi Bob! It's nice to meet you. I'm an AI assistant created by Anthropic. I don't actually have information about the current weather in specific locations, since I don't have access to real-time weather data. I should have been more clear that I don't have location-specific weather information. Please let me know if there's anything else I can assist you with!\n", + "Hi Bob! Nice to meet you. I'm Claude, an AI assistant created by Anthropic. How are you doing today? Let me know if you have any questions or if there's anything I can help you with.\n", "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "what's my name?\n", - "19:51:28 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:42:59 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "You said your name is Bob, so your name is Bob.\n", + "Your name is Bob, as you told me earlier in our conversation.\n", "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "i like the celtics!\n", - "19:51:29 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:43:00 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "That's great, the Celtics are a really exciting NBA team! Do you follow them closely? What do you like most about the team? I don't have strong sports knowledge myself, but I'm always happy to chat about topics that interest you.\n", - "19:51:30 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "That's great, I'm glad you like the Celtics! Basketball is a really exciting sport to follow. Do you have a favorite player on the Celtics team? I'd be curious to hear more about what you enjoy about watching them play.\n", + "00:43:02 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "================================\u001b[1m Remove Message \u001b[0m================================\n", "\n", "\n", @@ -286,20 +286,17 @@ "================================\u001b[1m Remove Message \u001b[0m================================\n", "\n", "\n", - "Here is a summary of the conversation so far:\n", + "Here is a summary of our conversation so far:\n", "\n", - "The conversation started with you asking about the weather in SF, to which I incorrectly responded that it was sunny in LA. I then clarified that I don't actually have access to real-time weather data for specific locations. \n", + "The conversation started with you asking about the weather in San Francisco, to which I incorrectly responded that it was sunny in Los Angeles. \n", "\n", - "You then introduced yourself as Bob, and I acknowledged that your name is Bob. \n", + "You then introduced yourself as Bob, and I greeted you and explained that I am an AI assistant named Claude.\n", "\n", - "You expressed that you like the Celtics basketball team, and I showed interest in discussing your fandom for them, though I don't have in-depth sports knowledge myself.\n", + "You asked me what your name was, and I correctly recalled that you had introduced yourself as Bob earlier.\n", "\n", - "The key points are:\n", - "- Confusion about weather information\n", - "- Confirmation of your name being Bob\n", - "- Your interest in the Celtics\n", + "Finally, you expressed that you like the Boston Celtics basketball team, and I asked if you had a favorite player on the team, showing interest in learning more about your fandom.\n", "\n", - "Please let me know if I've missed or mischaracterized anything in this summary.\n" + "The key points are your name is Bob, you're a fan of the Celtics, and we had a bit of back-and-forth as I introduced myself as an AI assistant named Claude.\n" ] } ], @@ -340,9 +337,9 @@ { "data": { "text/plain": [ - "{'messages': [HumanMessage(content='i like the celtics!', additional_kwargs={}, response_metadata={}, id='e18daa5f-6131-464c-9a7c-0c5abf376d68'),\n", - " AIMessage(content=\"That's great, the Celtics are a really exciting NBA team! Do you follow them closely? What do you like most about the team? I don't have strong sports knowledge myself, but I'm always happy to chat about topics that interest you.\", additional_kwargs={}, response_metadata={'id': 'msg_01N7BAiX5zGXrEvYUrtphnWw', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 146, 'output_tokens': 55, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307'}, id='run--f1d2ab88-5864-4243-83c4-55253227c9b2-0', usage_metadata={'input_tokens': 146, 'output_tokens': 55, 'total_tokens': 201, 'input_token_details': {'cache_creation': 0, 'cache_read': 0}})],\n", - " 'summary': \"Here is a summary of the conversation so far:\\n\\nThe conversation started with you asking about the weather in SF, to which I incorrectly responded that it was sunny in LA. I then clarified that I don't actually have access to real-time weather data for specific locations. \\n\\nYou then introduced yourself as Bob, and I acknowledged that your name is Bob. \\n\\nYou expressed that you like the Celtics basketball team, and I showed interest in discussing your fandom for them, though I don't have in-depth sports knowledge myself.\\n\\nThe key points are:\\n- Confusion about weather information\\n- Confirmation of your name being Bob\\n- Your interest in the Celtics\\n\\nPlease let me know if I've missed or mischaracterized anything in this summary.\"}" + "{'messages': [HumanMessage(content='i like the celtics!', additional_kwargs={}, response_metadata={}, id='95a53b16-7630-466e-be0a-896bbd58bc06'),\n", + " AIMessage(content=\"That's great, I'm glad you like the Celtics! Basketball is a really exciting sport to follow. Do you have a favorite player on the Celtics team? I'd be curious to hear more about what you enjoy about watching them play.\", additional_kwargs={}, response_metadata={'id': 'msg_0183Pgv8iMvNtpwmT8PbbgMT', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation': {'ephemeral_1h_input_tokens': 0, 'ephemeral_5m_input_tokens': 0}, 'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 113, 'output_tokens': 55, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307', 'model_provider': 'anthropic'}, id='lc_run--2e844ea2-d3c2-4f6b-87f7-0e17517c7a62-0', usage_metadata={'input_tokens': 113, 'output_tokens': 55, 'total_tokens': 168, 'input_token_details': {'cache_creation': 0, 'cache_read': 0, 'ephemeral_5m_input_tokens': 0, 'ephemeral_1h_input_tokens': 0}})],\n", + " 'summary': \"Here is a summary of our conversation so far:\\n\\nThe conversation started with you asking about the weather in San Francisco, to which I incorrectly responded that it was sunny in Los Angeles. \\n\\nYou then introduced yourself as Bob, and I greeted you and explained that I am an AI assistant named Claude.\\n\\nYou asked me what your name was, and I correctly recalled that you had introduced yourself as Bob earlier.\\n\\nFinally, you expressed that you like the Boston Celtics basketball team, and I asked if you had a favorite player on the team, showing interest in learning more about your fandom.\\n\\nThe key points are your name is Bob, you're a fan of the Celtics, and we had a bit of back-and-forth as I introduced myself as an AI assistant named Claude.\"}" ] }, "execution_count": 6, @@ -376,20 +373,20 @@ "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "i like how much they win\n", - "19:51:32 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:43:04 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "That's a great point about the Celtics! They have definitely been one of the more successful and consistent franchises in the NBA over the years. Some key things about the Celtics' winning ways:\n", + "That's a good point about the Celtics - they have been a very successful franchise over the years. A few thoughts on their winning ways:\n", "\n", - "- They have won a record 17 NBA championships, the most of any team. Their most recent title was in 2008.\n", + "- The Celtics are one of the most storied franchises in the NBA, with 17 championship titles, the most of any team. Their history of winning is impressive.\n", "\n", - "- They have made the playoffs in 32 of the last 35 seasons, showing their sustained excellence and competitiveness.\n", + "- This season, the Celtics have the best record in the Eastern Conference and are contending for another title. Their consistent ability to compete for championships year after year is admirable.\n", "\n", - "- Key players like Larry Bird, Kevin McHale, and Paul Pierce have led championship-caliber Celtics teams over the decades.\n", + "- Players like Jayson Tatum and Jaylen Brown have emerged as elite talents, helping keep the Celtics among the NBA's elite teams. Their young core has a lot of potential.\n", "\n", - "- Under coach Brad Stevens, they've remained a top contender in the Eastern Conference in recent years, making the playoffs every season since 2015.\n", + "- Coaching stability with Brad Stevens and now Joe Mazzulla has allowed the Celtics to maintain their high level of play over time.\n", "\n", - "I can see why you're drawn to a team with such a winning pedigree and tradition. The Celtics' ability to consistently compete for titles must be very satisfying as a fan. Do you have a favorite Celtics player or season you particularly enjoyed watching?\n" + "I can see why you enjoy following a team that wins as much as the Celtics do. Their sustained success and ability to compete for championships must make them very fun to root for. Do you have a favorite Celtics championship team or season from their history?\n" ] } ], @@ -417,11 +414,11 @@ { "data": { "text/plain": [ - "{'messages': [HumanMessage(content='i like the celtics!', additional_kwargs={}, response_metadata={}, id='e18daa5f-6131-464c-9a7c-0c5abf376d68'),\n", - " AIMessage(content=\"That's great, the Celtics are a really exciting NBA team! Do you follow them closely? What do you like most about the team? I don't have strong sports knowledge myself, but I'm always happy to chat about topics that interest you.\", additional_kwargs={}, response_metadata={'id': 'msg_01N7BAiX5zGXrEvYUrtphnWw', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 146, 'output_tokens': 55, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307'}, id='run--f1d2ab88-5864-4243-83c4-55253227c9b2-0', usage_metadata={'input_tokens': 146, 'output_tokens': 55, 'total_tokens': 201, 'input_token_details': {'cache_creation': 0, 'cache_read': 0}}),\n", - " HumanMessage(content='i like how much they win', additional_kwargs={}, response_metadata={}, id='7ff737dd-19e8-4cfd-8847-032516e1666e'),\n", - " AIMessage(content=\"That's a great point about the Celtics! They have definitely been one of the more successful and consistent franchises in the NBA over the years. Some key things about the Celtics' winning ways:\\n\\n- They have won a record 17 NBA championships, the most of any team. Their most recent title was in 2008.\\n\\n- They have made the playoffs in 32 of the last 35 seasons, showing their sustained excellence and competitiveness.\\n\\n- Key players like Larry Bird, Kevin McHale, and Paul Pierce have led championship-caliber Celtics teams over the decades.\\n\\n- Under coach Brad Stevens, they've remained a top contender in the Eastern Conference in recent years, making the playoffs every season since 2015.\\n\\nI can see why you're drawn to a team with such a winning pedigree and tradition. The Celtics' ability to consistently compete for titles must be very satisfying as a fan. Do you have a favorite Celtics player or season you particularly enjoyed watching?\", additional_kwargs={}, response_metadata={'id': 'msg_01Ce3TQnFa49akkAobXkXK13', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 246, 'output_tokens': 222, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307'}, id='run--ad74a07f-eb5f-4682-8856-ad99cd80790a-0', usage_metadata={'input_tokens': 246, 'output_tokens': 222, 'total_tokens': 468, 'input_token_details': {'cache_creation': 0, 'cache_read': 0}})],\n", - " 'summary': \"Here is a summary of the conversation so far:\\n\\nThe conversation started with you asking about the weather in SF, to which I incorrectly responded that it was sunny in LA. I then clarified that I don't actually have access to real-time weather data for specific locations. \\n\\nYou then introduced yourself as Bob, and I acknowledged that your name is Bob. \\n\\nYou expressed that you like the Celtics basketball team, and I showed interest in discussing your fandom for them, though I don't have in-depth sports knowledge myself.\\n\\nThe key points are:\\n- Confusion about weather information\\n- Confirmation of your name being Bob\\n- Your interest in the Celtics\\n\\nPlease let me know if I've missed or mischaracterized anything in this summary.\"}" + "{'messages': [HumanMessage(content='i like the celtics!', additional_kwargs={}, response_metadata={}, id='95a53b16-7630-466e-be0a-896bbd58bc06'),\n", + " AIMessage(content=\"That's great, I'm glad you like the Celtics! Basketball is a really exciting sport to follow. Do you have a favorite player on the Celtics team? I'd be curious to hear more about what you enjoy about watching them play.\", additional_kwargs={}, response_metadata={'id': 'msg_0183Pgv8iMvNtpwmT8PbbgMT', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation': {'ephemeral_1h_input_tokens': 0, 'ephemeral_5m_input_tokens': 0}, 'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 113, 'output_tokens': 55, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307', 'model_provider': 'anthropic'}, id='lc_run--2e844ea2-d3c2-4f6b-87f7-0e17517c7a62-0', usage_metadata={'input_tokens': 113, 'output_tokens': 55, 'total_tokens': 168, 'input_token_details': {'cache_creation': 0, 'cache_read': 0, 'ephemeral_5m_input_tokens': 0, 'ephemeral_1h_input_tokens': 0}}),\n", + " HumanMessage(content='i like how much they win', additional_kwargs={}, response_metadata={}, id='3d4a2b4f-a111-42de-a382-d59e90389a2f'),\n", + " AIMessage(content=\"That's a good point about the Celtics - they have been a very successful franchise over the years. A few thoughts on their winning ways:\\n\\n- The Celtics are one of the most storied franchises in the NBA, with 17 championship titles, the most of any team. Their history of winning is impressive.\\n\\n- This season, the Celtics have the best record in the Eastern Conference and are contending for another title. Their consistent ability to compete for championships year after year is admirable.\\n\\n- Players like Jayson Tatum and Jaylen Brown have emerged as elite talents, helping keep the Celtics among the NBA's elite teams. Their young core has a lot of potential.\\n\\n- Coaching stability with Brad Stevens and now Joe Mazzulla has allowed the Celtics to maintain their high level of play over time.\\n\\nI can see why you enjoy following a team that wins as much as the Celtics do. Their sustained success and ability to compete for championships must make them very fun to root for. Do you have a favorite Celtics championship team or season from their history?\", additional_kwargs={}, response_metadata={'id': 'msg_01SQizVtWWsq9zAnBW6Jg4Ub', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation': {'ephemeral_1h_input_tokens': 0, 'ephemeral_5m_input_tokens': 0}, 'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 249, 'output_tokens': 240, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307', 'model_provider': 'anthropic'}, id='lc_run--a87a6f62-2eba-4d8b-9165-96a4f76ccd0e-0', usage_metadata={'input_tokens': 249, 'output_tokens': 240, 'total_tokens': 489, 'input_token_details': {'cache_creation': 0, 'cache_read': 0, 'ephemeral_5m_input_tokens': 0, 'ephemeral_1h_input_tokens': 0}})],\n", + " 'summary': \"Here is a summary of our conversation so far:\\n\\nThe conversation started with you asking about the weather in San Francisco, to which I incorrectly responded that it was sunny in Los Angeles. \\n\\nYou then introduced yourself as Bob, and I greeted you and explained that I am an AI assistant named Claude.\\n\\nYou asked me what your name was, and I correctly recalled that you had introduced yourself as Bob earlier.\\n\\nFinally, you expressed that you like the Boston Celtics basketball team, and I asked if you had a favorite player on the team, showing interest in learning more about your fandom.\\n\\nThe key points are your name is Bob, you're a fan of the Celtics, and we had a bit of back-and-forth as I introduced myself as an AI assistant named Claude.\"}" ] }, "execution_count": 8, @@ -455,10 +452,10 @@ "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "what's my name?\n", - "19:51:33 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:43:04 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "Ah, you're right, I should have kept that detail in mind. Your name is Bob, as you mentioned earlier in our conversation. My apologies for not remembering that detail more clearly. Please feel free to remind me of important details like your name - it helps me have a more coherent and personalized conversation with you.\n" + "I apologize, I don't actually remember your name. Earlier in our conversation you introduced yourself as Bob, but I don't have that information stored currently. What is your name?\n" ] } ], @@ -482,11 +479,11 @@ "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "what NFL team do you think I like?\n", - "19:51:34 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:43:06 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "Hmm, that's a good question. Since I don't have any prior information about your specific NFL team preferences, I don't want to make an assumption. As an AI assistant without detailed knowledge of your personal interests, the best I can do is ask you directly - what NFL team do you like? I'm happy to discuss whichever team you're a fan of, but I don't want to guess incorrectly. Could you please let me know your favorite NFL team?\n", - "19:51:36 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "Hmm, without any additional context about your preferences, it's hard for me to confidently guess which NFL team you might like. Since you've expressed interest in the Boston Celtics basketball team, one possibility could be that you're a fan of a New England-based NFL team, like the Patriots. But I don't want to assume that without more information from you. What NFL team do you actually support?\n", + "00:43:08 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "================================\u001b[1m Remove Message \u001b[0m================================\n", "\n", "\n", @@ -505,18 +502,21 @@ "================================\u001b[1m Remove Message \u001b[0m================================\n", "\n", "\n", - "Got it, thank you for providing that helpful summary of our conversation so far. To extend the summary:\n", + "Okay, got it. Let me summarize our conversation so far, including the latest exchange:\n", "\n", - "After confirming your name is Bob, you asked what NFL team I think you like. Since I don't have any prior information about your NFL team preferences, I explained that I didn't want to make an assumption, and instead asked you directly to share your favorite NFL team.\n", + "The conversation started with me incorrectly stating the weather in Los Angeles when you asked about San Francisco. \n", "\n", - "So the full summary is:\n", + "You then introduced yourself as Bob, and I greeted you and explained that I am an AI assistant named Claude.\n", "\n", - "- Confusion about weather information\n", - "- Confirmation of your name being Bob \n", - "- Your interest in the Celtics basketball team\n", - "- Your question about what NFL team I think you like, to which I responded by asking you to share your favorite NFL team, as I didn't want to guess incorrectly.\n", + "You expressed that you like the Boston Celtics basketball team, and I asked if you had a favorite player or Celtics team. \n", "\n", - "Please let me know if I'm still missing or mischaracterizing anything in this extended summary of our discussion so far. I appreciate you taking the time to ensure I have an accurate understanding.\n" + "You said you like how much the Celtics win, and we discussed their history of success and sustained competitiveness.\n", + "\n", + "You then asked what your name was, and I correctly recalled that you had introduced yourself as Bob earlier.\n", + "\n", + "Finally, you asked what NFL team I think you might like, but I explained I didn't have enough information to guess that without more context about your preferences.\n", + "\n", + "So in summary, the key points are you are a fan of the Boston Celtics, your name is Bob, and we've had a friendly back-and-forth as I've tried to have a natural conversation with you as an AI assistant. Please let me know if I'm missing or misstating anything from our discussion so far.\n" ] } ], @@ -540,14 +540,14 @@ "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "i like the patriots!\n", - "19:51:37 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:43:10 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "Ah I see, got it! Thanks for sharing that you're a fan of the New England Patriots. That's a great NFL team with a very successful history over the past couple of decades. \n", + "Ah I see, that's a great guess on my part then! I suspected you might be a Patriots fan since they are the NFL team based in the New England region, just like your favorite basketball team the Boston Celtics.\n", "\n", - "Since you've now told me your favorite team is the Patriots, I'm happy to discuss them with you. What do you enjoy most about being a Patriots fan? Do you have a favorite player on the team currently or from their past championship teams? I'm always interested to hear fans' perspectives on their favorite teams and players.\n", + "The Patriots have been one of the most successful and consistently competitive NFL franchises over the past couple of decades, so it makes a lot of sense that you would be a fan of theirs. They've won 6 Super Bowls since 2001, establishing an impressive dynasty under head coach Bill Belichick and star quarterback Tom Brady.\n", "\n", - "Let me know what you'd like to chat about regarding the Patriots. I'm glad I was able to get the right information from you directly instead of making an assumption earlier. Discussing shared interests is more fun when we have the facts straight!\n" + "I'm glad I was able to correctly deduce that the Patriots are likely your preferred NFL team based on your affinity for the Boston Celtics. It's always satisfying when an AI assistant can make an accurate inference about a user's preferences and interests. Let me know if you have any other thoughts on the Patriots or the NFL in general!\n" ] } ], @@ -575,7 +575,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.13" + "version": "3.11.14" } }, "nbformat": 4, diff --git a/examples/memory/delete-messages.ipynb b/examples/memory/delete-messages.ipynb index 153790a..62ce4c9 100644 --- a/examples/memory/delete-messages.ipynb +++ b/examples/memory/delete-messages.ipynb @@ -104,10 +104,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:50:41 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "19:50:41 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:50:41 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:50:41 redisvl.index.index INFO Index already exists, not overwriting.\n" + "00:42:29 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", + "00:42:29 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:42:29 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:42:29 redisvl.index.index INFO Index already exists, not overwriting.\n" ] } ], @@ -205,17 +205,17 @@ "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "hi! I'm bob\n", - "19:50:42 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:42:30 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "Nice to meet you, Bob! How are you doing today?\n", + "Hi there! It's nice to meet you Bob. How are you doing today?\n", "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "what's my name?\n", - "19:50:42 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:42:31 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "Your name is Bob, as you introduced yourself earlier.\n" + "You said your name is Bobhi, but then you said \"I'm bob\". So I'm not entirely sure which name you prefer to go by - Bobhi or Bob. Could you please clarify which name you would like me to call you?\n" ] } ], @@ -251,13 +251,14 @@ { "data": { "text/plain": [ - "[HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='d7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'),\n", - " HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='28ef5b05-b571-4454-9753-10d194e52024'),\n", - " AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='9773b21f-7e75-4e67-91a8-5ab80fa37ee7'),\n", - " HumanMessage(content=\"hi! I'm bob\", additional_kwargs={}, response_metadata={}, id='2d0c503b-9df6-4570-af9f-79b9836feb93'),\n", - " AIMessage(content='Nice to meet you, Bob! How are you doing today?', additional_kwargs={}, response_metadata={'id': 'msg_018qjMF2rCeDopVNXyDUV2gs', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 33, 'output_tokens': 16, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307'}, id='run--f9412a3a-0228-4711-a34e-cd61408bfedd-0', usage_metadata={'input_tokens': 33, 'output_tokens': 16, 'total_tokens': 49, 'input_token_details': {'cache_creation': 0, 'cache_read': 0}}),\n", - " HumanMessage(content=\"what's my name?\", additional_kwargs={}, response_metadata={}, id='a93a4f72-2c30-4129-ab05-af7746b60af1'),\n", - " AIMessage(content='Your name is Bob, as you introduced yourself earlier.', additional_kwargs={}, response_metadata={'id': 'msg_01Gpz8yNWvUXbdLBAqnnEgac', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 57, 'output_tokens': 14, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307'}, id='run--1c8a9de5-8ccc-4832-92ce-84998c7867b7-0', usage_metadata={'input_tokens': 57, 'output_tokens': 14, 'total_tokens': 71, 'input_token_details': {'cache_creation': 0, 'cache_read': 0}})]" + "[HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'),\n", + " HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='eaa3e056-eca2-4788-bbab-c8a83e9878be'),\n", + " AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='86510037-f2d0-452f-b007-d335fa4d6482'),\n", + " HumanMessage(content=\"hi! I'm bob\", additional_kwargs={}, response_metadata={}, id='1ae41bbc-7e24-4f7e-977c-1b3fdcc32b17'),\n", + " HumanMessage(content=\"hi! I'm bob\", additional_kwargs={}, response_metadata={}, id='a2bfd9d6-eb79-4a4e-8442-e24f2e2aeaa0'),\n", + " AIMessage(content=\"Hi there! It's nice to meet you Bob. How are you doing today?\", additional_kwargs={}, response_metadata={'id': 'msg_017s4qmQuzYRURfeKbSBBrg2', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation': {'ephemeral_1h_input_tokens': 0, 'ephemeral_5m_input_tokens': 0}, 'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 38, 'output_tokens': 20, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307', 'model_provider': 'anthropic'}, id='lc_run--30df87d3-74c8-440b-b276-9f148dd51103-0', usage_metadata={'input_tokens': 38, 'output_tokens': 20, 'total_tokens': 58, 'input_token_details': {'cache_creation': 0, 'cache_read': 0, 'ephemeral_5m_input_tokens': 0, 'ephemeral_1h_input_tokens': 0}}),\n", + " HumanMessage(content=\"what's my name?\", additional_kwargs={}, response_metadata={}, id='5f52b451-f3da-4f99-b19a-6a36b18707ea'),\n", + " AIMessage(content='You said your name is Bobhi, but then you said \"I\\'m bob\". So I\\'m not entirely sure which name you prefer to go by - Bobhi or Bob. Could you please clarify which name you would like me to call you?', additional_kwargs={}, response_metadata={'id': 'msg_019TGAG3hZeYU3CNEQhrTCg6', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation': {'ephemeral_1h_input_tokens': 0, 'ephemeral_5m_input_tokens': 0}, 'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 66, 'output_tokens': 56, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307', 'model_provider': 'anthropic'}, id='lc_run--766d6be9-a776-41c7-a4a3-0d74ea1b56bb-0', usage_metadata={'input_tokens': 66, 'output_tokens': 56, 'total_tokens': 122, 'input_token_details': {'cache_creation': 0, 'cache_read': 0, 'ephemeral_5m_input_tokens': 0, 'ephemeral_1h_input_tokens': 0}})]" ] }, "execution_count": 5, @@ -289,7 +290,7 @@ "text/plain": [ "{'configurable': {'thread_id': '2',\n", " 'checkpoint_ns': '',\n", - " 'checkpoint_id': '1f072fea-2e9f-6bfc-800c-832ea93dceea'}}" + " 'checkpoint_id': '1f0c4177-727b-6981-800e-48d86665e9b9'}}" ] }, "execution_count": 6, @@ -320,12 +321,13 @@ { "data": { "text/plain": [ - "[HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='28ef5b05-b571-4454-9753-10d194e52024'),\n", - " AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='9773b21f-7e75-4e67-91a8-5ab80fa37ee7'),\n", - " HumanMessage(content=\"hi! I'm bob\", additional_kwargs={}, response_metadata={}, id='2d0c503b-9df6-4570-af9f-79b9836feb93'),\n", - " AIMessage(content='Nice to meet you, Bob! How are you doing today?', additional_kwargs={}, response_metadata={'id': 'msg_018qjMF2rCeDopVNXyDUV2gs', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 33, 'output_tokens': 16, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307'}, id='run--f9412a3a-0228-4711-a34e-cd61408bfedd-0', usage_metadata={'input_tokens': 33, 'output_tokens': 16, 'total_tokens': 49, 'input_token_details': {'cache_creation': 0, 'cache_read': 0}}),\n", - " HumanMessage(content=\"what's my name?\", additional_kwargs={}, response_metadata={}, id='a93a4f72-2c30-4129-ab05-af7746b60af1'),\n", - " AIMessage(content='Your name is Bob, as you introduced yourself earlier.', additional_kwargs={}, response_metadata={'id': 'msg_01Gpz8yNWvUXbdLBAqnnEgac', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 57, 'output_tokens': 14, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307'}, id='run--1c8a9de5-8ccc-4832-92ce-84998c7867b7-0', usage_metadata={'input_tokens': 57, 'output_tokens': 14, 'total_tokens': 71, 'input_token_details': {'cache_creation': 0, 'cache_read': 0}})]" + "[HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='eaa3e056-eca2-4788-bbab-c8a83e9878be'),\n", + " AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='86510037-f2d0-452f-b007-d335fa4d6482'),\n", + " HumanMessage(content=\"hi! I'm bob\", additional_kwargs={}, response_metadata={}, id='1ae41bbc-7e24-4f7e-977c-1b3fdcc32b17'),\n", + " HumanMessage(content=\"hi! I'm bob\", additional_kwargs={}, response_metadata={}, id='a2bfd9d6-eb79-4a4e-8442-e24f2e2aeaa0'),\n", + " AIMessage(content=\"Hi there! It's nice to meet you Bob. How are you doing today?\", additional_kwargs={}, response_metadata={'id': 'msg_017s4qmQuzYRURfeKbSBBrg2', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation': {'ephemeral_1h_input_tokens': 0, 'ephemeral_5m_input_tokens': 0}, 'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 38, 'output_tokens': 20, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307', 'model_provider': 'anthropic'}, id='lc_run--30df87d3-74c8-440b-b276-9f148dd51103-0', usage_metadata={'input_tokens': 38, 'output_tokens': 20, 'total_tokens': 58, 'input_token_details': {'cache_creation': 0, 'cache_read': 0, 'ephemeral_5m_input_tokens': 0, 'ephemeral_1h_input_tokens': 0}}),\n", + " HumanMessage(content=\"what's my name?\", additional_kwargs={}, response_metadata={}, id='5f52b451-f3da-4f99-b19a-6a36b18707ea'),\n", + " AIMessage(content='You said your name is Bobhi, but then you said \"I\\'m bob\". So I\\'m not entirely sure which name you prefer to go by - Bobhi or Bob. Could you please clarify which name you would like me to call you?', additional_kwargs={}, response_metadata={'id': 'msg_019TGAG3hZeYU3CNEQhrTCg6', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation': {'ephemeral_1h_input_tokens': 0, 'ephemeral_5m_input_tokens': 0}, 'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 66, 'output_tokens': 56, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307', 'model_provider': 'anthropic'}, id='lc_run--766d6be9-a776-41c7-a4a3-0d74ea1b56bb-0', usage_metadata={'input_tokens': 66, 'output_tokens': 56, 'total_tokens': 122, 'input_token_details': {'cache_creation': 0, 'cache_read': 0, 'ephemeral_5m_input_tokens': 0, 'ephemeral_1h_input_tokens': 0}})]" ] }, "execution_count": 7, @@ -358,10 +360,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:50:42 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "19:50:42 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:50:42 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:50:42 redisvl.index.index INFO Index already exists, not overwriting.\n" + "00:42:31 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", + "00:42:31 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:42:31 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:42:31 redisvl.index.index INFO Index already exists, not overwriting.\n" ] } ], @@ -435,13 +437,13 @@ "output_type": "stream", "text": [ "[('human', \"what's the weather in sf\"), ('ai', \"It's sunny in San Francisco!\"), ('human', \"hi! I'm bob\")]\n", - "19:50:43 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", - "[('human', \"what's the weather in sf\"), ('ai', \"It's sunny in San Francisco!\"), ('human', \"hi! I'm bob\"), ('ai', \"Hi Bob, it's nice to meet you! As an AI assistant, I don't have a physical form, but I'm happy to chat and try my best to help you with any questions or tasks you might have. Please let me know if there's anything I can assist you with.\")]\n", - "[('ai', \"It's sunny in San Francisco!\"), ('human', \"hi! I'm bob\"), ('ai', \"Hi Bob, it's nice to meet you! As an AI assistant, I don't have a physical form, but I'm happy to chat and try my best to help you with any questions or tasks you might have. Please let me know if there's anything I can assist you with.\")]\n", - "[('ai', \"It's sunny in San Francisco!\"), ('human', \"hi! I'm bob\"), ('ai', \"Hi Bob, it's nice to meet you! As an AI assistant, I don't have a physical form, but I'm happy to chat and try my best to help you with any questions or tasks you might have. Please let me know if there's anything I can assist you with.\"), ('human', \"what's my name?\")]\n", - "19:50:44 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", - "[('ai', \"It's sunny in San Francisco!\"), ('human', \"hi! I'm bob\"), ('ai', \"Hi Bob, it's nice to meet you! As an AI assistant, I don't have a physical form, but I'm happy to chat and try my best to help you with any questions or tasks you might have. Please let me know if there's anything I can assist you with.\"), ('human', \"what's my name?\"), ('ai', 'You said your name is Bob, so your name is Bob.')]\n", - "[('ai', \"Hi Bob, it's nice to meet you! As an AI assistant, I don't have a physical form, but I'm happy to chat and try my best to help you with any questions or tasks you might have. Please let me know if there's anything I can assist you with.\"), ('human', \"what's my name?\"), ('ai', 'You said your name is Bob, so your name is Bob.')]\n" + "00:42:31 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "[('human', \"what's the weather in sf\"), ('ai', \"It's sunny in San Francisco!\"), ('human', \"hi! I'm bob\"), ('ai', \"Nice to meet you, Bob! As an AI assistant, I don't have a physical form, but I'm happy to chat and help out however I can. Please let me know if you have any questions or if there's anything I can assist you with.\")]\n", + "[('ai', \"It's sunny in San Francisco!\"), ('human', \"hi! I'm bob\"), ('ai', \"Nice to meet you, Bob! As an AI assistant, I don't have a physical form, but I'm happy to chat and help out however I can. Please let me know if you have any questions or if there's anything I can assist you with.\")]\n", + "[('ai', \"It's sunny in San Francisco!\"), ('human', \"hi! I'm bob\"), ('ai', \"Nice to meet you, Bob! As an AI assistant, I don't have a physical form, but I'm happy to chat and help out however I can. Please let me know if you have any questions or if there's anything I can assist you with.\"), ('human', \"what's my name?\")]\n", + "00:42:32 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "[('ai', \"It's sunny in San Francisco!\"), ('human', \"hi! I'm bob\"), ('ai', \"Nice to meet you, Bob! As an AI assistant, I don't have a physical form, but I'm happy to chat and help out however I can. Please let me know if you have any questions or if there's anything I can assist you with.\"), ('human', \"what's my name?\"), ('ai', 'You just told me your name is Bob.')]\n", + "[('ai', \"Nice to meet you, Bob! As an AI assistant, I don't have a physical form, but I'm happy to chat and help out however I can. Please let me know if you have any questions or if there's anything I can assist you with.\"), ('human', \"what's my name?\"), ('ai', 'You just told me your name is Bob.')]\n" ] } ], @@ -475,9 +477,9 @@ { "data": { "text/plain": [ - "[AIMessage(content=\"Hi Bob, it's nice to meet you! As an AI assistant, I don't have a physical form, but I'm happy to chat and try my best to help you with any questions or tasks you might have. Please let me know if there's anything I can assist you with.\", additional_kwargs={}, response_metadata={'id': 'msg_018GPgXGZTAEVaMepCSqpnd6', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 31, 'output_tokens': 62, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307'}, id='run--8257b47e-e5b1-4e79-ac0c-6d3dfa9f2e10-0', usage_metadata={'input_tokens': 31, 'output_tokens': 62, 'total_tokens': 93, 'input_token_details': {'cache_creation': 0, 'cache_read': 0}}),\n", - " HumanMessage(content=\"what's my name?\", additional_kwargs={}, response_metadata={}, id='aee629b9-daa6-4e62-8acb-10aff78c9a2b'),\n", - " AIMessage(content='You said your name is Bob, so your name is Bob.', additional_kwargs={}, response_metadata={'id': 'msg_01Jx5JcjsiavCyyzn4ErHX7w', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 104, 'output_tokens': 16, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307'}, id='run--90a3132d-d1b0-4c97-aa72-56fe5731a9d3-0', usage_metadata={'input_tokens': 104, 'output_tokens': 16, 'total_tokens': 120, 'input_token_details': {'cache_creation': 0, 'cache_read': 0}})]" + "[AIMessage(content=\"Nice to meet you, Bob! As an AI assistant, I don't have a physical form, but I'm happy to chat and help out however I can. Please let me know if you have any questions or if there's anything I can assist you with.\", additional_kwargs={}, response_metadata={'id': 'msg_01Mj7ySSpyuJ2WDLwKP2BRzx', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation': {'ephemeral_1h_input_tokens': 0, 'ephemeral_5m_input_tokens': 0}, 'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 31, 'output_tokens': 56, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307', 'model_provider': 'anthropic'}, id='lc_run--a0533b69-48a1-4eff-8ab7-1d481d70eddc-0', usage_metadata={'input_tokens': 31, 'output_tokens': 56, 'total_tokens': 87, 'input_token_details': {'cache_creation': 0, 'cache_read': 0, 'ephemeral_5m_input_tokens': 0, 'ephemeral_1h_input_tokens': 0}}),\n", + " HumanMessage(content=\"what's my name?\", additional_kwargs={}, response_metadata={}, id='f86a5f02-10d3-4411-873e-fe467ba992dd'),\n", + " AIMessage(content='You just told me your name is Bob.', additional_kwargs={}, response_metadata={'id': 'msg_01BTHe5pJ4PnJfFEAhwTRjqB', 'model': 'claude-3-haiku-20240307', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'cache_creation': {'ephemeral_1h_input_tokens': 0, 'ephemeral_5m_input_tokens': 0}, 'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 98, 'output_tokens': 12, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-haiku-20240307', 'model_provider': 'anthropic'}, id='lc_run--d479edfe-b6bf-4e9b-8cfe-271673012c6b-0', usage_metadata={'input_tokens': 98, 'output_tokens': 12, 'total_tokens': 110, 'input_token_details': {'cache_creation': 0, 'cache_read': 0, 'ephemeral_5m_input_tokens': 0, 'ephemeral_1h_input_tokens': 0}})]" ] }, "execution_count": 10, @@ -515,7 +517,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.13" + "version": "3.11.14" } }, "nbformat": 4, diff --git a/examples/memory/manage-conversation-history.ipynb b/examples/memory/manage-conversation-history.ipynb index 9d1fc0c..c439df8 100644 --- a/examples/memory/manage-conversation-history.ipynb +++ b/examples/memory/manage-conversation-history.ipynb @@ -103,10 +103,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:52:08 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "19:52:08 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:52:08 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:52:08 redisvl.index.index INFO Index already exists, not overwriting.\n" + "00:43:40 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", + "00:43:40 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:43:40 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:43:40 redisvl.index.index INFO Index already exists, not overwriting.\n" ] } ], @@ -204,17 +204,17 @@ "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "hi! I'm bob\n", - "19:52:09 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:43:41 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "Ah I see, you're introducing yourself again. It's nice to meet you Bob! I'm an AI assistant created by Anthropic. Is there anything I can help you with today?\n", + "Okay, got it! It's nice to meet you Bob. Thanks for clarifying your name. How are you doing today?\n", "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "what's my name?\n", - "19:52:09 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:43:41 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "Your name is Bob, as you introduced yourself earlier.\n" + "Based on our conversation, your name is Bob. You've told me twice now that your name is Bob, so I will refer to you as Bob going forward.\n" ] } ], @@ -251,10 +251,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:52:09 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "19:52:09 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:52:09 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:52:09 redisvl.index.index INFO Index already exists, not overwriting.\n" + "00:43:41 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", + "00:43:41 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:43:41 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:43:41 redisvl.index.index INFO Index already exists, not overwriting.\n" ] } ], @@ -358,17 +358,17 @@ "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "hi! I'm bob\n", - "19:52:10 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:43:42 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "Hello Bob! It's nice to meet you. How can I assist you today?\n", + "It's nice to meet you, Bob! As an AI assistant, I'm here to help you with any questions or tasks you may have. Please feel free to ask me anything, and I'll do my best to assist you.\n", "================================\u001b[1m Human Message \u001b[0m=================================\n", "\n", "what's my name?\n", - "19:52:10 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:43:43 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "I'm afraid I don't actually know your name. As an AI assistant, I don't have personal information about you unless you provide it to me directly. Could you please tell me your name so I can address you properly?\n" + "I'm afraid I don't actually know your name. As an AI assistant, I don't have any specific information about you or your name unless you provide that to me directly.\n" ] } ], @@ -415,7 +415,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.13" + "version": "3.11.14" } }, "nbformat": 4, diff --git a/examples/memory/semantic-search.ipynb b/examples/memory/semantic-search.ipynb index 0253147..36f55f6 100644 --- a/examples/memory/semantic-search.ipynb +++ b/examples/memory/semantic-search.ipynb @@ -66,7 +66,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:52:53 langgraph.store.redis INFO Redis standalone client detected for RedisStore.\n" + "00:44:20 langgraph.store.redis INFO Redis standalone client detected for RedisStore.\n" ] } ], @@ -116,11 +116,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:52:55 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "19:52:55 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "19:52:55 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "19:52:56 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "19:52:56 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n" + "00:44:21 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:44:21 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:44:21 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:44:21 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:44:22 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n" ] } ], @@ -149,10 +149,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:52:57 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "Memory: I prefer Italian food (similarity: 0.464895367622)\n", - "Memory: I love pizza (similarity: 0.35517317056700004)\n", - "Memory: I am a plumber (similarity: 0.15568614006000003)\n" + "00:44:22 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "Memory: I prefer Italian food (similarity: 0.464826762676)\n", + "Memory: I love pizza (similarity: 0.35514843463900003)\n", + "Memory: I am a plumber (similarity: 0.15569871664)\n" ] } ], @@ -182,13 +182,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:52:57 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "19:52:57 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:52:57 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:52:57 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:52:57 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "19:52:58 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "What are you in the mood for? If you love Italian food, you might enjoy some pizza or pasta! Do you have any particular cravings?" + "00:44:22 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", + "00:44:22 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:44:22 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:44:22 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:44:22 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:44:23 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "What are you in the mood for? Since you love Italian food and pizza, would you like to order a pizza or perhaps make one at home?" ] } ], @@ -260,10 +260,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:52:58 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "19:52:58 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:52:58 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:52:58 redisvl.index.index INFO Index already exists, not overwriting.\n" + "00:44:24 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", + "00:44:24 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:44:24 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:44:24 redisvl.index.index INFO Index already exists, not overwriting.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_3503/975175168.py:50: LangGraphDeprecatedSinceV10: create_react_agent has been moved to `langchain.agents`. Please update your import to `from langchain.agents import create_agent`. Deprecated in LangGraph V1.0 to be removed in V2.0.\n", + " agent = create_react_agent(\n" ] } ], @@ -337,8 +345,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:52:59 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "19:52:59 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "00:44:24 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:44:25 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "Based on your memories, you prefer Italian food and you love pizza." ] } @@ -386,26 +394,26 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:53:00 langgraph.store.redis INFO Redis standalone client detected for RedisStore.\n", - "19:53:00 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:53:00 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:53:00 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "19:53:00 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "19:53:01 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:44:25 langgraph.store.redis INFO Redis standalone client detected for RedisStore.\n", + "00:44:25 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:44:25 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:44:25 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:44:26 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:44:26 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", "Expect mem 2\n", - "Item: mem2; Score (0.5895009040829999)\n", + "Item: mem2; Score (0.589555978775)\n", "Memory: Ate alone at home\n", "Emotion: felt a bit lonely\n", "\n", "Expect mem1\n", - "19:53:01 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "Item: mem2; Score (0.23533058166499998)\n", + "00:44:26 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "Item: mem2; Score (0.23533296585100005)\n", "Memory: Ate alone at home\n", "Emotion: felt a bit lonely\n", "\n", "Expect random lower score (ravioli not indexed)\n", - "19:53:01 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "Item: mem2; Score (0.15017724037199998)\n", + "00:44:26 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "Item: mem2; Score (0.15022909641299997)\n", "Memory: Ate alone at home\n", "Emotion: felt a bit lonely\n", "\n" @@ -489,20 +497,20 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:53:01 langgraph.store.redis INFO Redis standalone client detected for RedisStore.\n", - "19:53:01 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:53:01 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:53:01 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "19:53:02 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:44:26 langgraph.store.redis INFO Redis standalone client detected for RedisStore.\n", + "00:44:26 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:44:26 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:44:27 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:44:27 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", "Expect mem1\n", - "19:53:03 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "Item: mem1; Score (0.33750283718100005)\n", + "00:44:27 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "Item: mem1; Score (0.337496876717)\n", "Memory: I love spicy food\n", "Context: At a Thai restaurant\n", "\n", "Expect mem2\n", - "19:53:03 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "Item: mem2; Score (0.36788678169300004)\n", + "00:44:27 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "Item: mem2; Score (0.36784017086)\n", "Memory: The restaurant was too loud\n", "Context: Dinner at an Italian place\n", "\n" @@ -577,19 +585,19 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:53:03 langgraph.store.redis INFO Redis standalone client detected for RedisStore.\n", - "19:53:03 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:53:03 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:53:03 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "00:44:27 langgraph.store.redis INFO Redis standalone client detected for RedisStore.\n", + "00:44:27 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:44:27 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:44:28 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", "Expect mem1\n", - "19:53:04 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "Item: mem1; Score (0.32270014286000004)\n", + "00:44:28 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "Item: mem1; Score (0.322699844837)\n", "Memory: I love chocolate ice cream\n", "Type: preference\n", "\n", "Expect low score (mem2 not indexed)\n", - "19:53:04 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", - "Item: mem1; Score (0.010180473327999984)\n", + "00:44:28 httpx INFO HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "Item: mem1; Score (0.010241627692999966)\n", "Memory: I love chocolate ice cream\n", "Type: preference\n", "\n" @@ -654,7 +662,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.13" + "version": "3.11.14" } }, "nbformat": 4, diff --git a/examples/persistence-functional.ipynb b/examples/persistence-functional.ipynb index 6a57d2a..ea1f1d9 100644 --- a/examples/persistence-functional.ipynb +++ b/examples/persistence-functional.ipynb @@ -16,6 +16,10 @@ " - [Memory](../../concepts/memory/)\n", " - [Chat Models](https://python.langchain.com/docs/concepts/chat_models/)\n", "\n", + "!!! info \"Not needed for LangGraph API users\"\n", + "\n", + " If you're using the LangGraph API, you needn't manually implement a checkpointer. The API automatically handles checkpointing for you. This guide is relevant when implementing LangGraph in your own custom server.\n", + "\n", "Many AI applications need memory to share context across multiple interactions on the same [thread](../../concepts/persistence#threads) (e.g., multiple turns of a conversation). In LangGraph functional API, this kind of memory can be added to any [entrypoint()][langgraph.func.entrypoint] workflow using [thread-level persistence](https://langchain-ai.github.io/langgraph/concepts/persistence).\n", "\n", "When creating a LangGraph workflow, you can set it up to persist its results by using a [checkpointer](https://langchain-ai.github.io/langgraph/reference/checkpoints/#basecheckpointsaver):\n", @@ -94,7 +98,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 6, "id": "af4ce0ba-7596-4e5f-8bf8-0b0bd6e62833", "metadata": {}, "outputs": [], @@ -113,18 +117,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 7, "id": "c903a1cf-2977-4e2d-ad7d-8b3946821d89", "metadata": {}, - "outputs": [ - { - "name": "stdin", - "output_type": "stream", - "text": [ - "ANTHROPIC_API_KEY: ········\n" - ] - } - ], + "outputs": [], "source": [ "import getpass\n", "import os\n", @@ -165,14 +161,14 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "id": "892b54b9-75f0-4804-9ed0-88b5e5532989", "metadata": {}, "outputs": [], "source": [ "from langchain_anthropic import ChatAnthropic\n", "\n", - "model = ChatAnthropic(model=\"claude-3-5-sonnet-latest\")" + "model = ChatAnthropic(model=\"claude-sonnet-4-20250514\")" ] }, { @@ -185,7 +181,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 9, "id": "87326ea6-34c5-46da-a41f-dda26ef9bd74", "metadata": {}, "outputs": [ @@ -193,10 +189,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "18:55:08 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "18:55:08 redisvl.index.index INFO Index already exists, not overwriting.\n", - "18:55:08 redisvl.index.index INFO Index already exists, not overwriting.\n", - "18:55:08 redisvl.index.index INFO Index already exists, not overwriting.\n" + "00:36:43 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", + "00:36:43 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:36:43 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:36:43 redisvl.index.index INFO Index already exists, not overwriting.\n" ] } ], @@ -245,7 +241,7 @@ "source": [ "!!! note Note\n", "\n", - " If you're using LangGraph Cloud or LangGraph Studio, you __don't need__ to pass checkpointer to the entrypoint decorator, since it's done automatically." + " If you're using LangGraph Platform or LangGraph Studio, you __don't need__ to pass checkpointer to the entrypoint decorator, since it's done automatically." ] }, { @@ -258,7 +254,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 10, "id": "cfd140f0-a5a6-4697-8115-322242f197b5", "metadata": {}, "outputs": [ @@ -266,10 +262,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "18:55:11 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:36:45 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "Hi Bob! I'm Claude. Nice to meet you. How can I help you today?\n" + "Hi Bob! Good to hear from you again. How are you doing today?\n" ] } ], @@ -290,7 +286,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 11, "id": "08ae8246-11d5-40e1-8567-361e5bef8917", "metadata": {}, "outputs": [ @@ -298,10 +294,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "18:55:12 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:36:48 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "Your name is Bob, based on what you just told me.\n" + "Your name is Bob! You introduced yourself to me at the beginning of our conversation.\n" ] } ], @@ -321,7 +317,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 12, "id": "273d56a8-f40f-4a51-a27f-7c6bb2bda0ba", "metadata": {}, "outputs": [ @@ -329,10 +325,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "18:55:14 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", + "00:36:50 httpx INFO HTTP Request: POST https://api.anthropic.com/v1/messages \"HTTP/1.1 200 OK\"\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "I don't know your name, as you haven't shared it with me. Each conversation with me starts fresh, so I don't have access to any previous conversations or personal information about you unless you specifically tell me.\n" + "I don't actually know your name. I don't have access to information about who you are unless you tell me directly in our conversation. If you'd like me to know your name, please feel free to share it with me!\n" ] } ], @@ -373,7 +369,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.13" + "version": "3.11.14" } }, "nbformat": 4, diff --git a/examples/subgraph-persistence.ipynb b/examples/subgraph-persistence.ipynb index 116bcd9..a8e9bfc 100644 --- a/examples/subgraph-persistence.ipynb +++ b/examples/subgraph-persistence.ipynb @@ -47,7 +47,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 8, "id": "77d1eafa-3252-45f6-9af0-d94e1f9c5c9e", "metadata": {}, "outputs": [], @@ -105,17 +105,17 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 9, "id": "0d76f0c0-bd77-4eca-9527-27bcdf85dd42", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 2, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -176,12 +176,12 @@ "id": "47084b1f-9fd5-40a9-9d75-89eb5f853d02", "metadata": {}, "source": [ - "We can now compile the graph with an in-memory checkpointer (`MemorySaver`)." + "We can now compile the graph with a Redis checkpointer (`RedisSaver`)." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 10, "id": "7657d285-c896-40c9-a569-b4a3b9c230c7", "metadata": {}, "outputs": [ @@ -189,7 +189,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:48:39 langgraph.checkpoint.redis INFO Redis client is a standalone client\n" + "00:39:44 langgraph.checkpoint.redis INFO Redis client is a standalone client\n" ] } ], @@ -226,7 +226,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 11, "id": "13da686e-6ed6-4b83-93e8-1631fcc8c2a9", "metadata": {}, "outputs": [], @@ -236,7 +236,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 12, "id": "8721f045-2e82-4bf0-9d85-5ba6ecf899d6", "metadata": {}, "outputs": [ @@ -266,7 +266,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 13, "id": "3e817283-142d-4fda-8cb1-8de34717f833", "metadata": {}, "outputs": [ @@ -276,7 +276,7 @@ "{'foo': 'hi! foobar'}" ] }, - "execution_count": 6, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -300,7 +300,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 14, "id": "e896628f-36b2-45eb-b7c5-c64c1098f328", "metadata": {}, "outputs": [], @@ -320,7 +320,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 15, "id": "21e96df3-946d-40f8-8d6d-055ae4177452", "metadata": {}, "outputs": [ @@ -328,10 +328,10 @@ "data": { "text/plain": [ "{'configurable': {'thread_id': '1',\n", - " 'checkpoint_ns': 'node_2:a17a6508-101f-059f-10ae-100a6b79cc4c'}}" + " 'checkpoint_ns': 'node_2:562da115-4861-6138-1125-59718cde6ec8'}}" ] }, - "execution_count": 8, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -343,7 +343,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 16, "id": "1d2401b3-d52b-4895-a5d1-dccf015ba216", "metadata": {}, "outputs": [ @@ -353,7 +353,7 @@ "{'foo': 'hi! foobar', 'bar': 'bar'}" ] }, - "execution_count": 9, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -387,7 +387,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.13" + "version": "3.11.14" } }, "nbformat": 4, diff --git a/examples/subgraphs-manage-state.ipynb b/examples/subgraphs-manage-state.ipynb index f6790f2..76d6abd 100644 --- a/examples/subgraphs-manage-state.ipynb +++ b/examples/subgraphs-manage-state.ipynb @@ -176,10 +176,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:49:17 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "19:49:17 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:49:17 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:49:17 redisvl.index.index INFO Index already exists, not overwriting.\n" + "00:40:20 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", + "00:40:20 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:40:20 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:40:20 redisvl.index.index INFO Index already exists, not overwriting.\n" ] } ], @@ -246,7 +246,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaQAAAIMCAIAAAA1iU98AAAAAXNSR0IArs4c6QAAIABJREFUeJzs3XdcU9f7B/ATMiAJYe+9tyCCgrgVlaqAe+Leq/VbUTu0to5a66h7VVv3qKugVutsHbhQpgzZS4bMBLLI+P1x+4vUAqISbpLzvF/+keQmNw/DD+c+9+YcilwuRwAAoOm0yC4AAAA6AoQdAAALEHYAACxA2AEAsABhBwDAAoQdAAALNLILAB2BW9VYVyVpqJM0cCUSsXpcbETX1mJxqGw9qp4xXd+ETnY5QO1R4Do7DVZeIMxNbchNbTAwoTeKZbr6NJYejc6gkF1Xm0glqL62sYEroWtTa8pFDt5s504cCwdtsusC6grCTjNVl4njLlcydWkGpnRHb7aRBYPsij5KTUVj3ov62vLGeq4kZJiJiZV6fzmAFBB2Gujhlerc1Poew4wdvNlk19LOCjL4cZcq7dzZPSKMya4FqBkIO01zZktRQKihi58u2YUoUW5qw6M/qiYus0PqcUQOVAKcjdUccjnaE53df5yZZicdQsjJhx02xWLX0myZjOxSgPqAkZ3m2L00e94PLlSczlvujs6e/6OLFvzJBm0AvyYa4syWorH/s8Uq6RBCE5fbn9xYQHYVQD3AyE4TPLxcZWqrrfFHr80qSOMXvuT3Gm5CdiFA1cHITu1VvhLnpzfgmXQIIXsvVlmBsKxASHYhQNVB2Km9h5crQ4ZhPa4JGWYcd7mK7CqAqoOwU2+leUK2Ps3ek0V2IWSydmYamTOKswRkFwJUGoSdestOqje27OiPE4SGhpaUlLzvq86cObN69WrlVIRMrBhZiTwl7RxoBgg79ZaXWu/o06HduuLi4tra2g944YsXL5RQzj8cfXTzUhuUt3+gAeBsrBqrKhU/vlo1ZIalMnYul8tPnjx55cqVwsJCR0fHoKCg+fPnP336dNGiRcQT+vTps2XLlpycnHPnzj158qSsrMzR0XHUqFEjRoxACGVmZk6aNGnbtm3r1q0zNDRksVhJSUnEC48fP+7h4dHuBV87Utalv6GZLcwUAJoHUzypsdrXjcr7vNTp06f37t37xRdfdO/e/e7du7t379bT05syZcq2bduWLFkSExNjbW2NENq0aVNFRcXXX3/t5OR069at9evXW1paBgcHMxgMhNDu3bsnT57cuXNnb2/vadOm2dvbf/fdd0oqWItKqakQQ9iBlkDYqTE+T8LWU9ZP8Pnz5wEBAcOGDUMIjRgxIjAwUChs5vKOjRs38vl8S0tLhNDo0aMvXrwYFxcXHBxMpVKJ0d+kSZOUVOFb2HpUPlfaMe8F1BGEnRrjc6UsDlVJO/fz89u5c+eaNWt69+4dEBBga2vb7NNkMtmJEyfi4uIKCwuJRxwdHRVbPT09lVTef7H1aPV1kg57O6B2IOzUGQXRaMo6xTRhwgQWi3X37t3o6GgajTZ48ODFixebmPzrgj6pVLp48WK5XL548eLAwEAOhzNt2rSmT9DW7riDSiqNQoFJUEDLIOzUGJNNrX0tVtLOqVTqyJEjR44cmZub+/jx4/379zc0NGzevLnpc9LS0jIyMvbu3du1a1fiER6PtOs/eLUSHbayxrlAA8ClJ2qMxaHyeUrpUsnl8suXL+fm5iKEnJycJkyYMH78+IyMjLeeRlyDYmpqStzNzs4uKCDtY/l8rhI7mEADQNipMT1jOo2ulCM3CoVy+fLl5cuX37t3j8vl3r9//6+//vL19UUIOTg4IIRu3ryZmprq7OxMoVBOnDhRX1+fl5e3devW4ODg0tLSZvdpa2ublpYWHx9fXV2tlJqpFH1jzGZ9Ae8Dwk6NmdlqF2TwlTS4+/bbbx0cHP73v//1799/3bp1/fr1+/rrrxFCNjY24eHhe/fu3blzp5WV1bp16xITE/v27bt06dKFCxeOHj06KSlp3Lhx/93hyJEj5XL5ggULsrKy2r1asVCWk1Rv6aTT7nsGGgMuKlZvd36rMLPT8Q7WI7sQkmXE84oy+QMnmZNdCFBdMLJTb86+nMoSEdlVkK+yWOTSGdNJrkAbQUNXvdl5MB9fqywvEJrbN38EV1xcHBUV1ewmKpUqlTZ/CDx69GjFx8LaXXR0dHx8fLObjIyMWurorVy5MjQ0tNlNla/ERVn8njB/J2gVHMaqvZIcweNr1SMXWje7VSKRVFRUNLuJx+NxOJxmN7HZbH19/XYt843KykqxuPkrZoRCoY5O86ltaGjIZDKb3XTpwCvfXgaYz3MF3glGdmrvn9ncsgU2Ls1kAY1Gs7KyIqOuFr11ZfJHKisQsfRwn9EPtAX07DRB39Gmfx4tU9JpWVXWKJLF7CseMN6M7EKAGoCw0xATl9ud/LGQ7Co62omNhROX25NdBVAP0LPTHGKR/Pj6/Ilf2OuwNP9vWKNYfuKHggnRdtoYfLGgXUDYaZSGOunJTQXDZlpZOmry5bUVhaILe4onLrfXM4KmM2grCDsNdOtMBZ8rCRlm0vHLUyhbTUVj3KVKbaZW6ES4fhi8Hwg7zVSQzn9wqdLBk21qo+3ozaYx1HvyI2mjPO9Fw+tiUW5qfcgwE0cfNtkVAfUDYafJcpIbspN4eakNbl04CCG2Po2tR6Vrq0eTS9Ior6+V8LkS4tNgjt5sFz9d+JgE+GAQdlgoyRHWvhY3cCV8rrRRJGvfnRcWFkql0qYTFLcLurYWS4/K1qPpG9Ft3Jq/nBiAtoOwAx/r0KFDYrF4/vz5ZBcCQGvU44gGAAA+EoQdAAALEHYAACxA2AEAsABhBwDAAoQdAAALEHYAACxA2AEAsABhBwDAAoQdAAALEHYAACxA2AEAsABhBwDAAoQdAAALEHYAACxA2AEAsABhBwDAAoQdAAALEHYAACxA2AEAsABhBwDAAoQdAAALEHYAACzQyC4AqD06nS6TtfPC2wC0OxjZgY/V2NgokUjIrgKAd4CwAwBgAcIOAIAFCDsAABYg7AAAWICwAwBgAcIOAIAFCDsAABYg7AAAWICwAwBgAcIOAIAFCDsAABYg7AAAWICwAwBgAcIOAIAFCDsAABYocrmc7BqAWurbty+Px1P8/lAoFLlcTqFQnj17RnZpADQDRnbgA4WEhMjlcq3/R6FQKBRKz549ya4LgOZB2IEPNHHiRCsrq6aPcDicKVOmkFcRAK2BsAMfyMfHx8/P761HAgICyKsIgNZA2IEPFxUVZWFhQdw2NjaePn062RUB0CIIO/DhPD09O3fuTNz28vKCYR1QZRB24KNMmDDBwsLC2Nh46tSpZNcCQGtg3VhVV1fZ+LpYxK9X2bUKrf2dI8VisVa9Q/L9WrKLaR5Tl2ZqrW1gSie7EEAmuM5Odclk6PLPr2peN5rZMunaFLLLUWNSiby8QKBvTB82y5JKg+8kpiDsVJS0UX5hT4lPDyMbVxbZtWiI0jxB0t9Vw+dZw18OPEHPTkX9vq/Ev58xJF07snRkBg40vbC7mOxCADkg7FRRQSafxaGb2zPJLkTTmFhr65sw8l7wyS4EkADCThVVFouYHDh3pBRsffrrYiHZVQASQNipIkG9lGMApw6VQteAJqiXkl0FIAGEnSqSSZFUKiO7Cs0klyGpBE7K4QjCDgCABQg7AAAWIOwAAFiAsAMAYAHCDgCABQg7AAAWIOwAAFiAsAMAYAHCDgCABQg7AAAWIOwAAFiAsAOq7uata/0GBHJ5XLILAeoNwg68ceHimQ0bV5NdBQBKAWEH3sjIfEF2CQAoC8wQqSHCI/pOnzbv73u3kpMTYn6/zdHl/B5z9urVmPyCXAMDQxcX97mzP7W3d0QILV+xiEqjbVi/jXjhH1djNm1ee+2PB9HLF6SmJiGErl+/sn/fcTdXj5SUxCNHD2RmphkZmwQH9ZwyeTabzUYIrfommsFgmJlZnD5z9Ltvf+zdq39LVZ0/f+rk6cNrvt304+Y1hYX5Tk4uY0dHDR48jNiakBh/+Mj+7OxMGo3u4OA0bszkkJDexKZ9+7dfv3GFxWQNGBBmbWXbdJ9/XI25dPlCfn6Ok5Nrv74DR42cQKHAmhLg3WBkpyHoDMaFi6ddXNw3/bibxWT9ef3yjp0/Dh4cfvbM1W9WbigtLflu7Ret72Hn9kOenj6DBg29cyvezdWjsDB/+ReLGiWNu3cdXr3qh6ysjKXR82QyGUKITqdnZqbl5mWvX7vVt5N/61XxeNyduzatWLb69s2nvXr237Rl7evXFQihklfFny+dZ2tjf/Dn07t3/mqgb7j6u+WVla8RQjGx52Jiz3726Yo9e46am1seO3FIscMbN/7YtHmth7vXyeOx06fNO3vuxO49W9vvuwg0GYSdhqBSqSamZosXRgcGBNFotJiYs/36Dhw1cry+voGPj9/CBUvz8nLS01PbvsObt67SafQ1326ys3NwcnJZtuybzJfpcQ/vEu9VWfV6zbebQkJ6GxgYtrITLS2txsbGhQuWenl1olAogwYNlUqlL1+mI4RiY8+Zmpot+ewLSwsrGxu7ZdHfUKnU6zeuIIQuXDzdp3don94D9Dh6Qz6J9PPtotjhpSsXfH39P/t0haGhUWBA0Ixp83+P+Q3OXYC2gLDTHG6unorbefk5Xl6dFHc93L0RQtk5L9u+t9TUJA8Pb319A+KupYWVlZVNUtJz4q69naO2tnYbd+Xh4U3c0NXlIITq63kIoYLCPHc3LxqN9v+bdO1sHXJzs+RyeUlJkYODk+Ll7u5exA2JRJKWltI1sLtik79/V6lUmvM+XxfAFvTsNAeDwSBu1NfXi0QibW0dxSYWi4UQEgjeY1Wt+npeVnZmvwGBTR+sqan6573anHQIoWZ7atVVlXZ2Dk0f0WEy+QJ+Q0ODVCpls3XfPP7/X4hQKJRKpYd+2XPolz1NX1hXV9v2YgC2IOw0kI6ODkJIKBQoHmngNyCEjIxM/vtkog33X0bGJp2YzOnT5jV9UF/PoL2KZLHZQtG/VvkS8Pn2do5sNptKpYpFIsXj/P/PaF1dXR0dnbDB4b17D2j6Qns7x/aqCmgwOIzVQDQazd3N88WLZMUjxG0nRxdiUNZ0iFdYmN/sTpydXCtfV3T2C/DvHEj8MzQwemss9jHc3bzS0lIkEglxl8vjFhTmOTg4UygUc3PLF2lvin/0+L7itpOTq0AoUJTk7eVrYmxqZGTcXlUBDQZhp5kiIkb/fffWhQunefW8hMT4PXu3dg0MdnJyQQh5e/lmZLzIz89FCMU/e/wg7m/Fq6ytbTMz0xIS42tqqseOnSyRSnbt2SIUCgsL8/ft3z5j1ri8/Jz2qnDY0BE8HnfrT9+Xl5fl5+du+OEbJpP1SVgEQqhf34F3/rrx991bCKGTpw5nZqYpXjV39qd3797642qMTCZLTk5Ys+7Lpcvmi8Xi9qoKaDAIO830SVjEzBkLTv92NCKy348/fufn22Xlyu+JTSOGj+vfb/CsORP6DQi8ejVmctRMhJBUKkUIhQ8dKZfLo5ctyMnN0tfTP3TwjI62ztz5UVOnj05Kfr5i2WpXF/f2qtDW1n71Nz/k5LwcP3HY/5bOpVAoO7cfInqLUZNmhg0O375jY78BgY8e358/dwlCSC6TIYR8ff337z2enJwwYtTAZSsW8hsa1q3dqmhWAtAKilwOa2iqnLsXKnV0aZ5B7dYgAwpZz7m1FcL+48zILgR0NBjZAQCwAGdjwUc589ux48cPNbvJ0cllx7aDHV4RAM2DsAMfZciQ4W9dCKJAp9E7vBwAWgRhBz4KR5fD0eWQXQUA7wY9OwAAFiDsAABYgLADAGABwg4AgAUIOwAAFiDsAABYgLADAGABwg4AgAUIOwAAFiDsVBGTQ5XLYXlApZDJEEsPPjiEIwg7VWRoRn9dJGjDE8F7qygSGJrBh3ZxBGGnipw66dZWiKUSmGqwvcnR6yKBa2f4MC+OIOxUkZYWGhRlfvv0K7IL0TQ3T74aFGWhRSW7DkAGmKlYdb0uFv32U5FnkL6JNZOhA3+WPlyjSPa6RJCdyIuYY2Vhr9OGVwANBJ1a1cXgCOOrvtcumiSXdaqvlZBdjhrTNaQWlWY8KDoySncTQhB2mIKRnSo6d+7c6NGjCwoK6uvrvb29yS5HQ6SnpzMYDGdn57Nnz44ZM4bsckBHg4MjFUIsojpixIjS0lKEkL29PSRdO/L09HR2dkYIVVdXh4WFKb7hABMwslMJVVVVu3btCg0N7dGjh1QqpVKhhd4Rnj59eunSpcWLF5uampJdC1A6GNmRLDs7GyF069atLl269OjRAyEESddhunbtGhwcfOPGDcUPAmgwGNmRpr6+ftasWaGhobNmzSK7FoCOHj166dKlgwcP6uvrk10LUAoIu44ml8uPHTs2fvx4Ho9XU1Pj4uJCdkXgH3l5eSwWy9zc/Jdffpk6dSoMsTUMHMZ2HKFQiBCaPn16XV0dg8EwNjaGpFMpjo6O5ubmxE9q6tSpCCGBAD60pzlgZNcRqqurN2/e3Ldv30GDBpFdC3gP9+/fj42NXbZsGZzB0AAwslOupKQkhFB8fDwknTrq2bNnWFjY06dPFT9KoL5gZKcsYrF43Lhxn3zyyZw5c8iuBbSDw4cPX7hw4cyZM0wmk+xawIeAsGtnIpHoyJEjo0ePZjKZlZWVtra2ZFcE2s2rV684HA6FQjl27NjUqVNZLBbZFYH3AIex7YbH4yGEVq1ahRAyNDRkMpmQdBrGysqKw+Ho6uoyGIyvv/5a8UMHagFGdu2gurp63bp1ffv2jYiIILsW0KGuXbt29erVlStXwhkM1Qdh91EePXoUHBz8+PFjkUjUu3dvsssBJIiLi0MIhYSEPHz4sHv37mSXA1oEh7EfbtiwYcR5uqCgIEg6bIWEhISEhCCEUlJSwsLCpFIp2RWB5sHI7v3w+fxDhw4NGTLE2dm5vLycuAYVAEJlZaWhoWFpaenZs2dnzpypp6dHdkXgDRjZtVVVVRVCaMeOHfr6+sRMQZB04C0mJiZUKtXGxsbMzGzbtm2KXxugCmBk9251dXVff/11SEjIxIkTya4FqJnz58/fuHFj/fr1xsbGZNeCOwi71ty6dWvAgAFpaWlcLjc4OJjscoBaio+Pp9Ppfn5+N2/eDA0NJbscfMFhbDOIPwCRkZHJyckIIS8vL0g68MECAwP9/PwQQpmZmcRHBmGEQQoY2f0Lj8fbv39///79u3TpwuPxOBxYYBS0p4aGBjab/eLFiytXrsydOxfmzutIMLL7R0lJCULoxIkTNjY2Xbp0QQhB0oF2x2azEULe3t4ODg7Hjh1T/OKBDgAjO8Tlcj///PMePXpMnz6d7FoAdk6ePHnz5s2tW7caGBiQXYuGwzrsHjx40KNHj4KCgpqams6dO5NdDsBUcnIym812dna+e/cuXJ2uPPgexr58+fLgwYPEioWQdIBEvr6+xJWbJ06cSE1NJbscjYVv2BkZGU2aNInsKgB4Y/z48SYmJmRXobGwPowFAOAD35FdcXHxiRMnyK4CgDfOnDmTn59PdhUaC9+wq6ysvHPnDtlVAPDG3bt3y8vLya5CY+EbdjY2NvBZV6BSxo4d6+DgQHYVGgt6dgAALOA7soOeHVA10LNTKnzDDnp2QNVAz06p8A076NkBVQM9O6WCnh0AAAv4juygZwdUDfTslArfsIOeHVA10LNTKnzDDnp2QNVAz06poGcHAMACviM76NkBVQM9O6XCN+ygZwdUDfTslArfsIOeHVA10LNTKujZAQCwgO/Irri4mFjeCQAVcerUKejZKQ++YVdZWfn333+TXQUAb9y/fx96dsqDb9jZ2tpGRUWRXQUAb0yYMMHR0ZHsKjQW9OwAAFjAd2QHPTugaqBnp1Q0sgsgDdGzmzx5MtmFaIiSkr/kcinZVai3W7diOZw6Gs2V7ELUm56eo56e038fx/cwtqqqKiMjo0ePHmQXoiHOnw+2tAzA+Vjh46Wn11hasgwMtMkuRI3xeMXW1oN9fOb9dxO+IztjY2NIuvYVHPyplhaD7CrUWEgI2RWov7S0czJZ85vw/TsMPTugak6dupKfX0J2FRoL37CD6+yAqrl//3l5eRXZVWgsfMMOrrMDqmbChCGOjtZkV6Gx8A07Y2Pjvn37kl0F0EwrV26fOXPV+76qZ88AMzNj5VT0fj6sfhWHb9hBzw60rxUrtsTE3P6YPUDPTqnwDTvo2YH29eJF9kfuAXp2SoXvpSe2trZTp04luwrQoVJTs+bMWX337lEajYYQ+v77Axcu3Dh3bpuDgzVC6MyZq3v3nr5z57BUKt216yQRPf7+nmPHDu7ZM4DYQ05O4blz1588SSkrq3R0tBk1auCIEaESiSQ4eAJCaO3avT/9dOSvv44ghOh0Wnx86sqVO2pree7uDsuWzfDxcUUISSSSlnaelJSRkuJx8OC5hIT027d/1dPTbekLkUqlP/74y19/PWEw6EOH9vHxcVmy5IcbNw4aGur37Tt13rxxt249UuzkzJmr9+49S03N0tZmBAb6LFw4wcrKDCH02WcbmExte3urY8diZTK5q6vdqlXz3dz+mVCvpfrVF74jO2Nj4169epFdBehQ9vZWYnFjRkYecTchId3ISD8xMUNxNyjIl0KhbNjw8+nTVydMGHL58p7+/YOWL99y+/Yj4jmbNv36+HHyV1/NuXx5z/Dh/dev3//oURKNRnvw4ARCaNWq+UTSIYTKyirPn7+xbt2nO3Z8KRKJ16zZSzzeys5ZLObly3fd3R13717FYum08oUcOxb7+++3VqyYefz4RhqNunv3KYQQlUpFCDEY9NOnryp28uzZi02bfvH39zx+fOO2bV+Ul1euWrWT2AmDQXv6NJVOp8XFnTx37icjI4Po6E2KTxm0VL/6wjfsiouLDx8+THYVoENxOGwbG4vnz9MQQtXVtfn5JSNGhCYl/RN2z5696Natk1AounLl7rRpw0eNGqSvzxk+fMDgwT0OHbpAPGfjxs93714VEOBtaKg/evRgd3fHuLiEZt+rvLzyq6/mBAb6dOvmO378kNzcotpabus7F4nEHA47Onp6UJAvMfZsyeXLf/fvH9S/f7C+PmfWrNFsNlOxiUqlmpkZKXbSubPHmTNbpk0bbmNj4enpHBUVnpSUUV/fgBCiUCgikXjatOEIIRsbi/nzx716VaH4bjRbfzv9HMiBb9hVVlbev3+f7CpAR+va1ScpKRMhlJCQ4e7uGBjonZz8EiGUl1dcU8MNCvJ98SJbIpF07+6neElgoE9mZl5DAx8hJJPJTpy4PHLkp4GBYwIDx2Rm5lVX1zX7Rm5uDhwOm7itp8dGCAmFotZ3LhY3WlqavPNLkEgk+fklfn7uikf69Qtq+gRPzzefDKVSqUVFZYsXr+/Va3Jg4Jjo6E0IIUXNLi52ilS1s7NECGVnF7ZSfxu+waoLenYAL4GB3uvW7SfGcf7+Hr6+7sXF5bW13Pj4F+bmJjY2FsT/9v9eeFFZWaujo7148fdyuXzx4kmBgT4cDnvatK9aeqNmh2Y8XkNLO2ezWUymjomJ4Tu/hIYGAUKIyXxznGtsrN/0CQwGXXH79u1Hy5dvmTVr9JIlU1xd7R88eL5kyQ+KrTo62m/d5vOFrdSv1jTt62k76NnhKTjYTyAQZmcXJCSkz549Wlub4enp9OxZ2vPnacSAi4ibr7+ea2tr0fSFZmZGaWk5GRm5e/d+07VrJ+JBIrzarpWdI4S0tRlND0hbwmRqE+coFI9UVTU/ukQIXbx4y9/fc968ccTd+np+061N7xIDt9Z7hWoN37ArLi6+efPmtGnTyC4EdCh9fY67u2NcXGJWVkGXLl4IIT8/94SE9ISE9Ojo6cRJDAaDTqVqBQb6EC+pqqqlUBCTqVNby0MImZoaEY9nZxcUFLxqesz4Tq3sHCHE5wva0hdjMBgmJoa5ucWKR/7++2lLT66r49nYvAnWO3eeNN2alVVQW8s1MNBDCKWn5xIHtm3/ctQL9OwAdrp29blw4aaTky3xn9zPz/3evWdVVbVBQb7ESYy5c8fu3382MTFdLBbfvPlw4cK1GzceQgg5O9tSKJQTJy7X1zfk5RVv3XokONivtLSSGJSZmRk/eZISH58qkUhaeutWdk707IhD1Hfq3TswNvbO06cpRA+Ry61v6Zlubg5PnqQ8f54mkUiOH79EHJyWlVUSWw0MOJs3/8rjNdTV8fbv/83KyszPz+P9v6PqAd+RHfTssBUY6H38+KVRowYRd7t08SopKffyclb046dOHe7u7nj48O9PnqTo6rL8/Ny/+WY+QsjKymzduk8PHjzft+80OzvLtWs/ff26Ojp607hxS8+c2TJjxoh9+367f//55ct7Wnn3lnZOtOGI/H2nefPGlpVVzp+/xsbGolu3TpMmDfvuuz1NW3UKixZN5POFS5b8IBAIJ00atnr1/KKi0gUL1v7ww+cIIVdXe3t7q7CwOSKR2NrafPPmZRQK5f2/o+oB38k7Qfs6fz54xIgjMJ/dBxg0aJa2NoNCoVAoSC5HcrmcQqEwGLRz57a39BKhUFRWVklcC40QOno05ujR2Js3D73X+y5fvpnHa9i7d/VHfwUqJC3tnEzGaXbyTnwPY+E6O6AijIz0S0tfv3pVUVJS8epVBXF78OCerbzk118vTpq0/OzZP2trudevPzh+/NKoUQM7sGS1hO9hLNGzgxMUgHTDhw/YseO4WNyoeMTW1uLUqT9OnLjc7PPXrv103rxxtbW8mJjb27YdNTc3Hjfuk+nTR3RgyWoJ37CDnh1QEZGR/X///XZ2dgFxl0KhfPJJr2HDWpx/zMhIn0KhfPnl7I983x9/jP7IPagXfMMOrrMDKoLJ1ImM7Ld9+zGJREp8kmHChKGKsyWgvUDPDgDyRUb2Jz6tRaFQBg3qAUmnDPiGHVxnB1QHi8UcOrQPlUq1tbWYMGEI2eVoJnwPY+3s7KZPn052FaCD8GpQValc1KYrdsnh7xrm61Tl7+9VmsUuRSo0mW07AAAgAElEQVR6QZiWFtIzQoYWFIYarm2Lb9gZGRnBurE4aBShP49RXpfIrF10ZC1+tEEV6IwKW4AQykslu5CWabO0KopENAZy9ZP5qlvHG9+wKyoqunHjxowZM8guBCiRkE/9fY+82ycWpjZqOBRRYfdjymVycefeKv3X4y349uyqqqri4uLIrgIo128/SXqNtIKka3c9I81f5dDTHqvTZ8vwDTvo2Wm8tMdye089PeNmPjEKPl7wULPUOCSXkV1Hm+EbdtCz03jlhYitD0mnLHRtrQaurEF9pmrHN+yKiop++eUXsqsASiQSUPWMYGICJTK21OFWq+iJ4//CN+ygZ6fxRAKZVKo2/xXVkUggQap6lcx/4Rt20LMDACv4hh307ADACr5hBz07ALCCb9hBzw4ArOAbdtCzAwAr+IYd9OwAwAq+YVdYWHjw4EGyqwAAdBB8w666uvrRo0dkVwEA6CD4hp29vf2sWbPIrgIA0EHwDTtDQ8Pg4GCyqwAAdBB8ww56dgBgBd+wg54d6ABbtq6fNWdC68/Jzc3uNyAwJSVRRerRVPiGHfTsAMAKvmEHPTsAsILvGhSFhYXXr1+HwR1QyM5+OXvuxA3fbz91+nBycoKlhdWECdNcnN02bFz96lWxh4f3p4uXu7l6IIQEAsGhX/Y8enSv4nW5ubmln2+XhQuWMplMhBCfz1+/YWVCwlNHR5fhkWOb7r+y8vWevVtfpCULBIKgoB5TombZ2tq3vbxV30TT6fRu3UL27NkqEAq8vX3nzvnM08ObrHrUDr4jO+jZgbcwGAyE0O49W6ZMnn375lNvb98DB3bs2PnjV1+uvfbHAxqNtnPXJuKZ23dsvH3nzwXzPz9/7vr0afPu/HX9wM87iE2bt6wtLi7cvGnv2u82Z2dnPo1/SDwukUg+j56XkpoYvXTV4V/O6unpL1w07VVpyXuVFx//6OHDe/v2Hb965T6Dztj447ck1qN28A076NmBt2hpaSGEhkeMCejSjUKh9OkdWt9QP3HidA93LxqN1rtn/+zsTIQQl8e9dfva1ClzQkJ6c3Q5/fsNGjli/PUbVyQSSWXl6zt/3ZgwfqqXp4+RkfG8uZ/R6f9MlZyU/LyoqODLL9Z0DQw2MjJetGApR0//woXT71veiuXfWlla02i0vn0HFhTk8fl8supRO/iGHfTsQLMcHJ2JG2xdXYSQvZ0jcVeHyRQKhRKJpLi4UCKReHl1UrzE3d2Lz+eXlpaUlpYghOztnYjHKRSKu5sncTslJZFOp3fx76rY1NkvICUl4b1qs7VzYLFYxG1dXQ5CiMfjkliPeoGeHQzuwL8QA6iW7iKEqqsrEUI62jqKR5hMFkKIL+DXcWsRQrpsXcUmHR0mcaO+ntfY2NhvQGDTXRkbm3xMbaTXo17wDTuiZwdhB94Xm62LEBIIBYpH+PwGhJCJsalYJEIIiUSitzYROcJkMtev+6nprmjUdvgPqGr1qCxN/tpaBz078GGcnd2oVGpqahJxZhYhlJ6eqq9vYGRkLJPJEEIv0pJdXNwQQo2Njc8TnpqYmCKEnJxcBQKBhYWVpYUV8aqSV8VGhsaaV4/Kgp4dAO9Hj6M3YEDYseMH4+Lu8up5169fufj7mTGjJ1EoFFNTMx8fv0O/7CkuKRKJRGvXfaU48AzqFtKtW8imTWvKy8vq6movXDwzf8GUq9diNa8elYXvyK6goODPP/+cM2cO2YUA9bN44bK91J/Wrv9KIpFYW9tOjpo1buxkYtOXX6zZtm3D7DkTGhsbwwaHhw0Of/T4PrFpw/ptsZfOr1n3ZVpaiq2tfdjg8JEjxmlkPaqJIperzbKP7SsxMXHXrl0wF0B7OX8+eMSII1paKrQodcx+5BZgbuPKIrsQjXXtcGGP8EYrJxU6QExLOyeTcXx85v13kwpV2cEcHBxgWAcAPvA9jDUwMOjWrRvZVQDwxvCRoVKJpNlNX325tnv3Xh1ekUbBN+ygZwdUzd49R1vaZGhg1LG1aCB8w66mpubJkycQdkB1KK4CAcoAPTsAABbwDTvo2QGAFXzDrqCg4MCBA2RXAQDoIPiGHdGzI7sKAEAHwTfsoGcHAFbwDTvo2QGAFXzDDnp2AGAF37CDnh0AWME37BwcHObNa+bTwgAAjYRv2BkYGAQGBrbhiUBdcQwpcoTppD4dg6lLpWurTYaoTaHtLj8/f9++fWRXAZRIz1BaWSQkuwpNlv9CYKo+n3DDN+xqa2vj4+PJrgIokbOvVlUpn+wqNFZJFt+zKw1RyK6jzfANO+jZaTxDc+QZKLl7vpTsQjRQ3Wvxk+tlAyaoU5cA31lPoGeHA49uCFFEN44VWDpxTKxYVDrZBak5CpVSVyEW1guzk7kTotVsqIRv2OXn51+7dg0GdxrPo6vcxFr28nlNXmpd3Wuyq2lVdU0dm83UZqjQ1PZv0TWk0OhSS0dK1BdqlnRYhx307PBhYkUxsVKD3tLChTumDI0MCvIlu5BWyNW396WudX886NkBgBV8ww56dgBgBd+wg+vsAMAKvmEHPTsAsIJv2EHPDgCs4Bt20LMDACv4hh307ADACr5hBz07ALCCb9g5OjouXLiQ7CoAAB0E37DT19f39/cnuwoAQAfBN+zy8/N3795NdhUAgA6Cb9jV1tYmJCSQXQUAoIPgG3bQswMAK/iGHfTsAMAKvmEHPTsAsIJv2EHPDgCs4Bt20LMDACv4hh307ADACr5hBz07ALCCb9hBzw4ArOAbdtCzAwAr+IYd9OwAwAq+YZeXl7dz506yqwAAdBB8w47H45WWlpJdBQBvmJoaaWnh+19S2fD9zjo4OIwbN47sKgB44/XraplMRnYVGgvfsNPT0/Pz8yO7CgBAB8E37KBnBwBW8A27urq6pKQksqsAAHQQfMPOyclp8eLFZFcBAOgg+IYd9OwAwAq+YQc9OwCwgm/YQc8OAKzgG3bQswMAK/iGHfTsAMAKvmEHPTsAsIJv2EHPDgCs4Bt20LMDACv4hh307ADACr5hl5ubu337drKrAAB0EHzDjsvlpqSkkF0FAKCD0MgugDTOzs5LliwhuwoA0KBBM+l0OoVCqa6ue/kyn8GgUygUJlPn7NmfyC5No+AbdhwOx8fHh+wqAEAsFrO4uJy4LRY3EjemTRtOalEaCN/DWOjZARURFtZTLpc3fcTe3mrcuE/Iq0gz4Rt20LMDKmLcuCH29taKuxQKpX//bqamRqQWpYHwDTvo2QEVYWioFxYWQqFQiLv29lZjx8Kwrv3hG3bQswOqY/ToMDs7y/8f1gXBsE4Z8A076NkB1WFkpD9wYHeEkK2t5ahRg8guRzPhezYWenYaQFCPqsvkUgnZdbSHXgHD4m6WBQX5iWqMCmvkbXiFqmNxKMZW6P+PzsmHb9hBz06tVb5Cj/7QKiuQOngxeTVSsstpF4wR/ZchhJ7dJruQdtIoktaUS3xCtHpEkF0KQliHHfTs1Ffta8ofv8oHTbZh61PJrgW8Q8r9mj+P1g2eQv5YFXp2QM00cNH5XbIRixwh6dRCp56GRlaGN06QXQfOYQc9OzX1+BrqOdyS7CrAe/Doqi9p1C7LJ7kMfMPOxcXl888/J7sK8N4KM2R6RnSyqwDvh0qjVpWRfCSLb9jp6up6eXmRXQV4PzIpYjCpugb49prVlKG5Dr+O5POy+IZdTk7O1q1bya4CvB8KBdWUacSVJphpFMskjTCyIwmPx0tLSyO7CgBAB8E37KBnBwBW8A076NkBgBV8ww56dgBgBd+wg54dAFjBN+ygZwcAVrC7XmnixIk8Hg8hJJPJKBQKMWOiQCC4efMm2aUBAJQIu7ALDQ3dv3+/VPqveTLs7OzIqwgA0BGwO4wdN26cvb1900coFMrAgQPJqwgA0BGwCzs2m/3JJ59QqW8mzLCzsxs1ahSpRQEAlA67sEMIjRo1qungLjQ01MzMjNSKAABKh2PY6enpDR06lEajwbAOKFVxcWG/AYFP4x+RXcg7TJk2aufuzWRXoXQ4hh1CaOTIkba2tkS3DoZ1oH0NHxn6qrSE7CrA2959NlYmQZWlIj5Pw6aa0BrcK+oeutfDf3h+WgPZxbQnLS2KoTmDY4jdeXYVUfKquK6uluwqQDPe8V/ifkxl+lOunhFDh61pU2CbancbGdotLwkhxCW7lvakq08rellhaMboNsjI0kmH7HJU1MjRg0YMHzc5aiZCqK6udvjI0P79Bq1a+T2xNWJ4/6hJM8aOiaqsfL1n79YXackCgSAoqMeUqFm2tv90ey9cPPPo0b309FSGtrZ/58CZMxdaWlg9jX+0fMUihNCkqMgePfrMm/MZQkgqlf64ac3Va7HGxia9e/X/dPFyYg8t7TwrO3PO3Ekb1m/bvHWdgYHhwQOnWvoqsrNfzp478ceNu2Jizz548LeZmXm/voPmzvmUuHq0tOzV/v3bU18k8XhcB3unPn1CJ06YRrwwPz/3h42rC4vyO3cOnBw1q+k+U1ISjxw9kJmZZmRsEhzUc8rk2Ww2W2k/hw7VWthdP17OMdIev8ypA+sB7aDbJ6Zioez60ZIB48zM7LTJLkcVdesakvoiibj97PkTQ0OjlNRE4m5+fi6Pxw0MCJZIJJ9HzxMI+MuXrXZ2cj1x6teFi6bt23fcytI6MfHZzl2bZkyf/9lnX9TX83bv2fL9hlU7tx/qGhi8Yf22L79ecuJ4jJWldXFxIULoyNEDI0eMHzhwSFZWxt592zp18u/Xd2ArO2fQGQihg7/sHjd2so9P51a+CgaDgRDasnXdvLlLVq/6IfVF0udL57m5efbvN0gmk0UvW2BgYLh+3U8W5paxl87/fHCXlZVN3z6hjY2NK75c7Obq+d23mxoa6n89vK+2pprYYWFh/vIvFrm5ee7edVgikezavXlp9Lw9u49oaWlCv6vFr+HmqQpDMx2fHgYdWw9oHwwdrWFzbK8dK6upaCS7FlXUxb9rSkoCcW15cvLzsMHhNTXV5eVlCKHEpGfGxiZOTi5Jyc+Ligq+/GJN18BgIyPjRQuWcvT0L1w4jRDq1KnzLwfPTJwwzdrKxt3Nc+yYqNTUpPr6+pbea2DoJ/6dA8eOiTI3t0hOfo4QamXnxHVRPUL6jBk9ydPDu5WvgsigoUNG9O0TSqfT/TsHmptbZGS8QAg9fvzg1aviFctWu7t56usbTI6a2alT56vXYhFCd+/drqgoX7hgqbm5hZOTy6KF0bx6HrHDm7eu0mn0Nd9usrNzcHJyWbbsm8yX6XEP7yrnh9DRmg+78kKRWCjzCNLv8HpAe+oRaf70ejXZVaiigIAggUCQk5uFEEpJTfT28vXy6kQM7pKTn3fp0o04oKPT6V38uxIvoVAonf0CUlISiDwqKSla8cXiIcN69RsQuOqbaIRQbW3z3+pOTUZnurockUjU+s4Jbq6ebfxa3NzePFNXl1Nfz0MI5RfkslgsOzuHpjvMyXmJECopKdLR0bGw+GfRInNzC2NjE+J2amqSh4e3vv4/QxxLCysrK5ukpOdtrETFNX8YW1UqotI0YeCKOX1jRkGGRp1+aS/GxiZ2dg7Jyc/NzSzy8nL8/bumpaekpCSEDgiLf/Z4wfz/IYTq63mNjY39BgS+9UJicLT62+VTJs+aN3eJs7Pr48cPvvy6xQXXqbRm/pe1snMCQ7ut/YdmjzGrqiqZTFbTR1gslkDARwhxuXVstm7TTTo6TEVVWdmZb1VVU1PVxkpUXPNh18CVGpgxOrwY0M60WVocI4aIL9NmwZ+utwUEBKWkJJqZWTg5ubBYrE4+nX8+tKugII/H43brGkJED5PJXL/up6avolFpCKErVy76+vpPnzaPeLC+ofkD2Fa0svN2wWaz+fx//Z1r4DcYG5sihPT09MUiUdNNimcaGZt0YjIVXxdBX09DelnNf3NlEnkj2atjgHbBrRIjkhd1UlFd/Ltu37HR1NTczy8AIeTj07mgIO9B3N9OTi5GRsYIIScnV4FAYGFhZWlhRbyk5FWxkaExMTiysrJR7Or+/Tvv++6t7LxduLt5CQSC3NxsJycX4pH09FRHB2eEkIW5Ja+eV1CQZ2/viBDKyEyr+f8TFM5OrnfuXO/sF0CczyVO19jYaMg0GfAHH2Cqs19gdXXVo0f3fLz9iGn6HRycrly52MW/G/GEoG4h3bqFbNq0pry8rK6u9sLFM/MXTCF6/M7Obs+eP0lKei6RSH47e5z4NE55RRlCyNbOASH0998309JTW3n3VnbeLrp1C7GytN68dV1GZlp1ddWhX/akp6eOHROFEAoJ6cNgMDZvXScUCisrX3+/YRWHo0e8auzYyRKpZNeeLUKhsLAwf9/+7TNmjcvLz2mvqsgFYQcwpaur6+bmWfKqWHGWwMfb71VpieIuQmjD+m29ew9Ys+7L4SNDf4/5LWxw+MgR4xBCs2ctCujS7auVSwaFda+qqly+bLWHu1f0sgV//X3T2sombHD4L7/u/fnnna0X0NLO2wWNRlu3ditHl7Ng4dRJkyOfJzxdv3art7cv8YWvX/eTUCAYFtFn2ozRY0ZPsrW1l0mlCCF9Pf1DB8/oaOvMnR81dfropOTnK5atdnVxb6+qyEWRy5s5XH18tbqxEfn1MSKjJNCeTv2YO3WlgzZT6X/Vzp8PHjHiiJaWclu9chnas0w65RsXpb4LaHcp92so8pruw5TeUklLOyeTcXx85v13E4zsAABYgE9QAqC6XrxI/uLLT1vaeurkZV1d3Za2grdA2AGgury9fQ8cONnSVki69wJhB4BKU1ybAj4S9OwAAFiAsAMAYAHCDgCABQg7AAAWNC3svv1uRfSyBa0/Jzc3u9+AwJSUxDY+v4NhsvoJAB1M08IOAACaBWEHAMBCu11nFxHZb+LE6Q0N9cdP/MJms7t1DVm0MJqYKqelhT/+u7BIRGS/8eOnVla9vnjxjIGBYY+QPlMmz96+c2Nc3F07O4eoSTMHhn5CvF2zy518TP3E2iUbvt9+6vTh5OQESwurCROmuTi7bdi4+tWrYg8P708XL3dz9fjgb4JAIDj0y55Hj+5VvC43N7f08+2ycMFSJpPZ+uonrSz4AtoiNy/zxYvnDAYsxNH+aHRaSPAAJlNtluNpt7BjaGufPPnr2LGTY2PuiITCeQsmHz3285LPvmhl4Y//LizC0NY+derw3LmfXb/28M/rl7dsXZ+Smjhj+vw132769fC+zVvWhnTvzWazW1ru5KPqZzAQQrv3bFny2Rdd/Lt+v2HVgQM7bGzsvvpyrYuzW/TyBTt3bXrnW7T0TUAIbd+x8cnTuOjPV3by9X/69OGWrevodPpnn65oZfWTVtZk+ZivFCs6OjpdAgJMTU3JLkQDaWkhLaROU/y2W9hRKBR3d6+oSTMQQhxdTkBAUHp6qmLhjw3rtxHT4U+Omvk0/uHVa7F9+4Q2XVhEsZPOnQOHDR2BEOrXd9CWresDA4P79B5A3D1x8tfConxPD29iuRM7OwdiD2PHRK36Jrq+vv5jPj1DzG09PGJMQJduCKE+vUNv3ro2ceJ0D3cvhFDvnv1/PrTrg78JXB731u1rixZGh4T0Rgj17zcoLy/7wsXTCxcsJVY/2f7TQXNzC4TQooXR4ycOI/ZGrMmyZfNeYtKhRQuWPnp0/8KF04sWLv3gLxM3lhZ2iCIjuwpNJaMgOtk1vIf2/LjYWwt/NDTUt7Twx19/32h6t+lOHB2diRvEapX2do7EXSaLRcyRr1juZPeeLWnpKQKBgHhCbW31x39U0EHx7rq6Td9dh8kUCoUSiYTW3HoCTTX7TSguLpRIJF5enRSb3N29+Hx+aWlJK6ufvHNNFvBOFAoFIU1b8lhlqNk3tj3DTjGVc1OtLPxBeGthkbd20uxiIu+13Ml7eevtPmC5zGa/CdXVlQghHe03S1YT3xO+gN/66ietr8kCAGg7pU8E0MrCHx/s45c76WBEnAmEAsUjxPfExNi0ldVPlL0mCwBYUfr/nFYW/vhgH7/cSQdzdnajUqmpqUmK87np6an6+gZGRsatrH6i7DVZAMCK0q+za2Xhjw/WynInqkmPozdgQNix4wfj4u7y6nnXr1+5+PuZMaMnUSiUVlY/UfaaLABgRekjO2Lhj337ty1YOFVbW9vJyVWx8McHmz1rkUDA/2rlEoFAMGb0pOXLVpeUFEUvW7D6mx/ar/B2tnjhsr3Un9au/0oikVhb206OmjVu7GTF6if7928fFtFHR0dn7pzPrv15iVj9hFiTJfbS+TXrvkxLS7G1tW/fNVkAwAosuKPhYMEdoApgwR0AAOggmnlq78xvx44fb/7TDo5OLju2HfzgPQ8fGSqVSJrd9NWXa7t37/XBewYAKJVmht2QIcN79x7Q7CY67aOu+d6752hLmwwN4KgfANWlmWHH0eVwdDnK2DOsfgKAmoKeHQAACxB2AAAsQNgBALAAYQcAwAKEHQD/snDx9MtXLra0VS6Xn79wugPKKC8vu/dBH/r+dMmsS5cvtPHJJ07+2m9A4KdLZrXhuWpPM8/GAvDBdu/8tZWtd+/dfvI0btTI8cou48zZYybvPzmQTCZ7+TL98yVfteXJ9fX1Bw/tPnr4PCZz/UPYAfDG0/hHG3/89txv1x49frB33089e/R9/OSBTCYbNnTkyBHjbt66tn3HD/r6hht//G7F8tU7d29++vQhU4fJZuvOmrmQmJx1/sKpvp38ExPjBwwIs7N12Lt/m4eHd35ezrq1W8eOH3Lm1BUzM3OE0IaNqw30DefPW7Jr95by8lITE9OU1EQalRY1aWbPnn0P/Lzz4sUzHu5eOto6I98nWAsL8+l0+oO4v2fPnWhoaBQ+bNTkqJnELDv7Dmyvq6ulUqndg3tNnTInLz9n/fcrmUzmlp/Wz53zGZvF/vXwvsKifKlU2jWw+4zp85lM5qNH9xX1b992MC8v+62d0Om4zlQMgLrLyspwdfVACBUW5tXUVHt5dpo9a1FaWsriz2ZGRowOHRB28NCuBfP+FxLSOyb2XEbGi+/Xb7Oxtv3zz8srvlh88cJNGo1WVJTv6OC8f99xhNDZcydqqqvGjZns5OTyNP6RLluXSDqEUHZ25oTx0xBCRcUFUolk7pzPdHR0Dh/Zv2//tp49+w4bNvLU6SM/bT2go/NmwteY2HPbtr891UXM77f1/n+aHIRQekaqTCaztrb982rc48cPvlr5v/79B5sYm3639ouoSTPDBofzeNyvV33OZutOGD91QP+wrKyMtWs219XVzpozYdaMhatWfs/jcVetjj5+4tDsWYuKigsU9YtEomZ30lE/mXYAYQfAG9nZma4u7kTqhQ0O79GjD0JIKpUymUwtLS0uj1teXubq6sHn838+uHPtmi021rYIodDQT3748duy8lI6jd7Q0BAVNZPYW25udveQ3sRMjllZGYp5+SUSSV5eDjG5YVZWxppvNxGh5uHhc/bcCeJBa2vbpkmHEIqMGB0ZMbr1+l++TB/QP6xvn1CEUFBQD4RQdVXlrVvXLC2siaVdDA2NArp0y8nNIt7FxcUdIXTu/ElbG/vBg4chhPT1Dbr4d8vIfPFW/Wd+O9bsTtRI82Gnw6bKG5qZDQWoHSNzbSoVTkO11cusjL59ByKEMl+mz561iHgwJzfLycmVQqFkZWXosnVNTc2SkxMaGho+X/qvqTU4upzEpGcuzm6K5d9eZqVPmzqXuJ2dnUkkC0IoO+eltra2nZ1DdXUVj8f18PAmHq+oKNPXM0AI5eS8dP3/J7+XzJfpxDqlCCFiFlgjY5OkpGeJSc+azu8/YvhYoqSwweEIoeSUhB4hfRRbudxaYlLFpvW3tBM10nzY6RvT8tPqvEMMOrwe0J7qXouFfAlNnZa7I5NQKCwpKXJ38xIKhUVFBa4u/0wrnZWV4eLsRqSDp6cPQkgkFpmbW5w+efmtPbx8me7s7KbYW15ezpudZGf27NmPuJ2c/Nzd3Yt4kMViK1ZxSkh42rlzIPG4j7ffWzt/52GsRCLJzs40MTEj7qanpxobm1hb2YgbxcuiVw35JLLpC7k8bll5KXHM3tjYqFhaVy6Xp6QkhoePeqv+ZneiXpr/m2/rzhI2SDu8GNDOygqEbv5K+YywRsrMTNPV1TU3t3j5Ml2XratY8i07O5OIsKKiAgsLK4SQo4NzVVXly6wMhFBZWem27T8UFRUQYaeYeT8rK4PNYit2IhQKiPWb6upq/7ga4+LsTozgRCJhRmYaQuhVacmDuL/Dh40klqMzN7d8q7zIiNF3bsW/9a9pwy43Lxsh9Pz5EyL4Llw8PWL4OISQk6NLfPwjiUQilUpv37l++MgBojxFD9HN1ePJ0zhiastz50++rqzo32/wW/U3uxP10vzIjkqjdB9mcv3Yq0GT4XPv6qowvSH/BW/0p7CidltlZWd4evgQQaBYElMikeTmZRMjIDc3z5+2bRAIBV9/uXbtd5vXf7+SQqGUl5dOnzaPuHojI/PF5Kh/rll7+TK96bqas2cuOvPbsVOnDjs4OpuamBFLhmZlZYwbO3nr1vXiRnFjY+OXX6whRo6uLu7rv18pEgmHDhne9vqTkp4FBAS9elU8KSqSL+BHhI8iTiDMmrXowIEdo8eG0Wg0Cwurr79a13SUihCaNXPRgZ93jBw9yMzU3MPDe//e47q6um/V3+xO1EvzMxUTSvOFVw6V+vY2MjRjMHXhVIZ6oFBQdZmovraxKLNhzBKb5lZ2VAqYqfgDRE0Z8dmnK7oGBpNdiNKpwkzFrUWYpYPOpBV2CXdqUx/UN9Q1P2Ol+pJIpEKBQJfzsetqqxojC4aWFsXGlTX2fzZteLqGS0iMT0lJfOtBsVikaFEpODm69OzZtwNL+6dF6OSoIcGt+t4xXmPqUkPCNXPtvsTExF27dh38/sNnLQaqz79zoH/nwDY8kQRZWRkcXQ6set5h4EQhPxkAAA7ESURBVKIEAMjRqVPn2BhVX/JYk0DYAQCwAGEHAMAChB0AAAsQdgAALEDYAQCwAGEHAMAChB0AAAsQdgAALEDYAQCwAGEHAMAChB0AAAsQdgAALEDYAQCwAFNyAnVC0UJmtjS5HHXYpKSgXVBpWv+ZQrCjwcgOqBm5XFZZIiS7CvB+ygvq9cmeuA/CDqgZty6UikI+2VWA99NQJ7b3IHk0DmEH1EznPqjqFfflMy7ZhYC2unG8qGeEnEp2z4zs9wfg/Q2dKf9972uRQMDUZZpY6shaXjQKkEjEl9W8FqTcqxk6nWLpRH6TFcIOqKXh87XSnzSU5NSXF2jVVmhI2NXV8ZhMHQaDTnYh7YOlh0yt5ZNWaDFVY1UrCDugrjy7UTy7EeMF8kcN7WLhwu1TpkQGBfmSXUg7UqEfDfTsAABYgLADAGABwg4AgAUIOwAAFiDsAABYgLADAGABwg4AgAUIOwAAFiDsAABYgLADAGABwg4AgAUIOwAAFiDsAABYgLADAGABwg4AgAUIOwAAFiDsAABYgLADAGABwg4AgAUIOwAAFiDsAABYgLADAGABllIE7aamJl9LC36jPpxEIuDxSmtqVGOZVfUkFNYwGJxmN+H7q0mlUi0tLcmuQnMYGnokJBwhuwr1RqGU5+RcQ+gu2YWoNyengGYfxzfspFJpaWkp2VVojv79D5Ndgtq7eHFh585TgoKCyC5EM0HPDgCABQg7AAAWIOwAAFiAsAMAYAHCDgCABQg7AAAWIOwAAFiAsAMAYAHCDgCABQg7AAAWIOwAAFiAsAMAYAHCDgCABQg7AAAWIOwAAFiAsAMAYAHCDgCABQg7AAAWIOwAAFiAsAMAYAHCDgCABQg7AAAWsA67xsZGsksA4A2xWEx2CZoM37BzcXExNDScPXv2pUuXyK4F4O7KlSvz5s1jMBgeHh5k16KxKHK5nOwayJSQkBAbG3v58uWIiIiIiAg/Pz+yKwIYSU1NjY2NjY2NHTx4cHh4eGBgINkVaTLcw44gl8uJ37m6ujoi9QwMDMguCmgsLpdL/L6x2ezw8PCIiAgajUZ2UZoPwu5fCgoKYmNjY2JifH19IyIi+vbtS3ZFQKPcu3cvNjb22bNnkZGR4eHhTk5OZFeEEQi75t29ezc2Nvb58+fEQA9+KcHHKCgouHTpUkxMjI+PT2RkJPwRJQWEXWsUhxssFisiIiIyMpJKpZJdFFAnMTExly5dqqmpCQ8Pj4yMNDQ0JLsifEHYtQnRSI6JiQkLC4uIiAgICCC7IqDSEhMTY2NjL126FBERER4e3rlzZ7IrAhB27+nKlSuxsbHl5eXE4a2JiQnZFQEVUl1dTRwKGBsbE2ceyK4IvAFh9yFKSkqIgZ6bm1tERERoaCjZFQGS3blzJzY29sWLF8SZBzs7O7IrAm+DsPsocXFxsbGxcXFxxEDPzc2N7IpAh8rJySHOPAQGBkZERPTq1YvsikCLIOzaAZ/PJw5etLS0iPMY2traZBcFlEgikRBnHgQCAXHmgcPhkF0UeAcIu/aUkZFBpF6fPn0iIyO7detGdkWgncXHx8fGxt64cYM48+Dj40N2RaCtIOyU4vr16zExMQUFBcThrYWFBdkVgY9SUVFB/BmztrYODw8fMmQI2RWB9wZhp0Tl5eUxMTGxsbF2dnYRERFhYWFkVwTe240bN2JjY3NycogzD1ZWVmRXBD4QhF1HePLkSWxs7O3bt4mBnpeXF9kVgXfIzMwkzjz07NkzIiKie/fuZFcEPhaEXccRi8XEoZBYLCbOY7DZbLKLAv8iFAqJMw9yuZw488BkMskuCrQPCDsSZGdnE6kXFBQUERHRo0cPsisC6NGjR7Gxsffu3SPOPMC8cpoHwo5Mt2/fjomJycjIiIyMjIiIsLGxIbsi7JSWlhLXhzs7O4eHhw8aNIjsioCyQNiRr6qqijiPYWZmFhERMWzYMLIrwsLVq1djY2OLi4uJvzRmZmZkVwSUC8JOhTx//jw2NvaPP/4gzmP4+vo2+7Q5c+YcOHCgw6tTJ4sWLdq1a1ezm168eEGceQgNDY2IiOjatWuHVwfIAWGncmQyGdHR43K5xHkMfX39pk8IDAwcPHjw+vXryatRpa1ZsyYmJubZs2dNH6yvryfOPGhraxNnHuh0Onk1AhJA2Kmu/Px8IvX8/PwiIiL69OmDEBo0aFB1dTWdTh8xYsTy5cvJrlHl7Nq16/Tp00KhUF9f/9atWwih+/fvx8bGPn36lDjz4OLiQnaNgBwQdmrg7t27MTExiYmJERERR48epVAoCCEWizVt2rQZM2aQXZ0KOXLkyLFjx2praxFCUql01qxZMTEx3t7e4eHh/fv3J7s6QDIIO7VRV1c3YsQILpereMTY2Hj69Onjx48ntS5VcenSpZ07d1ZXVyse0dPTO3funJGREal1AVUBaxqpDX19fYlE0vSRqqqqI0eOmJqaDhgwoO374fOkDVyJWCCTyVTx7xxFi6Kto8XSo7H13mMG/Hv37h04cKBp0iGERCIRJB1QgJGdOunSpYuWlpZMJiPuyuVyLS0tAwMDojnViooiUU5yQ0EGv7JEyNChMphUpp62WNDYIVW/H4YOTcATi4VSsUBqasu0cdZx8WOb2+u0/qqBAwdWVVUp7lIoFAqFIpPJnj9/rvySgXqAsFMbo0aNEovFUqmUyWQaGhpyOBwOh2NpaWlubj5y5MiWXpWTXJ9wl8urkbCN2PpmbG1ddToFKW6Q1FXUN1Tz2XpUv54cty4tzhl39uzZqqqqysrK8vLy2tpasVgsEonEYjGVSr106VLHVg1UFISdmhGJRG2cGbSiUHT9VAXSopk7G9GZ6t2vkIik5dlVUlHjgHFm1i7vGOURhEKhjk6bngkwAWGnmVIfclMeNhhY6zP1NGfOZGG9uK6kziOA6ddLvw1PB+BfIOw00ONrNbnpIksPU7ILUYryl5VWDrRekcZkFwLUjBbZBYB29vjP2rwMsaYmHULI3M2kJF/28I8asgsBagbCTqOkxNXlpYss3DV8NVsLN6OinMbEv2vJLgSoEwg7zVFWIEx52KDxSUcwczHOeC4ozhaQXQhQGxB2muPPo+XG9hhdQ2tkb3T9WDnZVQC1AWGnIdIecRm62tpsdbqM7iMxmDSWITPlfh3ZhQD1AGGnIRLvcs2csTtBaeZinHSf24YnAgBhpxEKM/hSOYVKV9GfJpdXGb0qKPnFnXbfsxaVgrSouakN7b5noHlU9L8HeC/ZSfUsQxbZVZCDbcTKSoSwA+8GYacJ8tP5eqaYrsqoZ8ouzICwA++m3h+ZBAghQb20USSj67zHhEjvpY77OvbqtoKiFLFY4OEWEtpnhpmpPULo3sPTt+8enTrhh98urq+ozLc0d+ndY2JX/6HEqxKSr1+7tV8orPdy79krRIkz7lEZWgih+lqJrgH8MoPWwMhO7TVwpQylfc5fKpXs+3VhXkHSmMivoxefZjH1dx6YWVVdghCiURl8Aff3K1vHjVy5ac2jTl59z/6+vrauAiFUWp598tw3gf5DVnx2totf2O9XtiqpPAJDh9bAlSr1LYAGgLBTe3yuhKatrGFdbn7C68qCCaO/dXcN0uMYRw75H4ulf//RbwghipaWVNoYMWSJvW0nCoUS0HmITCYtfpWBEIp7fN5A32Jg35kslp6rc9eggAgllUegaVMbuJI2PBFgDcJO7TWK5TosZV1el1eQSKXSXZ0CibsUCsXZsUteQaLiCXbW3sQNpg4HISQQ8hBCldVFFuZOiufYWnspqTwCnUlvFMF8FuAdoM2h9nTYWgKesuYcFgjrpdLG6FVBTR/U47z5RBqx+s9b+HyumYm94i6DwVRSeQRRvZipi+n5GdB2EHZqj61HaxQp6yCOwzFmMJgzJm1p+iCV+o6jZhZLr1EiUtwViZR7tlQilrL14DcZvAP8iqg9th6VpbT/6lbmrmKxwMjQ0sjQiniksqqYw3nHRzUMDSzTMx/IZDItLS2EUPrLB0oqj8BkU5kcZXUtgcaAnp3ao2trUZCcXytqw3Pfm4dbdw/X7mcurqupLatvqL3/6Lcd+6c/ff6OVR38vEN59VWXrm2Xy+XZuc8ePrmgjNoIAp5Y0ihl6ULYgXeAkZ0mcPFj5WY0sAyUMgP7jKitD59eOP7byoKiFFMT+0D/YT2Dx7b+EnfXoKGDFj16evHew9MG+hYTR3+759A8uVymjPLqKxtcfKFhB94NpmXXBNVl4qtHX1t3siC7EBKUppWHjjU2tdWcpTaAksBhrCYwsmCwdCm8SuxmsmyoFtLpckg60BZwGKsheg03uXyojGNi3exWqVSy+ofBzW6SSMQ0Kh01dwWJpbnLwln7/6+9uwdpIwrgAH7ee3chxpjEj0QFI62ILl1aWqFrQcXBwVWFDh3UDl1tl47irouLq4POHRTp0A4WxaFFEfEjoDWUQ5OrXkzeuzyXbs2BpdHLvff/jcdx/I/j/ry7dx9VDPlxdtAte0wcC1ExQ2tz+t3kktcGrZOLoYlkFROCxHAZK4/15V8FFo62VP78iW1bFZcXS4WQx3NwOqENkXgVE3pl0DSNuSWDmH8vJ4RGPDJcWQVTdwbGUHZwJyg7qSx+OHrc30lN+e9OlLnY/5KZmuv2OwgEhvxnhVLG33cdbp76neIhHH47HZ/pusOKAH9gZCcb+5KvLpw/etbhd5B7dLz1c3S6Ldas0A834P9hZCebxgQdeZP6sXZcvL6vF2Z9xAru7sbJ8Oskmg7+FUZ2khLayvx5iZO2niadVJjlDBwhtOzBBRFs9G07NWTYI3hgKDuZbW/kNz9ZHb1N4Xg4uH9ZLDnMyd2c7VrPB1teDFRzdhiUgrKT387n3PevecZELNVATMMIEWoSYpLaPPR6XR1nLi+6rOgKznPZK6JrT142Pn2V8DsaBBvKThV5i2X2nGzm5neOX9suNYhj1+JNvfoo5awciZFonKbSoXRfJJEM6pgUagrKDgCUgNlYAFACyg4AlICyAwAloOwAQAkoOwBQAsoOAJSAsgMAJdwCjPBLmPe2LDcAAAAASUVORK5CYII=", + "image/png": "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", "text/plain": [ "" ] @@ -278,10 +278,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:49:19 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "00:40:21 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "{'router_node': {'route': 'other'}}\n", - "19:49:21 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "{'normal_llm_node': {'messages': [AIMessage(content='Hello! How can I assist you today?', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 9, 'prompt_tokens': 9, 'total_tokens': 18, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_ff25b2783a', 'id': 'chatcmpl-C1eQSpmVa2WR20bVGksAXd8sb4RgG', 'service_tier': 'default', 'finish_reason': 'stop', 'logprobs': None}, id='run--24da8d0f-1db0-40da-987f-59ba7b544ce2-0', usage_metadata={'input_tokens': 9, 'output_tokens': 9, 'total_tokens': 18, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})]}}\n" + "00:40:22 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "{'normal_llm_node': {'messages': [AIMessage(content='Hello! How can I assist you today?', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 9, 'prompt_tokens': 9, 'total_tokens': 18, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_provider': 'openai', 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_b1442291a8', 'id': 'chatcmpl-Cd43ZihdZFv10P6lgrnIWWijHENhJ', 'service_tier': 'default', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--e37f863f-5d5c-425e-b3b9-531240e43f13-0', usage_metadata={'input_tokens': 9, 'output_tokens': 9, 'total_tokens': 18, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})]}}\n" ] } ], @@ -312,9 +312,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:49:22 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "00:40:23 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "{'router_node': {'route': 'weather'}}\n", - "19:49:24 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "00:40:24 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "{'__interrupt__': ()}\n" ] } @@ -342,12 +342,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "((), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='e8ca97fe-6457-4e19-b9dc-5253d686b485')]})\n", - "19:49:25 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "((), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='e8ca97fe-6457-4e19-b9dc-5253d686b485')], 'route': 'weather'})\n", - "(('weather_graph:60555af0-33b1-dc09-4888-d57c08dc4db8',), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='e8ca97fe-6457-4e19-b9dc-5253d686b485')]})\n", - "19:49:27 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "(('weather_graph:60555af0-33b1-dc09-4888-d57c08dc4db8',), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='e8ca97fe-6457-4e19-b9dc-5253d686b485')], 'city': 'San Francisco'})\n" + "((), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='486b23fb-f66a-4691-a980-963bd6ba0717')]})\n", + "00:40:24 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "((), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='486b23fb-f66a-4691-a980-963bd6ba0717')], 'route': 'weather'})\n", + "(('weather_graph:ab9927db-776e-778c-fecb-c7c5c3428da0',), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='486b23fb-f66a-4691-a980-963bd6ba0717')]})\n", + "00:40:26 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "(('weather_graph:ab9927db-776e-778c-fecb-c7c5c3428da0',), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='486b23fb-f66a-4691-a980-963bd6ba0717')], 'city': 'San Francisco'})\n" ] } ], @@ -401,7 +401,7 @@ { "data": { "text/plain": [ - "(PregelTask(id='60555af0-33b1-dc09-4888-d57c08dc4db8', name='weather_graph', path=('__pregel_pull', 'weather_graph'), error=None, interrupts=(), state={'configurable': {'thread_id': '3', 'checkpoint_ns': 'weather_graph:60555af0-33b1-dc09-4888-d57c08dc4db8'}}, result=None),)" + "(PregelTask(id='ab9927db-776e-778c-fecb-c7c5c3428da0', name='weather_graph', path=('__pregel_pull', 'weather_graph'), error=None, interrupts=(), state={'configurable': {'thread_id': '3', 'checkpoint_ns': 'weather_graph:ab9927db-776e-778c-fecb-c7c5c3428da0'}}, result=None),)" ] }, "execution_count": 10, @@ -428,7 +428,7 @@ { "data": { "text/plain": [ - "PregelTask(id='60555af0-33b1-dc09-4888-d57c08dc4db8', name='weather_graph', path=('__pregel_pull', 'weather_graph'), error=None, interrupts=(), state=StateSnapshot(values={'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='e8ca97fe-6457-4e19-b9dc-5253d686b485')], 'city': 'San Francisco'}, next=('weather_node',), config={'configurable': {'thread_id': '3', 'checkpoint_ns': 'weather_graph:60555af0-33b1-dc09-4888-d57c08dc4db8', 'checkpoint_id': '1f072fe7-5fef-6d82-8001-128712d34fc6', 'checkpoint_map': {'': '1f072fe7-4dba-681c-8001-e1d2ab5eccf6', 'weather_graph:60555af0-33b1-dc09-4888-d57c08dc4db8': '1f072fe7-5fef-6d82-8001-128712d34fc6'}}}, metadata={'source': 'loop', 'step': 1, 'parents': {'': '1f072fe7-4dba-681c-8001-e1d2ab5eccf6'}}, created_at='2025-08-06T19:49:27.539023+00:00', parent_config={'configurable': {'thread_id': '3', 'checkpoint_ns': 'weather_graph:60555af0-33b1-dc09-4888-d57c08dc4db8', 'checkpoint_id': '1f072fe7-4dc0-6b54-8000-d7d6ffbeefa5', 'checkpoint_map': {'': '1f072fe7-4dba-681c-8001-e1d2ab5eccf6', 'weather_graph:60555af0-33b1-dc09-4888-d57c08dc4db8': '1f072fe7-4dc0-6b54-8000-d7d6ffbeefa5'}}}, tasks=(PregelTask(id='da7c4aa5-a62e-a941-1aad-f88a9cbf49e3', name='weather_node', path=('__pregel_pull', 'weather_node'), error=None, interrupts=(), state=None, result=None),), interrupts=()), result=None)" + "PregelTask(id='ab9927db-776e-778c-fecb-c7c5c3428da0', name='weather_graph', path=('__pregel_pull', 'weather_graph'), error=None, interrupts=(), state=StateSnapshot(values={'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='486b23fb-f66a-4691-a980-963bd6ba0717')], 'city': 'San Francisco'}, next=('weather_node',), config={'configurable': {'thread_id': '3', 'checkpoint_ns': 'weather_graph:ab9927db-776e-778c-fecb-c7c5c3428da0', 'checkpoint_id': '1f0c4172-d2ba-6250-8001-56721d7a79ce', 'checkpoint_map': {'': '1f0c4172-bdc6-68d4-8001-dbbae4a9b92e', 'weather_graph:ab9927db-776e-778c-fecb-c7c5c3428da0': '1f0c4172-d2ba-6250-8001-56721d7a79ce'}}}, metadata={'source': 'loop', 'step': 1, 'parents': {'': '1f0c4172-bdc6-68d4-8001-dbbae4a9b92e'}}, created_at='2025-11-18T00:40:26.961141+00:00', parent_config={'configurable': {'thread_id': '3', 'checkpoint_ns': 'weather_graph:ab9927db-776e-778c-fecb-c7c5c3428da0', 'checkpoint_id': '1f0c4172-bdcd-6a40-8000-49cf47919c06', 'checkpoint_map': {'': '1f0c4172-bdc6-68d4-8001-dbbae4a9b92e', 'weather_graph:ab9927db-776e-778c-fecb-c7c5c3428da0': '1f0c4172-bdcd-6a40-8000-49cf47919c06'}}}, tasks=(PregelTask(id='2853d1bd-40ee-07fe-aa8e-993ea3cc7b00', name='weather_node', path=('__pregel_pull', 'weather_node'), error=None, interrupts=(), state=None, result=None),), interrupts=()), result=None)" ] }, "execution_count": 11, @@ -459,10 +459,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "((), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='e8ca97fe-6457-4e19-b9dc-5253d686b485')], 'route': 'weather'})\n", - "(('weather_graph:60555af0-33b1-dc09-4888-d57c08dc4db8',), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='e8ca97fe-6457-4e19-b9dc-5253d686b485')], 'city': 'San Francisco'})\n", - "(('weather_graph:60555af0-33b1-dc09-4888-d57c08dc4db8',), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='e8ca97fe-6457-4e19-b9dc-5253d686b485'), AIMessage(content=\"It's sunny in San Francisco!\", additional_kwargs={}, response_metadata={}, id='fa13351e-f130-47d0-ae4d-6174dcdbffb8')], 'city': 'San Francisco'})\n", - "((), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='e8ca97fe-6457-4e19-b9dc-5253d686b485'), AIMessage(content=\"It's sunny in San Francisco!\", additional_kwargs={}, response_metadata={}, id='fa13351e-f130-47d0-ae4d-6174dcdbffb8')], 'route': 'weather'})\n" + "((), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='486b23fb-f66a-4691-a980-963bd6ba0717')], 'route': 'weather'})\n", + "(('weather_graph:ab9927db-776e-778c-fecb-c7c5c3428da0',), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='486b23fb-f66a-4691-a980-963bd6ba0717')], 'city': 'San Francisco'})\n", + "(('weather_graph:ab9927db-776e-778c-fecb-c7c5c3428da0',), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='486b23fb-f66a-4691-a980-963bd6ba0717'), AIMessage(content=\"It's sunny in San Francisco!\", additional_kwargs={}, response_metadata={}, id='43011c48-4d6a-4e1d-beef-f19fb2b76d8c')], 'city': 'San Francisco'})\n", + "((), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='486b23fb-f66a-4691-a980-963bd6ba0717'), AIMessage(content=\"It's sunny in San Francisco!\", additional_kwargs={}, response_metadata={}, id='43011c48-4d6a-4e1d-beef-f19fb2b76d8c')], 'route': 'weather'})\n" ] } ], @@ -554,10 +554,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "((), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='e8ca97fe-6457-4e19-b9dc-5253d686b485')], 'route': 'weather'})\n", - "(('weather_graph:60555af0-33b1-dc09-4888-d57c08dc4db8',), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='e8ca97fe-6457-4e19-b9dc-5253d686b485')]})\n", - "19:49:30 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "(('weather_graph:60555af0-33b1-dc09-4888-d57c08dc4db8',), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='e8ca97fe-6457-4e19-b9dc-5253d686b485')], 'city': 'San Francisco'})\n" + "((), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='486b23fb-f66a-4691-a980-963bd6ba0717')], 'route': 'weather'})\n", + "(('weather_graph:ab9927db-776e-778c-fecb-c7c5c3428da0',), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='486b23fb-f66a-4691-a980-963bd6ba0717')]})\n", + "00:40:27 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "(('weather_graph:ab9927db-776e-778c-fecb-c7c5c3428da0',), {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='486b23fb-f66a-4691-a980-963bd6ba0717')], 'city': 'San Francisco'})\n" ] } ], @@ -598,9 +598,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:49:31 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "00:40:28 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "{'router_node': {'route': 'weather'}}\n", - "19:49:31 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "00:40:29 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "{'__interrupt__': ()}\n" ] } @@ -620,7 +620,7 @@ { "data": { "text/plain": [ - "[HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='fab08064-f16c-42bb-92c8-4d1ec3e03a0c')]" + "[HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='10ace146-e3e3-45b6-87a6-2af70592d19a')]" ] }, "execution_count": 18, @@ -649,10 +649,10 @@ "data": { "text/plain": [ "{'configurable': {'thread_id': '4',\n", - " 'checkpoint_ns': 'weather_graph:97c4037c-04a4-88f0-5f77-b5d0a58d573e',\n", - " 'checkpoint_id': '1f072fe7-86ff-6d31-8002-d83218057702',\n", - " 'checkpoint_map': {'': '1f072fe7-8217-6934-8001-43fd0d293d39',\n", - " 'weather_graph:97c4037c-04a4-88f0-5f77-b5d0a58d573e': '1f072fe7-86ff-6d31-8002-d83218057702'}}}" + " 'checkpoint_ns': 'weather_graph:98bb2966-50c9-a970-9b65-91ddf06c0081',\n", + " 'checkpoint_id': '1f0c4172-e73d-60f8-8002-2fa7cf3ee206',\n", + " 'checkpoint_map': {'': '1f0c4172-dfbe-6003-8001-4c28f9e28ab0',\n", + " 'weather_graph:98bb2966-50c9-a970-9b65-91ddf06c0081': '1f0c4172-e73d-60f8-8002-2fa7cf3ee206'}}}" ] }, "execution_count": 19, @@ -680,8 +680,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "(('weather_graph:97c4037c-04a4-88f0-5f77-b5d0a58d573e',), {'weather_node': {'messages': [{'role': 'assistant', 'content': \"It's sunny in la!\"}]}})\n", - "((), {'weather_graph': {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='fab08064-f16c-42bb-92c8-4d1ec3e03a0c'), AIMessage(content=\"It's sunny in la!\", additional_kwargs={}, response_metadata={}, id='85d1dba9-1872-4b48-ae35-dbceb7d5de08')]}})\n" + "(('weather_graph:98bb2966-50c9-a970-9b65-91ddf06c0081',), {'weather_node': {'messages': [{'role': 'assistant', 'content': \"It's sunny in la!\"}]}})\n", + "((), {'weather_graph': {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='10ace146-e3e3-45b6-87a6-2af70592d19a'), AIMessage(content=\"It's sunny in la!\", additional_kwargs={}, response_metadata={}, id='25e0b022-8b46-45d6-a879-b1d59d551418')]}})\n" ] } ], @@ -710,14 +710,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:49:32 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "00:40:29 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "((), {'router_node': {'route': 'weather'}})\n", - "19:49:32 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "(('weather_graph:0f03bc0d-600b-8bcc-7aae-28e3848d8986',), {'model_node': {'city': 'San Francisco'}})\n", + "00:40:30 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "(('weather_graph:a8cee305-a4e1-1619-c9ed-922f8eb82574',), {'model_node': {'city': 'San Francisco'}})\n", "((), {'__interrupt__': ()})\n", "interrupted!\n", - "((), {'weather_graph': {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='0424d92e-33fa-4c0b-9d9a-426e9509e642'), AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='f507bd08-4145-4dff-a9dc-f7613737d1df')]}})\n", - "[HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='0424d92e-33fa-4c0b-9d9a-426e9509e642'), AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='f507bd08-4145-4dff-a9dc-f7613737d1df')]\n" + "((), {'weather_graph': {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='82a0cf58-ac94-40f9-bedb-3c3cad1f1415'), AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='b3845890-7652-459f-819b-370b896c4289')]}})\n", + "[HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='82a0cf58-ac94-40f9-bedb-3c3cad1f1415'), AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='b3845890-7652-459f-819b-370b896c4289')]\n" ] } ], @@ -765,13 +765,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:49:33 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "00:40:31 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "((), {'router_node': {'route': 'weather'}})\n", - "19:49:34 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "(('weather_graph:f8e64c8e-648f-6c34-a1f8-887d1d0e4a6d',), {'model_node': {'city': 'San Francisco'}})\n", + "00:40:31 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "(('weather_graph:bce0a8d8-7c21-907f-e1eb-fc3c389850f8',), {'model_node': {'city': 'San Francisco'}})\n", "((), {'__interrupt__': ()})\n", "interrupted!\n", - "[HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='1693421f-9586-478f-8919-0a6fee31cc13'), AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='f9c5b93e-ce41-49be-af80-2a29871d4f7e')]\n" + "[HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='70727bad-3d7a-4a62-911d-38ef4d75495e'), AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='96719b2b-fc92-43f6-b9b2-b0cf6b3638a4')]\n" ] } ], @@ -818,10 +818,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:49:34 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "19:49:34 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:49:34 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:49:34 redisvl.index.index INFO Index already exists, not overwriting.\n" + "00:40:31 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", + "00:40:31 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:40:31 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:40:31 redisvl.index.index INFO Index already exists, not overwriting.\n" ] } ], @@ -890,10 +890,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "19:49:34 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", - "19:49:34 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:49:34 redisvl.index.index INFO Index already exists, not overwriting.\n", - "19:49:34 redisvl.index.index INFO Index already exists, not overwriting.\n" + "00:40:31 langgraph.checkpoint.redis INFO Redis client is a standalone client\n", + "00:40:31 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:40:31 redisvl.index.index INFO Index already exists, not overwriting.\n", + "00:40:31 redisvl.index.index INFO Index already exists, not overwriting.\n" ] } ], @@ -942,7 +942,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] @@ -975,10 +975,10 @@ "output_type": "stream", "text": [ "((), {'router_node': {'to_continue': True}})\n", - "19:49:35 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "(('graph:c7c00782-3665-a049-2228-d98da6b23d48',), {'router_node': {'route': 'weather'}})\n", - "19:49:36 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "(('graph:c7c00782-3665-a049-2228-d98da6b23d48', 'weather_graph:0e5f154a-2df4-e57d-2dc8-5446514d1f93'), {'model_node': {'city': 'San Francisco'}})\n", + "00:40:32 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "(('graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83',), {'router_node': {'route': 'weather'}})\n", + "00:40:33 httpx INFO HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "(('graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83', 'weather_graph:f2a6b816-81df-d70a-ab45-b44861ae97e7'), {'model_node': {'city': 'San Francisco'}})\n", "((), {'__interrupt__': ()})\n" ] } @@ -1002,13 +1002,13 @@ "output_type": "stream", "text": [ "Grandparent State:\n", - "{'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='d7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'), HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='28ef5b05-b571-4454-9753-10d194e52024')], 'to_continue': True}\n", + "{'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'), HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='eaa3e056-eca2-4788-bbab-c8a83e9878be')], 'to_continue': True}\n", "---------------\n", "Parent Graph State:\n", - "{'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='d7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'), HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='28ef5b05-b571-4454-9753-10d194e52024')], 'route': 'weather'}\n", + "{'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'), HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='eaa3e056-eca2-4788-bbab-c8a83e9878be')], 'route': 'weather'}\n", "---------------\n", "Subgraph State:\n", - "{'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='d7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'), HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='28ef5b05-b571-4454-9753-10d194e52024')], 'city': 'San Francisco'}\n" + "{'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'), HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='eaa3e056-eca2-4788-bbab-c8a83e9878be')], 'city': 'San Francisco'}\n" ] } ], @@ -1040,9 +1040,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "(('graph:c7c00782-3665-a049-2228-d98da6b23d48',), {'weather_graph': {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='d7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'), HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='28ef5b05-b571-4454-9753-10d194e52024'), AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='9773b21f-7e75-4e67-91a8-5ab80fa37ee7')]}})\n", - "((), {'graph': {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='d7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'), HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='28ef5b05-b571-4454-9753-10d194e52024'), AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='9773b21f-7e75-4e67-91a8-5ab80fa37ee7')]}})\n", - "[HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='d7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'), HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='28ef5b05-b571-4454-9753-10d194e52024'), AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='9773b21f-7e75-4e67-91a8-5ab80fa37ee7')]\n" + "(('graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83',), {'weather_graph': {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'), HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='eaa3e056-eca2-4788-bbab-c8a83e9878be'), AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='86510037-f2d0-452f-b007-d335fa4d6482')]}})\n", + "((), {'graph': {'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'), HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='eaa3e056-eca2-4788-bbab-c8a83e9878be'), AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='86510037-f2d0-452f-b007-d335fa4d6482')]}})\n", + "[HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'), HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='eaa3e056-eca2-4788-bbab-c8a83e9878be'), AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='86510037-f2d0-452f-b007-d335fa4d6482')]\n" ] } ], @@ -1081,41 +1081,41 @@ "name": "stdout", "output_type": "stream", "text": [ - "StateSnapshot(values={'messages': []}, next=('__start__',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f072fe7-2625-6cb4-bfff-0577231ac0ec'}}, metadata={'source': 'input', 'step': -1, 'parents': {}}, created_at='2025-08-06T19:49:21.479383+00:00', parent_config=None, tasks=(PregelTask(id='7d06c21b-984b-2fc1-f4f5-7bcc52efbbd7', name='__start__', path=('__pregel_pull', '__start__'), error=None, interrupts=(), state=None, result={'messages': [{'role': 'user', 'content': \"what's the weather in sf\"}]}),), interrupts=())\n", + "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'eaa3e056-eca2-4788-bbab-c8a83e9878be'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'AIMessage'], 'kwargs': {'content': 'rainy', 'type': 'ai', 'id': '86510037-f2d0-452f-b007-d335fa4d6482', 'tool_calls': [], 'invalid_tool_calls': []}}], 'to_continue': True}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f0c4173-11ed-66bb-8005-abfb7c9b5673'}}, metadata={'source': 'loop', 'step': 5, 'parents': {}}, created_at='2025-11-18T00:40:33.588184+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f0c4173-0614-681b-8004-bb0145b1cb63'}}, tasks=(), interrupts=())\n", "-----\n", - "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'd7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'}}]}, next=('router_node',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f072fe7-262e-66ce-8000-aa07c2d13b6a'}}, metadata={'source': 'loop', 'step': 0, 'parents': {}}, created_at='2025-08-06T19:49:21.482906+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f072fe7-2625-6cb4-bfff-0577231ac0ec'}}, tasks=(PregelTask(id='aaa44ca4-9044-10fc-b337-87526cda849d', name='router_node', path=('__pregel_pull', 'router_node'), error=None, interrupts=(), state=None, result={}),), interrupts=())\n", + "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'eaa3e056-eca2-4788-bbab-c8a83e9878be'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'AIMessage'], 'kwargs': {'content': 'rainy', 'type': 'ai', 'id': '86510037-f2d0-452f-b007-d335fa4d6482', 'tool_calls': [], 'invalid_tool_calls': []}}]}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83', 'checkpoint_id': '1f0c4173-11e8-610c-8002-472a695abcd0', 'checkpoint_map': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-11e8-610c-8002-472a695abcd0'}}}, metadata={'source': 'loop', 'step': 2, 'parents': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63'}}, created_at='2025-11-18T00:40:33.585990+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83', 'checkpoint_id': '1f0c4173-0af0-644b-8001-5845b26dd1fd', 'checkpoint_map': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-0af0-644b-8001-5845b26dd1fd'}}}, tasks=(), interrupts=())\n", "-----\n", - "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'd7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'}}]}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f072fe7-2d45-6246-8001-98a17f4d33ab'}}, metadata={'source': 'loop', 'step': 1, 'parents': {}}, created_at='2025-08-06T19:49:22.226227+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f072fe7-262e-66ce-8000-aa07c2d13b6a'}}, tasks=(), interrupts=())\n", + "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'eaa3e056-eca2-4788-bbab-c8a83e9878be'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'AIMessage'], 'kwargs': {'content': 'rainy', 'type': 'ai', 'id': '86510037-f2d0-452f-b007-d335fa4d6482', 'tool_calls': [], 'invalid_tool_calls': []}}]}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83|weather_graph:f2a6b816-81df-d70a-ab45-b44861ae97e7', 'checkpoint_id': '1f0c4173-11de-6130-8002-1910b4333394', 'checkpoint_map': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-0af0-644b-8001-5845b26dd1fd', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83|weather_graph:f2a6b816-81df-d70a-ab45-b44861ae97e7': '1f0c4173-11de-6130-8002-1910b4333394'}}}, metadata={'source': 'update', 'step': 2, 'parents': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-0af0-644b-8001-5845b26dd1fd'}}, created_at='2025-11-18T00:40:33.581895+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83|weather_graph:f2a6b816-81df-d70a-ab45-b44861ae97e7', 'checkpoint_id': '1f0c4173-11b3-6f00-8001-3ebd6a4dec99', 'checkpoint_map': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-0af0-644b-8001-5845b26dd1fd', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83|weather_graph:f2a6b816-81df-d70a-ab45-b44861ae97e7': '1f0c4173-11b3-6f00-8001-3ebd6a4dec99'}}}, tasks=(), interrupts=())\n", "-----\n", - "StateSnapshot(values={'messages': []}, next=('__start__',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'weather_graph:39f41d26-c005-4401-f6f7-6bd3b7868150', 'checkpoint_id': '1f072fe7-2d49-6e48-bfff-84a69c927b9e', 'checkpoint_map': {'': '1f072fe7-2d45-6246-8001-98a17f4d33ab', 'weather_graph:39f41d26-c005-4401-f6f7-6bd3b7868150': '1f072fe7-2d49-6e48-bfff-84a69c927b9e'}}}, metadata={'source': 'input', 'step': -1, 'parents': {'': '1f072fe7-2d45-6246-8001-98a17f4d33ab'}}, created_at='2025-08-06T19:49:22.228176+00:00', parent_config=None, tasks=(PregelTask(id='7c096b4f-baa3-5993-f80e-4b94a9c1b50e', name='__start__', path=('__pregel_pull', '__start__'), error=None, interrupts=(), state=None, result={'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='d7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4')]}),), interrupts=())\n", + "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'eaa3e056-eca2-4788-bbab-c8a83e9878be'}}]}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83|weather_graph:f2a6b816-81df-d70a-ab45-b44861ae97e7', 'checkpoint_id': '1f0c4173-11b3-6f00-8001-3ebd6a4dec99', 'checkpoint_map': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-0af0-644b-8001-5845b26dd1fd', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83|weather_graph:f2a6b816-81df-d70a-ab45-b44861ae97e7': '1f0c4173-11b3-6f00-8001-3ebd6a4dec99'}}}, metadata={'source': 'loop', 'step': 1, 'parents': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-0af0-644b-8001-5845b26dd1fd'}}, created_at='2025-11-18T00:40:33.564619+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83|weather_graph:f2a6b816-81df-d70a-ab45-b44861ae97e7', 'checkpoint_id': '1f0c4173-0af7-6666-8000-2c7166449cf7', 'checkpoint_map': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-0af0-644b-8001-5845b26dd1fd', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83|weather_graph:f2a6b816-81df-d70a-ab45-b44861ae97e7': '1f0c4173-0af7-6666-8000-2c7166449cf7'}}}, tasks=(), interrupts=())\n", "-----\n", - "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'd7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'}}]}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'weather_graph:39f41d26-c005-4401-f6f7-6bd3b7868150', 'checkpoint_id': '1f072fe7-2d4c-63dd-8000-35de079e3213', 'checkpoint_map': {'': '1f072fe7-2d45-6246-8001-98a17f4d33ab', 'weather_graph:39f41d26-c005-4401-f6f7-6bd3b7868150': '1f072fe7-2d4c-63dd-8000-35de079e3213'}}}, metadata={'source': 'loop', 'step': 0, 'parents': {'': '1f072fe7-2d45-6246-8001-98a17f4d33ab'}}, created_at='2025-08-06T19:49:22.229136+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'weather_graph:39f41d26-c005-4401-f6f7-6bd3b7868150', 'checkpoint_id': '1f072fe7-2d49-6e48-bfff-84a69c927b9e', 'checkpoint_map': {'': '1f072fe7-2d45-6246-8001-98a17f4d33ab', 'weather_graph:39f41d26-c005-4401-f6f7-6bd3b7868150': '1f072fe7-2d49-6e48-bfff-84a69c927b9e'}}}, tasks=(), interrupts=())\n", + "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'eaa3e056-eca2-4788-bbab-c8a83e9878be'}}]}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83|weather_graph:f2a6b816-81df-d70a-ab45-b44861ae97e7', 'checkpoint_id': '1f0c4173-0af7-6666-8000-2c7166449cf7', 'checkpoint_map': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-0af0-644b-8001-5845b26dd1fd', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83|weather_graph:f2a6b816-81df-d70a-ab45-b44861ae97e7': '1f0c4173-0af7-6666-8000-2c7166449cf7'}}}, metadata={'source': 'loop', 'step': 0, 'parents': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-0af0-644b-8001-5845b26dd1fd'}}, created_at='2025-11-18T00:40:32.858264+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83|weather_graph:f2a6b816-81df-d70a-ab45-b44861ae97e7', 'checkpoint_id': '1f0c4173-0af2-63b4-bfff-e50626d4b8b1', 'checkpoint_map': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-0af0-644b-8001-5845b26dd1fd', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83|weather_graph:f2a6b816-81df-d70a-ab45-b44861ae97e7': '1f0c4173-0af2-63b4-bfff-e50626d4b8b1'}}}, tasks=(), interrupts=())\n", "-----\n", - "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'd7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'}}]}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'weather_graph:39f41d26-c005-4401-f6f7-6bd3b7868150', 'checkpoint_id': '1f072fe7-46b2-6d74-8001-274ee769e640', 'checkpoint_map': {'': '1f072fe7-2d45-6246-8001-98a17f4d33ab', 'weather_graph:39f41d26-c005-4401-f6f7-6bd3b7868150': '1f072fe7-46b2-6d74-8001-274ee769e640'}}}, metadata={'source': 'loop', 'step': 1, 'parents': {'': '1f072fe7-2d45-6246-8001-98a17f4d33ab'}}, created_at='2025-08-06T19:49:24.892599+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'weather_graph:39f41d26-c005-4401-f6f7-6bd3b7868150', 'checkpoint_id': '1f072fe7-2d4c-63dd-8000-35de079e3213', 'checkpoint_map': {'': '1f072fe7-2d45-6246-8001-98a17f4d33ab', 'weather_graph:39f41d26-c005-4401-f6f7-6bd3b7868150': '1f072fe7-2d4c-63dd-8000-35de079e3213'}}}, tasks=(), interrupts=())\n", + "StateSnapshot(values={'messages': []}, next=('__start__',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83|weather_graph:f2a6b816-81df-d70a-ab45-b44861ae97e7', 'checkpoint_id': '1f0c4173-0af2-63b4-bfff-e50626d4b8b1', 'checkpoint_map': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-0af0-644b-8001-5845b26dd1fd', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83|weather_graph:f2a6b816-81df-d70a-ab45-b44861ae97e7': '1f0c4173-0af2-63b4-bfff-e50626d4b8b1'}}}, metadata={'source': 'input', 'step': -1, 'parents': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-0af0-644b-8001-5845b26dd1fd'}}, created_at='2025-11-18T00:40:32.856154+00:00', parent_config=None, tasks=(PregelTask(id='8ab57b9a-ae9f-e8d6-9e2f-ecd918975654', name='__start__', path=('__pregel_pull', '__start__'), error=None, interrupts=(), state=None, result=None),), interrupts=())\n", "-----\n", - "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'd7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'}}]}, next=('__start__',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f072fe7-a5ab-604a-8002-bf1ff5658bc0'}}, metadata={'source': 'input', 'step': 2, 'parents': {}}, created_at='2025-08-06T19:49:34.850869+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f072fe7-2d45-6246-8001-98a17f4d33ab'}}, tasks=(PregelTask(id='114268c9-db18-46e1-da86-75c3db8904d0', name='__start__', path=('__pregel_pull', '__start__'), error=None, interrupts=(), state=None, result={'messages': [{'role': 'user', 'content': \"what's the weather in sf\"}]}),), interrupts=())\n", + "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'eaa3e056-eca2-4788-bbab-c8a83e9878be'}}]}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83', 'checkpoint_id': '1f0c4173-0af0-644b-8001-5845b26dd1fd', 'checkpoint_map': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-0af0-644b-8001-5845b26dd1fd'}}}, metadata={'source': 'loop', 'step': 1, 'parents': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63'}}, created_at='2025-11-18T00:40:32.855344+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83', 'checkpoint_id': '1f0c4173-061b-66c8-8000-829ec3811afe', 'checkpoint_map': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-061b-66c8-8000-829ec3811afe'}}}, tasks=(), interrupts=())\n", "-----\n", - "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'd7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '28ef5b05-b571-4454-9753-10d194e52024'}}]}, next=('router_node',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f072fe7-a5ad-68f4-8003-6c6fc3090288'}}, metadata={'source': 'loop', 'step': 3, 'parents': {}}, created_at='2025-08-06T19:49:34.851907+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f072fe7-a5ab-604a-8002-bf1ff5658bc0'}}, tasks=(PregelTask(id='3b74181a-192f-d700-9db9-95a3d7aac383', name='router_node', path=('__pregel_pull', 'router_node'), error=None, interrupts=(), state=None, result={'to_continue': True}),), interrupts=())\n", + "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'eaa3e056-eca2-4788-bbab-c8a83e9878be'}}]}, next=('router_node',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83', 'checkpoint_id': '1f0c4173-061b-66c8-8000-829ec3811afe', 'checkpoint_map': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-061b-66c8-8000-829ec3811afe'}}}, metadata={'source': 'loop', 'step': 0, 'parents': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63'}}, created_at='2025-11-18T00:40:32.348738+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83', 'checkpoint_id': '1f0c4173-0619-6899-bfff-c06e1a2af2b8', 'checkpoint_map': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-0619-6899-bfff-c06e1a2af2b8'}}}, tasks=(PregelTask(id='79d70b40-ba2e-7c12-a763-5e078c2f315e', name='router_node', path=('__pregel_pull', 'router_node'), error=None, interrupts=(), state=None, result={}),), interrupts=())\n", "-----\n", - "StateSnapshot(values={'messages': []}, next=('__start__',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:c7c00782-3665-a049-2228-d98da6b23d48', 'checkpoint_id': '1f072fe7-a5b4-6349-bfff-8d1f3e67a3af', 'checkpoint_map': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-a5b4-6349-bfff-8d1f3e67a3af'}}}, metadata={'source': 'input', 'step': -1, 'parents': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5'}}, created_at='2025-08-06T19:49:34.854635+00:00', parent_config=None, tasks=(PregelTask(id='7299899d-197c-8ca4-fa8b-bfe52c56664f', name='__start__', path=('__pregel_pull', '__start__'), error=None, interrupts=(), state=None, result={'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='d7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'), HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='28ef5b05-b571-4454-9753-10d194e52024')]}),), interrupts=())\n", + "StateSnapshot(values={'messages': []}, next=('__start__',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83', 'checkpoint_id': '1f0c4173-0619-6899-bfff-c06e1a2af2b8', 'checkpoint_map': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63', 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83': '1f0c4173-0619-6899-bfff-c06e1a2af2b8'}}}, metadata={'source': 'input', 'step': -1, 'parents': {'': '1f0c4173-0614-681b-8004-bb0145b1cb63'}}, created_at='2025-11-18T00:40:32.347967+00:00', parent_config=None, tasks=(PregelTask(id='c396d014-6d5e-eacd-595c-f1e589c2c502', name='__start__', path=('__pregel_pull', '__start__'), error=None, interrupts=(), state=None, result={'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'), HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='eaa3e056-eca2-4788-bbab-c8a83e9878be')]}),), interrupts=())\n", "-----\n", - "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'd7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '28ef5b05-b571-4454-9753-10d194e52024'}}]}, next=('router_node',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:c7c00782-3665-a049-2228-d98da6b23d48', 'checkpoint_id': '1f072fe7-a5b6-653c-8000-24b05222bc56', 'checkpoint_map': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-a5b6-653c-8000-24b05222bc56'}}}, metadata={'source': 'loop', 'step': 0, 'parents': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5'}}, created_at='2025-08-06T19:49:34.855502+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:c7c00782-3665-a049-2228-d98da6b23d48', 'checkpoint_id': '1f072fe7-a5b4-6349-bfff-8d1f3e67a3af', 'checkpoint_map': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-a5b4-6349-bfff-8d1f3e67a3af'}}}, tasks=(PregelTask(id='c6e0cae4-d8c6-b14d-1362-cbe293753fa7', name='router_node', path=('__pregel_pull', 'router_node'), error=None, interrupts=(), state=None, result={}),), interrupts=())\n", + "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'eaa3e056-eca2-4788-bbab-c8a83e9878be'}}], 'to_continue': True}, next=('graph',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f0c4173-0614-681b-8004-bb0145b1cb63'}}, metadata={'source': 'loop', 'step': 4, 'parents': {}}, created_at='2025-11-18T00:40:32.345904+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f0c4173-0611-6358-8003-a8dbd700740c'}}, tasks=(PregelTask(id='a6d3756e-3f64-22db-f9c7-37d129fc0a83', name='graph', path=('__pregel_pull', 'graph'), error=None, interrupts=(), state={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:a6d3756e-3f64-22db-f9c7-37d129fc0a83'}}, result={'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'), HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='eaa3e056-eca2-4788-bbab-c8a83e9878be'), AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='86510037-f2d0-452f-b007-d335fa4d6482')]}),), interrupts=())\n", "-----\n", - "StateSnapshot(values={'messages': []}, next=('__start__',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:c7c00782-3665-a049-2228-d98da6b23d48|weather_graph:0e5f154a-2df4-e57d-2dc8-5446514d1f93', 'checkpoint_id': '1f072fe7-aa68-6503-bfff-a4d8342b08aa', 'checkpoint_map': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-aa65-6ba2-8001-1d681f52eda7', 'graph:c7c00782-3665-a049-2228-d98da6b23d48|weather_graph:0e5f154a-2df4-e57d-2dc8-5446514d1f93': '1f072fe7-aa68-6503-bfff-a4d8342b08aa'}}}, metadata={'source': 'input', 'step': -1, 'parents': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-aa65-6ba2-8001-1d681f52eda7'}}, created_at='2025-08-06T19:49:35.347837+00:00', parent_config=None, tasks=(PregelTask(id='242fe40c-4451-c4b2-7391-d884b8af3ecb', name='__start__', path=('__pregel_pull', '__start__'), error=None, interrupts=(), state=None, result=None),), interrupts=())\n", + "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'eaa3e056-eca2-4788-bbab-c8a83e9878be'}}]}, next=('router_node',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f0c4173-0611-6358-8003-a8dbd700740c'}}, metadata={'source': 'loop', 'step': 3, 'parents': {}}, created_at='2025-11-18T00:40:32.344554+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f0c4173-060e-6c6e-8002-601a907b6eb1'}}, tasks=(PregelTask(id='a435de3f-68e5-6207-f047-7d43359fa425', name='router_node', path=('__pregel_pull', 'router_node'), error=None, interrupts=(), state=None, result={'to_continue': True}),), interrupts=())\n", "-----\n", - "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'd7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '28ef5b05-b571-4454-9753-10d194e52024'}}]}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:c7c00782-3665-a049-2228-d98da6b23d48|weather_graph:0e5f154a-2df4-e57d-2dc8-5446514d1f93', 'checkpoint_id': '1f072fe7-aa6b-6918-8000-c04fc9c43ab2', 'checkpoint_map': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-aa65-6ba2-8001-1d681f52eda7', 'graph:c7c00782-3665-a049-2228-d98da6b23d48|weather_graph:0e5f154a-2df4-e57d-2dc8-5446514d1f93': '1f072fe7-aa6b-6918-8000-c04fc9c43ab2'}}}, metadata={'source': 'loop', 'step': 0, 'parents': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-aa65-6ba2-8001-1d681f52eda7'}}, created_at='2025-08-06T19:49:35.349169+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:c7c00782-3665-a049-2228-d98da6b23d48|weather_graph:0e5f154a-2df4-e57d-2dc8-5446514d1f93', 'checkpoint_id': '1f072fe7-aa68-6503-bfff-a4d8342b08aa', 'checkpoint_map': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-aa65-6ba2-8001-1d681f52eda7', 'graph:c7c00782-3665-a049-2228-d98da6b23d48|weather_graph:0e5f154a-2df4-e57d-2dc8-5446514d1f93': '1f072fe7-aa68-6503-bfff-a4d8342b08aa'}}}, tasks=(), interrupts=())\n", + "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'}}]}, next=('__start__',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f0c4173-060e-6c6e-8002-601a907b6eb1'}}, metadata={'source': 'input', 'step': 2, 'parents': {}}, created_at='2025-11-18T00:40:32.343557+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f0c4172-b1f1-6d8e-8001-08dd4c84fc5f'}}, tasks=(PregelTask(id='b2aca149-5c03-e0a1-a4f3-4ec87c5cf341', name='__start__', path=('__pregel_pull', '__start__'), error=None, interrupts=(), state=None, result={'messages': [{'role': 'user', 'content': \"what's the weather in sf\"}]}),), interrupts=())\n", "-----\n", - "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'd7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '28ef5b05-b571-4454-9753-10d194e52024'}}]}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:c7c00782-3665-a049-2228-d98da6b23d48|weather_graph:0e5f154a-2df4-e57d-2dc8-5446514d1f93', 'checkpoint_id': '1f072fe7-b15b-65ac-8001-eb9037055f0a', 'checkpoint_map': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-aa65-6ba2-8001-1d681f52eda7', 'graph:c7c00782-3665-a049-2228-d98da6b23d48|weather_graph:0e5f154a-2df4-e57d-2dc8-5446514d1f93': '1f072fe7-b15b-65ac-8001-eb9037055f0a'}}}, metadata={'source': 'loop', 'step': 1, 'parents': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-aa65-6ba2-8001-1d681f52eda7'}}, created_at='2025-08-06T19:49:36.076527+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:c7c00782-3665-a049-2228-d98da6b23d48|weather_graph:0e5f154a-2df4-e57d-2dc8-5446514d1f93', 'checkpoint_id': '1f072fe7-aa6b-6918-8000-c04fc9c43ab2', 'checkpoint_map': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-aa65-6ba2-8001-1d681f52eda7', 'graph:c7c00782-3665-a049-2228-d98da6b23d48|weather_graph:0e5f154a-2df4-e57d-2dc8-5446514d1f93': '1f072fe7-aa6b-6918-8000-c04fc9c43ab2'}}}, tasks=(), interrupts=())\n", + "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'}}]}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'weather_graph:b6a694a7-73e2-a795-161e-4510c4f4a302', 'checkpoint_id': '1f0c4172-b70d-61a4-8001-93ba36ca7301', 'checkpoint_map': {'': '1f0c4172-b1f1-6d8e-8001-08dd4c84fc5f', 'weather_graph:b6a694a7-73e2-a795-161e-4510c4f4a302': '1f0c4172-b70d-61a4-8001-93ba36ca7301'}}}, metadata={'source': 'loop', 'step': 1, 'parents': {'': '1f0c4172-b1f1-6d8e-8001-08dd4c84fc5f'}}, created_at='2025-11-18T00:40:24.059107+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'weather_graph:b6a694a7-73e2-a795-161e-4510c4f4a302', 'checkpoint_id': '1f0c4172-b200-6b83-8000-83bcc4964821', 'checkpoint_map': {'': '1f0c4172-b1f1-6d8e-8001-08dd4c84fc5f', 'weather_graph:b6a694a7-73e2-a795-161e-4510c4f4a302': '1f0c4172-b200-6b83-8000-83bcc4964821'}}}, tasks=(), interrupts=())\n", "-----\n", - "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'd7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '28ef5b05-b571-4454-9753-10d194e52024'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'AIMessage'], 'kwargs': {'content': 'rainy', 'type': 'ai', 'id': '9773b21f-7e75-4e67-91a8-5ab80fa37ee7', 'tool_calls': [], 'invalid_tool_calls': []}}]}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:c7c00782-3665-a049-2228-d98da6b23d48|weather_graph:0e5f154a-2df4-e57d-2dc8-5446514d1f93', 'checkpoint_id': '1f072fe7-b176-65cc-8002-99de1c8214e6', 'checkpoint_map': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-aa65-6ba2-8001-1d681f52eda7', 'graph:c7c00782-3665-a049-2228-d98da6b23d48|weather_graph:0e5f154a-2df4-e57d-2dc8-5446514d1f93': '1f072fe7-b176-65cc-8002-99de1c8214e6'}}}, metadata={'source': 'update', 'step': 2, 'parents': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-aa65-6ba2-8001-1d681f52eda7'}}, created_at='2025-08-06T19:49:36.087591+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:c7c00782-3665-a049-2228-d98da6b23d48|weather_graph:0e5f154a-2df4-e57d-2dc8-5446514d1f93', 'checkpoint_id': '1f072fe7-b15b-65ac-8001-eb9037055f0a', 'checkpoint_map': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-aa65-6ba2-8001-1d681f52eda7', 'graph:c7c00782-3665-a049-2228-d98da6b23d48|weather_graph:0e5f154a-2df4-e57d-2dc8-5446514d1f93': '1f072fe7-b15b-65ac-8001-eb9037055f0a'}}}, tasks=(), interrupts=())\n", + "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'}}]}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'weather_graph:b6a694a7-73e2-a795-161e-4510c4f4a302', 'checkpoint_id': '1f0c4172-b200-6b83-8000-83bcc4964821', 'checkpoint_map': {'': '1f0c4172-b1f1-6d8e-8001-08dd4c84fc5f', 'weather_graph:b6a694a7-73e2-a795-161e-4510c4f4a302': '1f0c4172-b200-6b83-8000-83bcc4964821'}}}, metadata={'source': 'loop', 'step': 0, 'parents': {'': '1f0c4172-b1f1-6d8e-8001-08dd4c84fc5f'}}, created_at='2025-11-18T00:40:23.529751+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'weather_graph:b6a694a7-73e2-a795-161e-4510c4f4a302', 'checkpoint_id': '1f0c4172-b1fb-60f7-bfff-eed60bd332d0', 'checkpoint_map': {'': '1f0c4172-b1f1-6d8e-8001-08dd4c84fc5f', 'weather_graph:b6a694a7-73e2-a795-161e-4510c4f4a302': '1f0c4172-b1fb-60f7-bfff-eed60bd332d0'}}}, tasks=(), interrupts=())\n", "-----\n", - "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'd7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '28ef5b05-b571-4454-9753-10d194e52024'}}]}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:c7c00782-3665-a049-2228-d98da6b23d48', 'checkpoint_id': '1f072fe7-aa65-6ba2-8001-1d681f52eda7', 'checkpoint_map': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-aa65-6ba2-8001-1d681f52eda7'}}}, metadata={'source': 'loop', 'step': 1, 'parents': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5'}}, created_at='2025-08-06T19:49:35.346773+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:c7c00782-3665-a049-2228-d98da6b23d48', 'checkpoint_id': '1f072fe7-a5b6-653c-8000-24b05222bc56', 'checkpoint_map': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-a5b6-653c-8000-24b05222bc56'}}}, tasks=(), interrupts=())\n", + "StateSnapshot(values={'messages': []}, next=('__start__',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'weather_graph:b6a694a7-73e2-a795-161e-4510c4f4a302', 'checkpoint_id': '1f0c4172-b1fb-60f7-bfff-eed60bd332d0', 'checkpoint_map': {'': '1f0c4172-b1f1-6d8e-8001-08dd4c84fc5f', 'weather_graph:b6a694a7-73e2-a795-161e-4510c4f4a302': '1f0c4172-b1fb-60f7-bfff-eed60bd332d0'}}}, metadata={'source': 'input', 'step': -1, 'parents': {'': '1f0c4172-b1f1-6d8e-8001-08dd4c84fc5f'}}, created_at='2025-11-18T00:40:23.527428+00:00', parent_config=None, tasks=(PregelTask(id='b26425c9-d625-0489-dbfd-05cb1f078fe7', name='__start__', path=('__pregel_pull', '__start__'), error=None, interrupts=(), state=None, result={'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='1f3c6235-3e8a-4e36-9a09-dcd2240c9e59')]}),), interrupts=())\n", "-----\n", - "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'd7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '28ef5b05-b571-4454-9753-10d194e52024'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'AIMessage'], 'kwargs': {'content': 'rainy', 'type': 'ai', 'id': '9773b21f-7e75-4e67-91a8-5ab80fa37ee7', 'tool_calls': [], 'invalid_tool_calls': []}}]}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:c7c00782-3665-a049-2228-d98da6b23d48', 'checkpoint_id': '1f072fe7-b182-6295-8002-e699a61cebcd', 'checkpoint_map': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-b182-6295-8002-e699a61cebcd'}}}, metadata={'source': 'loop', 'step': 2, 'parents': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5'}}, created_at='2025-08-06T19:49:36.092422+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:c7c00782-3665-a049-2228-d98da6b23d48', 'checkpoint_id': '1f072fe7-aa65-6ba2-8001-1d681f52eda7', 'checkpoint_map': {'': '1f072fe7-a5b1-692c-8004-bd30259081c5', 'graph:c7c00782-3665-a049-2228-d98da6b23d48': '1f072fe7-aa65-6ba2-8001-1d681f52eda7'}}}, tasks=(), interrupts=())\n", + "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'}}]}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f0c4172-b1f1-6d8e-8001-08dd4c84fc5f'}}, metadata={'source': 'loop', 'step': 1, 'parents': {}}, created_at='2025-11-18T00:40:23.523655+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f0c4172-a741-6f3a-8000-09fe865ab1ae'}}, tasks=(), interrupts=())\n", "-----\n", - "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'd7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '28ef5b05-b571-4454-9753-10d194e52024'}}], 'to_continue': True}, next=('graph',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f072fe7-a5b1-692c-8004-bd30259081c5'}}, metadata={'source': 'loop', 'step': 4, 'parents': {}}, created_at='2025-08-06T19:49:34.853553+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f072fe7-a5ad-68f4-8003-6c6fc3090288'}}, tasks=(PregelTask(id='c7c00782-3665-a049-2228-d98da6b23d48', name='graph', path=('__pregel_pull', 'graph'), error=None, interrupts=(), state={'configurable': {'thread_id': '2', 'checkpoint_ns': 'graph:c7c00782-3665-a049-2228-d98da6b23d48'}}, result={'messages': [HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='d7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'), HumanMessage(content=\"what's the weather in sf\", additional_kwargs={}, response_metadata={}, id='28ef5b05-b571-4454-9753-10d194e52024'), AIMessage(content='rainy', additional_kwargs={}, response_metadata={}, id='9773b21f-7e75-4e67-91a8-5ab80fa37ee7')]}),), interrupts=())\n", + "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '1f3c6235-3e8a-4e36-9a09-dcd2240c9e59'}}]}, next=('router_node',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f0c4172-a741-6f3a-8000-09fe865ab1ae'}}, metadata={'source': 'loop', 'step': 0, 'parents': {}}, created_at='2025-11-18T00:40:22.403046+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f0c4172-a73e-6c5d-bfff-a55ef48917fb'}}, tasks=(PregelTask(id='e8f483d4-18ee-b8b2-41f9-2d35312ae295', name='router_node', path=('__pregel_pull', 'router_node'), error=None, interrupts=(), state=None, result={}),), interrupts=())\n", "-----\n", - "StateSnapshot(values={'messages': [{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': 'd7fc45f1-6c5d-4b8b-8b5d-2040d25e9ee4'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], 'kwargs': {'content': \"what's the weather in sf\", 'type': 'human', 'id': '28ef5b05-b571-4454-9753-10d194e52024'}}, {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'messages', 'AIMessage'], 'kwargs': {'content': 'rainy', 'type': 'ai', 'id': '9773b21f-7e75-4e67-91a8-5ab80fa37ee7', 'tool_calls': [], 'invalid_tool_calls': []}}], 'to_continue': True}, next=(), config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f072fe7-b186-6eac-8005-7ac703cf3254'}}, metadata={'source': 'loop', 'step': 5, 'parents': {}}, created_at='2025-08-06T19:49:36.094373+00:00', parent_config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f072fe7-a5b1-692c-8004-bd30259081c5'}}, tasks=(), interrupts=())\n", + "StateSnapshot(values={'messages': []}, next=('__start__',), config={'configurable': {'thread_id': '2', 'checkpoint_ns': '', 'checkpoint_id': '1f0c4172-a73e-6c5d-bfff-a55ef48917fb'}}, metadata={'source': 'input', 'step': -1, 'parents': {}}, created_at='2025-11-18T00:40:22.401745+00:00', parent_config=None, tasks=(PregelTask(id='7703781b-4ff0-1848-2931-3c363a415d4b', name='__start__', path=('__pregel_pull', '__start__'), error=None, interrupts=(), state=None, result={'messages': [{'role': 'user', 'content': \"what's the weather in sf\"}]}),), interrupts=())\n", "-----\n" ] } @@ -1143,7 +1143,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.13" + "version": "3.11.14" } }, "nbformat": 4, diff --git a/langgraph/checkpoint/redis/__init__.py b/langgraph/checkpoint/redis/__init__.py index 50b4f37..fc4727d 100644 --- a/langgraph/checkpoint/redis/__init__.py +++ b/langgraph/checkpoint/redis/__init__.py @@ -94,11 +94,26 @@ def configure_client( connection_args: Optional[Dict[str, Any]] = None, ) -> None: """Configure the Redis client.""" + from redis.exceptions import ResponseError + + from langgraph.checkpoint.redis.version import __full_lib_name__ + self._owns_its_client = redis_client is None self._redis = redis_client or RedisConnectionFactory.get_redis_connection( redis_url, **connection_args ) + # Set client info for Redis monitoring + try: + self._redis.client_setinfo("LIB-NAME", __full_lib_name__) + except (ResponseError, AttributeError): + # Fall back to a simple echo if client_setinfo is not available + try: + self._redis.echo(__full_lib_name__) + except Exception: + # Silently fail if even echo doesn't work + pass + def create_indexes(self) -> None: self.checkpoints_index = SearchIndex.from_dict( self.SCHEMAS[0], redis_client=self._redis @@ -583,7 +598,9 @@ def put_writes( "idx": WRITES_IDX_MAP.get(channel, idx), "channel": channel, "type": type_, - "blob": blob, + "blob": self._encode_blob( + blob + ), # Encode bytes to base64 string for Redis } writes_objects.append(write_obj) @@ -1438,7 +1455,8 @@ def _load_pending_writes_with_registry_check( pass # FALLBACK: Use FT.SEARCH if registry not available or failed - return self._load_pending_writes(thread_id, checkpoint_ns, checkpoint_id) + # Call the base class implementation to avoid recursion + return super()._load_pending_writes(thread_id, checkpoint_ns, checkpoint_id) def _load_pending_sends_with_registry_check( self, diff --git a/langgraph/checkpoint/redis/aio.py b/langgraph/checkpoint/redis/aio.py index 9ad1d73..cdcf512 100644 --- a/langgraph/checkpoint/redis/aio.py +++ b/langgraph/checkpoint/redis/aio.py @@ -1122,7 +1122,9 @@ async def aput_writes( "idx": WRITES_IDX_MAP.get(channel, idx), "channel": channel, "type": type_, - "blob": blob, + "blob": self._encode_blob( + blob + ), # Encode bytes to base64 string for Redis } writes_objects.append(write_obj) diff --git a/langgraph/checkpoint/redis/ashallow.py b/langgraph/checkpoint/redis/ashallow.py index 46cfe10..287a413 100644 --- a/langgraph/checkpoint/redis/ashallow.py +++ b/langgraph/checkpoint/redis/ashallow.py @@ -534,7 +534,9 @@ async def aput_writes( "idx": WRITES_IDX_MAP.get(channel, idx), "channel": channel, "type": type_, - "blob": blob, + "blob": self._encode_blob( + blob + ), # Encode bytes to base64 string for Redis } writes_objects.append(write_obj) diff --git a/langgraph/checkpoint/redis/base.py b/langgraph/checkpoint/redis/base.py index ae00384..29fbd9c 100644 --- a/langgraph/checkpoint/redis/base.py +++ b/langgraph/checkpoint/redis/base.py @@ -175,19 +175,16 @@ async def aset_client_info(self) -> None: """Set client info for Redis monitoring asynchronously.""" from redis.exceptions import ResponseError - from langgraph.checkpoint.redis.version import __redisvl_version__ - - # Create the client info string with only the redisvl version - client_info = f"redis-py(redisvl_v{__redisvl_version__})" + from langgraph.checkpoint.redis.version import __full_lib_name__ try: # Try to use client_setinfo command if available - await self._redis.client_setinfo("LIB-NAME", client_info) + await self._redis.client_setinfo("LIB-NAME", __full_lib_name__) except (ResponseError, AttributeError): # Fall back to a simple echo if client_setinfo is not available try: # Call with await to ensure it's an async call - echo_result = self._redis.echo(client_info) + echo_result = self._redis.echo(__full_lib_name__) if hasattr(echo_result, "__await__"): await echo_result except Exception: @@ -310,8 +307,21 @@ def _dump_checkpoint(self, checkpoint: Checkpoint) -> dict[str, Any]: """Convert checkpoint to Redis format.""" type_, data = self.serde.dumps_typed(checkpoint) - # Since we're keeping JSON format, decode string data - checkpoint_data = cast(dict, orjson.loads(data)) + # Decode the serialized data - handle both JSON and msgpack + if type_ == "json": + checkpoint_data = cast(dict, orjson.loads(data)) + else: + # For msgpack or other types, deserialize with loads_typed + checkpoint_data = cast(dict, self.serde.loads_typed((type_, data))) + + # When using msgpack, bytes are preserved - but Redis JSON.SET can't handle them + # Encode bytes in channel_values with type marker for JSON storage + if "channel_values" in checkpoint_data: + for key, value in checkpoint_data["channel_values"].items(): + if isinstance(value, bytes): + checkpoint_data["channel_values"][key] = { + "__bytes__": self._encode_blob(value) + } # Ensure channel_versions are always strings to fix issue #40 if "channel_versions" in checkpoint_data: @@ -379,6 +389,11 @@ def _recursive_deserialize(self, obj: Any) -> Any: The deserialized object, with LangChain objects properly reconstructed. """ if isinstance(obj, dict): + # Check if this is a bytes marker from msgpack storage + if "__bytes__" in obj and len(obj) == 1: + # Decode base64-encoded bytes + return self._decode_blob(obj["__bytes__"]) + # Check if this is a LangChain serialized object if obj.get("lc") in (1, 2) and obj.get("type") == "constructor": try: @@ -438,7 +453,7 @@ def _dump_writes( "idx": WRITES_IDX_MAP.get(channel, idx), "channel": channel, "type": t, - "blob": b, + "blob": self._encode_blob(b), # Encode bytes to base64 string for Redis } for idx, (channel, value) in enumerate(writes) for t, b in [self.serde.dumps_typed(value)] @@ -453,7 +468,9 @@ def _load_metadata(self, metadata: dict[str, Any]) -> CheckpointMetadata: Returns: Original metadata dictionary. """ - return self.serde.loads(self.serde.dumps(metadata)) + # Roundtrip through serializer to ensure proper type handling + type_str, data_bytes = self.serde.dumps_typed(metadata) + return self.serde.loads_typed((type_str, data_bytes)) def _dump_metadata(self, metadata: CheckpointMetadata) -> str: """Convert metadata to a Redis-compatible dictionary. @@ -464,9 +481,9 @@ def _dump_metadata(self, metadata: CheckpointMetadata) -> str: Returns: Dictionary representation of metadata for Redis storage. """ - serialized_metadata = self.serde.dumps(metadata) + type_str, serialized_bytes = self.serde.dumps_typed(metadata) # NOTE: we're using JSON serializer (not msgpack), so we need to remove null characters before writing - return serialized_metadata.decode().replace("\\u0000", "") + return serialized_bytes.decode().replace("\\u0000", "") def get_next_version( # type: ignore[override] self, current: Optional[str], channel: ChannelProtocol[Any, Any, Any] @@ -551,7 +568,9 @@ def put_writes( "idx": WRITES_IDX_MAP.get(channel, idx), "channel": channel, "type": type_, - "blob": blob, + "blob": self._encode_blob( + blob + ), # Encode bytes to base64 string for Redis } writes_objects.append(write_obj) @@ -730,12 +749,27 @@ def _load_writes( ( task_id, data["channel"], - serde.loads_typed((data["type"], data["blob"])), + serde.loads_typed( + (data["type"], BaseRedisSaver._decode_blob_static(data["blob"])) + ), ) for (task_id, _), data in task_id_to_data.items() ] return writes + @staticmethod + def _decode_blob_static(blob: bytes | str) -> bytes: + """Decode blob data from Redis storage (static method).""" + try: + # If it's already bytes, try to decode as base64 + if isinstance(blob, bytes): + return base64.b64decode(blob) + # If it's a string, encode to bytes first then decode + return base64.b64decode(blob.encode("utf-8")) + except (binascii.Error, TypeError, ValueError): + # Handle both malformed base64 data and incorrect input types + return blob.encode("utf-8") if isinstance(blob, str) else blob + @staticmethod def _parse_redis_checkpoint_writes_key(redis_key: str) -> dict: # Ensure redis_key is a string diff --git a/langgraph/checkpoint/redis/jsonplus_redis.py b/langgraph/checkpoint/redis/jsonplus_redis.py index bb84ced..a203b74 100644 --- a/langgraph/checkpoint/redis/jsonplus_redis.py +++ b/langgraph/checkpoint/redis/jsonplus_redis.py @@ -1,6 +1,6 @@ -import base64 +import dataclasses import logging -from typing import Any, Union +from typing import Any import orjson from langgraph.checkpoint.serde.jsonplus import JsonPlusSerializer @@ -9,26 +9,16 @@ class JsonPlusRedisSerializer(JsonPlusSerializer): - """Redis-optimized serializer using orjson for faster JSON processing. - - This serializer handles the conversion of LangChain objects (including messages) - to and from their serialized format. It specifically addresses the MESSAGE_COERCION_FAILURE - issue by ensuring that LangChain message objects stored in their serialized format - (with 'lc', 'type', 'constructor' fields) are properly reconstructed as message objects - rather than being left as raw dictionaries. - - The serialized format for LangChain objects looks like: - { - 'lc': 1, # LangChain version marker - 'type': 'constructor', - 'id': ['langchain', 'schema', 'messages', 'HumanMessage'], - 'kwargs': {'content': '...', 'type': 'human', 'id': '...'} - } - - This serializer ensures such objects are properly deserialized back to their - original message object form (e.g., HumanMessage, AIMessage) to prevent - downstream errors when the application expects message objects with specific - attributes and methods. + """Redis-optimized serializer using orjson for JSON processing. + + Redis requires JSON-serializable data (not msgpack), so this serializer: + 1. Uses orjson for fast JSON serialization + 2. Handles LangChain objects by encoding them in the LC constructor format + 3. Handles Interrupt objects with custom serialization/deserialization + 4. Applies parent's _reviver for security-checked object reconstruction + + In checkpoint 3.0, the serializer API uses only dumps_typed/loads_typed + with tuple[str, bytes] signatures (changed from tuple[str, str] in 2.x). """ SENTINEL_FIELDS = [ @@ -38,28 +28,189 @@ class JsonPlusRedisSerializer(JsonPlusSerializer): "parent_checkpoint_id", ] - def dumps(self, obj: Any) -> bytes: - """Use orjson for serialization with LangChain object support via default handler.""" - # Use orjson with default handler for LangChain objects - # The _default method from parent class handles LangChain serialization - return orjson.dumps(obj, default=self._default) + def _default_handler(self, obj: Any) -> Any: + """Custom JSON encoder for objects that orjson can't serialize. + + This handles LangChain objects by delegating to the parent's + _encode_constructor_args method which creates the LC format. + """ + # Bytes/bytearray in nested structures require msgpack - signal to fallback + if isinstance(obj, (bytes, bytearray)): + raise TypeError("bytes/bytearray in nested structure - use msgpack") + + # Handle Interrupt objects with a type marker to avoid false positives + from langgraph.types import Interrupt + + if isinstance(obj, Interrupt): + return { + "__interrupt__": True, + "value": obj.value, + "id": obj.id, + } - def loads(self, data: bytes) -> Any: - """Use orjson for JSON parsing with reviver support, fallback to parent for msgpack data.""" + # Try to encode using parent's constructor args encoder + # This creates the {"lc": 2, "type": "constructor", ...} format try: - # Fast path: Use orjson for JSON data - parsed = orjson.loads(data) - # Apply reviver for LangChain objects (lc format) - return self._revive_if_needed(parsed) - except (orjson.JSONDecodeError, TypeError): - # Fallback: Parent handles msgpack and other formats via loads_typed - # Attempt to detect type and use loads_typed + # _encode_constructor_args needs the CLASS, not the instance + # For LangChain objects with to_json(), use that data for kwargs + if hasattr(obj, "to_json"): + json_dict = obj.to_json() + if isinstance(json_dict, dict) and "lc" in json_dict: + # Already in LC format, return as-is + return json_dict + + # For other objects, encode with constructor args + # Pass the class and the instance's __dict__ as kwargs + return self._encode_constructor_args( + type(obj), kwargs=obj.__dict__ if hasattr(obj, "__dict__") else {} + ) + except (AttributeError, KeyError, ValueError, TypeError): + # For types we can't handle, raise TypeError + raise TypeError(f"Object of type {type(obj)} is not JSON serializable") + + def _preprocess_interrupts(self, obj: Any) -> Any: + """Recursively add type markers to Interrupt objects before serialization. + + This prevents false positives where user data with {value, id} fields + could be incorrectly deserialized as Interrupt objects. + + Also handles dataclass instances to preserve type information during serialization. + """ + from langgraph.types import Interrupt + + if isinstance(obj, Interrupt): + # Add type marker to distinguish from plain dicts + return { + "__interrupt__": True, + "value": self._preprocess_interrupts(obj.value), + "id": obj.id, + } + elif isinstance(obj, set): + # Handle sets by converting to list for JSON serialization + # Will be reconstructed back to set on deserialization + return { + "lc": 2, + "type": "constructor", + "id": ["builtins", "set"], + "kwargs": { + "__set_items__": [self._preprocess_interrupts(item) for item in obj] + }, + } + elif dataclasses.is_dataclass(obj) and not isinstance(obj, type): + # Handle dataclass instances (like langmem's RunningSummary) + # Convert to LangChain constructor format to preserve type information + # Recursively process the dataclass fields + processed_dict = { + k: self._preprocess_interrupts(v) + for k, v in dataclasses.asdict(obj).items() + } + return self._encode_constructor_args(type(obj), kwargs=processed_dict) + elif isinstance(obj, dict): + return {k: self._preprocess_interrupts(v) for k, v in obj.items()} + elif isinstance(obj, (list, tuple)): + processed = [self._preprocess_interrupts(item) for item in obj] + # Preserve tuple type + return tuple(processed) if isinstance(obj, tuple) else processed + else: + return obj + + def dumps_typed(self, obj: Any) -> tuple[str, bytes]: + """Serialize using orjson for JSON. + + Falls back to msgpack for structures containing bytes/bytearray. + + Returns: + tuple[str, bytes]: Type identifier and serialized bytes + """ + if isinstance(obj, bytes): + return "bytes", obj + elif isinstance(obj, bytearray): + return "bytearray", bytes(obj) + elif obj is None: + return "null", b"" + else: try: - # Try loading as msgpack via parent's loads_typed - return super().loads_typed(("msgpack", data)) - except Exception: - # If that fails, try loading as json string - return super().loads_typed(("json", data)) + # Preprocess to add type markers to Interrupt objects + processed_obj = self._preprocess_interrupts(obj) + # Try orjson first with custom default handler + json_bytes = orjson.dumps(processed_obj, default=self._default_handler) + return "json", json_bytes + except (TypeError, orjson.JSONEncodeError): + # Fall back to parent's msgpack serialization for bytes in nested structures + return super().dumps_typed(obj) + + def loads_typed(self, data: tuple[str, bytes]) -> Any: + """Deserialize with custom revival for LangChain/LangGraph objects. + + Args: + data: Tuple of (type_str, data_bytes) + + Returns: + Deserialized object with proper revival of LangChain/LangGraph types + """ + type_, data_bytes = data + + if type_ == "null": + return None + elif type_ == "bytes": + return data_bytes + elif type_ == "bytearray": + return bytearray(data_bytes) + elif type_ == "json": + # Use orjson for parsing, then apply our custom revival + parsed = orjson.loads(data_bytes) + return self._revive_if_needed(parsed) + elif type_ == "msgpack": + # Handle backward compatibility with old checkpoints that used msgpack + return super().loads_typed(data) + else: + # Unknown type, try parent + return super().loads_typed(data) + + def _reconstruct_from_constructor(self, obj: dict[str, Any]) -> Any: + """Reconstruct an object from LangChain constructor format. + + This handles objects that were serialized using _encode_constructor_args + but are not LangChain objects (e.g., dataclasses, regular classes, sets). + + Args: + obj: Dict with 'lc', 'type', 'id', and 'kwargs' keys + + Returns: + Reconstructed object instance + + Raises: + Exception: If object cannot be reconstructed + """ + # Get the class from the id field + id_parts = obj.get("id", []) + if not id_parts or len(id_parts) < 2: + raise ValueError(f"Invalid constructor format: {obj}") + + # Import the module and get the class + module_path = ".".join(id_parts[:-1]) + class_name = id_parts[-1] + + try: + import importlib + + module = importlib.import_module(module_path) + cls = getattr(module, class_name) + except (ImportError, AttributeError) as e: + raise ValueError( + f"Cannot import {class_name} from {module_path}: {e}" + ) from e + + # Get the kwargs and recursively revive nested objects + kwargs = obj.get("kwargs", {}) + revived_kwargs = {k: self._revive_if_needed(v) for k, v in kwargs.items()} + + # Special handling for sets + if cls is set and "__set_items__" in revived_kwargs: + return set(revived_kwargs["__set_items__"]) + + # Reconstruct the object + return cls(**revived_kwargs) def _revive_if_needed(self, obj: Any) -> Any: """Recursively apply reviver to handle LangChain and LangGraph serialized objects. @@ -73,6 +224,9 @@ def _revive_if_needed(self, obj: Any) -> Any: It also handles LangGraph Interrupt objects which serialize to {"value": ..., "resumable": ..., "ns": ..., "when": ...} and must be reconstructed to prevent AttributeError when accessing Interrupt attributes. + Additionally, it handles dataclass objects (like langmem's RunningSummary) that are serialized + using the LangChain constructor format but need special reconstruction logic. + Args: obj: The object to potentially revive, which may be a dict, list, or primitive. @@ -82,20 +236,32 @@ def _revive_if_needed(self, obj: Any) -> Any: if isinstance(obj, dict): # Check if this is a LangChain serialized object if obj.get("lc") in (1, 2) and obj.get("type") == "constructor": - # Use parent's reviver method to reconstruct the object + # First try to use parent's reviver method to reconstruct LangChain objects # This converts {'lc': 1, 'type': 'constructor', ...} back to # the actual LangChain object (e.g., HumanMessage, AIMessage) - return self._reviver(obj) + revived = self._reviver(obj) - # Check if this is a serialized Interrupt object - # Interrupt objects serialize to {"value": ..., "resumable": ..., "ns": ..., "when": ...} + # If reviver returns a dict unchanged, it means it couldn't reconstruct it + # This happens with dataclasses or other non-LangChain objects + if isinstance(revived, dict) and revived.get("lc") in (1, 2): + # Try to reconstruct it manually + try: + return self._reconstruct_from_constructor(obj) + except Exception: + # If reconstruction fails, fall through to recursive dict processing + pass + else: + # Reviver successfully reconstructed the object + return revived + + # Check if this is a serialized Interrupt object with type marker + # LangGraph 1.0+: Interrupt objects serialize to {"__interrupt__": True, "value": ..., "id": ...} # This must be done before recursively processing to avoid losing the structure if ( - "value" in obj - and "resumable" in obj - and "when" in obj - and len(obj) == 4 - and isinstance(obj.get("resumable"), bool) + obj.get("__interrupt__") is True + and "value" in obj + and "id" in obj + and len(obj) == 3 ): # Try to reconstruct as an Interrupt object try: @@ -103,9 +269,7 @@ def _revive_if_needed(self, obj: Any) -> Any: return Interrupt( value=self._revive_if_needed(obj["value"]), - resumable=obj["resumable"], - ns=obj["ns"], - when=obj["when"], + id=obj["id"], ) except (ImportError, TypeError, ValueError) as e: # If we can't import or construct Interrupt, log and fall through @@ -121,21 +285,3 @@ def _revive_if_needed(self, obj: Any) -> Any: else: # Return primitives as-is return obj - - def dumps_typed(self, obj: Any) -> tuple[str, str]: # type: ignore[override] - if isinstance(obj, (bytes, bytearray)): - return "base64", base64.b64encode(obj).decode("utf-8") - else: - # All objects should be JSON-serializable (LangChain objects are pre-serialized) - return "json", self.dumps(obj).decode("utf-8") - - def loads_typed(self, data: tuple[str, Union[str, bytes]]) -> Any: - type_, data_ = data - if type_ == "base64": - decoded = base64.b64decode( - data_ if isinstance(data_, bytes) else data_.encode() - ) - return decoded - elif type_ == "json": - data_bytes = data_ if isinstance(data_, bytes) else data_.encode() - return self.loads(data_bytes) diff --git a/langgraph/checkpoint/redis/shallow.py b/langgraph/checkpoint/redis/shallow.py index 0d63dbe..e84944d 100644 --- a/langgraph/checkpoint/redis/shallow.py +++ b/langgraph/checkpoint/redis/shallow.py @@ -529,7 +529,9 @@ def put_writes( "idx": WRITES_IDX_MAP.get(channel, idx), "channel": channel, "type": type_, - "blob": blob, + "blob": self._encode_blob( + blob + ), # Encode bytes to base64 string for Redis } writes_objects.append(write_obj) diff --git a/langgraph/store/redis/base.py b/langgraph/store/redis/base.py index bd278ec..becae85 100644 --- a/langgraph/store/redis/base.py +++ b/langgraph/store/redis/base.py @@ -325,18 +325,15 @@ def __init__( def set_client_info(self) -> None: """Set client info for Redis monitoring.""" - from langgraph.checkpoint.redis.version import __redisvl_version__ - - # Create the client info string with only the redisvl version - client_info = f"redis-py(redisvl_v{__redisvl_version__})" + from langgraph.checkpoint.redis.version import __full_lib_name__ try: # Try to use client_setinfo command if available - self._redis.client_setinfo("LIB-NAME", client_info) + self._redis.client_setinfo("LIB-NAME", __full_lib_name__) except (ResponseError, AttributeError): # Fall back to a simple echo if client_setinfo is not available try: - self._redis.echo(client_info) + self._redis.echo(__full_lib_name__) except Exception: # Silently fail if even echo doesn't work pass @@ -344,19 +341,16 @@ def set_client_info(self) -> None: async def aset_client_info(self) -> None: """Set client info for Redis monitoring asynchronously.""" - from langgraph.checkpoint.redis.version import __redisvl_version__ - - # Create the client info string with only the redisvl version - client_info = f"redis-py(redisvl_v{__redisvl_version__})" + from langgraph.checkpoint.redis.version import __full_lib_name__ try: # Try to use client_setinfo command if available - await self._redis.client_setinfo("LIB-NAME", client_info) + await self._redis.client_setinfo("LIB-NAME", __full_lib_name__) except (ResponseError, AttributeError): # Fall back to a simple echo if client_setinfo is not available try: # Call with await to ensure it's an async call - echo_result = self._redis.echo(client_info) + echo_result = self._redis.echo(__full_lib_name__) if hasattr(echo_result, "__await__"): await echo_result except Exception: diff --git a/poetry.lock b/poetry.lock index 9d6c1ab..4b921a0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,14 +2,14 @@ [[package]] name = "aioconsole" -version = "0.8.1" +version = "0.8.2" description = "Asynchronous console and interfaces for asyncio" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "aioconsole-0.8.1-py3-none-any.whl", hash = "sha256:e1023685cde35dde909fbf00631ffb2ed1c67fe0b7058ebb0892afbde5f213e5"}, - {file = "aioconsole-0.8.1.tar.gz", hash = "sha256:0535ce743ba468fb21a1ba43c9563032c779534d4ecd923a46dbd350ad91d234"}, + {file = "aioconsole-0.8.2-py3-none-any.whl", hash = "sha256:00f3fabd6de5df2fad635e1e6a13ebe5bb2456b83b31e881ae41bc5862fd6a68"}, + {file = "aioconsole-0.8.2.tar.gz", hash = "sha256:25cb5530f58f7ab431e9af84fbb5417178287b6c3300d5b1185e3b129a227cef"}, ] [package.extras] @@ -39,16 +39,43 @@ files = [ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] +[[package]] +name = "anthropic" +version = "0.73.0" +description = "The official Python library for the anthropic API" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "anthropic-0.73.0-py3-none-any.whl", hash = "sha256:0d56cd8b3ca3fea9c9b5162868bdfd053fbc189b8b56d4290bd2d427b56db769"}, + {file = "anthropic-0.73.0.tar.gz", hash = "sha256:30f0d7d86390165f86af6ca7c3041f8720bb2e1b0e12a44525c8edfdbd2c5239"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +docstring-parser = ">=0.15,<1" +httpx = ">=0.25.0,<1" +jiter = ">=0.4.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +typing-extensions = ">=4.10,<5" + +[package.extras] +aiohttp = ["aiohttp", "httpx-aiohttp (>=0.1.9)"] +bedrock = ["boto3 (>=1.28.57)", "botocore (>=1.31.57)"] +vertex = ["google-auth[requests] (>=2,<3)"] + [[package]] name = "anyio" -version = "4.10.0" +version = "4.11.0" description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1"}, - {file = "anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6"}, + {file = "anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc"}, + {file = "anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4"}, ] [package.dependencies] @@ -58,7 +85,7 @@ sniffio = ">=1.1" typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -trio = ["trio (>=0.26.1)"] +trio = ["trio (>=0.31.0)"] [[package]] name = "async-timeout" @@ -88,34 +115,38 @@ files = [ [[package]] name = "black" -version = "25.1.0" +version = "25.11.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"}, - {file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"}, - {file = "black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7"}, - {file = "black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9"}, - {file = "black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0"}, - {file = "black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299"}, - {file = "black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096"}, - {file = "black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2"}, - {file = "black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b"}, - {file = "black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc"}, - {file = "black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f"}, - {file = "black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba"}, - {file = "black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f"}, - {file = "black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3"}, - {file = "black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171"}, - {file = "black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18"}, - {file = "black-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0"}, - {file = "black-25.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f"}, - {file = "black-25.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e"}, - {file = "black-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355"}, - {file = "black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717"}, - {file = "black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666"}, + {file = "black-25.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e"}, + {file = "black-25.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0"}, + {file = "black-25.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37"}, + {file = "black-25.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03"}, + {file = "black-25.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a"}, + {file = "black-25.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170"}, + {file = "black-25.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc"}, + {file = "black-25.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e"}, + {file = "black-25.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac"}, + {file = "black-25.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96"}, + {file = "black-25.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd"}, + {file = "black-25.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409"}, + {file = "black-25.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b"}, + {file = "black-25.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd"}, + {file = "black-25.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993"}, + {file = "black-25.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c"}, + {file = "black-25.11.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170"}, + {file = "black-25.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545"}, + {file = "black-25.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda"}, + {file = "black-25.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664"}, + {file = "black-25.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3bb5ce32daa9ff0605d73b6f19da0b0e6c1f8f2d75594db539fdfed722f2b06"}, + {file = "black-25.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9815ccee1e55717fe9a4b924cae1646ef7f54e0f990da39a34fc7b264fcf80a2"}, + {file = "black-25.11.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92285c37b93a1698dcbc34581867b480f1ba3a7b92acf1fe0467b04d7a4da0dc"}, + {file = "black-25.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:43945853a31099c7c0ff8dface53b4de56c41294fa6783c0441a8b1d9bf668bc"}, + {file = "black-25.11.0-py3-none-any.whl", hash = "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b"}, + {file = "black-25.11.0.tar.gz", hash = "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08"}, ] [package.dependencies] @@ -124,6 +155,7 @@ mypy-extensions = ">=0.4.3" packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" +pytokens = ">=0.3.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} @@ -135,209 +167,247 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2025.6.15" +version = "2025.11.12" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" groups = ["main", "dev"] files = [ - {file = "certifi-2025.6.15-py3-none-any.whl", hash = "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057"}, - {file = "certifi-2025.6.15.tar.gz", hash = "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b"}, + {file = "certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b"}, + {file = "certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316"}, ] [[package]] name = "cffi" -version = "1.17.1" +version = "2.0.0" description = "Foreign Function Interface for Python calling C code." optional = false -python-versions = ">=3.8" -groups = ["main", "dev"] -files = [ - {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, - {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, - {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, - {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, - {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, - {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, - {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, - {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, - {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, - {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, - {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, - {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, - {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, - {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, - {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, - {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, -] -markers = {main = "platform_python_implementation == \"PyPy\"", dev = "python_version > \"3.9.1\" or platform_python_implementation == \"PyPy\""} +python-versions = ">=3.9" +groups = ["dev"] +markers = "platform_python_implementation != \"PyPy\"" +files = [ + {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, + {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb"}, + {file = "cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a"}, + {file = "cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743"}, + {file = "cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5"}, + {file = "cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5"}, + {file = "cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187"}, + {file = "cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18"}, + {file = "cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5"}, + {file = "cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b"}, + {file = "cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27"}, + {file = "cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75"}, + {file = "cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1"}, + {file = "cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f"}, + {file = "cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25"}, + {file = "cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4"}, + {file = "cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e"}, + {file = "cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6"}, + {file = "cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322"}, + {file = "cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a"}, + {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, + {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, +] [package.dependencies] -pycparser = "*" +pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} [[package]] name = "charset-normalizer" -version = "3.4.2" +version = "3.4.4" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" groups = ["main", "dev"] files = [ - {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-win32.whl", hash = "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e"}, - {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, - {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50"}, + {file = "charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f"}, + {file = "charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a"}, ] [[package]] name = "click" -version = "8.1.8" +version = "8.3.1" description = "Composable command line interface toolkit" optional = false -python-versions = ">=3.7" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, - {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, + {file = "click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6"}, + {file = "click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a"}, ] [package.dependencies] @@ -376,100 +446,104 @@ files = [ [[package]] name = "coverage" -version = "7.10.3" +version = "7.11.3" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "coverage-7.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53808194afdf948c462215e9403cca27a81cf150d2f9b386aee4dab614ae2ffe"}, - {file = "coverage-7.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f4d1b837d1abf72187a61645dbf799e0d7705aa9232924946e1f57eb09a3bf00"}, - {file = "coverage-7.10.3-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2a90dd4505d3cc68b847ab10c5ee81822a968b5191664e8a0801778fa60459fa"}, - {file = "coverage-7.10.3-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d52989685ff5bf909c430e6d7f6550937bc6d6f3e6ecb303c97a86100efd4596"}, - {file = "coverage-7.10.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdb558a1d97345bde3a9f4d3e8d11c9e5611f748646e9bb61d7d612a796671b5"}, - {file = "coverage-7.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c9e6331a8f09cb1fc8bda032752af03c366870b48cce908875ba2620d20d0ad4"}, - {file = "coverage-7.10.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:992f48bf35b720e174e7fae916d943599f1a66501a2710d06c5f8104e0756ee1"}, - {file = "coverage-7.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c5595fc4ad6a39312c786ec3326d7322d0cf10e3ac6a6df70809910026d67cfb"}, - {file = "coverage-7.10.3-cp310-cp310-win32.whl", hash = "sha256:9e92fa1f2bd5a57df9d00cf9ce1eb4ef6fccca4ceabec1c984837de55329db34"}, - {file = "coverage-7.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:b96524d6e4a3ce6a75c56bb15dbd08023b0ae2289c254e15b9fbdddf0c577416"}, - {file = "coverage-7.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2ff2e2afdf0d51b9b8301e542d9c21a8d084fd23d4c8ea2b3a1b3c96f5f7397"}, - {file = "coverage-7.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:18ecc5d1b9a8c570f6c9b808fa9a2b16836b3dd5414a6d467ae942208b095f85"}, - {file = "coverage-7.10.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1af4461b25fe92889590d438905e1fc79a95680ec2a1ff69a591bb3fdb6c7157"}, - {file = "coverage-7.10.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3966bc9a76b09a40dc6063c8b10375e827ea5dfcaffae402dd65953bef4cba54"}, - {file = "coverage-7.10.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:205a95b87ef4eb303b7bc5118b47b6b6604a644bcbdb33c336a41cfc0a08c06a"}, - {file = "coverage-7.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b3801b79fb2ad61e3c7e2554bab754fc5f105626056980a2b9cf3aef4f13f84"}, - {file = "coverage-7.10.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0dc69c60224cda33d384572da945759756e3f06b9cdac27f302f53961e63160"}, - {file = "coverage-7.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a83d4f134bab2c7ff758e6bb1541dd72b54ba295ced6a63d93efc2e20cb9b124"}, - {file = "coverage-7.10.3-cp311-cp311-win32.whl", hash = "sha256:54e409dd64e5302b2a8fdf44ec1c26f47abd1f45a2dcf67bd161873ee05a59b8"}, - {file = "coverage-7.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:30c601610a9b23807c5e9e2e442054b795953ab85d525c3de1b1b27cebeb2117"}, - {file = "coverage-7.10.3-cp311-cp311-win_arm64.whl", hash = "sha256:dabe662312a97958e932dee056f2659051d822552c0b866823e8ba1c2fe64770"}, - {file = "coverage-7.10.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:449c1e2d3a84d18bd204258a897a87bc57380072eb2aded6a5b5226046207b42"}, - {file = "coverage-7.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d4f9ce50b9261ad196dc2b2e9f1fbbee21651b54c3097a25ad783679fd18294"}, - {file = "coverage-7.10.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4dd4564207b160d0d45c36a10bc0a3d12563028e8b48cd6459ea322302a156d7"}, - {file = "coverage-7.10.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5ca3c9530ee072b7cb6a6ea7b640bcdff0ad3b334ae9687e521e59f79b1d0437"}, - {file = "coverage-7.10.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b6df359e59fa243c9925ae6507e27f29c46698359f45e568fd51b9315dbbe587"}, - {file = "coverage-7.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a181e4c2c896c2ff64c6312db3bda38e9ade2e1aa67f86a5628ae85873786cea"}, - {file = "coverage-7.10.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a374d4e923814e8b72b205ef6b3d3a647bb50e66f3558582eda074c976923613"}, - {file = "coverage-7.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:daeefff05993e5e8c6e7499a8508e7bd94502b6b9a9159c84fd1fe6bce3151cb"}, - {file = "coverage-7.10.3-cp312-cp312-win32.whl", hash = "sha256:187ecdcac21f9636d570e419773df7bd2fda2e7fa040f812e7f95d0bddf5f79a"}, - {file = "coverage-7.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:4a50ad2524ee7e4c2a95e60d2b0b83283bdfc745fe82359d567e4f15d3823eb5"}, - {file = "coverage-7.10.3-cp312-cp312-win_arm64.whl", hash = "sha256:c112f04e075d3495fa3ed2200f71317da99608cbb2e9345bdb6de8819fc30571"}, - {file = "coverage-7.10.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b99e87304ffe0eb97c5308447328a584258951853807afdc58b16143a530518a"}, - {file = "coverage-7.10.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4af09c7574d09afbc1ea7da9dcea23665c01f3bc1b1feb061dac135f98ffc53a"}, - {file = "coverage-7.10.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:488e9b50dc5d2aa9521053cfa706209e5acf5289e81edc28291a24f4e4488f46"}, - {file = "coverage-7.10.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:913ceddb4289cbba3a310704a424e3fb7aac2bc0c3a23ea473193cb290cf17d4"}, - {file = "coverage-7.10.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b1f91cbc78c7112ab84ed2a8defbccd90f888fcae40a97ddd6466b0bec6ae8a"}, - {file = "coverage-7.10.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0bac054d45af7cd938834b43a9878b36ea92781bcb009eab040a5b09e9927e3"}, - {file = "coverage-7.10.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fe72cbdd12d9e0f4aca873fa6d755e103888a7f9085e4a62d282d9d5b9f7928c"}, - {file = "coverage-7.10.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c1e2e927ab3eadd7c244023927d646e4c15c65bb2ac7ae3c3e9537c013700d21"}, - {file = "coverage-7.10.3-cp313-cp313-win32.whl", hash = "sha256:24d0c13de473b04920ddd6e5da3c08831b1170b8f3b17461d7429b61cad59ae0"}, - {file = "coverage-7.10.3-cp313-cp313-win_amd64.whl", hash = "sha256:3564aae76bce4b96e2345cf53b4c87e938c4985424a9be6a66ee902626edec4c"}, - {file = "coverage-7.10.3-cp313-cp313-win_arm64.whl", hash = "sha256:f35580f19f297455f44afcd773c9c7a058e52eb6eb170aa31222e635f2e38b87"}, - {file = "coverage-7.10.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07009152f497a0464ffdf2634586787aea0e69ddd023eafb23fc38267db94b84"}, - {file = "coverage-7.10.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dd2ba5f0c7e7e8cc418be2f0c14c4d9e3f08b8fb8e4c0f83c2fe87d03eb655e"}, - {file = "coverage-7.10.3-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1ae22b97003c74186e034a93e4f946c75fad8c0ce8d92fbbc168b5e15ee2841f"}, - {file = "coverage-7.10.3-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:eb329f1046888a36b1dc35504d3029e1dd5afe2196d94315d18c45ee380f67d5"}, - {file = "coverage-7.10.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce01048199a91f07f96ca3074b0c14021f4fe7ffd29a3e6a188ac60a5c3a4af8"}, - {file = "coverage-7.10.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:08b989a06eb9dfacf96d42b7fb4c9a22bafa370d245dc22fa839f2168c6f9fa1"}, - {file = "coverage-7.10.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:669fe0d4e69c575c52148511029b722ba8d26e8a3129840c2ce0522e1452b256"}, - {file = "coverage-7.10.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3262d19092771c83f3413831d9904b1ccc5f98da5de4ffa4ad67f5b20c7aaf7b"}, - {file = "coverage-7.10.3-cp313-cp313t-win32.whl", hash = "sha256:cc0ee4b2ccd42cab7ee6be46d8a67d230cb33a0a7cd47a58b587a7063b6c6b0e"}, - {file = "coverage-7.10.3-cp313-cp313t-win_amd64.whl", hash = "sha256:03db599f213341e2960430984e04cf35fb179724e052a3ee627a068653cf4a7c"}, - {file = "coverage-7.10.3-cp313-cp313t-win_arm64.whl", hash = "sha256:46eae7893ba65f53c71284585a262f083ef71594f05ec5c85baf79c402369098"}, - {file = "coverage-7.10.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:bce8b8180912914032785850d8f3aacb25ec1810f5f54afc4a8b114e7a9b55de"}, - {file = "coverage-7.10.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07790b4b37d56608536f7c1079bd1aa511567ac2966d33d5cec9cf520c50a7c8"}, - {file = "coverage-7.10.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e79367ef2cd9166acedcbf136a458dfe9a4a2dd4d1ee95738fb2ee581c56f667"}, - {file = "coverage-7.10.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:419d2a0f769f26cb1d05e9ccbc5eab4cb5d70231604d47150867c07822acbdf4"}, - {file = "coverage-7.10.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee221cf244757cdc2ac882e3062ab414b8464ad9c884c21e878517ea64b3fa26"}, - {file = "coverage-7.10.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c2079d8cdd6f7373d628e14b3357f24d1db02c9dc22e6a007418ca7a2be0435a"}, - {file = "coverage-7.10.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:bd8df1f83c0703fa3ca781b02d36f9ec67ad9cb725b18d486405924f5e4270bd"}, - {file = "coverage-7.10.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6b4e25e0fa335c8aa26e42a52053f3786a61cc7622b4d54ae2dad994aa754fec"}, - {file = "coverage-7.10.3-cp314-cp314-win32.whl", hash = "sha256:d7c3d02c2866deb217dce664c71787f4b25420ea3eaf87056f44fb364a3528f5"}, - {file = "coverage-7.10.3-cp314-cp314-win_amd64.whl", hash = "sha256:9c8916d44d9e0fe6cdb2227dc6b0edd8bc6c8ef13438bbbf69af7482d9bb9833"}, - {file = "coverage-7.10.3-cp314-cp314-win_arm64.whl", hash = "sha256:1007d6a2b3cf197c57105cc1ba390d9ff7f0bee215ced4dea530181e49c65ab4"}, - {file = "coverage-7.10.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:ebc8791d346410d096818788877d675ca55c91db87d60e8f477bd41c6970ffc6"}, - {file = "coverage-7.10.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f4e4d8e75f6fd3c6940ebeed29e3d9d632e1f18f6fb65d33086d99d4d073241"}, - {file = "coverage-7.10.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:24581ed69f132b6225a31b0228ae4885731cddc966f8a33fe5987288bdbbbd5e"}, - {file = "coverage-7.10.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec151569ddfccbf71bac8c422dce15e176167385a00cd86e887f9a80035ce8a5"}, - {file = "coverage-7.10.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2ae8e7c56290b908ee817200c0b65929b8050bc28530b131fe7c6dfee3e7d86b"}, - {file = "coverage-7.10.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5fb742309766d7e48e9eb4dc34bc95a424707bc6140c0e7d9726e794f11b92a0"}, - {file = "coverage-7.10.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:c65e2a5b32fbe1e499f1036efa6eb9cb4ea2bf6f7168d0e7a5852f3024f471b1"}, - {file = "coverage-7.10.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d48d2cb07d50f12f4f18d2bb75d9d19e3506c26d96fffabf56d22936e5ed8f7c"}, - {file = "coverage-7.10.3-cp314-cp314t-win32.whl", hash = "sha256:dec0d9bc15ee305e09fe2cd1911d3f0371262d3cfdae05d79515d8cb712b4869"}, - {file = "coverage-7.10.3-cp314-cp314t-win_amd64.whl", hash = "sha256:424ea93a323aa0f7f01174308ea78bde885c3089ec1bef7143a6d93c3e24ef64"}, - {file = "coverage-7.10.3-cp314-cp314t-win_arm64.whl", hash = "sha256:f5983c132a62d93d71c9ef896a0b9bf6e6828d8d2ea32611f58684fba60bba35"}, - {file = "coverage-7.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:da749daa7e141985487e1ff90a68315b0845930ed53dc397f4ae8f8bab25b551"}, - {file = "coverage-7.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3126fb6a47d287f461d9b1aa5d1a8c97034d1dffb4f452f2cf211289dae74ef"}, - {file = "coverage-7.10.3-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3da794db13cc27ca40e1ec8127945b97fab78ba548040047d54e7bfa6d442dca"}, - {file = "coverage-7.10.3-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4e27bebbd184ef8d1c1e092b74a2b7109dcbe2618dce6e96b1776d53b14b3fe8"}, - {file = "coverage-7.10.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8fd4ee2580b9fefbd301b4f8f85b62ac90d1e848bea54f89a5748cf132782118"}, - {file = "coverage-7.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6999920bdd73259ce11cabfc1307484f071ecc6abdb2ca58d98facbcefc70f16"}, - {file = "coverage-7.10.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c3623f929db885fab100cb88220a5b193321ed37e03af719efdbaf5d10b6e227"}, - {file = "coverage-7.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:25b902c5e15dea056485d782e420bb84621cc08ee75d5131ecb3dbef8bd1365f"}, - {file = "coverage-7.10.3-cp39-cp39-win32.whl", hash = "sha256:f930a4d92b004b643183451fe9c8fe398ccf866ed37d172ebaccfd443a097f61"}, - {file = "coverage-7.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:08e638a93c8acba13c7842953f92a33d52d73e410329acd472280d2a21a6c0e1"}, - {file = "coverage-7.10.3-py3-none-any.whl", hash = "sha256:416a8d74dc0adfd33944ba2f405897bab87b7e9e84a391e09d241956bd953ce1"}, - {file = "coverage-7.10.3.tar.gz", hash = "sha256:812ba9250532e4a823b070b0420a36499859542335af3dca8f47fc6aa1a05619"}, + {file = "coverage-7.11.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0c986537abca9b064510f3fd104ba33e98d3036608c7f2f5537f869bc10e1ee5"}, + {file = "coverage-7.11.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:28c5251b3ab1d23e66f1130ca0c419747edfbcb4690de19467cd616861507af7"}, + {file = "coverage-7.11.3-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4f2bb4ee8dd40f9b2a80bb4adb2aecece9480ba1fa60d9382e8c8e0bd558e2eb"}, + {file = "coverage-7.11.3-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e5f4bfac975a2138215a38bda599ef00162e4143541cf7dd186da10a7f8e69f1"}, + {file = "coverage-7.11.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f4cbfff5cf01fa07464439a8510affc9df281535f41a1f5312fbd2b59b4ab5c"}, + {file = "coverage-7.11.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:31663572f20bf3406d7ac00d6981c7bbbcec302539d26b5ac596ca499664de31"}, + {file = "coverage-7.11.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9799bd6a910961cb666196b8583ed0ee125fa225c6fdee2cbf00232b861f29d2"}, + {file = "coverage-7.11.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:097acc18bedf2c6e3144eaf09b5f6034926c3c9bb9e10574ffd0942717232507"}, + {file = "coverage-7.11.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:6f033dec603eea88204589175782290a038b436105a8f3637a81c4359df27832"}, + {file = "coverage-7.11.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dd9ca2d44ed8018c90efb72f237a2a140325a4c3339971364d758e78b175f58e"}, + {file = "coverage-7.11.3-cp310-cp310-win32.whl", hash = "sha256:900580bc99c145e2561ea91a2d207e639171870d8a18756eb57db944a017d4bb"}, + {file = "coverage-7.11.3-cp310-cp310-win_amd64.whl", hash = "sha256:c8be5bfcdc7832011b2652db29ed7672ce9d353dd19bce5272ca33dbcf60aaa8"}, + {file = "coverage-7.11.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:200bb89fd2a8a07780eafcdff6463104dec459f3c838d980455cfa84f5e5e6e1"}, + {file = "coverage-7.11.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8d264402fc179776d43e557e1ca4a7d953020d3ee95f7ec19cc2c9d769277f06"}, + {file = "coverage-7.11.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:385977d94fc155f8731c895accdfcc3dd0d9dd9ef90d102969df95d3c637ab80"}, + {file = "coverage-7.11.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0542ddf6107adbd2592f29da9f59f5d9cff7947b5bb4f734805085c327dcffaa"}, + {file = "coverage-7.11.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d60bf4d7f886989ddf80e121a7f4d140d9eac91f1d2385ce8eb6bda93d563297"}, + {file = "coverage-7.11.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0a3b6e32457535df0d41d2d895da46434706dd85dbaf53fbc0d3bd7d914b362"}, + {file = "coverage-7.11.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:876a3ee7fd2613eb79602e4cdb39deb6b28c186e76124c3f29e580099ec21a87"}, + {file = "coverage-7.11.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a730cd0824e8083989f304e97b3f884189efb48e2151e07f57e9e138ab104200"}, + {file = "coverage-7.11.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:b5cd111d3ab7390be0c07ad839235d5ad54d2ca497b5f5db86896098a77180a4"}, + {file = "coverage-7.11.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:074e6a5cd38e06671580b4d872c1a67955d4e69639e4b04e87fc03b494c1f060"}, + {file = "coverage-7.11.3-cp311-cp311-win32.whl", hash = "sha256:86d27d2dd7c7c5a44710565933c7dc9cd70e65ef97142e260d16d555667deef7"}, + {file = "coverage-7.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:ca90ef33a152205fb6f2f0c1f3e55c50df4ef049bb0940ebba666edd4cdebc55"}, + {file = "coverage-7.11.3-cp311-cp311-win_arm64.whl", hash = "sha256:56f909a40d68947ef726ce6a34eb38f0ed241ffbe55c5007c64e616663bcbafc"}, + {file = "coverage-7.11.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5b771b59ac0dfb7f139f70c85b42717ef400a6790abb6475ebac1ecee8de782f"}, + {file = "coverage-7.11.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:603c4414125fc9ae9000f17912dcfd3d3eb677d4e360b85206539240c96ea76e"}, + {file = "coverage-7.11.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:77ffb3b7704eb7b9b3298a01fe4509cef70117a52d50bcba29cffc5f53dd326a"}, + {file = "coverage-7.11.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4d4ca49f5ba432b0755ebb0fc3a56be944a19a16bb33802264bbc7311622c0d1"}, + {file = "coverage-7.11.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:05fd3fb6edff0c98874d752013588836f458261e5eba587afe4c547bba544afd"}, + {file = "coverage-7.11.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0e920567f8c3a3ce68ae5a42cf7c2dc4bb6cc389f18bff2235dd8c03fa405de5"}, + {file = "coverage-7.11.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4bec8c7160688bd5a34e65c82984b25409563134d63285d8943d0599efbc448e"}, + {file = "coverage-7.11.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:adb9b7b42c802bd8cb3927de8c1c26368ce50c8fdaa83a9d8551384d77537044"}, + {file = "coverage-7.11.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c8f563b245b4ddb591e99f28e3cd140b85f114b38b7f95b2e42542f0603eb7d7"}, + {file = "coverage-7.11.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e2a96fdc7643c9517a317553aca13b5cae9bad9a5f32f4654ce247ae4d321405"}, + {file = "coverage-7.11.3-cp312-cp312-win32.whl", hash = "sha256:e8feeb5e8705835f0622af0fe7ff8d5cb388948454647086494d6c41ec142c2e"}, + {file = "coverage-7.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:abb903ffe46bd319d99979cdba350ae7016759bb69f47882242f7b93f3356055"}, + {file = "coverage-7.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:1451464fd855d9bd000c19b71bb7dafea9ab815741fb0bd9e813d9b671462d6f"}, + {file = "coverage-7.11.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84b892e968164b7a0498ddc5746cdf4e985700b902128421bb5cec1080a6ee36"}, + {file = "coverage-7.11.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f761dbcf45e9416ec4698e1a7649248005f0064ce3523a47402d1bff4af2779e"}, + {file = "coverage-7.11.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1410bac9e98afd9623f53876fae7d8a5db9f5a0ac1c9e7c5188463cb4b3212e2"}, + {file = "coverage-7.11.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:004cdcea3457c0ea3233622cd3464c1e32ebba9b41578421097402bee6461b63"}, + {file = "coverage-7.11.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f067ada2c333609b52835ca4d4868645d3b63ac04fb2b9a658c55bba7f667d3"}, + {file = "coverage-7.11.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:07bc7745c945a6d95676953e86ba7cebb9f11de7773951c387f4c07dc76d03f5"}, + {file = "coverage-7.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8bba7e4743e37484ae17d5c3b8eb1ce78b564cb91b7ace2e2182b25f0f764cb5"}, + {file = "coverage-7.11.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbffc22d80d86fbe456af9abb17f7a7766e7b2101f7edaacc3535501691563f7"}, + {file = "coverage-7.11.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:0dba4da36730e384669e05b765a2c49f39514dd3012fcc0398dd66fba8d746d5"}, + {file = "coverage-7.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ae12fe90b00b71a71b69f513773310782ce01d5f58d2ceb2b7c595ab9d222094"}, + {file = "coverage-7.11.3-cp313-cp313-win32.whl", hash = "sha256:12d821de7408292530b0d241468b698bce18dd12ecaf45316149f53877885f8c"}, + {file = "coverage-7.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:6bb599052a974bb6cedfa114f9778fedfad66854107cf81397ec87cb9b8fbcf2"}, + {file = "coverage-7.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:bb9d7efdb063903b3fdf77caec7b77c3066885068bdc0d44bc1b0c171033f944"}, + {file = "coverage-7.11.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:fb58da65e3339b3dbe266b607bb936efb983d86b00b03eb04c4ad5b442c58428"}, + {file = "coverage-7.11.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8d16bbe566e16a71d123cd66382c1315fcd520c7573652a8074a8fe281b38c6a"}, + {file = "coverage-7.11.3-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8258f10059b5ac837232c589a350a2df4a96406d6d5f2a09ec587cbdd539655"}, + {file = "coverage-7.11.3-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4c5627429f7fbff4f4131cfdd6abd530734ef7761116811a707b88b7e205afd7"}, + {file = "coverage-7.11.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:465695268414e149bab754c54b0c45c8ceda73dd4a5c3ba255500da13984b16d"}, + {file = "coverage-7.11.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4ebcddfcdfb4c614233cff6e9a3967a09484114a8b2e4f2c7a62dc83676ba13f"}, + {file = "coverage-7.11.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:13b2066303a1c1833c654d2af0455bb009b6e1727b3883c9964bc5c2f643c1d0"}, + {file = "coverage-7.11.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d8750dd20362a1b80e3cf84f58013d4672f89663aee457ea59336df50fab6739"}, + {file = "coverage-7.11.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ab6212e62ea0e1006531a2234e209607f360d98d18d532c2fa8e403c1afbdd71"}, + {file = "coverage-7.11.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a6b17c2b5e0b9bb7702449200f93e2d04cb04b1414c41424c08aa1e5d352da76"}, + {file = "coverage-7.11.3-cp313-cp313t-win32.whl", hash = "sha256:426559f105f644b69290ea414e154a0d320c3ad8a2bb75e62884731f69cf8e2c"}, + {file = "coverage-7.11.3-cp313-cp313t-win_amd64.whl", hash = "sha256:90a96fcd824564eae6137ec2563bd061d49a32944858d4bdbae5c00fb10e76ac"}, + {file = "coverage-7.11.3-cp313-cp313t-win_arm64.whl", hash = "sha256:1e33d0bebf895c7a0905fcfaff2b07ab900885fc78bba2a12291a2cfbab014cc"}, + {file = "coverage-7.11.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fdc5255eb4815babcdf236fa1a806ccb546724c8a9b129fd1ea4a5448a0bf07c"}, + {file = "coverage-7.11.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fe3425dc6021f906c6325d3c415e048e7cdb955505a94f1eb774dafc779ba203"}, + {file = "coverage-7.11.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4ca5f876bf41b24378ee67c41d688155f0e54cdc720de8ef9ad6544005899240"}, + {file = "coverage-7.11.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9061a3e3c92b27fd8036dafa26f25d95695b6aa2e4514ab16a254f297e664f83"}, + {file = "coverage-7.11.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:abcea3b5f0dc44e1d01c27090bc32ce6ffb7aa665f884f1890710454113ea902"}, + {file = "coverage-7.11.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:68c4eb92997dbaaf839ea13527be463178ac0ddd37a7ac636b8bc11a51af2428"}, + {file = "coverage-7.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:149eccc85d48c8f06547534068c41d69a1a35322deaa4d69ba1561e2e9127e75"}, + {file = "coverage-7.11.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:08c0bcf932e47795c49f0406054824b9d45671362dfc4269e0bc6e4bff010704"}, + {file = "coverage-7.11.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:39764c6167c82d68a2d8c97c33dba45ec0ad9172570860e12191416f4f8e6e1b"}, + {file = "coverage-7.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3224c7baf34e923ffc78cb45e793925539d640d42c96646db62dbd61bbcfa131"}, + {file = "coverage-7.11.3-cp314-cp314-win32.whl", hash = "sha256:c713c1c528284d636cd37723b0b4c35c11190da6f932794e145fc40f8210a14a"}, + {file = "coverage-7.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:c381a252317f63ca0179d2c7918e83b99a4ff3101e1b24849b999a00f9cd4f86"}, + {file = "coverage-7.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:3e33a968672be1394eded257ec10d4acbb9af2ae263ba05a99ff901bb863557e"}, + {file = "coverage-7.11.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f9c96a29c6d65bd36a91f5634fef800212dff69dacdb44345c4c9783943ab0df"}, + {file = "coverage-7.11.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2ec27a7a991d229213c8070d31e3ecf44d005d96a9edc30c78eaeafaa421c001"}, + {file = "coverage-7.11.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:72c8b494bd20ae1c58528b97c4a67d5cfeafcb3845c73542875ecd43924296de"}, + {file = "coverage-7.11.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:60ca149a446da255d56c2a7a813b51a80d9497a62250532598d249b3cdb1a926"}, + {file = "coverage-7.11.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb5069074db19a534de3859c43eec78e962d6d119f637c41c8e028c5ab3f59dd"}, + {file = "coverage-7.11.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac5d5329c9c942bbe6295f4251b135d860ed9f86acd912d418dce186de7c19ac"}, + {file = "coverage-7.11.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e22539b676fafba17f0a90ac725f029a309eb6e483f364c86dcadee060429d46"}, + {file = "coverage-7.11.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:2376e8a9c889016f25472c452389e98bc6e54a19570b107e27cde9d47f387b64"}, + {file = "coverage-7.11.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4234914b8c67238a3c4af2bba648dc716aa029ca44d01f3d51536d44ac16854f"}, + {file = "coverage-7.11.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f0b4101e2b3c6c352ff1f70b3a6fcc7c17c1ab1a91ccb7a33013cb0782af9820"}, + {file = "coverage-7.11.3-cp314-cp314t-win32.whl", hash = "sha256:305716afb19133762e8cf62745c46c4853ad6f9eeba54a593e373289e24ea237"}, + {file = "coverage-7.11.3-cp314-cp314t-win_amd64.whl", hash = "sha256:9245bd392572b9f799261c4c9e7216bafc9405537d0f4ce3ad93afe081a12dc9"}, + {file = "coverage-7.11.3-cp314-cp314t-win_arm64.whl", hash = "sha256:9a1d577c20b4334e5e814c3d5fe07fa4a8c3ae42a601945e8d7940bab811d0bd"}, + {file = "coverage-7.11.3-py3-none-any.whl", hash = "sha256:351511ae28e2509c8d8cae5311577ea7dd511ab8e746ffc8814a0896c3d33fbe"}, + {file = "coverage-7.11.3.tar.gz", hash = "sha256:0f59387f5e6edbbffec2281affb71cdc85e0776c1745150a3ab9b6c1d016106b"}, ] [package.dependencies] @@ -480,63 +554,80 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "45.0.4" +version = "46.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false -python-versions = "!=3.9.0,!=3.9.1,>=3.7" +python-versions = "!=3.9.0,!=3.9.1,>=3.8" groups = ["dev"] -markers = "python_version > \"3.9.1\"" -files = [ - {file = "cryptography-45.0.4-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:425a9a6ac2823ee6e46a76a21a4e8342d8fa5c01e08b823c1f19a8b74f096069"}, - {file = "cryptography-45.0.4-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:680806cf63baa0039b920f4976f5f31b10e772de42f16310a6839d9f21a26b0d"}, - {file = "cryptography-45.0.4-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4ca0f52170e821bc8da6fc0cc565b7bb8ff8d90d36b5e9fdd68e8a86bdf72036"}, - {file = "cryptography-45.0.4-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f3fe7a5ae34d5a414957cc7f457e2b92076e72938423ac64d215722f6cf49a9e"}, - {file = "cryptography-45.0.4-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:25eb4d4d3e54595dc8adebc6bbd5623588991d86591a78c2548ffb64797341e2"}, - {file = "cryptography-45.0.4-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ce1678a2ccbe696cf3af15a75bb72ee008d7ff183c9228592ede9db467e64f1b"}, - {file = "cryptography-45.0.4-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:49fe9155ab32721b9122975e168a6760d8ce4cffe423bcd7ca269ba41b5dfac1"}, - {file = "cryptography-45.0.4-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2882338b2a6e0bd337052e8b9007ced85c637da19ef9ecaf437744495c8c2999"}, - {file = "cryptography-45.0.4-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:23b9c3ea30c3ed4db59e7b9619272e94891f8a3a5591d0b656a7582631ccf750"}, - {file = "cryptography-45.0.4-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0a97c927497e3bc36b33987abb99bf17a9a175a19af38a892dc4bbb844d7ee2"}, - {file = "cryptography-45.0.4-cp311-abi3-win32.whl", hash = "sha256:e00a6c10a5c53979d6242f123c0a97cff9f3abed7f064fc412c36dc521b5f257"}, - {file = "cryptography-45.0.4-cp311-abi3-win_amd64.whl", hash = "sha256:817ee05c6c9f7a69a16200f0c90ab26d23a87701e2a284bd15156783e46dbcc8"}, - {file = "cryptography-45.0.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:964bcc28d867e0f5491a564b7debb3ffdd8717928d315d12e0d7defa9e43b723"}, - {file = "cryptography-45.0.4-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6a5bf57554e80f75a7db3d4b1dacaa2764611ae166ab42ea9a72bcdb5d577637"}, - {file = "cryptography-45.0.4-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:46cf7088bf91bdc9b26f9c55636492c1cce3e7aaf8041bbf0243f5e5325cfb2d"}, - {file = "cryptography-45.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7bedbe4cc930fa4b100fc845ea1ea5788fcd7ae9562e669989c11618ae8d76ee"}, - {file = "cryptography-45.0.4-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:eaa3e28ea2235b33220b949c5a0d6cf79baa80eab2eb5607ca8ab7525331b9ff"}, - {file = "cryptography-45.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:7ef2dde4fa9408475038fc9aadfc1fb2676b174e68356359632e980c661ec8f6"}, - {file = "cryptography-45.0.4-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:6a3511ae33f09094185d111160fd192c67aa0a2a8d19b54d36e4c78f651dc5ad"}, - {file = "cryptography-45.0.4-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:06509dc70dd71fa56eaa138336244e2fbaf2ac164fc9b5e66828fccfd2b680d6"}, - {file = "cryptography-45.0.4-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:5f31e6b0a5a253f6aa49be67279be4a7e5a4ef259a9f33c69f7d1b1191939872"}, - {file = "cryptography-45.0.4-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:944e9ccf67a9594137f942d5b52c8d238b1b4e46c7a0c2891b7ae6e01e7c80a4"}, - {file = "cryptography-45.0.4-cp37-abi3-win32.whl", hash = "sha256:c22fe01e53dc65edd1945a2e6f0015e887f84ced233acecb64b4daadb32f5c97"}, - {file = "cryptography-45.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:627ba1bc94f6adf0b0a2e35d87020285ead22d9f648c7e75bb64f367375f3b22"}, - {file = "cryptography-45.0.4-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a77c6fb8d76e9c9f99f2f3437c1a4ac287b34eaf40997cfab1e9bd2be175ac39"}, - {file = "cryptography-45.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7aad98a25ed8ac917fdd8a9c1e706e5a0956e06c498be1f713b61734333a4507"}, - {file = "cryptography-45.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3530382a43a0e524bc931f187fc69ef4c42828cf7d7f592f7f249f602b5a4ab0"}, - {file = "cryptography-45.0.4-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:6b613164cb8425e2f8db5849ffb84892e523bf6d26deb8f9bb76ae86181fa12b"}, - {file = "cryptography-45.0.4-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:96d4819e25bf3b685199b304a0029ce4a3caf98947ce8a066c9137cc78ad2c58"}, - {file = "cryptography-45.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b97737a3ffbea79eebb062eb0d67d72307195035332501722a9ca86bab9e3ab2"}, - {file = "cryptography-45.0.4-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4828190fb6c4bcb6ebc6331f01fe66ae838bb3bd58e753b59d4b22eb444b996c"}, - {file = "cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:03dbff8411206713185b8cebe31bc5c0eb544799a50c09035733716b386e61a4"}, - {file = "cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51dfbd4d26172d31150d84c19bbe06c68ea4b7f11bbc7b3a5e146b367c311349"}, - {file = "cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:0339a692de47084969500ee455e42c58e449461e0ec845a34a6a9b9bf7df7fb8"}, - {file = "cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:0cf13c77d710131d33e63626bd55ae7c0efb701ebdc2b3a7952b9b23a0412862"}, - {file = "cryptography-45.0.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bbc505d1dc469ac12a0a064214879eac6294038d6b24ae9f71faae1448a9608d"}, - {file = "cryptography-45.0.4.tar.gz", hash = "sha256:7405ade85c83c37682c8fe65554759800a4a8c54b2d96e0f8ad114d31b808d57"}, +files = [ + {file = "cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e"}, + {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926"}, + {file = "cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71"}, + {file = "cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac"}, + {file = "cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018"}, + {file = "cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb"}, + {file = "cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c"}, + {file = "cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665"}, + {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3"}, + {file = "cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20"}, + {file = "cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de"}, + {file = "cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914"}, + {file = "cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db"}, + {file = "cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21"}, + {file = "cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04"}, + {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506"}, + {file = "cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963"}, + {file = "cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4"}, + {file = "cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df"}, + {file = "cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f"}, + {file = "cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372"}, + {file = "cryptography-46.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a23582810fedb8c0bc47524558fb6c56aac3fc252cb306072fd2815da2a47c32"}, + {file = "cryptography-46.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e7aec276d68421f9574040c26e2a7c3771060bc0cff408bae1dcb19d3ab1e63c"}, + {file = "cryptography-46.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ce938a99998ed3c8aa7e7272dca1a610401ede816d36d0693907d863b10d9ea"}, + {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b"}, + {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb"}, + {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9394673a9f4de09e28b5356e7fff97d778f8abad85c9d5ac4a4b7e25a0de7717"}, + {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9"}, + {file = "cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c"}, + {file = "cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1"}, ] [package.dependencies] -cffi = {version = ">=1.14", markers = "platform_python_implementation != \"PyPy\""} +cffi = {version = ">=2.0.0", markers = "python_full_version >= \"3.9\" and platform_python_implementation != \"PyPy\""} +typing-extensions = {version = ">=4.13.2", markers = "python_full_version < \"3.11\""} [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-inline-tabs", "sphinx-rtd-theme (>=3.0.0)"] docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] -nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] -pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +nox = ["nox[uv] (>=2024.4.15)"] +pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.14)", "ruff (>=0.11.11)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi (>=2024)", "cryptography-vectors (==45.0.4)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test = ["certifi (>=2024)", "cryptography-vectors (==46.0.3)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] [[package]] @@ -574,6 +665,41 @@ docs = ["myst-parser (==0.18.0)", "sphinx (==5.1.1)"] ssh = ["paramiko (>=2.4.3)"] websockets = ["websocket-client (>=1.3.0)"] +[[package]] +name = "docstring-parser" +version = "0.17.0" +description = "Parse Python docstrings in reST, Google and Numpydoc format" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708"}, + {file = "docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912"}, +] + +[package.extras] +dev = ["pre-commit (>=2.16.0)", "pydoctor (>=25.4.0)", "pytest"] +docs = ["pydoctor (>=25.4.0)"] +test = ["pytest"] + +[[package]] +name = "dydantic" +version = "0.0.8" +description = "Dynamically generate pydantic models from JSON schema." +optional = false +python-versions = "<4.0,>=3.9" +groups = ["dev"] +files = [ + {file = "dydantic-0.0.8-py3-none-any.whl", hash = "sha256:cd0a991f523bd8632699872f1c0c4278415dd04783e36adec5428defa0afb721"}, + {file = "dydantic-0.0.8.tar.gz", hash = "sha256:14a31d4cdfce314ce3e69e8f8c7c46cbc26ce3ce4485de0832260386c612942f"}, +] + +[package.dependencies] +pydantic = ">=2,<3" + +[package.extras] +email = ["email-validator (>=2.1,<3.0)"] + [[package]] name = "exceptiongroup" version = "1.3.0" @@ -595,14 +721,14 @@ test = ["pytest (>=6)"] [[package]] name = "execnet" -version = "2.1.1" +version = "2.1.2" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, - {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, + {file = "execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec"}, + {file = "execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd"}, ] [package.extras] @@ -669,14 +795,14 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "idna" -version = "3.10" +version = "3.11" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" groups = ["main", "dev"] files = [ - {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, - {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, + {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, + {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, ] [package.extras] @@ -684,26 +810,26 @@ all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2 [[package]] name = "iniconfig" -version = "2.1.0" +version = "2.3.0" description = "brain-dead simple config-ini parsing" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, - {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, + {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, + {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, ] [[package]] name = "isort" -version = "6.0.1" +version = "6.1.0" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.9.0" groups = ["dev"] files = [ - {file = "isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615"}, - {file = "isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450"}, + {file = "isort-6.1.0-py3-none-any.whl", hash = "sha256:58d8927ecce74e5087aef019f778d4081a3b6c98f15a80ba35782ca8a2097784"}, + {file = "isort-6.1.0.tar.gz", hash = "sha256:9b8f96a14cfee0677e78e941ff62f03769a06d412aabb9e2a90487b3b7e8d481"}, ] [package.extras] @@ -712,89 +838,114 @@ plugins = ["setuptools"] [[package]] name = "jiter" -version = "0.10.0" +version = "0.12.0" description = "Fast iterable JSON parser." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "jiter-0.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cd2fb72b02478f06a900a5782de2ef47e0396b3e1f7d5aba30daeb1fce66f303"}, - {file = "jiter-0.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32bb468e3af278f095d3fa5b90314728a6916d89ba3d0ffb726dd9bf7367285e"}, - {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8b3e0068c26ddedc7abc6fac37da2d0af16b921e288a5a613f4b86f050354f"}, - {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:286299b74cc49e25cd42eea19b72aa82c515d2f2ee12d11392c56d8701f52224"}, - {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ed5649ceeaeffc28d87fb012d25a4cd356dcd53eff5acff1f0466b831dda2a7"}, - {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2ab0051160cb758a70716448908ef14ad476c3774bd03ddce075f3c1f90a3d6"}, - {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03997d2f37f6b67d2f5c475da4412be584e1cec273c1cfc03d642c46db43f8cf"}, - {file = "jiter-0.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c404a99352d839fed80d6afd6c1d66071f3bacaaa5c4268983fc10f769112e90"}, - {file = "jiter-0.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66e989410b6666d3ddb27a74c7e50d0829704ede652fd4c858e91f8d64b403d0"}, - {file = "jiter-0.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b532d3af9ef4f6374609a3bcb5e05a1951d3bf6190dc6b176fdb277c9bbf15ee"}, - {file = "jiter-0.10.0-cp310-cp310-win32.whl", hash = "sha256:da9be20b333970e28b72edc4dff63d4fec3398e05770fb3205f7fb460eb48dd4"}, - {file = "jiter-0.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:f59e533afed0c5b0ac3eba20d2548c4a550336d8282ee69eb07b37ea526ee4e5"}, - {file = "jiter-0.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3bebe0c558e19902c96e99217e0b8e8b17d570906e72ed8a87170bc290b1e978"}, - {file = "jiter-0.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:558cc7e44fd8e507a236bee6a02fa17199ba752874400a0ca6cd6e2196cdb7dc"}, - {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d613e4b379a07d7c8453c5712ce7014e86c6ac93d990a0b8e7377e18505e98d"}, - {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f62cf8ba0618eda841b9bf61797f21c5ebd15a7a1e19daab76e4e4b498d515b2"}, - {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:919d139cdfa8ae8945112398511cb7fca58a77382617d279556b344867a37e61"}, - {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13ddbc6ae311175a3b03bd8994881bc4635c923754932918e18da841632349db"}, - {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c440ea003ad10927a30521a9062ce10b5479592e8a70da27f21eeb457b4a9c5"}, - {file = "jiter-0.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc347c87944983481e138dea467c0551080c86b9d21de6ea9306efb12ca8f606"}, - {file = "jiter-0.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:13252b58c1f4d8c5b63ab103c03d909e8e1e7842d302473f482915d95fefd605"}, - {file = "jiter-0.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7d1bbf3c465de4a24ab12fb7766a0003f6f9bce48b8b6a886158c4d569452dc5"}, - {file = "jiter-0.10.0-cp311-cp311-win32.whl", hash = "sha256:db16e4848b7e826edca4ccdd5b145939758dadf0dc06e7007ad0e9cfb5928ae7"}, - {file = "jiter-0.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c9c1d5f10e18909e993f9641f12fe1c77b3e9b533ee94ffa970acc14ded3812"}, - {file = "jiter-0.10.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1e274728e4a5345a6dde2d343c8da018b9d4bd4350f5a472fa91f66fda44911b"}, - {file = "jiter-0.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7202ae396446c988cb2a5feb33a543ab2165b786ac97f53b59aafb803fef0744"}, - {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23ba7722d6748b6920ed02a8f1726fb4b33e0fd2f3f621816a8b486c66410ab2"}, - {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:371eab43c0a288537d30e1f0b193bc4eca90439fc08a022dd83e5e07500ed026"}, - {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c675736059020365cebc845a820214765162728b51ab1e03a1b7b3abb70f74c"}, - {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c5867d40ab716e4684858e4887489685968a47e3ba222e44cde6e4a2154f959"}, - {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395bb9a26111b60141757d874d27fdea01b17e8fac958b91c20128ba8f4acc8a"}, - {file = "jiter-0.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6842184aed5cdb07e0c7e20e5bdcfafe33515ee1741a6835353bb45fe5d1bd95"}, - {file = "jiter-0.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62755d1bcea9876770d4df713d82606c8c1a3dca88ff39046b85a048566d56ea"}, - {file = "jiter-0.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533efbce2cacec78d5ba73a41756beff8431dfa1694b6346ce7af3a12c42202b"}, - {file = "jiter-0.10.0-cp312-cp312-win32.whl", hash = "sha256:8be921f0cadd245e981b964dfbcd6fd4bc4e254cdc069490416dd7a2632ecc01"}, - {file = "jiter-0.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:a7c7d785ae9dda68c2678532a5a1581347e9c15362ae9f6e68f3fdbfb64f2e49"}, - {file = "jiter-0.10.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e0588107ec8e11b6f5ef0e0d656fb2803ac6cf94a96b2b9fc675c0e3ab5e8644"}, - {file = "jiter-0.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cafc4628b616dc32530c20ee53d71589816cf385dd9449633e910d596b1f5c8a"}, - {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:520ef6d981172693786a49ff5b09eda72a42e539f14788124a07530f785c3ad6"}, - {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:554dedfd05937f8fc45d17ebdf298fe7e0c77458232bcb73d9fbbf4c6455f5b3"}, - {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bc299da7789deacf95f64052d97f75c16d4fc8c4c214a22bf8d859a4288a1c2"}, - {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5161e201172de298a8a1baad95eb85db4fb90e902353b1f6a41d64ea64644e25"}, - {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2227db6ba93cb3e2bf67c87e594adde0609f146344e8207e8730364db27041"}, - {file = "jiter-0.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15acb267ea5e2c64515574b06a8bf393fbfee6a50eb1673614aa45f4613c0cca"}, - {file = "jiter-0.10.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:901b92f2e2947dc6dfcb52fd624453862e16665ea909a08398dde19c0731b7f4"}, - {file = "jiter-0.10.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d0cb9a125d5a3ec971a094a845eadde2db0de85b33c9f13eb94a0c63d463879e"}, - {file = "jiter-0.10.0-cp313-cp313-win32.whl", hash = "sha256:48a403277ad1ee208fb930bdf91745e4d2d6e47253eedc96e2559d1e6527006d"}, - {file = "jiter-0.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:75f9eb72ecb640619c29bf714e78c9c46c9c4eaafd644bf78577ede459f330d4"}, - {file = "jiter-0.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:28ed2a4c05a1f32ef0e1d24c2611330219fed727dae01789f4a335617634b1ca"}, - {file = "jiter-0.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14a4c418b1ec86a195f1ca69da8b23e8926c752b685af665ce30777233dfe070"}, - {file = "jiter-0.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d7bfed2fe1fe0e4dda6ef682cee888ba444b21e7a6553e03252e4feb6cf0adca"}, - {file = "jiter-0.10.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:5e9251a5e83fab8d87799d3e1a46cb4b7f2919b895c6f4483629ed2446f66522"}, - {file = "jiter-0.10.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:023aa0204126fe5b87ccbcd75c8a0d0261b9abdbbf46d55e7ae9f8e22424eeb8"}, - {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c189c4f1779c05f75fc17c0c1267594ed918996a231593a21a5ca5438445216"}, - {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15720084d90d1098ca0229352607cd68256c76991f6b374af96f36920eae13c4"}, - {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4f2fb68e5f1cfee30e2b2a09549a00683e0fde4c6a2ab88c94072fc33cb7426"}, - {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce541693355fc6da424c08b7edf39a2895f58d6ea17d92cc2b168d20907dee12"}, - {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31c50c40272e189d50006ad5c73883caabb73d4e9748a688b216e85a9a9ca3b9"}, - {file = "jiter-0.10.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa3402a2ff9815960e0372a47b75c76979d74402448509ccd49a275fa983ef8a"}, - {file = "jiter-0.10.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:1956f934dca32d7bb647ea21d06d93ca40868b505c228556d3373cbd255ce853"}, - {file = "jiter-0.10.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:fcedb049bdfc555e261d6f65a6abe1d5ad68825b7202ccb9692636c70fcced86"}, - {file = "jiter-0.10.0-cp314-cp314-win32.whl", hash = "sha256:ac509f7eccca54b2a29daeb516fb95b6f0bd0d0d8084efaf8ed5dfc7b9f0b357"}, - {file = "jiter-0.10.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5ed975b83a2b8639356151cef5c0d597c68376fc4922b45d0eb384ac058cfa00"}, - {file = "jiter-0.10.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa96f2abba33dc77f79b4cf791840230375f9534e5fac927ccceb58c5e604a5"}, - {file = "jiter-0.10.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bd6292a43c0fc09ce7c154ec0fa646a536b877d1e8f2f96c19707f65355b5a4d"}, - {file = "jiter-0.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:39de429dcaeb6808d75ffe9effefe96a4903c6a4b376b2f6d08d77c1aaee2f18"}, - {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52ce124f13a7a616fad3bb723f2bfb537d78239d1f7f219566dc52b6f2a9e48d"}, - {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:166f3606f11920f9a1746b2eea84fa2c0a5d50fd313c38bdea4edc072000b0af"}, - {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28dcecbb4ba402916034fc14eba7709f250c4d24b0c43fc94d187ee0580af181"}, - {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86c5aa6910f9bebcc7bc4f8bc461aff68504388b43bfe5e5c0bd21efa33b52f4"}, - {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ceeb52d242b315d7f1f74b441b6a167f78cea801ad7c11c36da77ff2d42e8a28"}, - {file = "jiter-0.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ff76d8887c8c8ee1e772274fcf8cc1071c2c58590d13e33bd12d02dc9a560397"}, - {file = "jiter-0.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a9be4d0fa2b79f7222a88aa488bd89e2ae0a0a5b189462a12def6ece2faa45f1"}, - {file = "jiter-0.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ab7fd8738094139b6c1ab1822d6f2000ebe41515c537235fd45dabe13ec9324"}, - {file = "jiter-0.10.0-cp39-cp39-win32.whl", hash = "sha256:5f51e048540dd27f204ff4a87f5d79294ea0aa3aa552aca34934588cf27023cf"}, - {file = "jiter-0.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:1b28302349dc65703a9e4ead16f163b1c339efffbe1049c30a44b001a2a4fff9"}, - {file = "jiter-0.10.0.tar.gz", hash = "sha256:07a7142c38aacc85194391108dc91b5b57093c978a9932bd86a36862759d9500"}, + {file = "jiter-0.12.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e7acbaba9703d5de82a2c98ae6a0f59ab9770ab5af5fa35e43a303aee962cf65"}, + {file = "jiter-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:364f1a7294c91281260364222f535bc427f56d4de1d8ffd718162d21fbbd602e"}, + {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ee4d25805d4fb23f0a5167a962ef8e002dbfb29c0989378488e32cf2744b62"}, + {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:796f466b7942107eb889c08433b6e31b9a7ed31daceaecf8af1be26fb26c0ca8"}, + {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35506cb71f47dba416694e67af996bbdefb8e3608f1f78799c2e1f9058b01ceb"}, + {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:726c764a90c9218ec9e4f99a33d6bf5ec169163f2ca0fc21b654e88c2abc0abc"}, + {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa47810c5565274810b726b0dc86d18dce5fd17b190ebdc3890851d7b2a0e74"}, + {file = "jiter-0.12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8ec0259d3f26c62aed4d73b198c53e316ae11f0f69c8fbe6682c6dcfa0fcce2"}, + {file = "jiter-0.12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:79307d74ea83465b0152fa23e5e297149506435535282f979f18b9033c0bb025"}, + {file = "jiter-0.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cf6e6dd18927121fec86739f1a8906944703941d000f0639f3eb6281cc601dca"}, + {file = "jiter-0.12.0-cp310-cp310-win32.whl", hash = "sha256:b6ae2aec8217327d872cbfb2c1694489057b9433afce447955763e6ab015b4c4"}, + {file = "jiter-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7f49ce90a71e44f7e1aa9e7ec415b9686bbc6a5961e57eab511015e6759bc11"}, + {file = "jiter-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8f8a7e317190b2c2d60eb2e8aa835270b008139562d70fe732e1c0020ec53c9"}, + {file = "jiter-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2218228a077e784c6c8f1a8e5d6b8cb1dea62ce25811c356364848554b2056cd"}, + {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9354ccaa2982bf2188fd5f57f79f800ef622ec67beb8329903abf6b10da7d423"}, + {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2607185ea89b4af9a604d4c7ec40e45d3ad03ee66998b031134bc510232bb7"}, + {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a585a5e42d25f2e71db5f10b171f5e5ea641d3aa44f7df745aa965606111cc2"}, + {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd9e21d34edff5a663c631f850edcb786719c960ce887a5661e9c828a53a95d9"}, + {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a612534770470686cd5431478dc5a1b660eceb410abade6b1b74e320ca98de6"}, + {file = "jiter-0.12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3985aea37d40a908f887b34d05111e0aae822943796ebf8338877fee2ab67725"}, + {file = "jiter-0.12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b1207af186495f48f72529f8d86671903c8c10127cac6381b11dddc4aaa52df6"}, + {file = "jiter-0.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef2fb241de583934c9915a33120ecc06d94aa3381a134570f59eed784e87001e"}, + {file = "jiter-0.12.0-cp311-cp311-win32.whl", hash = "sha256:453b6035672fecce8007465896a25b28a6b59cfe8fbc974b2563a92f5a92a67c"}, + {file = "jiter-0.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:ca264b9603973c2ad9435c71a8ec8b49f8f715ab5ba421c85a51cde9887e421f"}, + {file = "jiter-0.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:cb00ef392e7d684f2754598c02c409f376ddcef857aae796d559e6cacc2d78a5"}, + {file = "jiter-0.12.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:305e061fa82f4680607a775b2e8e0bcb071cd2205ac38e6ef48c8dd5ebe1cf37"}, + {file = "jiter-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c1860627048e302a528333c9307c818c547f214d8659b0705d2195e1a94b274"}, + {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df37577a4f8408f7e0ec3205d2a8f87672af8f17008358063a4d6425b6081ce3"}, + {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:75fdd787356c1c13a4f40b43c2156276ef7a71eb487d98472476476d803fb2cf"}, + {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1eb5db8d9c65b112aacf14fcd0faae9913d07a8afea5ed06ccdd12b724e966a1"}, + {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73c568cc27c473f82480abc15d1301adf333a7ea4f2e813d6a2c7d8b6ba8d0df"}, + {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4321e8a3d868919bcb1abb1db550d41f2b5b326f72df29e53b2df8b006eb9403"}, + {file = "jiter-0.12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a51bad79f8cc9cac2b4b705039f814049142e0050f30d91695a2d9a6611f126"}, + {file = "jiter-0.12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2a67b678f6a5f1dd6c36d642d7db83e456bc8b104788262aaefc11a22339f5a9"}, + {file = "jiter-0.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efe1a211fe1fd14762adea941e3cfd6c611a136e28da6c39272dbb7a1bbe6a86"}, + {file = "jiter-0.12.0-cp312-cp312-win32.whl", hash = "sha256:d779d97c834b4278276ec703dc3fc1735fca50af63eb7262f05bdb4e62203d44"}, + {file = "jiter-0.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e8269062060212b373316fe69236096aaf4c49022d267c6736eebd66bbbc60bb"}, + {file = "jiter-0.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:06cb970936c65de926d648af0ed3d21857f026b1cf5525cb2947aa5e01e05789"}, + {file = "jiter-0.12.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6cc49d5130a14b732e0612bc76ae8db3b49898732223ef8b7599aa8d9810683e"}, + {file = "jiter-0.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:37f27a32ce36364d2fa4f7fdc507279db604d27d239ea2e044c8f148410defe1"}, + {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbc0944aa3d4b4773e348cda635252824a78f4ba44328e042ef1ff3f6080d1cf"}, + {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:da25c62d4ee1ffbacb97fac6dfe4dcd6759ebdc9015991e92a6eae5816287f44"}, + {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:048485c654b838140b007390b8182ba9774621103bd4d77c9c3f6f117474ba45"}, + {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:635e737fbb7315bef0037c19b88b799143d2d7d3507e61a76751025226b3ac87"}, + {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e017c417b1ebda911bd13b1e40612704b1f5420e30695112efdbed8a4b389ed"}, + {file = "jiter-0.12.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:89b0bfb8b2bf2351fba36bb211ef8bfceba73ef58e7f0c68fb67b5a2795ca2f9"}, + {file = "jiter-0.12.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f5aa5427a629a824a543672778c9ce0c5e556550d1569bb6ea28a85015287626"}, + {file = "jiter-0.12.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed53b3d6acbcb0fd0b90f20c7cb3b24c357fe82a3518934d4edfa8c6898e498c"}, + {file = "jiter-0.12.0-cp313-cp313-win32.whl", hash = "sha256:4747de73d6b8c78f2e253a2787930f4fffc68da7fa319739f57437f95963c4de"}, + {file = "jiter-0.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:e25012eb0c456fcc13354255d0338cd5397cce26c77b2832b3c4e2e255ea5d9a"}, + {file = "jiter-0.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:c97b92c54fe6110138c872add030a1f99aea2401ddcdaa21edf74705a646dd60"}, + {file = "jiter-0.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:53839b35a38f56b8be26a7851a48b89bc47e5d88e900929df10ed93b95fea3d6"}, + {file = "jiter-0.12.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94f669548e55c91ab47fef8bddd9c954dab1938644e715ea49d7e117015110a4"}, + {file = "jiter-0.12.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:351d54f2b09a41600ffea43d081522d792e81dcfb915f6d2d242744c1cc48beb"}, + {file = "jiter-0.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2a5e90604620f94bf62264e7c2c038704d38217b7465b863896c6d7c902b06c7"}, + {file = "jiter-0.12.0-cp313-cp313t-win_arm64.whl", hash = "sha256:88ef757017e78d2860f96250f9393b7b577b06a956ad102c29c8237554380db3"}, + {file = "jiter-0.12.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c46d927acd09c67a9fb1416df45c5a04c27e83aae969267e98fba35b74e99525"}, + {file = "jiter-0.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:774ff60b27a84a85b27b88cd5583899c59940bcc126caca97eb2a9df6aa00c49"}, + {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5433fab222fb072237df3f637d01b81f040a07dcac1cb4a5c75c7aa9ed0bef1"}, + {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8c593c6e71c07866ec6bfb790e202a833eeec885022296aff6b9e0b92d6a70e"}, + {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:90d32894d4c6877a87ae00c6b915b609406819dce8bc0d4e962e4de2784e567e"}, + {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:798e46eed9eb10c3adbbacbd3bdb5ecd4cf7064e453d00dbef08802dae6937ff"}, + {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3f1368f0a6719ea80013a4eb90ba72e75d7ea67cfc7846db2ca504f3df0169a"}, + {file = "jiter-0.12.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65f04a9d0b4406f7e51279710b27484af411896246200e461d80d3ba0caa901a"}, + {file = "jiter-0.12.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:fd990541982a24281d12b67a335e44f117e4c6cbad3c3b75c7dea68bf4ce3a67"}, + {file = "jiter-0.12.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:b111b0e9152fa7df870ecaebb0bd30240d9f7fff1f2003bcb4ed0f519941820b"}, + {file = "jiter-0.12.0-cp314-cp314-win32.whl", hash = "sha256:a78befb9cc0a45b5a5a0d537b06f8544c2ebb60d19d02c41ff15da28a9e22d42"}, + {file = "jiter-0.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:e1fe01c082f6aafbe5c8faf0ff074f38dfb911d53f07ec333ca03f8f6226debf"}, + {file = "jiter-0.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:d72f3b5a432a4c546ea4bedc84cce0c3404874f1d1676260b9c7f048a9855451"}, + {file = "jiter-0.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e6ded41aeba3603f9728ed2b6196e4df875348ab97b28fc8afff115ed42ba7a7"}, + {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a947920902420a6ada6ad51892082521978e9dd44a802663b001436e4b771684"}, + {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:add5e227e0554d3a52cf390a7635edaffdf4f8fce4fdbcef3cc2055bb396a30c"}, + {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f9b1cda8fcb736250d7e8711d4580ebf004a46771432be0ae4796944b5dfa5d"}, + {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deeb12a2223fe0135c7ff1356a143d57f95bbf1f4a66584f1fc74df21d86b993"}, + {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c596cc0f4cb574877550ce4ecd51f8037469146addd676d7c1a30ebe6391923f"}, + {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ab4c823b216a4aeab3fdbf579c5843165756bd9ad87cc6b1c65919c4715f783"}, + {file = "jiter-0.12.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:e427eee51149edf962203ff8db75a7514ab89be5cb623fb9cea1f20b54f1107b"}, + {file = "jiter-0.12.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:edb868841f84c111255ba5e80339d386d937ec1fdce419518ce1bd9370fac5b6"}, + {file = "jiter-0.12.0-cp314-cp314t-win32.whl", hash = "sha256:8bbcfe2791dfdb7c5e48baf646d37a6a3dcb5a97a032017741dea9f817dca183"}, + {file = "jiter-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2fa940963bf02e1d8226027ef461e36af472dea85d36054ff835aeed944dd873"}, + {file = "jiter-0.12.0-cp314-cp314t-win_arm64.whl", hash = "sha256:506c9708dd29b27288f9f8f1140c3cb0e3d8ddb045956d7757b1fa0e0f39a473"}, + {file = "jiter-0.12.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c9d28b218d5f9e5f69a0787a196322a5056540cb378cac8ff542b4fa7219966c"}, + {file = "jiter-0.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d0ee12028daf8cfcf880dd492349a122a64f42c059b6c62a2b0c96a83a8da820"}, + {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b135ebe757a82d67ed2821526e72d0acf87dd61f6013e20d3c45b8048af927b"}, + {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15d7fafb81af8a9e3039fc305529a61cd933eecee33b4251878a1c89859552a3"}, + {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92d1f41211d8a8fe412faad962d424d334764c01dac6691c44691c2e4d3eedaf"}, + {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a64a48d7c917b8f32f25c176df8749ecf08cec17c466114727efe7441e17f6d"}, + {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:122046f3b3710b85de99d9aa2f3f0492a8233a2f54a64902b096efc27ea747b5"}, + {file = "jiter-0.12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:27ec39225e03c32c6b863ba879deb427882f243ae46f0d82d68b695fa5b48b40"}, + {file = "jiter-0.12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26b9e155ddc132225a39b1995b3b9f0fe0f79a6d5cbbeacf103271e7d309b404"}, + {file = "jiter-0.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ab05b7c58e29bb9e60b70c2e0094c98df79a1e42e397b9bb6eaa989b7a66dd0"}, + {file = "jiter-0.12.0-cp39-cp39-win32.whl", hash = "sha256:59f9f9df87ed499136db1c2b6c9efb902f964bed42a582ab7af413b6a293e7b0"}, + {file = "jiter-0.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:d3719596a1ebe7a48a498e8d5d0c4bf7553321d4c3eee1d620628d51351a3928"}, + {file = "jiter-0.12.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:4739a4657179ebf08f85914ce50332495811004cc1747852e8b2041ed2aab9b8"}, + {file = "jiter-0.12.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:41da8def934bf7bec16cb24bd33c0ca62126d2d45d81d17b864bd5ad721393c3"}, + {file = "jiter-0.12.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c44ee814f499c082e69872d426b624987dbc5943ab06e9bbaa4f81989fdb79e"}, + {file = "jiter-0.12.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd2097de91cf03eaa27b3cbdb969addf83f0179c6afc41bbc4513705e013c65d"}, + {file = "jiter-0.12.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:e8547883d7b96ef2e5fe22b88f8a4c8725a56e7f4abafff20fd5272d634c7ecb"}, + {file = "jiter-0.12.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:89163163c0934854a668ed783a2546a0617f71706a2551a4a0666d91ab365d6b"}, + {file = "jiter-0.12.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d96b264ab7d34bbb2312dedc47ce07cd53f06835eacbc16dde3761f47c3a9e7f"}, + {file = "jiter-0.12.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24e864cb30ab82311c6425655b0cdab0a98c5d973b065c66a3f020740c2324c"}, + {file = "jiter-0.12.0.tar.gz", hash = "sha256:64dfcd7d5c168b38d3f9f8bba7fc639edb3418abcc74f22fdbe6b8938293f30b"}, ] [[package]] @@ -840,106 +991,159 @@ files = [ {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, ] +[[package]] +name = "langchain" +version = "1.0.7" +description = "Building applications with LLMs through composability" +optional = false +python-versions = "<4.0.0,>=3.10.0" +groups = ["dev"] +files = [ + {file = "langchain-1.0.7-py3-none-any.whl", hash = "sha256:cf33b4d60d7a2ff7f0f313441628927853192cdbab9d6d8ce229909a868bbf12"}, + {file = "langchain-1.0.7.tar.gz", hash = "sha256:e3f8ad742b4cdc91d728f96bd70e4688bc11ffeca3bd160c5fe9937625d541b9"}, +] + +[package.dependencies] +langchain-core = ">=1.0.4,<2.0.0" +langgraph = ">=1.0.2,<1.1.0" +pydantic = ">=2.7.4,<3.0.0" + +[package.extras] +anthropic = ["langchain-anthropic"] +aws = ["langchain-aws"] +azure-ai = ["langchain-azure-ai"] +community = ["langchain-community"] +deepseek = ["langchain-deepseek"] +fireworks = ["langchain-fireworks"] +google-genai = ["langchain-google-genai"] +google-vertexai = ["langchain-google-vertexai"] +groq = ["langchain-groq"] +huggingface = ["langchain-huggingface"] +mistralai = ["langchain-mistralai"] +model-profiles = ["langchain-model-profiles"] +ollama = ["langchain-ollama"] +openai = ["langchain-openai"] +perplexity = ["langchain-perplexity"] +together = ["langchain-together"] +xai = ["langchain-xai"] + +[[package]] +name = "langchain-anthropic" +version = "1.0.4" +description = "Integration package connecting Claude (Anthropic) APIs and LangChain" +optional = false +python-versions = "<4.0.0,>=3.10.0" +groups = ["dev"] +files = [ + {file = "langchain_anthropic-1.0.4-py3-none-any.whl", hash = "sha256:ba3e580ac0691b268082b82280bb898af485b58dbf23a65f27e692c009e543ad"}, + {file = "langchain_anthropic-1.0.4.tar.gz", hash = "sha256:46e2a842755609d4a0e9dcc505779093b1a462b04ee9024cbd751ea6853a8890"}, +] + +[package.dependencies] +anthropic = ">=0.69.0,<1.0.0" +langchain-core = ">=1.0.4,<2.0.0" +pydantic = ">=2.7.4,<3.0.0" + [[package]] name = "langchain-core" -version = "0.3.74" +version = "1.0.5" description = "Building applications with LLMs through composability" optional = false -python-versions = ">=3.9" +python-versions = "<4.0.0,>=3.10.0" groups = ["main", "dev"] files = [ - {file = "langchain_core-0.3.74-py3-none-any.whl", hash = "sha256:088338b5bc2f6a66892f9afc777992c24ee3188f41cbc603d09181e34a228ce7"}, - {file = "langchain_core-0.3.74.tar.gz", hash = "sha256:ff604441aeade942fbcc0a3860a592daba7671345230c2078ba2eb5f82b6ba76"}, + {file = "langchain_core-1.0.5-py3-none-any.whl", hash = "sha256:d24c0cf12cfcd96dd4bd479aa91425f3a6652226cd824228ae422a195067b74e"}, + {file = "langchain_core-1.0.5.tar.gz", hash = "sha256:7ecbad9a60dde626252733a9c18c7377f4468cfe00465ffa99f5e9c6cb9b82d2"}, ] [package.dependencies] -jsonpatch = ">=1.33,<2.0" -langsmith = ">=0.3.45" -packaging = ">=23.2" -pydantic = ">=2.7.4" -PyYAML = ">=5.3" +jsonpatch = ">=1.33.0,<2.0.0" +langsmith = ">=0.3.45,<1.0.0" +packaging = ">=23.2.0,<26.0.0" +pydantic = ">=2.7.4,<3.0.0" +pyyaml = ">=5.3.0,<7.0.0" tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10.0.0" -typing-extensions = ">=4.7" +typing-extensions = ">=4.7.0,<5.0.0" [[package]] name = "langchain-openai" -version = "0.3.30" +version = "0.3.34" description = "An integration package connecting OpenAI and LangChain" optional = false -python-versions = ">=3.9" +python-versions = "<4.0.0,>=3.9.0" groups = ["dev"] files = [ - {file = "langchain_openai-0.3.30-py3-none-any.whl", hash = "sha256:280f1f31004393228e3f75ff8353b1aae86bbc282abc7890a05beb5f43b89923"}, - {file = "langchain_openai-0.3.30.tar.gz", hash = "sha256:90df37509b2dcf5e057f491326fcbf78cf2a71caff5103a5a7de560320171842"}, + {file = "langchain_openai-0.3.34-py3-none-any.whl", hash = "sha256:08d61d68a6d869c70d542171e149b9065668dedfc4fafcd4de8aeb5b933030a9"}, + {file = "langchain_openai-0.3.34.tar.gz", hash = "sha256:57916d462be5b8fd19e5cb2f00d4e5cf0465266a292d583de2fc693a55ba190e"}, ] [package.dependencies] -langchain-core = ">=0.3.74,<1.0.0" -openai = ">=1.99.9,<2.0.0" -tiktoken = ">=0.7,<1" +langchain-core = ">=0.3.77,<2.0.0" +openai = ">=1.104.2,<3.0.0" +tiktoken = ">=0.7.0,<1.0.0" [[package]] name = "langgraph" -version = "0.4.9" +version = "1.0.3" description = "Building stateful, multi-actor applications with LLMs" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "langgraph-0.4.9-py3-none-any.whl", hash = "sha256:03312d769edec311dac3ec9ed83a595f1a74590b9ad141387f1fb006b5b3f753"}, - {file = "langgraph-0.4.9.tar.gz", hash = "sha256:f815d4cc804862fb32c280bb17e634c3f0e88b4e0df1fb6573aebb73fb959a1e"}, + {file = "langgraph-1.0.3-py3-none-any.whl", hash = "sha256:4a75146f09bd0d127a724876f4244f460c4c66353a993641bd641ed710cd010f"}, + {file = "langgraph-1.0.3.tar.gz", hash = "sha256:873a6aae6be054ef52a05c463be363a46da9711405b1b14454d595f543b68335"}, ] [package.dependencies] langchain-core = ">=0.1" -langgraph-checkpoint = ">=2.0.26" -langgraph-prebuilt = ">=0.2.0" -langgraph-sdk = ">=0.1.42" +langgraph-checkpoint = ">=2.1.0,<4.0.0" +langgraph-prebuilt = ">=1.0.2,<1.1.0" +langgraph-sdk = ">=0.2.2,<0.3.0" pydantic = ">=2.7.4" xxhash = ">=3.5.0" [[package]] name = "langgraph-checkpoint" -version = "2.1.0" +version = "3.0.1" description = "Library with base interfaces for LangGraph checkpoint savers." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main", "dev"] files = [ - {file = "langgraph_checkpoint-2.1.0-py3-none-any.whl", hash = "sha256:4cea3e512081da1241396a519cbfe4c5d92836545e2c64e85b6f5c34a1b8bc61"}, - {file = "langgraph_checkpoint-2.1.0.tar.gz", hash = "sha256:cdaa2f0b49aa130ab185c02d82f02b40299a1fbc9ac59ac20cecce09642a1abe"}, + {file = "langgraph_checkpoint-3.0.1-py3-none-any.whl", hash = "sha256:9b04a8d0edc0474ce4eaf30c5d731cee38f11ddff50a6177eead95b5c4e4220b"}, + {file = "langgraph_checkpoint-3.0.1.tar.gz", hash = "sha256:59222f875f85186a22c494aedc65c4e985a3df27e696e5016ba0b98a5ed2cee0"}, ] [package.dependencies] langchain-core = ">=0.2.38" -ormsgpack = ">=1.10.0" +ormsgpack = ">=1.12.0" [[package]] name = "langgraph-prebuilt" -version = "0.2.2" +version = "1.0.4" description = "Library with high-level APIs for creating and executing LangGraph agents and tools." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "langgraph_prebuilt-0.2.2-py3-none-any.whl", hash = "sha256:72de5ef1d969a8f02ad7adc7cc1915bb9b4467912d57ba60da34b5a70fdad1f6"}, - {file = "langgraph_prebuilt-0.2.2.tar.gz", hash = "sha256:0a5d1f651f97c848cd1c3dd0ef017614f47ee74effb7375b59ac639e41b253f9"}, + {file = "langgraph_prebuilt-1.0.4-py3-none-any.whl", hash = "sha256:50b1aa2b434783b6da30785568cf7155136b484750cc2ec695c0d4255db08262"}, + {file = "langgraph_prebuilt-1.0.4.tar.gz", hash = "sha256:7b4f9e97a146d2d625695c3549bdb432974b80817165139ec2ec869721e72c0f"}, ] [package.dependencies] -langchain-core = ">=0.3.22" -langgraph-checkpoint = ">=2.0.10" +langchain-core = ">=1.0.0" +langgraph-checkpoint = ">=2.1.0,<4.0.0" [[package]] name = "langgraph-sdk" -version = "0.1.70" +version = "0.2.9" description = "SDK for interacting with LangGraph API" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "langgraph_sdk-0.1.70-py3-none-any.whl", hash = "sha256:47f2b04a964f40a610c1636b387ea52f961ce7a233afc21d3103e5faac8ca1e5"}, - {file = "langgraph_sdk-0.1.70.tar.gz", hash = "sha256:cc65ec33bcdf8c7008d43da2d2b0bc1dd09f98d21a7f636828d9379535069cf9"}, + {file = "langgraph_sdk-0.2.9-py3-none-any.whl", hash = "sha256:fbf302edadbf0fb343596f91c597794e936ef68eebc0d3e1d358b6f9f72a1429"}, + {file = "langgraph_sdk-0.2.9.tar.gz", hash = "sha256:b3bd04c6be4fa382996cd2be8fbc1e7cc94857d2bc6b6f4599a7f2a245975303"}, ] [package.dependencies] @@ -947,110 +1151,107 @@ httpx = ">=0.25.2" orjson = ">=3.10.1" [[package]] -name = "langsmith" -version = "0.4.2" -description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." +name = "langmem" +version = "0.0.30" +description = "Prebuilt utilities for memory management and retrieval." optional = false -python-versions = ">=3.9" -groups = ["main", "dev"] +python-versions = ">=3.10" +groups = ["dev"] files = [ - {file = "langsmith-0.4.2-py3-none-any.whl", hash = "sha256:2b1a3f889e134546dc5d67e23e5e8c6be5f91fd86827276ac874e3a25a04498a"}, - {file = "langsmith-0.4.2.tar.gz", hash = "sha256:51df086a9ae17ffa16538f52ef3bb8b3d85b0e52c84958980553cb6cadd9e565"}, + {file = "langmem-0.0.30-py3-none-any.whl", hash = "sha256:142f040014493eebd67e1055c0642f9ab38868b5b1fde5c8f2d39add57f4ba5b"}, + {file = "langmem-0.0.30.tar.gz", hash = "sha256:4e27920979f8253a96d279f4f97b1aebbfb49e95a46d5269433488ed044756e1"}, ] [package.dependencies] -httpx = ">=0.23.0,<1" -orjson = {version = ">=3.9.14,<4.0.0", markers = "platform_python_implementation != \"PyPy\""} -packaging = ">=23.2" -pydantic = [ - {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, - {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, -] -requests = ">=2,<3" -requests-toolbelt = ">=1.0.0,<2.0.0" -zstandard = ">=0.23.0,<0.24.0" - -[package.extras] -langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2,<0.2.0)"] -openai-agents = ["openai-agents (>=0.0.3,<0.1)"] -otel = ["opentelemetry-api (>=1.30.0,<2.0.0)", "opentelemetry-exporter-otlp-proto-http (>=1.30.0,<2.0.0)", "opentelemetry-sdk (>=1.30.0,<2.0.0)"] -pytest = ["pytest (>=7.0.0)", "rich (>=13.9.4,<14.0.0)"] +langchain = ">=0.3.15" +langchain-anthropic = ">=0.3.3" +langchain-core = ">=0.3.46" +langchain-openai = ">=0.3.1" +langgraph = ">=0.6.0,<2" +langgraph-checkpoint = ">=2.0.12" +langsmith = ">=0.3.8" +trustcall = ">=0.0.39" [[package]] -name = "ml-dtypes" -version = "0.4.1" -description = "" +name = "langsmith" +version = "0.4.43" +description = "Client library to connect to the LangSmith Observability and Evaluation Platform." optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "python_version >= \"3.13\"" -files = [ - {file = "ml_dtypes-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1fe8b5b5e70cd67211db94b05cfd58dace592f24489b038dc6f9fe347d2e07d5"}, - {file = "ml_dtypes-0.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c09a6d11d8475c2a9fd2bc0695628aec105f97cab3b3a3fb7c9660348ff7d24"}, - {file = "ml_dtypes-0.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5e8f75fa371020dd30f9196e7d73babae2abd51cf59bdd56cb4f8de7e13354"}, - {file = "ml_dtypes-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:15fdd922fea57e493844e5abb930b9c0bd0af217d9edd3724479fc3d7ce70e3f"}, - {file = "ml_dtypes-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2d55b588116a7085d6e074cf0cdb1d6fa3875c059dddc4d2c94a4cc81c23e975"}, - {file = "ml_dtypes-0.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e138a9b7a48079c900ea969341a5754019a1ad17ae27ee330f7ebf43f23877f9"}, - {file = "ml_dtypes-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74c6cfb5cf78535b103fde9ea3ded8e9f16f75bc07789054edc7776abfb3d752"}, - {file = "ml_dtypes-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:274cc7193dd73b35fb26bef6c5d40ae3eb258359ee71cd82f6e96a8c948bdaa6"}, - {file = "ml_dtypes-0.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:827d3ca2097085cf0355f8fdf092b888890bb1b1455f52801a2d7756f056f54b"}, - {file = "ml_dtypes-0.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:772426b08a6172a891274d581ce58ea2789cc8abc1c002a27223f314aaf894e7"}, - {file = "ml_dtypes-0.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:126e7d679b8676d1a958f2651949fbfa182832c3cd08020d8facd94e4114f3e9"}, - {file = "ml_dtypes-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:df0fb650d5c582a9e72bb5bd96cfebb2cdb889d89daff621c8fbc60295eba66c"}, - {file = "ml_dtypes-0.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e35e486e97aee577d0890bc3bd9e9f9eece50c08c163304008587ec8cfe7575b"}, - {file = "ml_dtypes-0.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:560be16dc1e3bdf7c087eb727e2cf9c0e6a3d87e9f415079d2491cc419b3ebf5"}, - {file = "ml_dtypes-0.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad0b757d445a20df39035c4cdeed457ec8b60d236020d2560dbc25887533cf50"}, - {file = "ml_dtypes-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:ef0d7e3fece227b49b544fa69e50e607ac20948f0043e9f76b44f35f229ea450"}, - {file = "ml_dtypes-0.4.1.tar.gz", hash = "sha256:fad5f2de464fd09127e49b7fd1252b9006fb43d2edc1ff112d390c324af5ca7a"}, +python-versions = ">=3.10" +groups = ["main", "dev"] +files = [ + {file = "langsmith-0.4.43-py3-none-any.whl", hash = "sha256:c97846a0b15061bc15844aac32fd1ce4a8e50983905f80a0d6079bb41b112ae3"}, + {file = "langsmith-0.4.43.tar.gz", hash = "sha256:75c2468ab740438adfb32af8595ad8837c3af2bd1cdaf057d534182c5a07407a"}, ] [package.dependencies] -numpy = {version = ">=1.26.0", markers = "python_version >= \"3.12\""} +httpx = ">=0.23.0,<1" +orjson = {version = ">=3.9.14", markers = "platform_python_implementation != \"PyPy\""} +packaging = ">=23.2" +pydantic = ">=1,<3" +requests = ">=2.0.0" +requests-toolbelt = ">=1.0.0" +zstandard = ">=0.23.0" [package.extras] -dev = ["absl-py", "pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist"] +claude-agent-sdk = ["claude-agent-sdk (>=0.1.0)"] +langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2)"] +openai-agents = ["openai-agents (>=0.0.3)"] +otel = ["opentelemetry-api (>=1.30.0)", "opentelemetry-exporter-otlp-proto-http (>=1.30.0)", "opentelemetry-sdk (>=1.30.0)"] +pytest = ["pytest (>=7.0.0)", "rich (>=13.9.4)", "vcrpy (>=7.0.0)"] +vcr = ["vcrpy (>=7.0.0)"] [[package]] name = "ml-dtypes" -version = "0.5.1" -description = "" +version = "0.5.3" +description = "ml_dtypes is a stand-alone implementation of several NumPy dtype extensions used in machine learning." optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version < \"3.13\"" -files = [ - {file = "ml_dtypes-0.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bd73f51957949069573ff783563486339a9285d72e2f36c18e0c1aa9ca7eb190"}, - {file = "ml_dtypes-0.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:810512e2eccdfc3b41eefa3a27402371a3411453a1efc7e9c000318196140fed"}, - {file = "ml_dtypes-0.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:141b2ea2f20bb10802ddca55d91fe21231ef49715cfc971998e8f2a9838f3dbe"}, - {file = "ml_dtypes-0.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:26ebcc69d7b779c8f129393e99732961b5cc33fcff84090451f448c89b0e01b4"}, - {file = "ml_dtypes-0.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:023ce2f502efd4d6c1e0472cc58ce3640d051d40e71e27386bed33901e201327"}, - {file = "ml_dtypes-0.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7000b6e4d8ef07542c05044ec5d8bbae1df083b3f56822c3da63993a113e716f"}, - {file = "ml_dtypes-0.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c09526488c3a9e8b7a23a388d4974b670a9a3dd40c5c8a61db5593ce9b725bab"}, - {file = "ml_dtypes-0.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:15ad0f3b0323ce96c24637a88a6f44f6713c64032f27277b069f285c3cf66478"}, - {file = "ml_dtypes-0.5.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6f462f5eca22fb66d7ff9c4744a3db4463af06c49816c4b6ac89b16bfcdc592e"}, - {file = "ml_dtypes-0.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f76232163b5b9c34291b54621ee60417601e2e4802a188a0ea7157cd9b323f4"}, - {file = "ml_dtypes-0.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4953c5eb9c25a56d11a913c2011d7e580a435ef5145f804d98efa14477d390"}, - {file = "ml_dtypes-0.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:9626d0bca1fb387d5791ca36bacbba298c5ef554747b7ebeafefb4564fc83566"}, - {file = "ml_dtypes-0.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:12651420130ee7cc13059fc56dac6ad300c3af3848b802d475148c9defd27c23"}, - {file = "ml_dtypes-0.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9945669d3dadf8acb40ec2e57d38c985d8c285ea73af57fc5b09872c516106d"}, - {file = "ml_dtypes-0.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf9975bda82a99dc935f2ae4c83846d86df8fd6ba179614acac8e686910851da"}, - {file = "ml_dtypes-0.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:fd918d4e6a4e0c110e2e05be7a7814d10dc1b95872accbf6512b80a109b71ae1"}, - {file = "ml_dtypes-0.5.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:05f23447a1c20ddf4dc7c2c661aa9ed93fcb2658f1017c204d1e758714dc28a8"}, - {file = "ml_dtypes-0.5.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b7fbe5571fdf28fd3aaab3ef4aafc847de9ebf263be959958c1ca58ec8eadf5"}, - {file = "ml_dtypes-0.5.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d13755f8e8445b3870114e5b6240facaa7cb0c3361e54beba3e07fa912a6e12b"}, - {file = "ml_dtypes-0.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b8a9d46b4df5ae2135a8e8e72b465448ebbc1559997f4f9304a9ecc3413efb5b"}, - {file = "ml_dtypes-0.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afb2009ac98da274e893e03162f6269398b2b00d947e7057ee2469a921d58135"}, - {file = "ml_dtypes-0.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aefedc579ece2f8fb38f876aa7698204ee4c372d0e54f1c1ffa8ca580b54cc60"}, - {file = "ml_dtypes-0.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:8f2c028954f16ede77902b223a8da2d9cbb3892375b85809a5c3cfb1587960c4"}, - {file = "ml_dtypes-0.5.1.tar.gz", hash = "sha256:ac5b58559bb84a95848ed6984eb8013249f90b6bab62aa5acbad876e256002c9"}, +files = [ + {file = "ml_dtypes-0.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0a1d68a7cb53e3f640b2b6a34d12c0542da3dd935e560fdf463c0c77f339fc20"}, + {file = "ml_dtypes-0.5.3-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cd5a6c711b5350f3cbc2ac28def81cd1c580075ccb7955e61e9d8f4bfd40d24"}, + {file = "ml_dtypes-0.5.3-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdcf26c2dbc926b8a35ec8cbfad7eff1a8bd8239e12478caca83a1fc2c400dc2"}, + {file = "ml_dtypes-0.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:aecbd7c5272c82e54d5b99d8435fd10915d1bc704b7df15e4d9ca8dc3902be61"}, + {file = "ml_dtypes-0.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4a177b882667c69422402df6ed5c3428ce07ac2c1f844d8a1314944651439458"}, + {file = "ml_dtypes-0.5.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9849ce7267444c0a717c80c6900997de4f36e2815ce34ac560a3edb2d9a64cd2"}, + {file = "ml_dtypes-0.5.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c3f5ae0309d9f888fd825c2e9d0241102fadaca81d888f26f845bc8c13c1e4ee"}, + {file = "ml_dtypes-0.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:58e39349d820b5702bb6f94ea0cb2dc8ec62ee81c0267d9622067d8333596a46"}, + {file = "ml_dtypes-0.5.3-cp311-cp311-win_arm64.whl", hash = "sha256:66c2756ae6cfd7f5224e355c893cfd617fa2f747b8bbd8996152cbdebad9a184"}, + {file = "ml_dtypes-0.5.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:156418abeeda48ea4797db6776db3c5bdab9ac7be197c1233771e0880c304057"}, + {file = "ml_dtypes-0.5.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1db60c154989af253f6c4a34e8a540c2c9dce4d770784d426945e09908fbb177"}, + {file = "ml_dtypes-0.5.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1b255acada256d1fa8c35ed07b5f6d18bc21d1556f842fbc2d5718aea2cd9e55"}, + {file = "ml_dtypes-0.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:da65e5fd3eea434ccb8984c3624bc234ddcc0d9f4c81864af611aaebcc08a50e"}, + {file = "ml_dtypes-0.5.3-cp312-cp312-win_arm64.whl", hash = "sha256:8bb9cd1ce63096567f5f42851f5843b5a0ea11511e50039a7649619abfb4ba6d"}, + {file = "ml_dtypes-0.5.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5103856a225465371fe119f2fef737402b705b810bd95ad5f348e6e1a6ae21af"}, + {file = "ml_dtypes-0.5.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cae435a68861660af81fa3c5af16b70ca11a17275c5b662d9c6f58294e0f113"}, + {file = "ml_dtypes-0.5.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6936283b56d74fbec431ca57ce58a90a908fdbd14d4e2d22eea6d72bb208a7b7"}, + {file = "ml_dtypes-0.5.3-cp313-cp313-win_amd64.whl", hash = "sha256:d0f730a17cf4f343b2c7ad50cee3bd19e969e793d2be6ed911f43086460096e4"}, + {file = "ml_dtypes-0.5.3-cp313-cp313-win_arm64.whl", hash = "sha256:2db74788fc01914a3c7f7da0763427280adfc9cd377e9604b6b64eb8097284bd"}, + {file = "ml_dtypes-0.5.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:93c36a08a6d158db44f2eb9ce3258e53f24a9a4a695325a689494f0fdbc71770"}, + {file = "ml_dtypes-0.5.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0e44a3761f64bc009d71ddb6d6c71008ba21b53ab6ee588dadab65e2fa79eafc"}, + {file = "ml_dtypes-0.5.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdf40d2aaabd3913dec11840f0d0ebb1b93134f99af6a0a4fd88ffe924928ab4"}, + {file = "ml_dtypes-0.5.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:aec640bd94c4c85c0d11e2733bd13cbb10438fb004852996ec0efbc6cacdaf70"}, + {file = "ml_dtypes-0.5.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bda32ce212baa724e03c68771e5c69f39e584ea426bfe1a701cb01508ffc7035"}, + {file = "ml_dtypes-0.5.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c205cac07d24a29840c163d6469f61069ce4b065518519216297fc2f261f8db9"}, + {file = "ml_dtypes-0.5.3-cp314-cp314-win_amd64.whl", hash = "sha256:cd7c0bb22d4ff86d65ad61b5dd246812e8993fbc95b558553624c33e8b6903ea"}, + {file = "ml_dtypes-0.5.3-cp314-cp314-win_arm64.whl", hash = "sha256:9d55ea7f7baf2aed61bf1872116cefc9d0c3693b45cae3916897ee27ef4b835e"}, + {file = "ml_dtypes-0.5.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:e12e29764a0e66a7a31e9b8bf1de5cc0423ea72979f45909acd4292de834ccd3"}, + {file = "ml_dtypes-0.5.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19f6c3a4f635c2fc9e2aa7d91416bd7a3d649b48350c51f7f715a09370a90d93"}, + {file = "ml_dtypes-0.5.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ab039ffb40f3dc0aeeeba84fd6c3452781b5e15bef72e2d10bcb33e4bbffc39"}, + {file = "ml_dtypes-0.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5ee72568d46b9533ad54f78b1e1f3067c0534c5065120ea8ecc6f210d22748b3"}, + {file = "ml_dtypes-0.5.3-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:01de48de4537dc3c46e684b969a40ec36594e7eeb7c69e9a093e7239f030a28a"}, + {file = "ml_dtypes-0.5.3-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8b1a6e231b0770f2894910f1dce6d2f31d65884dbf7668f9b08d73623cdca909"}, + {file = "ml_dtypes-0.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:a4f39b9bf6555fab9bfb536cf5fdd1c1c727e8d22312078702e9ff005354b37f"}, + {file = "ml_dtypes-0.5.3.tar.gz", hash = "sha256:95ce33057ba4d05df50b1f3cfefab22e351868a843b3b15a46c65836283670c9"}, ] [package.dependencies] numpy = [ + {version = ">=2.1.0", markers = "python_version >= \"3.13\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\" and python_version < \"3.13\""}, {version = ">=1.23.3", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, {version = ">=1.21.2", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, - {version = ">=1.21", markers = "python_version < \"3.10\""}, ] [package.extras] @@ -1058,44 +1259,50 @@ dev = ["absl-py", "pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist"] [[package]] name = "mypy" -version = "1.16.1" +version = "1.18.2" description = "Optional static typing for Python" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "mypy-1.16.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b4f0fed1022a63c6fec38f28b7fc77fca47fd490445c69d0a66266c59dd0b88a"}, - {file = "mypy-1.16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86042bbf9f5a05ea000d3203cf87aa9d0ccf9a01f73f71c58979eb9249f46d72"}, - {file = "mypy-1.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ea7469ee5902c95542bea7ee545f7006508c65c8c54b06dc2c92676ce526f3ea"}, - {file = "mypy-1.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:352025753ef6a83cb9e7f2427319bb7875d1fdda8439d1e23de12ab164179574"}, - {file = "mypy-1.16.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ff9fa5b16e4c1364eb89a4d16bcda9987f05d39604e1e6c35378a2987c1aac2d"}, - {file = "mypy-1.16.1-cp310-cp310-win_amd64.whl", hash = "sha256:1256688e284632382f8f3b9e2123df7d279f603c561f099758e66dd6ed4e8bd6"}, - {file = "mypy-1.16.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:472e4e4c100062488ec643f6162dd0d5208e33e2f34544e1fc931372e806c0cc"}, - {file = "mypy-1.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea16e2a7d2714277e349e24d19a782a663a34ed60864006e8585db08f8ad1782"}, - {file = "mypy-1.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08e850ea22adc4d8a4014651575567b0318ede51e8e9fe7a68f25391af699507"}, - {file = "mypy-1.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22d76a63a42619bfb90122889b903519149879ddbf2ba4251834727944c8baca"}, - {file = "mypy-1.16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c7ce0662b6b9dc8f4ed86eb7a5d505ee3298c04b40ec13b30e572c0e5ae17c4"}, - {file = "mypy-1.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:211287e98e05352a2e1d4e8759c5490925a7c784ddc84207f4714822f8cf99b6"}, - {file = "mypy-1.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:af4792433f09575d9eeca5c63d7d90ca4aeceda9d8355e136f80f8967639183d"}, - {file = "mypy-1.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66df38405fd8466ce3517eda1f6640611a0b8e70895e2a9462d1d4323c5eb4b9"}, - {file = "mypy-1.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44e7acddb3c48bd2713994d098729494117803616e116032af192871aed80b79"}, - {file = "mypy-1.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ab5eca37b50188163fa7c1b73c685ac66c4e9bdee4a85c9adac0e91d8895e15"}, - {file = "mypy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb6229b2c9086247e21a83c309754b9058b438704ad2f6807f0d8227f6ebdd"}, - {file = "mypy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:1f0435cf920e287ff68af3d10a118a73f212deb2ce087619eb4e648116d1fe9b"}, - {file = "mypy-1.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ddc91eb318c8751c69ddb200a5937f1232ee8efb4e64e9f4bc475a33719de438"}, - {file = "mypy-1.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:87ff2c13d58bdc4bbe7dc0dedfe622c0f04e2cb2a492269f3b418df2de05c536"}, - {file = "mypy-1.16.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a7cfb0fe29fe5a9841b7c8ee6dffb52382c45acdf68f032145b75620acfbd6f"}, - {file = "mypy-1.16.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:051e1677689c9d9578b9c7f4d206d763f9bbd95723cd1416fad50db49d52f359"}, - {file = "mypy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d5d2309511cc56c021b4b4e462907c2b12f669b2dbeb68300110ec27723971be"}, - {file = "mypy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:4f58ac32771341e38a853c5d0ec0dfe27e18e27da9cdb8bbc882d2249c71a3ee"}, - {file = "mypy-1.16.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7fc688329af6a287567f45cc1cefb9db662defeb14625213a5b7da6e692e2069"}, - {file = "mypy-1.16.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e198ab3f55924c03ead626ff424cad1732d0d391478dfbf7bb97b34602395da"}, - {file = "mypy-1.16.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09aa4f91ada245f0a45dbc47e548fd94e0dd5a8433e0114917dc3b526912a30c"}, - {file = "mypy-1.16.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13c7cd5b1cb2909aa318a90fd1b7e31f17c50b242953e7dd58345b2a814f6383"}, - {file = "mypy-1.16.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:58e07fb958bc5d752a280da0e890c538f1515b79a65757bbdc54252ba82e0b40"}, - {file = "mypy-1.16.1-cp39-cp39-win_amd64.whl", hash = "sha256:f895078594d918f93337a505f8add9bd654d1a24962b4c6ed9390e12531eb31b"}, - {file = "mypy-1.16.1-py3-none-any.whl", hash = "sha256:5fc2ac4027d0ef28d6ba69a0343737a23c4d1b83672bf38d1fe237bdc0643b37"}, - {file = "mypy-1.16.1.tar.gz", hash = "sha256:6bd00a0a2094841c5e47e7374bb42b83d64c527a502e3334e1173a0c24437bab"}, + {file = "mypy-1.18.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1eab0cf6294dafe397c261a75f96dc2c31bffe3b944faa24db5def4e2b0f77c"}, + {file = "mypy-1.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a780ca61fc239e4865968ebc5240bb3bf610ef59ac398de9a7421b54e4a207e"}, + {file = "mypy-1.18.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:448acd386266989ef11662ce3c8011fd2a7b632e0ec7d61a98edd8e27472225b"}, + {file = "mypy-1.18.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f9e171c465ad3901dc652643ee4bffa8e9fef4d7d0eece23b428908c77a76a66"}, + {file = "mypy-1.18.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:592ec214750bc00741af1f80cbf96b5013d81486b7bb24cb052382c19e40b428"}, + {file = "mypy-1.18.2-cp310-cp310-win_amd64.whl", hash = "sha256:7fb95f97199ea11769ebe3638c29b550b5221e997c63b14ef93d2e971606ebed"}, + {file = "mypy-1.18.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:807d9315ab9d464125aa9fcf6d84fde6e1dc67da0b6f80e7405506b8ac72bc7f"}, + {file = "mypy-1.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:776bb00de1778caf4db739c6e83919c1d85a448f71979b6a0edd774ea8399341"}, + {file = "mypy-1.18.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1379451880512ffce14505493bd9fe469e0697543717298242574882cf8cdb8d"}, + {file = "mypy-1.18.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1331eb7fd110d60c24999893320967594ff84c38ac6d19e0a76c5fd809a84c86"}, + {file = "mypy-1.18.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ca30b50a51e7ba93b00422e486cbb124f1c56a535e20eff7b2d6ab72b3b2e37"}, + {file = "mypy-1.18.2-cp311-cp311-win_amd64.whl", hash = "sha256:664dc726e67fa54e14536f6e1224bcfce1d9e5ac02426d2326e2bb4e081d1ce8"}, + {file = "mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34"}, + {file = "mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764"}, + {file = "mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893"}, + {file = "mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914"}, + {file = "mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8"}, + {file = "mypy-1.18.2-cp312-cp312-win_amd64.whl", hash = "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074"}, + {file = "mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc"}, + {file = "mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e"}, + {file = "mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986"}, + {file = "mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d"}, + {file = "mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba"}, + {file = "mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544"}, + {file = "mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce"}, + {file = "mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d"}, + {file = "mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c"}, + {file = "mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb"}, + {file = "mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075"}, + {file = "mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf"}, + {file = "mypy-1.18.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25a9c8fb67b00599f839cf472713f54249a62efd53a54b565eb61956a7e3296b"}, + {file = "mypy-1.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2b9c7e284ee20e7598d6f42e13ca40b4928e6957ed6813d1ab6348aa3f47133"}, + {file = "mypy-1.18.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d6985ed057513e344e43a26cc1cd815c7a94602fb6a3130a34798625bc2f07b6"}, + {file = "mypy-1.18.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22f27105f1525ec024b5c630c0b9f36d5c1cc4d447d61fe51ff4bd60633f47ac"}, + {file = "mypy-1.18.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:030c52d0ea8144e721e49b1f68391e39553d7451f0c3f8a7565b59e19fcb608b"}, + {file = "mypy-1.18.2-cp39-cp39-win_amd64.whl", hash = "sha256:aa5e07ac1a60a253445797e42b8b2963c9675563a94f11291ab40718b016a7a0"}, + {file = "mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e"}, + {file = "mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b"}, ] [package.dependencies] @@ -1125,230 +1332,262 @@ files = [ [[package]] name = "numpy" -version = "2.0.2" +version = "2.2.6" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, - {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, - {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"}, - {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"}, - {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"}, - {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"}, - {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"}, - {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"}, - {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"}, - {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"}, - {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"}, - {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"}, - {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"}, - {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"}, - {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"}, - {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"}, - {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"}, - {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"}, - {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"}, - {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"}, - {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"}, - {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"}, - {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"}, - {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"}, - {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"}, - {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"}, - {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"}, - {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"}, - {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"}, - {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"}, - {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"}, - {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"}, - {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"}, - {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"}, - {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"}, - {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"}, - {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"}, - {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"}, - {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"}, - {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"}, - {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"}, - {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"}, - {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"}, - {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"}, - {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf"}, + {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83"}, + {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915"}, + {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680"}, + {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289"}, + {file = "numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d"}, + {file = "numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491"}, + {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a"}, + {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf"}, + {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1"}, + {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab"}, + {file = "numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47"}, + {file = "numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282"}, + {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87"}, + {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249"}, + {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49"}, + {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de"}, + {file = "numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4"}, + {file = "numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566"}, + {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f"}, + {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f"}, + {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868"}, + {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d"}, + {file = "numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd"}, + {file = "numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8"}, + {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f"}, + {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa"}, + {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571"}, + {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1"}, + {file = "numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff"}, + {file = "numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00"}, + {file = "numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd"}, ] [[package]] name = "openai" -version = "1.99.9" +version = "2.8.0" description = "The official Python library for the openai API" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "openai-1.99.9-py3-none-any.whl", hash = "sha256:9dbcdb425553bae1ac5d947147bebbd630d91bbfc7788394d4c4f3a35682ab3a"}, - {file = "openai-1.99.9.tar.gz", hash = "sha256:f2082d155b1ad22e83247c3de3958eb4255b20ccf4a1de2e6681b6957b554e92"}, + {file = "openai-2.8.0-py3-none-any.whl", hash = "sha256:ba975e347f6add2fe13529ccb94d54a578280e960765e5224c34b08d7e029ddf"}, + {file = "openai-2.8.0.tar.gz", hash = "sha256:4851908f6d6fcacbd47ba659c5ac084f7725b752b6bfa1e948b6fbfc111a6bad"}, ] [package.dependencies] anyio = ">=3.5.0,<5" distro = ">=1.7.0,<2" httpx = ">=0.23.0,<1" -jiter = ">=0.4.0,<1" +jiter = ">=0.10.0,<1" pydantic = ">=1.9.0,<3" sniffio = "*" tqdm = ">4" typing-extensions = ">=4.11,<5" [package.extras] -aiohttp = ["aiohttp", "httpx-aiohttp (>=0.1.8)"] +aiohttp = ["aiohttp", "httpx-aiohttp (>=0.1.9)"] datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] realtime = ["websockets (>=13,<16)"] voice-helpers = ["numpy (>=2.0.2)", "sounddevice (>=0.5.1)"] [[package]] name = "orjson" -version = "3.10.18" +version = "3.11.4" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "orjson-3.10.18-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a45e5d68066b408e4bc383b6e4ef05e717c65219a9e1390abc6155a520cac402"}, - {file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be3b9b143e8b9db05368b13b04c84d37544ec85bb97237b3a923f076265ec89c"}, - {file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9b0aa09745e2c9b3bf779b096fa71d1cc2d801a604ef6dd79c8b1bfef52b2f92"}, - {file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53a245c104d2792e65c8d225158f2b8262749ffe64bc7755b00024757d957a13"}, - {file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9495ab2611b7f8a0a8a505bcb0f0cbdb5469caafe17b0e404c3c746f9900469"}, - {file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73be1cbcebadeabdbc468f82b087df435843c809cd079a565fb16f0f3b23238f"}, - {file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8936ee2679e38903df158037a2f1c108129dee218975122e37847fb1d4ac68"}, - {file = "orjson-3.10.18-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7115fcbc8525c74e4c2b608129bef740198e9a120ae46184dac7683191042056"}, - {file = "orjson-3.10.18-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:771474ad34c66bc4d1c01f645f150048030694ea5b2709b87d3bda273ffe505d"}, - {file = "orjson-3.10.18-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7c14047dbbea52886dd87169f21939af5d55143dad22d10db6a7514f058156a8"}, - {file = "orjson-3.10.18-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:641481b73baec8db14fdf58f8967e52dc8bda1f2aba3aa5f5c1b07ed6df50b7f"}, - {file = "orjson-3.10.18-cp310-cp310-win32.whl", hash = "sha256:607eb3ae0909d47280c1fc657c4284c34b785bae371d007595633f4b1a2bbe06"}, - {file = "orjson-3.10.18-cp310-cp310-win_amd64.whl", hash = "sha256:8770432524ce0eca50b7efc2a9a5f486ee0113a5fbb4231526d414e6254eba92"}, - {file = "orjson-3.10.18-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e0a183ac3b8e40471e8d843105da6fbe7c070faab023be3b08188ee3f85719b8"}, - {file = "orjson-3.10.18-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:5ef7c164d9174362f85238d0cd4afdeeb89d9e523e4651add6a5d458d6f7d42d"}, - {file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd14c5d99cdc7bf93f22b12ec3b294931518aa019e2a147e8aa2f31fd3240f7"}, - {file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7b672502323b6cd133c4af6b79e3bea36bad2d16bca6c1f645903fce83909a7a"}, - {file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51f8c63be6e070ec894c629186b1c0fe798662b8687f3d9fdfa5e401c6bd7679"}, - {file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f9478ade5313d724e0495d167083c6f3be0dd2f1c9c8a38db9a9e912cdaf947"}, - {file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:187aefa562300a9d382b4b4eb9694806e5848b0cedf52037bb5c228c61bb66d4"}, - {file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9da552683bc9da222379c7a01779bddd0ad39dd699dd6300abaf43eadee38334"}, - {file = "orjson-3.10.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e450885f7b47a0231979d9c49b567ed1c4e9f69240804621be87c40bc9d3cf17"}, - {file = "orjson-3.10.18-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5e3c9cc2ba324187cd06287ca24f65528f16dfc80add48dc99fa6c836bb3137e"}, - {file = "orjson-3.10.18-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:50ce016233ac4bfd843ac5471e232b865271d7d9d44cf9d33773bcd883ce442b"}, - {file = "orjson-3.10.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b3ceff74a8f7ffde0b2785ca749fc4e80e4315c0fd887561144059fb1c138aa7"}, - {file = "orjson-3.10.18-cp311-cp311-win32.whl", hash = "sha256:fdba703c722bd868c04702cac4cb8c6b8ff137af2623bc0ddb3b3e6a2c8996c1"}, - {file = "orjson-3.10.18-cp311-cp311-win_amd64.whl", hash = "sha256:c28082933c71ff4bc6ccc82a454a2bffcef6e1d7379756ca567c772e4fb3278a"}, - {file = "orjson-3.10.18-cp311-cp311-win_arm64.whl", hash = "sha256:a6c7c391beaedd3fa63206e5c2b7b554196f14debf1ec9deb54b5d279b1b46f5"}, - {file = "orjson-3.10.18-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:50c15557afb7f6d63bc6d6348e0337a880a04eaa9cd7c9d569bcb4e760a24753"}, - {file = "orjson-3.10.18-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:356b076f1662c9813d5fa56db7d63ccceef4c271b1fb3dd522aca291375fcf17"}, - {file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:559eb40a70a7494cd5beab2d73657262a74a2c59aff2068fdba8f0424ec5b39d"}, - {file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f3c29eb9a81e2fbc6fd7ddcfba3e101ba92eaff455b8d602bf7511088bbc0eae"}, - {file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6612787e5b0756a171c7d81ba245ef63a3533a637c335aa7fcb8e665f4a0966f"}, - {file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ac6bd7be0dcab5b702c9d43d25e70eb456dfd2e119d512447468f6405b4a69c"}, - {file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9f72f100cee8dde70100406d5c1abba515a7df926d4ed81e20a9730c062fe9ad"}, - {file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dca85398d6d093dd41dc0983cbf54ab8e6afd1c547b6b8a311643917fbf4e0c"}, - {file = "orjson-3.10.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22748de2a07fcc8781a70edb887abf801bb6142e6236123ff93d12d92db3d406"}, - {file = "orjson-3.10.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:3a83c9954a4107b9acd10291b7f12a6b29e35e8d43a414799906ea10e75438e6"}, - {file = "orjson-3.10.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:303565c67a6c7b1f194c94632a4a39918e067bd6176a48bec697393865ce4f06"}, - {file = "orjson-3.10.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:86314fdb5053a2f5a5d881f03fca0219bfdf832912aa88d18676a5175c6916b5"}, - {file = "orjson-3.10.18-cp312-cp312-win32.whl", hash = "sha256:187ec33bbec58c76dbd4066340067d9ece6e10067bb0cc074a21ae3300caa84e"}, - {file = "orjson-3.10.18-cp312-cp312-win_amd64.whl", hash = "sha256:f9f94cf6d3f9cd720d641f8399e390e7411487e493962213390d1ae45c7814fc"}, - {file = "orjson-3.10.18-cp312-cp312-win_arm64.whl", hash = "sha256:3d600be83fe4514944500fa8c2a0a77099025ec6482e8087d7659e891f23058a"}, - {file = "orjson-3.10.18-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:69c34b9441b863175cc6a01f2935de994025e773f814412030f269da4f7be147"}, - {file = "orjson-3.10.18-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:1ebeda919725f9dbdb269f59bc94f861afbe2a27dce5608cdba2d92772364d1c"}, - {file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5adf5f4eed520a4959d29ea80192fa626ab9a20b2ea13f8f6dc58644f6927103"}, - {file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7592bb48a214e18cd670974f289520f12b7aed1fa0b2e2616b8ed9e069e08595"}, - {file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f872bef9f042734110642b7a11937440797ace8c87527de25e0c53558b579ccc"}, - {file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0315317601149c244cb3ecef246ef5861a64824ccbcb8018d32c66a60a84ffbc"}, - {file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0da26957e77e9e55a6c2ce2e7182a36a6f6b180ab7189315cb0995ec362e049"}, - {file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb70d489bc79b7519e5803e2cc4c72343c9dc1154258adf2f8925d0b60da7c58"}, - {file = "orjson-3.10.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e9e86a6af31b92299b00736c89caf63816f70a4001e750bda179e15564d7a034"}, - {file = "orjson-3.10.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:c382a5c0b5931a5fc5405053d36c1ce3fd561694738626c77ae0b1dfc0242ca1"}, - {file = "orjson-3.10.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8e4b2ae732431127171b875cb2668f883e1234711d3c147ffd69fe5be51a8012"}, - {file = "orjson-3.10.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2d808e34ddb24fc29a4d4041dcfafbae13e129c93509b847b14432717d94b44f"}, - {file = "orjson-3.10.18-cp313-cp313-win32.whl", hash = "sha256:ad8eacbb5d904d5591f27dee4031e2c1db43d559edb8f91778efd642d70e6bea"}, - {file = "orjson-3.10.18-cp313-cp313-win_amd64.whl", hash = "sha256:aed411bcb68bf62e85588f2a7e03a6082cc42e5a2796e06e72a962d7c6310b52"}, - {file = "orjson-3.10.18-cp313-cp313-win_arm64.whl", hash = "sha256:f54c1385a0e6aba2f15a40d703b858bedad36ded0491e55d35d905b2c34a4cc3"}, - {file = "orjson-3.10.18-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c95fae14225edfd699454e84f61c3dd938df6629a00c6ce15e704f57b58433bb"}, - {file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5232d85f177f98e0cefabb48b5e7f60cff6f3f0365f9c60631fecd73849b2a82"}, - {file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2783e121cafedf0d85c148c248a20470018b4ffd34494a68e125e7d5857655d1"}, - {file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e54ee3722caf3db09c91f442441e78f916046aa58d16b93af8a91500b7bbf273"}, - {file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2daf7e5379b61380808c24f6fc182b7719301739e4271c3ec88f2984a2d61f89"}, - {file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f39b371af3add20b25338f4b29a8d6e79a8c7ed0e9dd49e008228a065d07781"}, - {file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b819ed34c01d88c6bec290e6842966f8e9ff84b7694632e88341363440d4cc0"}, - {file = "orjson-3.10.18-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2f6c57debaef0b1aa13092822cbd3698a1fb0209a9ea013a969f4efa36bdea57"}, - {file = "orjson-3.10.18-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:755b6d61ffdb1ffa1e768330190132e21343757c9aa2308c67257cc81a1a6f5a"}, - {file = "orjson-3.10.18-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce8d0a875a85b4c8579eab5ac535fb4b2a50937267482be402627ca7e7570ee3"}, - {file = "orjson-3.10.18-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57b5d0673cbd26781bebc2bf86f99dd19bd5a9cb55f71cc4f66419f6b50f3d77"}, - {file = "orjson-3.10.18-cp39-cp39-win32.whl", hash = "sha256:951775d8b49d1d16ca8818b1f20c4965cae9157e7b562a2ae34d3967b8f21c8e"}, - {file = "orjson-3.10.18-cp39-cp39-win_amd64.whl", hash = "sha256:fdd9d68f83f0bc4406610b1ac68bdcded8c5ee58605cc69e643a06f4d075f429"}, - {file = "orjson-3.10.18.tar.gz", hash = "sha256:e8da3947d92123eda795b68228cafe2724815621fe35e8e320a9e9593a4bcd53"}, + {file = "orjson-3.11.4-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e3aa2118a3ece0d25489cbe48498de8a5d580e42e8d9979f65bf47900a15aba1"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a69ab657a4e6733133a3dca82768f2f8b884043714e8d2b9ba9f52b6efef5c44"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3740bffd9816fc0326ddc406098a3a8f387e42223f5f455f2a02a9f834ead80c"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65fd2f5730b1bf7f350c6dc896173d3460d235c4be007af73986d7cd9a2acd23"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fdc3ae730541086158d549c97852e2eea6820665d4faf0f41bf99df41bc11ea"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e10b4d65901da88845516ce9f7f9736f9638d19a1d483b3883dc0182e6e5edba"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb6a03a678085f64b97f9d4a9ae69376ce91a3a9e9b56a82b1580d8e1d501aff"}, + {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c82e4f0b1c712477317434761fbc28b044c838b6b1240d895607441412371ac"}, + {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d58c166a18f44cc9e2bad03a327dc2d1a3d2e85b847133cfbafd6bfc6719bd79"}, + {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94f206766bf1ea30e1382e4890f763bd1eefddc580e08fec1ccdc20ddd95c827"}, + {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:41bf25fb39a34cf8edb4398818523277ee7096689db352036a9e8437f2f3ee6b"}, + {file = "orjson-3.11.4-cp310-cp310-win32.whl", hash = "sha256:fa9627eba4e82f99ca6d29bc967f09aba446ee2b5a1ea728949ede73d313f5d3"}, + {file = "orjson-3.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:23ef7abc7fca96632d8174ac115e668c1e931b8fe4dde586e92a500bf1914dcc"}, + {file = "orjson-3.11.4-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5e59d23cd93ada23ec59a96f215139753fbfe3a4d989549bcb390f8c00370b39"}, + {file = "orjson-3.11.4-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:5c3aedecfc1beb988c27c79d52ebefab93b6c3921dbec361167e6559aba2d36d"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da9e5301f1c2caa2a9a4a303480d79c9ad73560b2e7761de742ab39fe59d9175"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8873812c164a90a79f65368f8f96817e59e35d0cc02786a5356f0e2abed78040"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d7feb0741ebb15204e748f26c9638e6665a5fa93c37a2c73d64f1669b0ddc63"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ee5487fefee21e6910da4c2ee9eef005bee568a0879834df86f888d2ffbdd9"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d40d46f348c0321df01507f92b95a377240c4ec31985225a6668f10e2676f9a"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95713e5fc8af84d8edc75b785d2386f653b63d62b16d681687746734b4dfc0be"}, + {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad73ede24f9083614d6c4ca9a85fe70e33be7bf047ec586ee2363bc7418fe4d7"}, + {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:842289889de515421f3f224ef9c1f1efb199a32d76d8d2ca2706fa8afe749549"}, + {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3b2427ed5791619851c52a1261b45c233930977e7de8cf36de05636c708fa905"}, + {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c36e524af1d29982e9b190573677ea02781456b2e537d5840e4538a5ec41907"}, + {file = "orjson-3.11.4-cp311-cp311-win32.whl", hash = "sha256:87255b88756eab4a68ec61837ca754e5d10fa8bc47dc57f75cedfeaec358d54c"}, + {file = "orjson-3.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:e2d5d5d798aba9a0e1fede8d853fa899ce2cb930ec0857365f700dffc2c7af6a"}, + {file = "orjson-3.11.4-cp311-cp311-win_arm64.whl", hash = "sha256:6bb6bb41b14c95d4f2702bce9975fda4516f1db48e500102fc4d8119032ff045"}, + {file = "orjson-3.11.4-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d4371de39319d05d3f482f372720b841c841b52f5385bd99c61ed69d55d9ab50"}, + {file = "orjson-3.11.4-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:e41fd3b3cac850eaae78232f37325ed7d7436e11c471246b87b2cd294ec94853"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:600e0e9ca042878c7fdf189cf1b028fe2c1418cc9195f6cb9824eb6ed99cb938"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7bbf9b333f1568ef5da42bc96e18bf30fd7f8d54e9ae066d711056add508e415"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4806363144bb6e7297b8e95870e78d30a649fdc4e23fc84daa80c8ebd366ce44"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad355e8308493f527d41154e9053b86a5be892b3b359a5c6d5d95cda23601cb2"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a7517482667fb9f0ff1b2f16fe5829296ed7a655d04d68cd9711a4d8a4e708"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97eb5942c7395a171cbfecc4ef6701fc3c403e762194683772df4c54cfbb2210"}, + {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:149d95d5e018bdd822e3f38c103b1a7c91f88d38a88aada5c4e9b3a73a244241"}, + {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:624f3951181eb46fc47dea3d221554e98784c823e7069edb5dbd0dc826ac909b"}, + {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:03bfa548cf35e3f8b3a96c4e8e41f753c686ff3d8e182ce275b1751deddab58c"}, + {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:525021896afef44a68148f6ed8a8bf8375553d6066c7f48537657f64823565b9"}, + {file = "orjson-3.11.4-cp312-cp312-win32.whl", hash = "sha256:b58430396687ce0f7d9eeb3dd47761ca7d8fda8e9eb92b3077a7a353a75efefa"}, + {file = "orjson-3.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:c6dbf422894e1e3c80a177133c0dda260f81428f9de16d61041949f6a2e5c140"}, + {file = "orjson-3.11.4-cp312-cp312-win_arm64.whl", hash = "sha256:d38d2bc06d6415852224fcc9c0bfa834c25431e466dc319f0edd56cca81aa96e"}, + {file = "orjson-3.11.4-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2d6737d0e616a6e053c8b4acc9eccea6b6cce078533666f32d140e4f85002534"}, + {file = "orjson-3.11.4-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:afb14052690aa328cc118a8e09f07c651d301a72e44920b887c519b313d892ff"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38aa9e65c591febb1b0aed8da4d469eba239d434c218562df179885c94e1a3ad"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f2cf4dfaf9163b0728d061bebc1e08631875c51cd30bf47cb9e3293bfbd7dcd5"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89216ff3dfdde0e4070932e126320a1752c9d9a758d6a32ec54b3b9334991a6a"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9daa26ca8e97fae0ce8aa5d80606ef8f7914e9b129b6b5df9104266f764ce436"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c8b2769dc31883c44a9cd126560327767f848eb95f99c36c9932f51090bfce9"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1469d254b9884f984026bd9b0fa5bbab477a4bfe558bba6848086f6d43eb5e73"}, + {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:68e44722541983614e37117209a194e8c3ad07838ccb3127d96863c95ec7f1e0"}, + {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8e7805fda9672c12be2f22ae124dcd7b03928d6c197544fe12174b86553f3196"}, + {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:04b69c14615fb4434ab867bf6f38b2d649f6f300af30a6705397e895f7aec67a"}, + {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:639c3735b8ae7f970066930e58cf0ed39a852d417c24acd4a25fc0b3da3c39a6"}, + {file = "orjson-3.11.4-cp313-cp313-win32.whl", hash = "sha256:6c13879c0d2964335491463302a6ca5ad98105fc5db3565499dcb80b1b4bd839"}, + {file = "orjson-3.11.4-cp313-cp313-win_amd64.whl", hash = "sha256:09bf242a4af98732db9f9a1ec57ca2604848e16f132e3f72edfd3c5c96de009a"}, + {file = "orjson-3.11.4-cp313-cp313-win_arm64.whl", hash = "sha256:a85f0adf63319d6c1ba06fb0dbf997fced64a01179cf17939a6caca662bf92de"}, + {file = "orjson-3.11.4-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:42d43a1f552be1a112af0b21c10a5f553983c2a0938d2bbb8ecd8bc9fb572803"}, + {file = "orjson-3.11.4-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:26a20f3fbc6c7ff2cb8e89c4c5897762c9d88cf37330c6a117312365d6781d54"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e3f20be9048941c7ffa8fc523ccbd17f82e24df1549d1d1fe9317712d19938e"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aac364c758dc87a52e68e349924d7e4ded348dedff553889e4d9f22f74785316"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d5c54a6d76e3d741dcc3f2707f8eeb9ba2a791d3adbf18f900219b62942803b1"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f28485bdca8617b79d44627f5fb04336897041dfd9fa66d383a49d09d86798bc"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bfc2a484cad3585e4ba61985a6062a4c2ed5c7925db6d39f1fa267c9d166487f"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e34dbd508cb91c54f9c9788923daca129fe5b55c5b4eebe713bf5ed3791280cf"}, + {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b13c478fa413d4b4ee606ec8e11c3b2e52683a640b006bb586b3041c2ca5f606"}, + {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:724ca721ecc8a831b319dcd72cfa370cc380db0bf94537f08f7edd0a7d4e1780"}, + {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:977c393f2e44845ce1b540e19a786e9643221b3323dae190668a98672d43fb23"}, + {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1e539e382cf46edec157ad66b0b0872a90d829a6b71f17cb633d6c160a223155"}, + {file = "orjson-3.11.4-cp314-cp314-win32.whl", hash = "sha256:d63076d625babab9db5e7836118bdfa086e60f37d8a174194ae720161eb12394"}, + {file = "orjson-3.11.4-cp314-cp314-win_amd64.whl", hash = "sha256:0a54d6635fa3aaa438ae32e8570b9f0de36f3f6562c308d2a2a452e8b0592db1"}, + {file = "orjson-3.11.4-cp314-cp314-win_arm64.whl", hash = "sha256:78b999999039db3cf58f6d230f524f04f75f129ba3d1ca2ed121f8657e575d3d"}, + {file = "orjson-3.11.4-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:405261b0a8c62bcbd8e2931c26fdc08714faf7025f45531541e2b29e544b545b"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af02ff34059ee9199a3546f123a6ab4c86caf1708c79042caf0820dc290a6d4f"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b2eba969ea4203c177c7b38b36c69519e6067ee68c34dc37081fac74c796e10"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0baa0ea43cfa5b008a28d3c07705cf3ada40e5d347f0f44994a64b1b7b4b5350"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80fd082f5dcc0e94657c144f1b2a3a6479c44ad50be216cf0c244e567f5eae19"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e3704d35e47d5bee811fb1cbd8599f0b4009b14d451c4c57be5a7e25eb89a13"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caa447f2b5356779d914658519c874cf3b7629e99e63391ed519c28c8aea4919"}, + {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bba5118143373a86f91dadb8df41d9457498226698ebdf8e11cbb54d5b0e802d"}, + {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:622463ab81d19ef3e06868b576551587de8e4d518892d1afab71e0fbc1f9cffc"}, + {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3e0a700c4b82144b72946b6629968df9762552ee1344bfdb767fecdd634fbd5a"}, + {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6e18a5c15e764e5f3fc569b47872450b4bcea24f2a6354c0a0e95ad21045d5a9"}, + {file = "orjson-3.11.4-cp39-cp39-win32.whl", hash = "sha256:fb1c37c71cad991ef4d89c7a634b5ffb4447dbd7ae3ae13e8f5ee7f1775e7ab1"}, + {file = "orjson-3.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:e2985ce8b8c42d00492d0ed79f2bd2b6460d00f2fa671dfde4bf2e02f49bf5c6"}, + {file = "orjson-3.11.4.tar.gz", hash = "sha256:39485f4ab4c9b30a3943cfe99e1a213c4776fb69e8abd68f66b83d5a0b0fdc6d"}, ] [[package]] name = "ormsgpack" -version = "1.10.0" -description = "Fast, correct Python msgpack library supporting dataclasses, datetimes, and numpy" +version = "1.12.0" +description = "" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main", "dev"] files = [ - {file = "ormsgpack-1.10.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8a52c7ce7659459f3dc8dec9fd6a6c76f855a0a7e2b61f26090982ac10b95216"}, - {file = "ormsgpack-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:060f67fe927582f4f63a1260726d019204b72f460cf20930e6c925a1d129f373"}, - {file = "ormsgpack-1.10.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7058ef6092f995561bf9f71d6c9a4da867b6cc69d2e94cb80184f579a3ceed5"}, - {file = "ormsgpack-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f6f3509c1b0e51b15552d314b1d409321718122e90653122ce4b997f01453a"}, - {file = "ormsgpack-1.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:51c1edafd5c72b863b1f875ec31c529f09c872a5ff6fe473b9dfaf188ccc3227"}, - {file = "ormsgpack-1.10.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c780b44107a547a9e9327270f802fa4d6b0f6667c9c03c3338c0ce812259a0f7"}, - {file = "ormsgpack-1.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:137aab0d5cdb6df702da950a80405eb2b7038509585e32b4e16289604ac7cb84"}, - {file = "ormsgpack-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:3e666cb63030538fa5cd74b1e40cb55b6fdb6e2981f024997a288bf138ebad07"}, - {file = "ormsgpack-1.10.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:4bb7df307e17b36cbf7959cd642c47a7f2046ae19408c564e437f0ec323a7775"}, - {file = "ormsgpack-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8817ae439c671779e1127ee62f0ac67afdeaeeacb5f0db45703168aa74a2e4af"}, - {file = "ormsgpack-1.10.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f345f81e852035d80232e64374d3a104139d60f8f43c6c5eade35c4bac5590e"}, - {file = "ormsgpack-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21de648a1c7ef692bdd287fb08f047bd5371d7462504c0a7ae1553c39fee35e3"}, - {file = "ormsgpack-1.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3a7d844ae9cbf2112c16086dd931b2acefce14cefd163c57db161170c2bfa22b"}, - {file = "ormsgpack-1.10.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e4d80585403d86d7f800cf3d0aafac1189b403941e84e90dd5102bb2b92bf9d5"}, - {file = "ormsgpack-1.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:da1de515a87e339e78a3ccf60e39f5fb740edac3e9e82d3c3d209e217a13ac08"}, - {file = "ormsgpack-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:57c4601812684024132cbb32c17a7d4bb46ffc7daf2fddf5b697391c2c4f142a"}, - {file = "ormsgpack-1.10.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:4e159d50cd4064d7540e2bc6a0ab66eab70b0cc40c618b485324ee17037527c0"}, - {file = "ormsgpack-1.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeb47c85f3a866e29279d801115b554af0fefc409e2ed8aa90aabfa77efe5cc6"}, - {file = "ormsgpack-1.10.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c28249574934534c9bd5dce5485c52f21bcea0ee44d13ece3def6e3d2c3798b5"}, - {file = "ormsgpack-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1957dcadbb16e6a981cd3f9caef9faf4c2df1125e2a1b702ee8236a55837ce07"}, - {file = "ormsgpack-1.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3b29412558c740bf6bac156727aa85ac67f9952cd6f071318f29ee72e1a76044"}, - {file = "ormsgpack-1.10.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6933f350c2041ec189fe739f0ba7d6117c8772f5bc81f45b97697a84d03020dd"}, - {file = "ormsgpack-1.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a86de06d368fcc2e58b79dece527dc8ca831e0e8b9cec5d6e633d2777ec93d0"}, - {file = "ormsgpack-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:35fa9f81e5b9a0dab42e09a73f7339ecffdb978d6dbf9deb2ecf1e9fc7808722"}, - {file = "ormsgpack-1.10.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d816d45175a878993b7372bd5408e0f3ec5a40f48e2d5b9d8f1cc5d31b61f1f"}, - {file = "ormsgpack-1.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a90345ccb058de0f35262893751c603b6376b05f02be2b6f6b7e05d9dd6d5643"}, - {file = "ormsgpack-1.10.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:144b5e88f1999433e54db9d637bae6fe21e935888be4e3ac3daecd8260bd454e"}, - {file = "ormsgpack-1.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2190b352509d012915921cca76267db136cd026ddee42f1b0d9624613cc7058c"}, - {file = "ormsgpack-1.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:86fd9c1737eaba43d3bb2730add9c9e8b5fbed85282433705dd1b1e88ea7e6fb"}, - {file = "ormsgpack-1.10.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:33afe143a7b61ad21bb60109a86bb4e87fec70ef35db76b89c65b17e32da7935"}, - {file = "ormsgpack-1.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f23d45080846a7b90feabec0d330a9cc1863dc956728412e4f7986c80ab3a668"}, - {file = "ormsgpack-1.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:534d18acb805c75e5fba09598bf40abe1851c853247e61dda0c01f772234da69"}, - {file = "ormsgpack-1.10.0-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:efdb25cf6d54085f7ae557268d59fd2d956f1a09a340856e282d2960fe929f32"}, - {file = "ormsgpack-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddfcb30d4b1be2439836249d675f297947f4fb8efcd3eeb6fd83021d773cadc4"}, - {file = "ormsgpack-1.10.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee0944b6ccfd880beb1ca29f9442a774683c366f17f4207f8b81c5e24cadb453"}, - {file = "ormsgpack-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35cdff6a0d3ba04e40a751129763c3b9b57a602c02944138e4b760ec99ae80a1"}, - {file = "ormsgpack-1.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:599ccdabc19c618ef5de6e6f2e7f5d48c1f531a625fa6772313b8515bc710681"}, - {file = "ormsgpack-1.10.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:bf46f57da9364bd5eefd92365c1b78797f56c6f780581eecd60cd7b367f9b4d3"}, - {file = "ormsgpack-1.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b796f64fdf823dedb1e35436a4a6f889cf78b1aa42d3097c66e5adfd8c3bd72d"}, - {file = "ormsgpack-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:106253ac9dc08520951e556b3c270220fcb8b4fef0d30b71eedac4befa4de749"}, - {file = "ormsgpack-1.10.0.tar.gz", hash = "sha256:7f7a27efd67ef22d7182ec3b7fa7e9d147c3ad9be2a24656b23c989077e08b16"}, + {file = "ormsgpack-1.12.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e08904c232358b94a682ccfbb680bc47d3fd5c424bb7dccb65974dd20c95e8e1"}, + {file = "ormsgpack-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9ed7a4b0037d69c8ba7e670e03ee65ae8d5c5114a409e73c5770d7fb5e4b895"}, + {file = "ormsgpack-1.12.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:db2928525b684f3f2af0367aef7ae8d20cde37fc5349c700017129d493a755aa"}, + {file = "ormsgpack-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45f911d9c5b23d11e49ff03fc8f9566745a2b1a7d9033733a1c0a2fa9301cd60"}, + {file = "ormsgpack-1.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:98c54ae6fd682b2aceb264505af9b2255f3df9d84e6e4369bc44d2110f1f311d"}, + {file = "ormsgpack-1.12.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:857ab987c3502de08258cc4baf0e87267cb2c80931601084e13df3c355b1ab9d"}, + {file = "ormsgpack-1.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27579d45dc502ee736238e1024559cb0a01aa72a3b68827448b8edf6a2dcdc9c"}, + {file = "ormsgpack-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:c78379d054760875540cf2e81f28da1bb78d09fda3eabdbeb6c53b3e297158cb"}, + {file = "ormsgpack-1.12.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:c40d86d77391b18dd34de5295e3de2b8ad818bcab9c9def4121c8ec5c9714ae4"}, + {file = "ormsgpack-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:777b7fab364dc0f200bb382a98a385c8222ffa6a2333d627d763797326202c86"}, + {file = "ormsgpack-1.12.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5b5089ad9dd5b3d3013b245a55e4abaea2f8ad70f4a78e1b002127b02340004"}, + {file = "ormsgpack-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:deaf0c87cace7bc08fbf68c5cc66605b593df6427e9f4de235b2da358787e008"}, + {file = "ormsgpack-1.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f62d476fe28bc5675d9aff30341bfa9f41d7de332c5b63fbbe9aaf6bb7ec74d4"}, + {file = "ormsgpack-1.12.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ded7810095b887e28434f32f5a345d354e88cf851bab3c5435aeb86a718618d2"}, + {file = "ormsgpack-1.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f72a1dea0c4ae7c4101dcfbe8133f274a9d769d0b87fe5188db4fab07ffabaee"}, + {file = "ormsgpack-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:8f479bfef847255d7d0b12c7a198f6a21490155da2da3062e082ba370893d4a1"}, + {file = "ormsgpack-1.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:3583ca410e4502144b2594170542e4bbef7b15643fd1208703ae820f11029036"}, + {file = "ormsgpack-1.12.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e0c1e08b64d99076fee155276097489b82cc56e8d5951c03c721a65a32f44494"}, + {file = "ormsgpack-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fd43bcb299131690b8e0677af172020b2ada8e625169034b42ac0c13adf84aa"}, + {file = "ormsgpack-1.12.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0149d595341e22ead340bf281b2995c4cc7dc8d522a6b5f575fe17aa407604"}, + {file = "ormsgpack-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f19a1b27d169deb553c80fd10b589fc2be1fc14cee779fae79fcaf40db04de2b"}, + {file = "ormsgpack-1.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6f28896942d655064940dfe06118b7ce1e3468d051483148bf02c99ec157483a"}, + {file = "ormsgpack-1.12.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9396efcfa48b4abbc06e44c5dbc3c4574a8381a80cb4cd01eea15d28b38c554e"}, + {file = "ormsgpack-1.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:96586ed537a5fb386a162c4f9f7d8e6f76e07b38a990d50c73f11131e00ff040"}, + {file = "ormsgpack-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e70387112fb3870e4844de090014212cdcf1342f5022047aecca01ec7de05d7a"}, + {file = "ormsgpack-1.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:d71290a23de5d4829610c42665d816c661ecad8979883f3f06b2e3ab9639962e"}, + {file = "ormsgpack-1.12.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:766f2f3b512d85cd375b26a8b1329b99843560b50b93d3880718e634ad4a5de5"}, + {file = "ormsgpack-1.12.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84b285b1f3f185aad7da45641b873b30acfd13084cf829cf668c4c6480a81583"}, + {file = "ormsgpack-1.12.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e23604fc79fe110292cb365f4c8232e64e63a34f470538be320feae3921f271b"}, + {file = "ormsgpack-1.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc32b156c113a0fae2975051417d8d9a7a5247c34b2d7239410c46b75ce9348a"}, + {file = "ormsgpack-1.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:94ac500dd10c20fa8b8a23bc55606250bfe711bf9716828d9f3d44dfd1f25668"}, + {file = "ormsgpack-1.12.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:c5201ff7ec24f721f813a182885a17064cffdbe46b2412685a52e6374a872c8f"}, + {file = "ormsgpack-1.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a9740bb3839c9368aacae1cbcfc474ee6976458f41cc135372b7255d5206c953"}, + {file = "ormsgpack-1.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ed37f29772432048b58174e920a1d4c4cde0404a5d448d3d8bbcc95d86a6918"}, + {file = "ormsgpack-1.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:b03994bbec5d6d42e03d6604e327863f885bde67aa61e06107ce1fa5bdd3e71d"}, + {file = "ormsgpack-1.12.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0f3981ba3cba80656012090337e548e597799e14b41e3d0b595ab5ab05a23d7f"}, + {file = "ormsgpack-1.12.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:901f6f55184d6776dbd5183cbce14caf05bf7f467eef52faf9b094686980bf71"}, + {file = "ormsgpack-1.12.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e13b15412571422b711b40f45e3fe6d993ea3314b5e97d1a853fe99226c5effc"}, + {file = "ormsgpack-1.12.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91fa8a452553a62e5fb3fbab471e7faf7b3bec3c87a2f355ebf3d7aab290fe4f"}, + {file = "ormsgpack-1.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:74ec101f69624695eec4ce7c953192d97748254abe78fb01b591f06d529e1952"}, + {file = "ormsgpack-1.12.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:9bbf7896580848326c1f9bd7531f264e561f98db7e08e15aa75963d83832c717"}, + {file = "ormsgpack-1.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7567917da613b8f8d591c1674e411fd3404bea41ef2b9a0e0a1e049c0f9406d7"}, + {file = "ormsgpack-1.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e418256c5d8622b8bc92861936f7c6a0131355e7bcad88a42102ae8227f8a1c"}, + {file = "ormsgpack-1.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:433ace29aa02713554f714c62a4e4dcad0c9e32674ba4f66742c91a4c3b1b969"}, + {file = "ormsgpack-1.12.0-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e57164be4ca34b64e210ec515059193280ac84df4d6f31a6fcbfb2fc8436de55"}, + {file = "ormsgpack-1.12.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:904f96289deaa92fc6440b122edc27c5bdc28234edd63717f6d853d88c823a83"}, + {file = "ormsgpack-1.12.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b291d086e524a1062d57d1b7b5a8bcaaf29caebf0212fec12fd86240bd33633"}, + {file = "ormsgpack-1.12.0.tar.gz", hash = "sha256:94be818fdbb0285945839b88763b269987787cb2f7ef280cad5d6ec815b7e608"}, ] [[package]] name = "packaging" -version = "24.2" +version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" groups = ["main", "dev"] files = [ - {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, - {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, ] [[package]] @@ -1365,20 +1604,20 @@ files = [ [[package]] name = "platformdirs" -version = "4.3.8" +version = "4.5.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, - {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, + {file = "platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3"}, + {file = "platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312"}, ] [package.extras] -docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"] -type = ["mypy (>=1.14.1)"] +docs = ["furo (>=2025.9.25)", "proselint (>=0.14)", "sphinx (>=8.2.3)", "sphinx-autodoc-typehints (>=3.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.4.2)", "pytest-cov (>=7)", "pytest-mock (>=3.15.1)"] +type = ["mypy (>=1.18.2)"] [[package]] name = "pluggy" @@ -1410,58 +1649,67 @@ files = [ [[package]] name = "psutil" -version = "7.0.0" -description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." +version = "7.1.3" +description = "Cross-platform lib for process and system monitoring." optional = false python-versions = ">=3.6" groups = ["dev"] files = [ - {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, - {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993"}, - {file = "psutil-7.0.0-cp36-cp36m-win32.whl", hash = "sha256:84df4eb63e16849689f76b1ffcb36db7b8de703d1bc1fe41773db487621b6c17"}, - {file = "psutil-7.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1e744154a6580bc968a0195fd25e80432d3afec619daf145b9e5ba16cc1d688e"}, - {file = "psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99"}, - {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, - {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, + {file = "psutil-7.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc"}, + {file = "psutil-7.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0"}, + {file = "psutil-7.1.3-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7"}, + {file = "psutil-7.1.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251"}, + {file = "psutil-7.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa"}, + {file = "psutil-7.1.3-cp313-cp313t-win_arm64.whl", hash = "sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee"}, + {file = "psutil-7.1.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353"}, + {file = "psutil-7.1.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b"}, + {file = "psutil-7.1.3-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9"}, + {file = "psutil-7.1.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f"}, + {file = "psutil-7.1.3-cp314-cp314t-win_amd64.whl", hash = "sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7"}, + {file = "psutil-7.1.3-cp314-cp314t-win_arm64.whl", hash = "sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264"}, + {file = "psutil-7.1.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab"}, + {file = "psutil-7.1.3-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880"}, + {file = "psutil-7.1.3-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3"}, + {file = "psutil-7.1.3-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b"}, + {file = "psutil-7.1.3-cp37-abi3-win_amd64.whl", hash = "sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd"}, + {file = "psutil-7.1.3-cp37-abi3-win_arm64.whl", hash = "sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1"}, + {file = "psutil-7.1.3.tar.gz", hash = "sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74"}, ] [package.extras] -dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] -test = ["pytest", "pytest-xdist", "setuptools"] +dev = ["abi3audit", "black", "check-manifest", "colorama", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pyreadline", "pytest", "pytest-cov", "pytest-instafail", "pytest-subtests", "pytest-xdist", "pywin32", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "validate-pyproject[all]", "virtualenv", "vulture", "wheel", "wheel", "wmi"] +test = ["pytest", "pytest-instafail", "pytest-subtests", "pytest-xdist", "pywin32", "setuptools", "wheel", "wmi"] [[package]] name = "pycparser" -version = "2.22" +version = "2.23" description = "C parser in Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["dev"] +markers = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"" files = [ - {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, - {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, + {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, + {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, ] -markers = {main = "platform_python_implementation == \"PyPy\"", dev = "python_version > \"3.9.1\" or platform_python_implementation == \"PyPy\""} [[package]] name = "pydantic" -version = "2.11.7" +version = "2.12.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b"}, - {file = "pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db"}, + {file = "pydantic-2.12.4-py3-none-any.whl", hash = "sha256:92d3d202a745d46f9be6df459ac5a064fdaa3c1c4cd8adcfa332ccf3c05f871e"}, + {file = "pydantic-2.12.4.tar.gz", hash = "sha256:0f8cb9555000a4b5b617f66bfd2566264c4984b27589d3b845685983e8ea85ac"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.33.2" -typing-extensions = ">=4.12.2" -typing-inspection = ">=0.4.0" +pydantic-core = "2.41.5" +typing-extensions = ">=4.14.1" +typing-inspection = ">=0.4.2" [package.extras] email = ["email-validator (>=2.0.0)"] @@ -1469,115 +1717,137 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.33.2" +version = "2.41.5" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, - {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"}, - {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d"}, - {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572"}, - {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02"}, - {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b"}, - {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2"}, - {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a"}, - {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac"}, - {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a"}, - {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b"}, - {file = "pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22"}, - {file = "pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640"}, - {file = "pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7"}, - {file = "pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246"}, - {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f"}, - {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc"}, - {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de"}, - {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a"}, - {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef"}, - {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e"}, - {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d"}, - {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30"}, - {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf"}, - {file = "pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51"}, - {file = "pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab"}, - {file = "pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65"}, - {file = "pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc"}, - {file = "pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7"}, - {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025"}, - {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011"}, - {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f"}, - {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88"}, - {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1"}, - {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b"}, - {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1"}, - {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6"}, - {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea"}, - {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"}, - {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"}, - {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"}, - {file = "pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f"}, - {file = "pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6"}, - {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef"}, - {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a"}, - {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916"}, - {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a"}, - {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d"}, - {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56"}, - {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5"}, - {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e"}, - {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162"}, - {file = "pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849"}, - {file = "pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9"}, - {file = "pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9"}, - {file = "pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac"}, - {file = "pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5"}, - {file = "pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9"}, - {file = "pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d"}, - {file = "pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954"}, - {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb"}, - {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7"}, - {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4"}, - {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b"}, - {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3"}, - {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a"}, - {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782"}, - {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9"}, - {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e"}, - {file = "pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9"}, - {file = "pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27"}, - {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"}, + {file = "pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146"}, + {file = "pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c"}, + {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2"}, + {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556"}, + {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49"}, + {file = "pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba"}, + {file = "pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9"}, + {file = "pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6"}, + {file = "pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284"}, + {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594"}, + {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e"}, + {file = "pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe"}, + {file = "pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f"}, + {file = "pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7"}, + {file = "pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5"}, + {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c"}, + {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294"}, + {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1"}, + {file = "pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d"}, + {file = "pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815"}, + {file = "pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3"}, + {file = "pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9"}, + {file = "pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d"}, + {file = "pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740"}, + {file = "pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e"}, + {file = "pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858"}, + {file = "pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36"}, + {file = "pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11"}, + {file = "pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd"}, + {file = "pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a"}, + {file = "pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553"}, + {file = "pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90"}, + {file = "pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07"}, + {file = "pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb"}, + {file = "pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23"}, + {file = "pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf"}, + {file = "pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008"}, + {file = "pydantic_core-2.41.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8bfeaf8735be79f225f3fefab7f941c712aaca36f1128c9d7e2352ee1aa87bdf"}, + {file = "pydantic_core-2.41.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:346285d28e4c8017da95144c7f3acd42740d637ff41946af5ce6e5e420502dd5"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a75dafbf87d6276ddc5b2bf6fae5254e3d0876b626eb24969a574fff9149ee5d"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7b93a4d08587e2b7e7882de461e82b6ed76d9026ce91ca7915e740ecc7855f60"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8465ab91a4bd96d36dde3263f06caa6a8a6019e4113f24dc753d79a8b3a3f82"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:299e0a22e7ae2b85c1a57f104538b2656e8ab1873511fd718a1c1c6f149b77b5"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:707625ef0983fcfb461acfaf14de2067c5942c6bb0f3b4c99158bed6fedd3cf3"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f41eb9797986d6ebac5e8edff36d5cef9de40def462311b3eb3eeded1431e425"}, + {file = "pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0384e2e1021894b1ff5a786dbf94771e2986ebe2869533874d7e43bc79c6f504"}, + {file = "pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:f0cd744688278965817fd0839c4a4116add48d23890d468bc436f78beb28abf5"}, + {file = "pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:753e230374206729bf0a807954bcc6c150d3743928a73faffee51ac6557a03c3"}, + {file = "pydantic_core-2.41.5-cp39-cp39-win32.whl", hash = "sha256:873e0d5b4fb9b89ef7c2d2a963ea7d02879d9da0da8d9d4933dee8ee86a8b460"}, + {file = "pydantic_core-2.41.5-cp39-cp39-win_amd64.whl", hash = "sha256:e4f4a984405e91527a0d62649ee21138f8e3d0ef103be488c1dc11a80d7f184b"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51"}, + {file = "pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e"}, ] [package.dependencies] -typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +typing-extensions = ">=4.14.1" [[package]] name = "pygments" @@ -1611,14 +1881,14 @@ pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} [[package]] name = "pytest" -version = "8.4.1" +version = "8.4.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7"}, - {file = "pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c"}, + {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"}, + {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"}, ] [package.dependencies] @@ -1635,20 +1905,20 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests [[package]] name = "pytest-asyncio" -version = "1.1.0" +version = "1.3.0" description = "Pytest support for asyncio" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "pytest_asyncio-1.1.0-py3-none-any.whl", hash = "sha256:5fe2d69607b0bd75c656d1211f969cadba035030156745ee09e7d71740e58ecf"}, - {file = "pytest_asyncio-1.1.0.tar.gz", hash = "sha256:796aa822981e01b68c12e4827b8697108f7205020f24b5793b3c41555dab68ea"}, + {file = "pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5"}, + {file = "pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5"}, ] [package.dependencies] backports-asyncio-runner = {version = ">=1.1,<2", markers = "python_version < \"3.11\""} -pytest = ">=8.2,<9" -typing-extensions = {version = ">=4.12", markers = "python_version < \"3.10\""} +pytest = ">=8.2,<10" +typing-extensions = {version = ">=4.12", markers = "python_version < \"3.13\""} [package.extras] docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1)"] @@ -1656,14 +1926,14 @@ testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] [[package]] name = "pytest-cov" -version = "6.2.1" +version = "6.3.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5"}, - {file = "pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2"}, + {file = "pytest_cov-6.3.0-py3-none-any.whl", hash = "sha256:440db28156d2468cafc0415b4f8e50856a0d11faefa38f30906048fe490f1749"}, + {file = "pytest_cov-6.3.0.tar.gz", hash = "sha256:35c580e7800f87ce892e687461166e1ac2bcb8fb9e13aea79032518d6e503ff2"}, ] [package.dependencies] @@ -1676,14 +1946,14 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "pytest-mock" -version = "3.14.1" +version = "3.15.1" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pytest_mock-3.14.1-py3-none-any.whl", hash = "sha256:178aefcd11307d874b4cd3100344e7e2d888d9791a6a1d9bfe90fbc1b74fd1d0"}, - {file = "pytest_mock-3.14.1.tar.gz", hash = "sha256:159e9edac4c451ce77a5cdb9fc5d1100708d2dd4ba3c3df572f14097351af80e"}, + {file = "pytest_mock-3.15.1-py3-none-any.whl", hash = "sha256:0a25e2eb88fe5168d535041d09a4529a188176ae608a6d249ee65abc0949630d"}, + {file = "pytest_mock-3.15.1.tar.gz", hash = "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f"}, ] [package.dependencies] @@ -1716,14 +1986,14 @@ testing = ["filelock"] [[package]] name = "python-dotenv" -version = "1.1.1" +version = "1.2.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc"}, - {file = "python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab"}, + {file = "python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61"}, + {file = "python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6"}, ] [package.extras] @@ -1731,107 +2001,139 @@ cli = ["click (>=5.0)"] [[package]] name = "python-ulid" -version = "3.0.0" +version = "3.1.0" description = "Universally unique lexicographically sortable identifier" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "python_ulid-3.0.0-py3-none-any.whl", hash = "sha256:e4c4942ff50dbd79167ad01ac725ec58f924b4018025ce22c858bfcff99a5e31"}, - {file = "python_ulid-3.0.0.tar.gz", hash = "sha256:e50296a47dc8209d28629a22fc81ca26c00982c78934bd7766377ba37ea49a9f"}, + {file = "python_ulid-3.1.0-py3-none-any.whl", hash = "sha256:e2cdc979c8c877029b4b7a38a6fba3bc4578e4f109a308419ff4d3ccf0a46619"}, + {file = "python_ulid-3.1.0.tar.gz", hash = "sha256:ff0410a598bc5f6b01b602851a3296ede6f91389f913a5d5f8c496003836f636"}, ] [package.extras] pydantic = ["pydantic (>=2.0)"] +[[package]] +name = "pytokens" +version = "0.3.0" +description = "A Fast, spec compliant Python 3.14+ tokenizer that runs on older Pythons." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pytokens-0.3.0-py3-none-any.whl", hash = "sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3"}, + {file = "pytokens-0.3.0.tar.gz", hash = "sha256:2f932b14ed08de5fcf0b391ace2642f858f1394c0857202959000b68ed7a458a"}, +] + +[package.extras] +dev = ["black", "build", "mypy", "pytest", "pytest-cov", "setuptools", "tox", "twine", "wheel"] + [[package]] name = "pywin32" -version = "310" +version = "311" description = "Python for Window Extensions" optional = false python-versions = "*" groups = ["dev"] markers = "sys_platform == \"win32\" or platform_system == \"Windows\"" files = [ - {file = "pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1"}, - {file = "pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d"}, - {file = "pywin32-310-cp310-cp310-win_arm64.whl", hash = "sha256:33babed0cf0c92a6f94cc6cc13546ab24ee13e3e800e61ed87609ab91e4c8213"}, - {file = "pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd"}, - {file = "pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c"}, - {file = "pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582"}, - {file = "pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d"}, - {file = "pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060"}, - {file = "pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966"}, - {file = "pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab"}, - {file = "pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e"}, - {file = "pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33"}, - {file = "pywin32-310-cp38-cp38-win32.whl", hash = "sha256:0867beb8addefa2e3979d4084352e4ac6e991ca45373390775f7084cc0209b9c"}, - {file = "pywin32-310-cp38-cp38-win_amd64.whl", hash = "sha256:30f0a9b3138fb5e07eb4973b7077e1883f558e40c578c6925acc7a94c34eaa36"}, - {file = "pywin32-310-cp39-cp39-win32.whl", hash = "sha256:851c8d927af0d879221e616ae1f66145253537bbdd321a77e8ef701b443a9a1a"}, - {file = "pywin32-310-cp39-cp39-win_amd64.whl", hash = "sha256:96867217335559ac619f00ad70e513c0fcf84b8a3af9fc2bba3b59b97da70475"}, + {file = "pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3"}, + {file = "pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b"}, + {file = "pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b"}, + {file = "pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151"}, + {file = "pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503"}, + {file = "pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2"}, + {file = "pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31"}, + {file = "pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067"}, + {file = "pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852"}, + {file = "pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d"}, + {file = "pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d"}, + {file = "pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a"}, + {file = "pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee"}, + {file = "pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87"}, + {file = "pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42"}, + {file = "pywin32-311-cp38-cp38-win32.whl", hash = "sha256:6c6f2969607b5023b0d9ce2541f8d2cbb01c4f46bc87456017cf63b73f1e2d8c"}, + {file = "pywin32-311-cp38-cp38-win_amd64.whl", hash = "sha256:c8015b09fb9a5e188f83b7b04de91ddca4658cee2ae6f3bc483f0b21a77ef6cd"}, + {file = "pywin32-311-cp39-cp39-win32.whl", hash = "sha256:aba8f82d551a942cb20d4a83413ccbac30790b50efb89a75e4f586ac0bb8056b"}, + {file = "pywin32-311-cp39-cp39-win_amd64.whl", hash = "sha256:e0c4cfb0621281fe40387df582097fd796e80430597cb9944f0ae70447bacd91"}, + {file = "pywin32-311-cp39-cp39-win_arm64.whl", hash = "sha256:62ea666235135fee79bb154e695f3ff67370afefd71bd7fea7512fc70ef31e3d"}, ] [[package]] name = "pyyaml" -version = "6.0.2" +version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" groups = ["main", "dev"] files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, - {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, - {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, - {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"}, + {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"}, + {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"}, + {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"}, + {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"}, + {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be"}, + {file = "pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7"}, + {file = "pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0"}, + {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"}, + {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, ] [[package]] @@ -1856,14 +2158,14 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (>=20.0.1)", "requests (>=2.31.0)" [[package]] name = "redisvl" -version = "0.9.1" +version = "0.11.0" description = "Python client library and CLI for using Redis as a vector database" optional = false -python-versions = "<3.14,>=3.9" +python-versions = "<3.14,>=3.9.2" groups = ["main"] files = [ - {file = "redisvl-0.9.1-py3-none-any.whl", hash = "sha256:aaec441cfcb37ce7cced028dcf9a748337a27422dcaf1b494a4c6198f577dcf4"}, - {file = "redisvl-0.9.1.tar.gz", hash = "sha256:a735ecf3238e804800b54a513b85a8cf4300fe6d111fb055bd75528f77dd5419"}, + {file = "redisvl-0.11.0-py3-none-any.whl", hash = "sha256:7e2029fd5fc73baf5f024415002d91cdce88168e51113afc1dbc4fcd0f8a210a"}, + {file = "redisvl-0.11.0.tar.gz", hash = "sha256:8bd52e059a805756160320f547b04372fe00517596364431f813107d96c6cbf8"}, ] [package.dependencies] @@ -1879,6 +2181,7 @@ tenacity = ">=8.2.2" [package.extras] bedrock = ["boto3 (>=1.36.0,<2)", "urllib3 (<2.2.0)"] cohere = ["cohere (>=4.44)"] +langcache = ["langcache (>=0.9.0)"] mistralai = ["mistralai (>=1.0.0)"] nltk = ["nltk (>=3.8.1,<4)"] openai = ["openai (>=1.1.0)"] @@ -1888,118 +2191,139 @@ voyageai = ["voyageai (>=0.2.2)"] [[package]] name = "regex" -version = "2024.11.6" +version = "2025.11.3" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, - {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, - {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"}, - {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"}, - {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"}, - {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"}, - {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"}, - {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"}, - {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"}, - {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"}, - {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"}, - {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"}, - {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"}, - {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"}, - {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"}, - {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"}, - {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"}, - {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"}, - {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"}, - {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"}, - {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"}, - {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"}, - {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"}, - {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"}, - {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"}, - {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"}, - {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"}, - {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"}, - {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"}, - {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"}, - {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, + {file = "regex-2025.11.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2b441a4ae2c8049106e8b39973bfbddfb25a179dda2bdb99b0eeb60c40a6a3af"}, + {file = "regex-2025.11.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2fa2eed3f76677777345d2f81ee89f5de2f5745910e805f7af7386a920fa7313"}, + {file = "regex-2025.11.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d8b4a27eebd684319bdf473d39f1d79eed36bf2cd34bd4465cdb4618d82b3d56"}, + {file = "regex-2025.11.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cf77eac15bd264986c4a2c63353212c095b40f3affb2bc6b4ef80c4776c1a28"}, + {file = "regex-2025.11.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b7f9ee819f94c6abfa56ec7b1dbab586f41ebbdc0a57e6524bd5e7f487a878c7"}, + {file = "regex-2025.11.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:838441333bc90b829406d4a03cb4b8bf7656231b84358628b0406d803931ef32"}, + {file = "regex-2025.11.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cfe6d3f0c9e3b7e8c0c694b24d25e677776f5ca26dce46fd6b0489f9c8339391"}, + {file = "regex-2025.11.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2ab815eb8a96379a27c3b6157fcb127c8f59c36f043c1678110cea492868f1d5"}, + {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:728a9d2d173a65b62bdc380b7932dd8e74ed4295279a8fe1021204ce210803e7"}, + {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:509dc827f89c15c66a0c216331260d777dd6c81e9a4e4f830e662b0bb296c313"}, + {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:849202cd789e5f3cf5dcc7822c34b502181b4824a65ff20ce82da5524e45e8e9"}, + {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b6f78f98741dcc89607c16b1e9426ee46ce4bf31ac5e6b0d40e81c89f3481ea5"}, + {file = "regex-2025.11.3-cp310-cp310-win32.whl", hash = "sha256:149eb0bba95231fb4f6d37c8f760ec9fa6fabf65bab555e128dde5f2475193ec"}, + {file = "regex-2025.11.3-cp310-cp310-win_amd64.whl", hash = "sha256:ee3a83ce492074c35a74cc76cf8235d49e77b757193a5365ff86e3f2f93db9fd"}, + {file = "regex-2025.11.3-cp310-cp310-win_arm64.whl", hash = "sha256:38af559ad934a7b35147716655d4a2f79fcef2d695ddfe06a06ba40ae631fa7e"}, + {file = "regex-2025.11.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eadade04221641516fa25139273505a1c19f9bf97589a05bc4cfcd8b4a618031"}, + {file = "regex-2025.11.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:feff9e54ec0dd3833d659257f5c3f5322a12eee58ffa360984b716f8b92983f4"}, + {file = "regex-2025.11.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3b30bc921d50365775c09a7ed446359e5c0179e9e2512beec4a60cbcef6ddd50"}, + {file = "regex-2025.11.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f99be08cfead2020c7ca6e396c13543baea32343b7a9a5780c462e323bd8872f"}, + {file = "regex-2025.11.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6dd329a1b61c0ee95ba95385fb0c07ea0d3fe1a21e1349fa2bec272636217118"}, + {file = "regex-2025.11.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c5238d32f3c5269d9e87be0cf096437b7622b6920f5eac4fd202468aaeb34d2"}, + {file = "regex-2025.11.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10483eefbfb0adb18ee9474498c9a32fcf4e594fbca0543bb94c48bac6183e2e"}, + {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:78c2d02bb6e1da0720eedc0bad578049cad3f71050ef8cd065ecc87691bed2b0"}, + {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e6b49cd2aad93a1790ce9cffb18964f6d3a4b0b3dbdbd5de094b65296fce6e58"}, + {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:885b26aa3ee56433b630502dc3d36ba78d186a00cc535d3806e6bfd9ed3c70ab"}, + {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ddd76a9f58e6a00f8772e72cff8ebcff78e022be95edf018766707c730593e1e"}, + {file = "regex-2025.11.3-cp311-cp311-win32.whl", hash = "sha256:3e816cc9aac1cd3cc9a4ec4d860f06d40f994b5c7b4d03b93345f44e08cc68bf"}, + {file = "regex-2025.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:087511f5c8b7dfbe3a03f5d5ad0c2a33861b1fc387f21f6f60825a44865a385a"}, + {file = "regex-2025.11.3-cp311-cp311-win_arm64.whl", hash = "sha256:1ff0d190c7f68ae7769cd0313fe45820ba07ffebfddfaa89cc1eb70827ba0ddc"}, + {file = "regex-2025.11.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bc8ab71e2e31b16e40868a40a69007bc305e1109bd4658eb6cad007e0bf67c41"}, + {file = "regex-2025.11.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:22b29dda7e1f7062a52359fca6e58e548e28c6686f205e780b02ad8ef710de36"}, + {file = "regex-2025.11.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a91e4a29938bc1a082cc28fdea44be420bf2bebe2665343029723892eb073e1"}, + {file = "regex-2025.11.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08b884f4226602ad40c5d55f52bf91a9df30f513864e0054bad40c0e9cf1afb7"}, + {file = "regex-2025.11.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3e0b11b2b2433d1c39c7c7a30e3f3d0aeeea44c2a8d0bae28f6b95f639927a69"}, + {file = "regex-2025.11.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:87eb52a81ef58c7ba4d45c3ca74e12aa4b4e77816f72ca25258a85b3ea96cb48"}, + {file = "regex-2025.11.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a12ab1f5c29b4e93db518f5e3872116b7e9b1646c9f9f426f777b50d44a09e8c"}, + {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7521684c8c7c4f6e88e35ec89680ee1aa8358d3f09d27dfbdf62c446f5d4c695"}, + {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7fe6e5440584e94cc4b3f5f4d98a25e29ca12dccf8873679a635638349831b98"}, + {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8e026094aa12b43f4fd74576714e987803a315c76edb6b098b9809db5de58f74"}, + {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:435bbad13e57eb5606a68443af62bed3556de2f46deb9f7d4237bc2f1c9fb3a0"}, + {file = "regex-2025.11.3-cp312-cp312-win32.whl", hash = "sha256:3839967cf4dc4b985e1570fd8d91078f0c519f30491c60f9ac42a8db039be204"}, + {file = "regex-2025.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:e721d1b46e25c481dc5ded6f4b3f66c897c58d2e8cfdf77bbced84339108b0b9"}, + {file = "regex-2025.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:64350685ff08b1d3a6fff33f45a9ca183dc1d58bbfe4981604e70ec9801bbc26"}, + {file = "regex-2025.11.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c1e448051717a334891f2b9a620fe36776ebf3dd8ec46a0b877c8ae69575feb4"}, + {file = "regex-2025.11.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9b5aca4d5dfd7fbfbfbdaf44850fcc7709a01146a797536a8f84952e940cca76"}, + {file = "regex-2025.11.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:04d2765516395cf7dda331a244a3282c0f5ae96075f728629287dfa6f76ba70a"}, + {file = "regex-2025.11.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d9903ca42bfeec4cebedba8022a7c97ad2aab22e09573ce9976ba01b65e4361"}, + {file = "regex-2025.11.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:639431bdc89d6429f6721625e8129413980ccd62e9d3f496be618a41d205f160"}, + {file = "regex-2025.11.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f117efad42068f9715677c8523ed2be1518116d1c49b1dd17987716695181efe"}, + {file = "regex-2025.11.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4aecb6f461316adf9f1f0f6a4a1a3d79e045f9b71ec76055a791affa3b285850"}, + {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3b3a5f320136873cc5561098dfab677eea139521cb9a9e8db98b7e64aef44cbc"}, + {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:75fa6f0056e7efb1f42a1c34e58be24072cb9e61a601340cc1196ae92326a4f9"}, + {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:dbe6095001465294f13f1adcd3311e50dd84e5a71525f20a10bd16689c61ce0b"}, + {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:454d9b4ae7881afbc25015b8627c16d88a597479b9dea82b8c6e7e2e07240dc7"}, + {file = "regex-2025.11.3-cp313-cp313-win32.whl", hash = "sha256:28ba4d69171fc6e9896337d4fc63a43660002b7da53fc15ac992abcf3410917c"}, + {file = "regex-2025.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:bac4200befe50c670c405dc33af26dad5a3b6b255dd6c000d92fe4629f9ed6a5"}, + {file = "regex-2025.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:2292cd5a90dab247f9abe892ac584cb24f0f54680c73fcb4a7493c66c2bf2467"}, + {file = "regex-2025.11.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1eb1ebf6822b756c723e09f5186473d93236c06c579d2cc0671a722d2ab14281"}, + {file = "regex-2025.11.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1e00ec2970aab10dc5db34af535f21fcf32b4a31d99e34963419636e2f85ae39"}, + {file = "regex-2025.11.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a4cb042b615245d5ff9b3794f56be4138b5adc35a4166014d31d1814744148c7"}, + {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44f264d4bf02f3176467d90b294d59bf1db9fe53c141ff772f27a8b456b2a9ed"}, + {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7be0277469bf3bd7a34a9c57c1b6a724532a0d235cd0dc4e7f4316f982c28b19"}, + {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0d31e08426ff4b5b650f68839f5af51a92a5b51abd8554a60c2fbc7c71f25d0b"}, + {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e43586ce5bd28f9f285a6e729466841368c4a0353f6fd08d4ce4630843d3648a"}, + {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0f9397d561a4c16829d4e6ff75202c1c08b68a3bdbfe29dbfcdb31c9830907c6"}, + {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:dd16e78eb18ffdb25ee33a0682d17912e8cc8a770e885aeee95020046128f1ce"}, + {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:ffcca5b9efe948ba0661e9df0fa50d2bc4b097c70b9810212d6b62f05d83b2dd"}, + {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c56b4d162ca2b43318ac671c65bd4d563e841a694ac70e1a976ac38fcf4ca1d2"}, + {file = "regex-2025.11.3-cp313-cp313t-win32.whl", hash = "sha256:9ddc42e68114e161e51e272f667d640f97e84a2b9ef14b7477c53aac20c2d59a"}, + {file = "regex-2025.11.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7a7c7fdf755032ffdd72c77e3d8096bdcb0eb92e89e17571a196f03d88b11b3c"}, + {file = "regex-2025.11.3-cp313-cp313t-win_arm64.whl", hash = "sha256:df9eb838c44f570283712e7cff14c16329a9f0fb19ca492d21d4b7528ee6821e"}, + {file = "regex-2025.11.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9697a52e57576c83139d7c6f213d64485d3df5bf84807c35fa409e6c970801c6"}, + {file = "regex-2025.11.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e18bc3f73bd41243c9b38a6d9f2366cd0e0137a9aebe2d8ff76c5b67d4c0a3f4"}, + {file = "regex-2025.11.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:61a08bcb0ec14ff4e0ed2044aad948d0659604f824cbd50b55e30b0ec6f09c73"}, + {file = "regex-2025.11.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9c30003b9347c24bcc210958c5d167b9e4f9be786cb380a7d32f14f9b84674f"}, + {file = "regex-2025.11.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4e1e592789704459900728d88d41a46fe3969b82ab62945560a31732ffc19a6d"}, + {file = "regex-2025.11.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6538241f45eb5a25aa575dbba1069ad786f68a4f2773a29a2bd3dd1f9de787be"}, + {file = "regex-2025.11.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce22519c989bb72a7e6b36a199384c53db7722fe669ba891da75907fe3587db"}, + {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:66d559b21d3640203ab9075797a55165d79017520685fb407b9234d72ab63c62"}, + {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:669dcfb2e38f9e8c69507bace46f4889e3abbfd9b0c29719202883c0a603598f"}, + {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:32f74f35ff0f25a5021373ac61442edcb150731fbaa28286bbc8bb1582c89d02"}, + {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e6c7a21dffba883234baefe91bc3388e629779582038f75d2a5be918e250f0ed"}, + {file = "regex-2025.11.3-cp314-cp314-win32.whl", hash = "sha256:795ea137b1d809eb6836b43748b12634291c0ed55ad50a7d72d21edf1cd565c4"}, + {file = "regex-2025.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:9f95fbaa0ee1610ec0fc6b26668e9917a582ba80c52cc6d9ada15e30aa9ab9ad"}, + {file = "regex-2025.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:dfec44d532be4c07088c3de2876130ff0fbeeacaa89a137decbbb5f665855a0f"}, + {file = "regex-2025.11.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ba0d8a5d7f04f73ee7d01d974d47c5834f8a1b0224390e4fe7c12a3a92a78ecc"}, + {file = "regex-2025.11.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:442d86cf1cfe4faabf97db7d901ef58347efd004934da045c745e7b5bd57ac49"}, + {file = "regex-2025.11.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fd0a5e563c756de210bb964789b5abe4f114dacae9104a47e1a649b910361536"}, + {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf3490bcbb985a1ae97b2ce9ad1c0f06a852d5b19dde9b07bdf25bf224248c95"}, + {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3809988f0a8b8c9dcc0f92478d6501fac7200b9ec56aecf0ec21f4a2ec4b6009"}, + {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f4ff94e58e84aedb9c9fce66d4ef9f27a190285b451420f297c9a09f2b9abee9"}, + {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eb542fd347ce61e1321b0a6b945d5701528dca0cd9759c2e3bb8bd57e47964d"}, + {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d6c2d5919075a1f2e413c00b056ea0c2f065b3f5fe83c3d07d325ab92dce51d6"}, + {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3f8bf11a4827cc7ce5a53d4ef6cddd5ad25595d3c1435ef08f76825851343154"}, + {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:22c12d837298651e5550ac1d964e4ff57c3f56965fc1812c90c9fb2028eaf267"}, + {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:62ba394a3dda9ad41c7c780f60f6e4a70988741415ae96f6d1bf6c239cf01379"}, + {file = "regex-2025.11.3-cp314-cp314t-win32.whl", hash = "sha256:4bf146dca15cdd53224a1bf46d628bd7590e4a07fbb69e720d561aea43a32b38"}, + {file = "regex-2025.11.3-cp314-cp314t-win_amd64.whl", hash = "sha256:adad1a1bcf1c9e76346e091d22d23ac54ef28e1365117d99521631078dfec9de"}, + {file = "regex-2025.11.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c54f768482cef41e219720013cd05933b6f971d9562544d691c68699bf2b6801"}, + {file = "regex-2025.11.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:81519e25707fc076978c6143b81ea3dc853f176895af05bf7ec51effe818aeec"}, + {file = "regex-2025.11.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3bf28b1873a8af8bbb58c26cc56ea6e534d80053b41fb511a35795b6de507e6a"}, + {file = "regex-2025.11.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:856a25c73b697f2ce2a24e7968285579e62577a048526161a2c0f53090bea9f9"}, + {file = "regex-2025.11.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a3d571bd95fade53c86c0517f859477ff3a93c3fde10c9e669086f038e0f207"}, + {file = "regex-2025.11.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:732aea6de26051af97b94bc98ed86448821f839d058e5d259c72bf6d73ad0fc0"}, + {file = "regex-2025.11.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:51c1c1847128238f54930edb8805b660305dca164645a9fd29243f5610beea34"}, + {file = "regex-2025.11.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22dd622a402aad4558277305350699b2be14bc59f64d64ae1d928ce7d072dced"}, + {file = "regex-2025.11.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f3b5a391c7597ffa96b41bd5cbd2ed0305f515fcbb367dfa72735679d5502364"}, + {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:cc4076a5b4f36d849fd709284b4a3b112326652f3b0466f04002a6c15a0c96c1"}, + {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a295ca2bba5c1c885826ce3125fa0b9f702a1be547d821c01d65f199e10c01e2"}, + {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b4774ff32f18e0504bfc4e59a3e71e18d83bc1e171a3c8ed75013958a03b2f14"}, + {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e7d1cdfa88ef33a2ae6aa0d707f9255eb286ffbd90045f1088246833223aee"}, + {file = "regex-2025.11.3-cp39-cp39-win32.whl", hash = "sha256:74d04244852ff73b32eeede4f76f51c5bcf44bc3c207bc3e6cf1c5c45b890708"}, + {file = "regex-2025.11.3-cp39-cp39-win_amd64.whl", hash = "sha256:7a50cd39f73faa34ec18d6720ee25ef10c4c1839514186fcda658a06c06057a2"}, + {file = "regex-2025.11.3-cp39-cp39-win_arm64.whl", hash = "sha256:43b4fb020e779ca81c1b5255015fe2b82816c76ec982354534ad9ec09ad7c9e3"}, + {file = "regex-2025.11.3.tar.gz", hash = "sha256:1fedc720f9bb2494ce31a58a1631f9c82df6a09b49c19517ea5cc280b4541e01"}, ] [[package]] name = "requests" -version = "2.32.4" +version = "2.32.5" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, - {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, + {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, + {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, ] [package.dependencies] @@ -2057,14 +2381,14 @@ test = ["pytest", "tornado (>=4.5)", "typeguard"] [[package]] name = "testcontainers" -version = "4.12.0" +version = "4.13.3" description = "Python library for throwaway instances of anything that can run in a Docker container" optional = false -python-versions = "<4.0,>=3.9" +python-versions = ">=3.9.2" groups = ["dev"] files = [ - {file = "testcontainers-4.12.0-py3-none-any.whl", hash = "sha256:26caef57e642d5e8c5fcc593881cf7df3ab0f0dc9170fad22765b184e226ab15"}, - {file = "testcontainers-4.12.0.tar.gz", hash = "sha256:13ee89cae995e643f225665aad8b200b25c4f219944a6f9c0b03249ec3f31b8d"}, + {file = "testcontainers-4.13.3-py3-none-any.whl", hash = "sha256:063278c4805ffa6dd85e56648a9da3036939e6c0ac1001e851c9276b19b05970"}, + {file = "testcontainers-4.13.3.tar.gz", hash = "sha256:9d82a7052c9a53c58b69e1dc31da8e7a715e8b3ec1c4df5027561b47e2efe646"}, ] [package.dependencies] @@ -2079,26 +2403,25 @@ arangodb = ["python-arango (>=7.8,<8.0)"] aws = ["boto3", "httpx"] azurite = ["azure-storage-blob (>=12.19,<13.0)"] chroma = ["chromadb-client (>=1.0.0,<2.0.0)"] -clickhouse = ["clickhouse-driver"] cosmosdb = ["azure-cosmos"] db2 = ["ibm_db_sa", "sqlalchemy"] generic = ["httpx", "redis"] google = ["google-cloud-datastore (>=2)", "google-cloud-pubsub (>=2)"] influxdb = ["influxdb", "influxdb-client"] -k3s = ["kubernetes", "pyyaml"] +k3s = ["kubernetes", "pyyaml (>=6.0.3)"] keycloak = ["python-keycloak"] localstack = ["boto3"] mailpit = ["cryptography"] minio = ["minio"] mongodb = ["pymongo"] -mssql = ["pymssql", "sqlalchemy"] +mssql = ["pymssql (>=2.3.9)", "sqlalchemy"] mysql = ["pymysql[rsa]", "sqlalchemy"] nats = ["nats-py"] neo4j = ["neo4j"] openfga = ["openfga-sdk"] opensearch = ["opensearch-py"] -oracle = ["oracledb", "sqlalchemy"] -oracle-free = ["oracledb", "sqlalchemy"] +oracle = ["oracledb (>=3.4.1)", "sqlalchemy"] +oracle-free = ["oracledb (>=3.4.1)", "sqlalchemy"] qdrant = ["qdrant-client"] rabbitmq = ["pika"] redis = ["redis"] @@ -2112,43 +2435,69 @@ weaviate = ["weaviate-client (>=4.5.4,<5.0.0)"] [[package]] name = "tiktoken" -version = "0.9.0" +version = "0.12.0" description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "tiktoken-0.9.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:586c16358138b96ea804c034b8acf3f5d3f0258bd2bc3b0227af4af5d622e382"}, - {file = "tiktoken-0.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d9c59ccc528c6c5dd51820b3474402f69d9a9e1d656226848ad68a8d5b2e5108"}, - {file = "tiktoken-0.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0968d5beeafbca2a72c595e8385a1a1f8af58feaebb02b227229b69ca5357fd"}, - {file = "tiktoken-0.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a5fb085a6a3b7350b8fc838baf493317ca0e17bd95e8642f95fc69ecfed1de"}, - {file = "tiktoken-0.9.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:15a2752dea63d93b0332fb0ddb05dd909371ededa145fe6a3242f46724fa7990"}, - {file = "tiktoken-0.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:26113fec3bd7a352e4b33dbaf1bd8948de2507e30bd95a44e2b1156647bc01b4"}, - {file = "tiktoken-0.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f32cc56168eac4851109e9b5d327637f15fd662aa30dd79f964b7c39fbadd26e"}, - {file = "tiktoken-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:45556bc41241e5294063508caf901bf92ba52d8ef9222023f83d2483a3055348"}, - {file = "tiktoken-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03935988a91d6d3216e2ec7c645afbb3d870b37bcb67ada1943ec48678e7ee33"}, - {file = "tiktoken-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b3d80aad8d2c6b9238fc1a5524542087c52b860b10cbf952429ffb714bc1136"}, - {file = "tiktoken-0.9.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b2a21133be05dc116b1d0372af051cd2c6aa1d2188250c9b553f9fa49301b336"}, - {file = "tiktoken-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:11a20e67fdf58b0e2dea7b8654a288e481bb4fc0289d3ad21291f8d0849915fb"}, - {file = "tiktoken-0.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e88f121c1c22b726649ce67c089b90ddda8b9662545a8aeb03cfef15967ddd03"}, - {file = "tiktoken-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a6600660f2f72369acb13a57fb3e212434ed38b045fd8cc6cdd74947b4b5d210"}, - {file = "tiktoken-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95e811743b5dfa74f4b227927ed86cbc57cad4df859cb3b643be797914e41794"}, - {file = "tiktoken-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99376e1370d59bcf6935c933cb9ba64adc29033b7e73f5f7569f3aad86552b22"}, - {file = "tiktoken-0.9.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:badb947c32739fb6ddde173e14885fb3de4d32ab9d8c591cbd013c22b4c31dd2"}, - {file = "tiktoken-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:5a62d7a25225bafed786a524c1b9f0910a1128f4232615bf3f8257a73aaa3b16"}, - {file = "tiktoken-0.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b0e8e05a26eda1249e824156d537015480af7ae222ccb798e5234ae0285dbdb"}, - {file = "tiktoken-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:27d457f096f87685195eea0165a1807fae87b97b2161fe8c9b1df5bd74ca6f63"}, - {file = "tiktoken-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cf8ded49cddf825390e36dd1ad35cd49589e8161fdcb52aa25f0583e90a3e01"}, - {file = "tiktoken-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc156cb314119a8bb9748257a2eaebd5cc0753b6cb491d26694ed42fc7cb3139"}, - {file = "tiktoken-0.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cd69372e8c9dd761f0ab873112aba55a0e3e506332dd9f7522ca466e817b1b7a"}, - {file = "tiktoken-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:5ea0edb6f83dc56d794723286215918c1cde03712cbbafa0348b33448faf5b95"}, - {file = "tiktoken-0.9.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c6386ca815e7d96ef5b4ac61e0048cd32ca5a92d5781255e13b31381d28667dc"}, - {file = "tiktoken-0.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:75f6d5db5bc2c6274b674ceab1615c1778e6416b14705827d19b40e6355f03e0"}, - {file = "tiktoken-0.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e15b16f61e6f4625a57a36496d28dd182a8a60ec20a534c5343ba3cafa156ac7"}, - {file = "tiktoken-0.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebcec91babf21297022882344c3f7d9eed855931466c3311b1ad6b64befb3df"}, - {file = "tiktoken-0.9.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e5fd49e7799579240f03913447c0cdfa1129625ebd5ac440787afc4345990427"}, - {file = "tiktoken-0.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:26242ca9dc8b58e875ff4ca078b9a94d2f0813e6a535dcd2205df5d49d927cc7"}, - {file = "tiktoken-0.9.0.tar.gz", hash = "sha256:d02a5ca6a938e0490e1ff957bc48c8b078c88cb83977be1625b1fd8aac792c5d"}, + {file = "tiktoken-0.12.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3de02f5a491cfd179aec916eddb70331814bd6bf764075d39e21d5862e533970"}, + {file = "tiktoken-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b6cfb6d9b7b54d20af21a912bfe63a2727d9cfa8fbda642fd8322c70340aad16"}, + {file = "tiktoken-0.12.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:cde24cdb1b8a08368f709124f15b36ab5524aac5fa830cc3fdce9c03d4fb8030"}, + {file = "tiktoken-0.12.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:6de0da39f605992649b9cfa6f84071e3f9ef2cec458d08c5feb1b6f0ff62e134"}, + {file = "tiktoken-0.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6faa0534e0eefbcafaccb75927a4a380463a2eaa7e26000f0173b920e98b720a"}, + {file = "tiktoken-0.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:82991e04fc860afb933efb63957affc7ad54f83e2216fe7d319007dab1ba5892"}, + {file = "tiktoken-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:6fb2995b487c2e31acf0a9e17647e3b242235a20832642bb7a9d1a181c0c1bb1"}, + {file = "tiktoken-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e227c7f96925003487c33b1b32265fad2fbcec2b7cf4817afb76d416f40f6bb"}, + {file = "tiktoken-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c06cf0fcc24c2cb2adb5e185c7082a82cba29c17575e828518c2f11a01f445aa"}, + {file = "tiktoken-0.12.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:f18f249b041851954217e9fd8e5c00b024ab2315ffda5ed77665a05fa91f42dc"}, + {file = "tiktoken-0.12.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:47a5bc270b8c3db00bb46ece01ef34ad050e364b51d406b6f9730b64ac28eded"}, + {file = "tiktoken-0.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:508fa71810c0efdcd1b898fda574889ee62852989f7c1667414736bcb2b9a4bd"}, + {file = "tiktoken-0.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1af81a6c44f008cba48494089dd98cccb8b313f55e961a52f5b222d1e507967"}, + {file = "tiktoken-0.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e68e3e593637b53e56f7237be560f7a394451cb8c11079755e80ae64b9e6def"}, + {file = "tiktoken-0.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b97f74aca0d78a1ff21b8cd9e9925714c15a9236d6ceacf5c7327c117e6e21e8"}, + {file = "tiktoken-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b90f5ad190a4bb7c3eb30c5fa32e1e182ca1ca79f05e49b448438c3e225a49b"}, + {file = "tiktoken-0.12.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:65b26c7a780e2139e73acc193e5c63ac754021f160df919add909c1492c0fb37"}, + {file = "tiktoken-0.12.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:edde1ec917dfd21c1f2f8046b86348b0f54a2c0547f68149d8600859598769ad"}, + {file = "tiktoken-0.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:35a2f8ddd3824608b3d650a000c1ef71f730d0c56486845705a8248da00f9fe5"}, + {file = "tiktoken-0.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:83d16643edb7fa2c99eff2ab7733508aae1eebb03d5dfc46f5565862810f24e3"}, + {file = "tiktoken-0.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ffc5288f34a8bc02e1ea7047b8d041104791d2ddbf42d1e5fa07822cbffe16bd"}, + {file = "tiktoken-0.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:775c2c55de2310cc1bc9a3ad8826761cbdc87770e586fd7b6da7d4589e13dab3"}, + {file = "tiktoken-0.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a01b12f69052fbe4b080a2cfb867c4de12c704b56178edf1d1d7b273561db160"}, + {file = "tiktoken-0.12.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:01d99484dc93b129cd0964f9d34eee953f2737301f18b3c7257bf368d7615baa"}, + {file = "tiktoken-0.12.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:4a1a4fcd021f022bfc81904a911d3df0f6543b9e7627b51411da75ff2fe7a1be"}, + {file = "tiktoken-0.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:981a81e39812d57031efdc9ec59fa32b2a5a5524d20d4776574c4b4bd2e9014a"}, + {file = "tiktoken-0.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9baf52f84a3f42eef3ff4e754a0db79a13a27921b457ca9832cf944c6be4f8f3"}, + {file = "tiktoken-0.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:b8a0cd0c789a61f31bf44851defbd609e8dd1e2c8589c614cc1060940ef1f697"}, + {file = "tiktoken-0.12.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d5f89ea5680066b68bcb797ae85219c72916c922ef0fcdd3480c7d2315ffff16"}, + {file = "tiktoken-0.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b4e7ed1c6a7a8a60a3230965bdedba8cc58f68926b835e519341413370e0399a"}, + {file = "tiktoken-0.12.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:fc530a28591a2d74bce821d10b418b26a094bf33839e69042a6e86ddb7a7fb27"}, + {file = "tiktoken-0.12.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:06a9f4f49884139013b138920a4c393aa6556b2f8f536345f11819389c703ebb"}, + {file = "tiktoken-0.12.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:04f0e6a985d95913cabc96a741c5ffec525a2c72e9df086ff17ebe35985c800e"}, + {file = "tiktoken-0.12.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0ee8f9ae00c41770b5f9b0bb1235474768884ae157de3beb5439ca0fd70f3e25"}, + {file = "tiktoken-0.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:dc2dd125a62cb2b3d858484d6c614d136b5b848976794edfb63688d539b8b93f"}, + {file = "tiktoken-0.12.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:a90388128df3b3abeb2bfd1895b0681412a8d7dc644142519e6f0a97c2111646"}, + {file = "tiktoken-0.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:da900aa0ad52247d8794e307d6446bd3cdea8e192769b56276695d34d2c9aa88"}, + {file = "tiktoken-0.12.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:285ba9d73ea0d6171e7f9407039a290ca77efcdb026be7769dccc01d2c8d7fff"}, + {file = "tiktoken-0.12.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:d186a5c60c6a0213f04a7a802264083dea1bbde92a2d4c7069e1a56630aef830"}, + {file = "tiktoken-0.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:604831189bd05480f2b885ecd2d1986dc7686f609de48208ebbbddeea071fc0b"}, + {file = "tiktoken-0.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8f317e8530bb3a222547b85a58583238c8f74fd7a7408305f9f63246d1a0958b"}, + {file = "tiktoken-0.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:399c3dd672a6406719d84442299a490420b458c44d3ae65516302a99675888f3"}, + {file = "tiktoken-0.12.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2c714c72bc00a38ca969dae79e8266ddec999c7ceccd603cc4f0d04ccd76365"}, + {file = "tiktoken-0.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cbb9a3ba275165a2cb0f9a83f5d7025afe6b9d0ab01a22b50f0e74fee2ad253e"}, + {file = "tiktoken-0.12.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:dfdfaa5ffff8993a3af94d1125870b1d27aed7cb97aa7eb8c1cefdbc87dbee63"}, + {file = "tiktoken-0.12.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:584c3ad3d0c74f5269906eb8a659c8bfc6144a52895d9261cdaf90a0ae5f4de0"}, + {file = "tiktoken-0.12.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:54c891b416a0e36b8e2045b12b33dd66fb34a4fe7965565f1b482da50da3e86a"}, + {file = "tiktoken-0.12.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5edb8743b88d5be814b1a8a8854494719080c28faaa1ccbef02e87354fe71ef0"}, + {file = "tiktoken-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f61c0aea5565ac82e2ec50a05e02a6c44734e91b51c10510b084ea1b8e633a71"}, + {file = "tiktoken-0.12.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:d51d75a5bffbf26f86554d28e78bfb921eae998edc2675650fd04c7e1f0cdc1e"}, + {file = "tiktoken-0.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:09eb4eae62ae7e4c62364d9ec3a57c62eea707ac9a2b2c5d6bd05de6724ea179"}, + {file = "tiktoken-0.12.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:df37684ace87d10895acb44b7f447d4700349b12197a526da0d4a4149fde074c"}, + {file = "tiktoken-0.12.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:4c9614597ac94bb294544345ad8cf30dac2129c05e2db8dc53e082f355857af7"}, + {file = "tiktoken-0.12.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:20cf97135c9a50de0b157879c3c4accbb29116bcf001283d26e073ff3b345946"}, + {file = "tiktoken-0.12.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:15d875454bbaa3728be39880ddd11a5a2a9e548c29418b41e8fd8a767172b5ec"}, + {file = "tiktoken-0.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cff3688ba3c639ebe816f8d58ffbbb0aa7433e23e08ab1cade5d175fc973fb3"}, + {file = "tiktoken-0.12.0.tar.gz", hash = "sha256:b18ba7ee2b093863978fcb14f74b3707cdc8d4d4d3836853ce7ec60772139931"}, ] [package.dependencies] @@ -2160,46 +2509,56 @@ blobfile = ["blobfile (>=2)"] [[package]] name = "tomli" -version = "2.2.1" +version = "2.3.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version < \"3.11\"" files = [ - {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, - {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, - {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, - {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, - {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, - {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, - {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, - {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, - {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, - {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, -] + {file = "tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45"}, + {file = "tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba"}, + {file = "tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf"}, + {file = "tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441"}, + {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845"}, + {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c"}, + {file = "tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456"}, + {file = "tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be"}, + {file = "tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac"}, + {file = "tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22"}, + {file = "tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f"}, + {file = "tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52"}, + {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8"}, + {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6"}, + {file = "tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876"}, + {file = "tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878"}, + {file = "tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b"}, + {file = "tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae"}, + {file = "tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b"}, + {file = "tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf"}, + {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f"}, + {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05"}, + {file = "tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606"}, + {file = "tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999"}, + {file = "tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e"}, + {file = "tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3"}, + {file = "tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc"}, + {file = "tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0"}, + {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879"}, + {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005"}, + {file = "tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463"}, + {file = "tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8"}, + {file = "tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77"}, + {file = "tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf"}, + {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530"}, + {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b"}, + {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67"}, + {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f"}, + {file = "tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0"}, + {file = "tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba"}, + {file = "tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b"}, + {file = "tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549"}, +] +markers = {main = "python_version < \"3.11\"", dev = "python_full_version <= \"3.11.0a6\""} [[package]] name = "tqdm" @@ -2223,28 +2582,45 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] +[[package]] +name = "trustcall" +version = "0.0.39" +description = "Tenacious & trustworthy tool calling built on LangGraph." +optional = false +python-versions = "<4.0,>=3.10" +groups = ["dev"] +files = [ + {file = "trustcall-0.0.39-py3-none-any.whl", hash = "sha256:d7da42e0bba816c0539b2936dfed90ffb3ea8d789e548e73865d416f8ac4ee64"}, + {file = "trustcall-0.0.39.tar.gz", hash = "sha256:ec315818224501b9537ce6b7618dbc21be41210c6e8f2e239169a5a00912cd6e"}, +] + +[package.dependencies] +dydantic = ">=0.0.8,<1.0.0" +jsonpatch = ">=1.33,<2.0" +langgraph = ">=0.2.25" + [[package]] name = "typing-extensions" -version = "4.14.0" +version = "4.15.0" description = "Backported and Experimental Type Hints for Python 3.9+" optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af"}, - {file = "typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4"}, + {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, + {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] [[package]] name = "typing-inspection" -version = "0.4.1" +version = "0.4.2" description = "Runtime typing introspection tools" optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51"}, - {file = "typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28"}, + {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"}, + {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"}, ] [package.dependencies] @@ -2285,340 +2661,387 @@ tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [[package]] name = "wrapt" -version = "1.17.2" +version = "2.0.1" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, - {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, - {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, - {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, - {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, - {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, - {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, - {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, - {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, - {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, - {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, - {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, - {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, - {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, - {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, - {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, - {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, - {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, - {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, + {file = "wrapt-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:64b103acdaa53b7caf409e8d45d39a8442fe6dcfec6ba3f3d141e0cc2b5b4dbd"}, + {file = "wrapt-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91bcc576260a274b169c3098e9a3519fb01f2989f6d3d386ef9cbf8653de1374"}, + {file = "wrapt-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab594f346517010050126fcd822697b25a7031d815bb4fbc238ccbe568216489"}, + {file = "wrapt-2.0.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:36982b26f190f4d737f04a492a68accbfc6fa042c3f42326fdfbb6c5b7a20a31"}, + {file = "wrapt-2.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23097ed8bc4c93b7bf36fa2113c6c733c976316ce0ee2c816f64ca06102034ef"}, + {file = "wrapt-2.0.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8bacfe6e001749a3b64db47bcf0341da757c95959f592823a93931a422395013"}, + {file = "wrapt-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8ec3303e8a81932171f455f792f8df500fc1a09f20069e5c16bd7049ab4e8e38"}, + {file = "wrapt-2.0.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:3f373a4ab5dbc528a94334f9fe444395b23c2f5332adab9ff4ea82f5a9e33bc1"}, + {file = "wrapt-2.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f49027b0b9503bf6c8cdc297ca55006b80c2f5dd36cecc72c6835ab6e10e8a25"}, + {file = "wrapt-2.0.1-cp310-cp310-win32.whl", hash = "sha256:8330b42d769965e96e01fa14034b28a2a7600fbf7e8f0cc90ebb36d492c993e4"}, + {file = "wrapt-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:1218573502a8235bb8a7ecaed12736213b22dcde9feab115fa2989d42b5ded45"}, + {file = "wrapt-2.0.1-cp310-cp310-win_arm64.whl", hash = "sha256:eda8e4ecd662d48c28bb86be9e837c13e45c58b8300e43ba3c9b4fa9900302f7"}, + {file = "wrapt-2.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e17283f533a0d24d6e5429a7d11f250a58d28b4ae5186f8f47853e3e70d2590"}, + {file = "wrapt-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85df8d92158cb8f3965aecc27cf821461bb5f40b450b03facc5d9f0d4d6ddec6"}, + {file = "wrapt-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1be685ac7700c966b8610ccc63c3187a72e33cab53526a27b2a285a662cd4f7"}, + {file = "wrapt-2.0.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:df0b6d3b95932809c5b3fecc18fda0f1e07452d05e2662a0b35548985f256e28"}, + {file = "wrapt-2.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4da7384b0e5d4cae05c97cd6f94faaf78cc8b0f791fc63af43436d98c4ab37bb"}, + {file = "wrapt-2.0.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ec65a78fbd9d6f083a15d7613b2800d5663dbb6bb96003899c834beaa68b242c"}, + {file = "wrapt-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7de3cc939be0e1174969f943f3b44e0d79b6f9a82198133a5b7fc6cc92882f16"}, + {file = "wrapt-2.0.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:fb1a5b72cbd751813adc02ef01ada0b0d05d3dcbc32976ce189a1279d80ad4a2"}, + {file = "wrapt-2.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3fa272ca34332581e00bf7773e993d4f632594eb2d1b0b162a9038df0fd971dd"}, + {file = "wrapt-2.0.1-cp311-cp311-win32.whl", hash = "sha256:fc007fdf480c77301ab1afdbb6ab22a5deee8885f3b1ed7afcb7e5e84a0e27be"}, + {file = "wrapt-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:47434236c396d04875180171ee1f3815ca1eada05e24a1ee99546320d54d1d1b"}, + {file = "wrapt-2.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:837e31620e06b16030b1d126ed78e9383815cbac914693f54926d816d35d8edf"}, + {file = "wrapt-2.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1fdbb34da15450f2b1d735a0e969c24bdb8d8924892380126e2a293d9902078c"}, + {file = "wrapt-2.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3d32794fe940b7000f0519904e247f902f0149edbe6316c710a8562fb6738841"}, + {file = "wrapt-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:386fb54d9cd903ee0012c09291336469eb7b244f7183d40dc3e86a16a4bace62"}, + {file = "wrapt-2.0.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7b219cb2182f230676308cdcacd428fa837987b89e4b7c5c9025088b8a6c9faf"}, + {file = "wrapt-2.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:641e94e789b5f6b4822bb8d8ebbdfc10f4e4eae7756d648b717d980f657a9eb9"}, + {file = "wrapt-2.0.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe21b118b9f58859b5ebaa4b130dee18669df4bd111daad082b7beb8799ad16b"}, + {file = "wrapt-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:17fb85fa4abc26a5184d93b3efd2dcc14deb4b09edcdb3535a536ad34f0b4dba"}, + {file = "wrapt-2.0.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:b89ef9223d665ab255ae42cc282d27d69704d94be0deffc8b9d919179a609684"}, + {file = "wrapt-2.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a453257f19c31b31ba593c30d997d6e5be39e3b5ad9148c2af5a7314061c63eb"}, + {file = "wrapt-2.0.1-cp312-cp312-win32.whl", hash = "sha256:3e271346f01e9c8b1130a6a3b0e11908049fe5be2d365a5f402778049147e7e9"}, + {file = "wrapt-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:2da620b31a90cdefa9cd0c2b661882329e2e19d1d7b9b920189956b76c564d75"}, + {file = "wrapt-2.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:aea9c7224c302bc8bfc892b908537f56c430802560e827b75ecbde81b604598b"}, + {file = "wrapt-2.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:47b0f8bafe90f7736151f61482c583c86b0693d80f075a58701dd1549b0010a9"}, + {file = "wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cbeb0971e13b4bd81d34169ed57a6dda017328d1a22b62fda45e1d21dd06148f"}, + {file = "wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb7cffe572ad0a141a7886a1d2efa5bef0bf7fe021deeea76b3ab334d2c38218"}, + {file = "wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c8d60527d1ecfc131426b10d93ab5d53e08a09c5fa0175f6b21b3252080c70a9"}, + {file = "wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c654eafb01afac55246053d67a4b9a984a3567c3808bb7df2f8de1c1caba2e1c"}, + {file = "wrapt-2.0.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:98d873ed6c8b4ee2418f7afce666751854d6d03e3c0ec2a399bb039cd2ae89db"}, + {file = "wrapt-2.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9e850f5b7fc67af856ff054c71690d54fa940c3ef74209ad9f935b4f66a0233"}, + {file = "wrapt-2.0.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e505629359cb5f751e16e30cf3f91a1d3ddb4552480c205947da415d597f7ac2"}, + {file = "wrapt-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2879af909312d0baf35f08edeea918ee3af7ab57c37fe47cb6a373c9f2749c7b"}, + {file = "wrapt-2.0.1-cp313-cp313-win32.whl", hash = "sha256:d67956c676be5a24102c7407a71f4126d30de2a569a1c7871c9f3cabc94225d7"}, + {file = "wrapt-2.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:9ca66b38dd642bf90c59b6738af8070747b610115a39af2498535f62b5cdc1c3"}, + {file = "wrapt-2.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:5a4939eae35db6b6cec8e7aa0e833dcca0acad8231672c26c2a9ab7a0f8ac9c8"}, + {file = "wrapt-2.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a52f93d95c8d38fed0669da2ebdb0b0376e895d84596a976c15a9eb45e3eccb3"}, + {file = "wrapt-2.0.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4e54bbf554ee29fcceee24fa41c4d091398b911da6e7f5d7bffda963c9aed2e1"}, + {file = "wrapt-2.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:908f8c6c71557f4deaa280f55d0728c3bca0960e8c3dd5ceeeafb3c19942719d"}, + {file = "wrapt-2.0.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e2f84e9af2060e3904a32cea9bb6db23ce3f91cfd90c6b426757cf7cc01c45c7"}, + {file = "wrapt-2.0.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e3612dc06b436968dfb9142c62e5dfa9eb5924f91120b3c8ff501ad878f90eb3"}, + {file = "wrapt-2.0.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d2d947d266d99a1477cd005b23cbd09465276e302515e122df56bb9511aca1b"}, + {file = "wrapt-2.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7d539241e87b650cbc4c3ac9f32c8d1ac8a54e510f6dca3f6ab60dcfd48c9b10"}, + {file = "wrapt-2.0.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:4811e15d88ee62dbf5c77f2c3ff3932b1e3ac92323ba3912f51fc4016ce81ecf"}, + {file = "wrapt-2.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c1c91405fcf1d501fa5d55df21e58ea49e6b879ae829f1039faaf7e5e509b41e"}, + {file = "wrapt-2.0.1-cp313-cp313t-win32.whl", hash = "sha256:e76e3f91f864e89db8b8d2a8311d57df93f01ad6bb1e9b9976d1f2e83e18315c"}, + {file = "wrapt-2.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:83ce30937f0ba0d28818807b303a412440c4b63e39d3d8fc036a94764b728c92"}, + {file = "wrapt-2.0.1-cp313-cp313t-win_arm64.whl", hash = "sha256:4b55cacc57e1dc2d0991dbe74c6419ffd415fb66474a02335cb10efd1aa3f84f"}, + {file = "wrapt-2.0.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:5e53b428f65ece6d9dad23cb87e64506392b720a0b45076c05354d27a13351a1"}, + {file = "wrapt-2.0.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ad3ee9d0f254851c71780966eb417ef8e72117155cff04821ab9b60549694a55"}, + {file = "wrapt-2.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7b822c61ed04ee6ad64bc90d13368ad6eb094db54883b5dde2182f67a7f22c0"}, + {file = "wrapt-2.0.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7164a55f5e83a9a0b031d3ffab4d4e36bbec42e7025db560f225489fa929e509"}, + {file = "wrapt-2.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e60690ba71a57424c8d9ff28f8d006b7ad7772c22a4af432188572cd7fa004a1"}, + {file = "wrapt-2.0.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3cd1a4bd9a7a619922a8557e1318232e7269b5fb69d4ba97b04d20450a6bf970"}, + {file = "wrapt-2.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b4c2e3d777e38e913b8ce3a6257af72fb608f86a1df471cb1d4339755d0a807c"}, + {file = "wrapt-2.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3d366aa598d69416b5afedf1faa539fac40c1d80a42f6b236c88c73a3c8f2d41"}, + {file = "wrapt-2.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c235095d6d090aa903f1db61f892fffb779c1eaeb2a50e566b52001f7a0f66ed"}, + {file = "wrapt-2.0.1-cp314-cp314-win32.whl", hash = "sha256:bfb5539005259f8127ea9c885bdc231978c06b7a980e63a8a61c8c4c979719d0"}, + {file = "wrapt-2.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:4ae879acc449caa9ed43fc36ba08392b9412ee67941748d31d94e3cedb36628c"}, + {file = "wrapt-2.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:8639b843c9efd84675f1e100ed9e99538ebea7297b62c4b45a7042edb84db03e"}, + {file = "wrapt-2.0.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:9219a1d946a9b32bb23ccae66bdb61e35c62773ce7ca6509ceea70f344656b7b"}, + {file = "wrapt-2.0.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fa4184e74197af3adad3c889a1af95b53bb0466bced92ea99a0c014e48323eec"}, + {file = "wrapt-2.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c5ef2f2b8a53b7caee2f797ef166a390fef73979b15778a4a153e4b5fedce8fa"}, + {file = "wrapt-2.0.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e042d653a4745be832d5aa190ff80ee4f02c34b21f4b785745eceacd0907b815"}, + {file = "wrapt-2.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2afa23318136709c4b23d87d543b425c399887b4057936cd20386d5b1422b6fa"}, + {file = "wrapt-2.0.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c72328f668cf4c503ffcf9434c2b71fdd624345ced7941bc6693e61bbe36bef"}, + {file = "wrapt-2.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3793ac154afb0e5b45d1233cb94d354ef7a983708cc3bb12563853b1d8d53747"}, + {file = "wrapt-2.0.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fec0d993ecba3991645b4857837277469c8cc4c554a7e24d064d1ca291cfb81f"}, + {file = "wrapt-2.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:949520bccc1fa227274da7d03bf238be15389cd94e32e4297b92337df9b7a349"}, + {file = "wrapt-2.0.1-cp314-cp314t-win32.whl", hash = "sha256:be9e84e91d6497ba62594158d3d31ec0486c60055c49179edc51ee43d095f79c"}, + {file = "wrapt-2.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:61c4956171c7434634401db448371277d07032a81cc21c599c22953374781395"}, + {file = "wrapt-2.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:35cdbd478607036fee40273be8ed54a451f5f23121bd9d4be515158f9498f7ad"}, + {file = "wrapt-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:90897ea1cf0679763b62e79657958cd54eae5659f6360fc7d2ccc6f906342183"}, + {file = "wrapt-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:50844efc8cdf63b2d90cd3d62d4947a28311e6266ce5235a219d21b195b4ec2c"}, + {file = "wrapt-2.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49989061a9977a8cbd6d20f2efa813f24bf657c6990a42967019ce779a878dbf"}, + {file = "wrapt-2.0.1-cp38-cp38-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:09c7476ab884b74dce081ad9bfd07fe5822d8600abade571cb1f66d5fc915af6"}, + {file = "wrapt-2.0.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1a8a09a004ef100e614beec82862d11fc17d601092c3599afd22b1f36e4137e"}, + {file = "wrapt-2.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:89a82053b193837bf93c0f8a57ded6e4b6d88033a499dadff5067e912c2a41e9"}, + {file = "wrapt-2.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f26f8e2ca19564e2e1fdbb6a0e47f36e0efbab1acc31e15471fad88f828c75f6"}, + {file = "wrapt-2.0.1-cp38-cp38-win32.whl", hash = "sha256:115cae4beed3542e37866469a8a1f2b9ec549b4463572b000611e9946b86e6f6"}, + {file = "wrapt-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:c4012a2bd37059d04f8209916aa771dfb564cccb86079072bdcd48a308b6a5c5"}, + {file = "wrapt-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:68424221a2dc00d634b54f92441914929c5ffb1c30b3b837343978343a3512a3"}, + {file = "wrapt-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6bd1a18f5a797fe740cb3d7a0e853a8ce6461cc62023b630caec80171a6b8097"}, + {file = "wrapt-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fb3a86e703868561c5cad155a15c36c716e1ab513b7065bd2ac8ed353c503333"}, + {file = "wrapt-2.0.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5dc1b852337c6792aa111ca8becff5bacf576bf4a0255b0f05eb749da6a1643e"}, + {file = "wrapt-2.0.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c046781d422f0830de6329fa4b16796096f28a92c8aef3850674442cdcb87b7f"}, + {file = "wrapt-2.0.1-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f73f9f7a0ebd0db139253d27e5fc8d2866ceaeef19c30ab5d69dcbe35e1a6981"}, + {file = "wrapt-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b667189cf8efe008f55bbda321890bef628a67ab4147ebf90d182f2dadc78790"}, + {file = "wrapt-2.0.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:a9a83618c4f0757557c077ef71d708ddd9847ed66b7cc63416632af70d3e2308"}, + {file = "wrapt-2.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e9b121e9aeb15df416c2c960b8255a49d44b4038016ee17af03975992d03931"}, + {file = "wrapt-2.0.1-cp39-cp39-win32.whl", hash = "sha256:1f186e26ea0a55f809f232e92cc8556a0977e00183c3ebda039a807a42be1494"}, + {file = "wrapt-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:bf4cb76f36be5de950ce13e22e7fdf462b35b04665a12b64f3ac5c1bbbcf3728"}, + {file = "wrapt-2.0.1-cp39-cp39-win_arm64.whl", hash = "sha256:d6cc985b9c8b235bd933990cdbf0f891f8e010b65a3911f7a55179cd7b0fc57b"}, + {file = "wrapt-2.0.1-py3-none-any.whl", hash = "sha256:4d2ce1bf1a48c5277d7969259232b57645aae5686dba1eaeade39442277afbca"}, + {file = "wrapt-2.0.1.tar.gz", hash = "sha256:9c9c635e78497cacb81e84f8b11b23e0aacac7a136e73b8e5b2109a1d9fc468f"}, ] +[package.extras] +dev = ["pytest", "setuptools"] + [[package]] name = "xxhash" -version = "3.5.0" +version = "3.6.0" description = "Python binding for xxHash" optional = false python-versions = ">=3.7" groups = ["dev"] files = [ - {file = "xxhash-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ece616532c499ee9afbb83078b1b952beffef121d989841f7f4b3dc5ac0fd212"}, - {file = "xxhash-3.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3171f693dbc2cef6477054a665dc255d996646b4023fe56cb4db80e26f4cc520"}, - {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c5d3e570ef46adaf93fc81b44aca6002b5a4d8ca11bd0580c07eac537f36680"}, - {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7cb29a034301e2982df8b1fe6328a84f4b676106a13e9135a0d7e0c3e9f806da"}, - {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d0d307d27099bb0cbeea7260eb39ed4fdb99c5542e21e94bb6fd29e49c57a23"}, - {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0342aafd421795d740e514bc9858ebddfc705a75a8c5046ac56d85fe97bf196"}, - {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dbbd9892c5ebffeca1ed620cf0ade13eb55a0d8c84e0751a6653adc6ac40d0c"}, - {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4cc2d67fdb4d057730c75a64c5923abfa17775ae234a71b0200346bfb0a7f482"}, - {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ec28adb204b759306a3d64358a5e5c07d7b1dd0ccbce04aa76cb9377b7b70296"}, - {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1328f6d8cca2b86acb14104e381225a3d7b42c92c4b86ceae814e5c400dbb415"}, - {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8d47ebd9f5d9607fd039c1fbf4994e3b071ea23eff42f4ecef246ab2b7334198"}, - {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b96d559e0fcddd3343c510a0fe2b127fbff16bf346dd76280b82292567523442"}, - {file = "xxhash-3.5.0-cp310-cp310-win32.whl", hash = "sha256:61c722ed8d49ac9bc26c7071eeaa1f6ff24053d553146d5df031802deffd03da"}, - {file = "xxhash-3.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:9bed5144c6923cc902cd14bb8963f2d5e034def4486ab0bbe1f58f03f042f9a9"}, - {file = "xxhash-3.5.0-cp310-cp310-win_arm64.whl", hash = "sha256:893074d651cf25c1cc14e3bea4fceefd67f2921b1bb8e40fcfeba56820de80c6"}, - {file = "xxhash-3.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02c2e816896dc6f85922ced60097bcf6f008dedfc5073dcba32f9c8dd786f3c1"}, - {file = "xxhash-3.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6027dcd885e21581e46d3c7f682cfb2b870942feeed58a21c29583512c3f09f8"}, - {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1308fa542bbdbf2fa85e9e66b1077eea3a88bef38ee8a06270b4298a7a62a166"}, - {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c28b2fdcee797e1c1961cd3bcd3d545cab22ad202c846235197935e1df2f8ef7"}, - {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:924361811732ddad75ff23e90efd9ccfda4f664132feecb90895bade6a1b4623"}, - {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89997aa1c4b6a5b1e5b588979d1da048a3c6f15e55c11d117a56b75c84531f5a"}, - {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:685c4f4e8c59837de103344eb1c8a3851f670309eb5c361f746805c5471b8c88"}, - {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbd2ecfbfee70bc1a4acb7461fa6af7748ec2ab08ac0fa298f281c51518f982c"}, - {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25b5a51dc3dfb20a10833c8eee25903fd2e14059e9afcd329c9da20609a307b2"}, - {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a8fb786fb754ef6ff8c120cb96629fb518f8eb5a61a16aac3a979a9dbd40a084"}, - {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a905ad00ad1e1c34fe4e9d7c1d949ab09c6fa90c919860c1534ff479f40fd12d"}, - {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:963be41bcd49f53af6d795f65c0da9b4cc518c0dd9c47145c98f61cb464f4839"}, - {file = "xxhash-3.5.0-cp311-cp311-win32.whl", hash = "sha256:109b436096d0a2dd039c355fa3414160ec4d843dfecc64a14077332a00aeb7da"}, - {file = "xxhash-3.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:b702f806693201ad6c0a05ddbbe4c8f359626d0b3305f766077d51388a6bac58"}, - {file = "xxhash-3.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:c4dcb4120d0cc3cc448624147dba64e9021b278c63e34a38789b688fd0da9bf3"}, - {file = "xxhash-3.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:14470ace8bd3b5d51318782cd94e6f94431974f16cb3b8dc15d52f3b69df8e00"}, - {file = "xxhash-3.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59aa1203de1cb96dbeab595ded0ad0c0056bb2245ae11fac11c0ceea861382b9"}, - {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08424f6648526076e28fae6ea2806c0a7d504b9ef05ae61d196d571e5c879c84"}, - {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61a1ff00674879725b194695e17f23d3248998b843eb5e933007ca743310f793"}, - {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2f2c61bee5844d41c3eb015ac652a0229e901074951ae48581d58bfb2ba01be"}, - {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d32a592cac88d18cc09a89172e1c32d7f2a6e516c3dfde1b9adb90ab5df54a6"}, - {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70dabf941dede727cca579e8c205e61121afc9b28516752fd65724be1355cc90"}, - {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e5d0ddaca65ecca9c10dcf01730165fd858533d0be84c75c327487c37a906a27"}, - {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e5b5e16c5a480fe5f59f56c30abdeba09ffd75da8d13f6b9b6fd224d0b4d0a2"}, - {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149b7914451eb154b3dfaa721315117ea1dac2cc55a01bfbd4df7c68c5dd683d"}, - {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:eade977f5c96c677035ff39c56ac74d851b1cca7d607ab3d8f23c6b859379cab"}, - {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa9f547bd98f5553d03160967866a71056a60960be00356a15ecc44efb40ba8e"}, - {file = "xxhash-3.5.0-cp312-cp312-win32.whl", hash = "sha256:f7b58d1fd3551b8c80a971199543379be1cee3d0d409e1f6d8b01c1a2eebf1f8"}, - {file = "xxhash-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:fa0cafd3a2af231b4e113fba24a65d7922af91aeb23774a8b78228e6cd785e3e"}, - {file = "xxhash-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:586886c7e89cb9828bcd8a5686b12e161368e0064d040e225e72607b43858ba2"}, - {file = "xxhash-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6"}, - {file = "xxhash-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5"}, - {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc"}, - {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3"}, - {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c"}, - {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb"}, - {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f"}, - {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7"}, - {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326"}, - {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf"}, - {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7"}, - {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c"}, - {file = "xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637"}, - {file = "xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43"}, - {file = "xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b"}, - {file = "xxhash-3.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6e5f70f6dca1d3b09bccb7daf4e087075ff776e3da9ac870f86ca316736bb4aa"}, - {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e76e83efc7b443052dd1e585a76201e40b3411fe3da7af4fe434ec51b2f163b"}, - {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33eac61d0796ca0591f94548dcfe37bb193671e0c9bcf065789b5792f2eda644"}, - {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ec70a89be933ea49222fafc3999987d7899fc676f688dd12252509434636622"}, - {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86b8e7f703ec6ff4f351cfdb9f428955859537125904aa8c963604f2e9d3e7"}, - {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0adfbd36003d9f86c8c97110039f7539b379f28656a04097e7434d3eaf9aa131"}, - {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:63107013578c8a730419adc05608756c3fa640bdc6abe806c3123a49fb829f43"}, - {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:683b94dbd1ca67557850b86423318a2e323511648f9f3f7b1840408a02b9a48c"}, - {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:5d2a01dcce81789cf4b12d478b5464632204f4c834dc2d064902ee27d2d1f0ee"}, - {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:a9d360a792cbcce2fe7b66b8d51274ec297c53cbc423401480e53b26161a290d"}, - {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:f0b48edbebea1b7421a9c687c304f7b44d0677c46498a046079d445454504737"}, - {file = "xxhash-3.5.0-cp37-cp37m-win32.whl", hash = "sha256:7ccb800c9418e438b44b060a32adeb8393764da7441eb52aa2aa195448935306"}, - {file = "xxhash-3.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c3bc7bf8cb8806f8d1c9bf149c18708cb1c406520097d6b0a73977460ea03602"}, - {file = "xxhash-3.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:74752ecaa544657d88b1d1c94ae68031e364a4d47005a90288f3bab3da3c970f"}, - {file = "xxhash-3.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dee1316133c9b463aa81aca676bc506d3f80d8f65aeb0bba2b78d0b30c51d7bd"}, - {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:602d339548d35a8579c6b013339fb34aee2df9b4e105f985443d2860e4d7ffaa"}, - {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:695735deeddfb35da1677dbc16a083445360e37ff46d8ac5c6fcd64917ff9ade"}, - {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1030a39ba01b0c519b1a82f80e8802630d16ab95dc3f2b2386a0b5c8ed5cbb10"}, - {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5bc08f33c4966f4eb6590d6ff3ceae76151ad744576b5fc6c4ba8edd459fdec"}, - {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160e0c19ee500482ddfb5d5570a0415f565d8ae2b3fd69c5dcfce8a58107b1c3"}, - {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f1abffa122452481a61c3551ab3c89d72238e279e517705b8b03847b1d93d738"}, - {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d5e9db7ef3ecbfc0b4733579cea45713a76852b002cf605420b12ef3ef1ec148"}, - {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:23241ff6423378a731d84864bf923a41649dc67b144debd1077f02e6249a0d54"}, - {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:82b833d5563fefd6fceafb1aed2f3f3ebe19f84760fdd289f8b926731c2e6e91"}, - {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0a80ad0ffd78bef9509eee27b4a29e56f5414b87fb01a888353e3d5bda7038bd"}, - {file = "xxhash-3.5.0-cp38-cp38-win32.whl", hash = "sha256:50ac2184ffb1b999e11e27c7e3e70cc1139047e7ebc1aa95ed12f4269abe98d4"}, - {file = "xxhash-3.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:392f52ebbb932db566973693de48f15ce787cabd15cf6334e855ed22ea0be5b3"}, - {file = "xxhash-3.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfc8cdd7f33d57f0468b0614ae634cc38ab9202c6957a60e31d285a71ebe0301"}, - {file = "xxhash-3.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e0c48b6300cd0b0106bf49169c3e0536408dfbeb1ccb53180068a18b03c662ab"}, - {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe1a92cfbaa0a1253e339ccec42dbe6db262615e52df591b68726ab10338003f"}, - {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33513d6cc3ed3b559134fb307aae9bdd94d7e7c02907b37896a6c45ff9ce51bd"}, - {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eefc37f6138f522e771ac6db71a6d4838ec7933939676f3753eafd7d3f4c40bc"}, - {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a606c8070ada8aa2a88e181773fa1ef17ba65ce5dd168b9d08038e2a61b33754"}, - {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42eca420c8fa072cc1dd62597635d140e78e384a79bb4944f825fbef8bfeeef6"}, - {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:604253b2143e13218ff1ef0b59ce67f18b8bd1c4205d2ffda22b09b426386898"}, - {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6e93a5ad22f434d7876665444a97e713a8f60b5b1a3521e8df11b98309bff833"}, - {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:7a46e1d6d2817ba8024de44c4fd79913a90e5f7265434cef97026215b7d30df6"}, - {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:30eb2efe6503c379b7ab99c81ba4a779748e3830241f032ab46bd182bf5873af"}, - {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c8aa771ff2c13dd9cda8166d685d7333d389fae30a4d2bb39d63ab5775de8606"}, - {file = "xxhash-3.5.0-cp39-cp39-win32.whl", hash = "sha256:5ed9ebc46f24cf91034544b26b131241b699edbfc99ec5e7f8f3d02d6eb7fba4"}, - {file = "xxhash-3.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:220f3f896c6b8d0316f63f16c077d52c412619e475f9372333474ee15133a558"}, - {file = "xxhash-3.5.0-cp39-cp39-win_arm64.whl", hash = "sha256:a7b1d8315d9b5e9f89eb2933b73afae6ec9597a258d52190944437158b49d38e"}, - {file = "xxhash-3.5.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2014c5b3ff15e64feecb6b713af12093f75b7926049e26a580e94dcad3c73d8c"}, - {file = "xxhash-3.5.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fab81ef75003eda96239a23eda4e4543cedc22e34c373edcaf744e721a163986"}, - {file = "xxhash-3.5.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e2febf914ace002132aa09169cc572e0d8959d0f305f93d5828c4836f9bc5a6"}, - {file = "xxhash-3.5.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d3a10609c51da2a1c0ea0293fc3968ca0a18bd73838455b5bca3069d7f8e32b"}, - {file = "xxhash-3.5.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a74f23335b9689b66eb6dbe2a931a88fcd7a4c2cc4b1cb0edba8ce381c7a1da"}, - {file = "xxhash-3.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b4154c00eb22e4d543f472cfca430e7962a0f1d0f3778334f2e08a7ba59363c"}, - {file = "xxhash-3.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d30bbc1644f726b825b3278764240f449d75f1a8bdda892e641d4a688b1494ae"}, - {file = "xxhash-3.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fa0b72f2423e2aa53077e54a61c28e181d23effeaafd73fcb9c494e60930c8e"}, - {file = "xxhash-3.5.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13de2b76c1835399b2e419a296d5b38dc4855385d9e96916299170085ef72f57"}, - {file = "xxhash-3.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0691bfcc4f9c656bcb96cc5db94b4d75980b9d5589f2e59de790091028580837"}, - {file = "xxhash-3.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:297595fe6138d4da2c8ce9e72a04d73e58725bb60f3a19048bc96ab2ff31c692"}, - {file = "xxhash-3.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc1276d369452040cbb943300dc8abeedab14245ea44056a2943183822513a18"}, - {file = "xxhash-3.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2061188a1ba352fc699c82bff722f4baacb4b4b8b2f0c745d2001e56d0dfb514"}, - {file = "xxhash-3.5.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38c384c434021e4f62b8d9ba0bc9467e14d394893077e2c66d826243025e1f81"}, - {file = "xxhash-3.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e6a4dd644d72ab316b580a1c120b375890e4c52ec392d4aef3c63361ec4d77d1"}, - {file = "xxhash-3.5.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:531af8845aaadcadf951b7e0c1345c6b9c68a990eeb74ff9acd8501a0ad6a1c9"}, - {file = "xxhash-3.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ce379bcaa9fcc00f19affa7773084dd09f5b59947b3fb47a1ceb0179f91aaa1"}, - {file = "xxhash-3.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd1b2281d01723f076df3c8188f43f2472248a6b63118b036e641243656b1b0f"}, - {file = "xxhash-3.5.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c770750cc80e8694492244bca7251385188bc5597b6a39d98a9f30e8da984e0"}, - {file = "xxhash-3.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b150b8467852e1bd844387459aa6fbe11d7f38b56e901f9f3b3e6aba0d660240"}, - {file = "xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f"}, + {file = "xxhash-3.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:87ff03d7e35c61435976554477a7f4cd1704c3596a89a8300d5ce7fc83874a71"}, + {file = "xxhash-3.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f572dfd3d0e2eb1a57511831cf6341242f5a9f8298a45862d085f5b93394a27d"}, + {file = "xxhash-3.6.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:89952ea539566b9fed2bbd94e589672794b4286f342254fad28b149f9615fef8"}, + {file = "xxhash-3.6.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e6f2ffb07a50b52465a1032c3cf1f4a5683f944acaca8a134a2f23674c2058"}, + {file = "xxhash-3.6.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b5b848ad6c16d308c3ac7ad4ba6bede80ed5df2ba8ed382f8932df63158dd4b2"}, + {file = "xxhash-3.6.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a034590a727b44dd8ac5914236a7b8504144447a9682586c3327e935f33ec8cc"}, + {file = "xxhash-3.6.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a8f1972e75ebdd161d7896743122834fe87378160c20e97f8b09166213bf8cc"}, + {file = "xxhash-3.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ee34327b187f002a596d7b167ebc59a1b729e963ce645964bbc050d2f1b73d07"}, + {file = "xxhash-3.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:339f518c3c7a850dd033ab416ea25a692759dc7478a71131fe8869010d2b75e4"}, + {file = "xxhash-3.6.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:bf48889c9630542d4709192578aebbd836177c9f7a4a2778a7d6340107c65f06"}, + {file = "xxhash-3.6.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:5576b002a56207f640636056b4160a378fe36a58db73ae5c27a7ec8db35f71d4"}, + {file = "xxhash-3.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af1f3278bd02814d6dedc5dec397993b549d6f16c19379721e5a1d31e132c49b"}, + {file = "xxhash-3.6.0-cp310-cp310-win32.whl", hash = "sha256:aed058764db109dc9052720da65fafe84873b05eb8b07e5e653597951af57c3b"}, + {file = "xxhash-3.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:e82da5670f2d0d98950317f82a0e4a0197150ff19a6df2ba40399c2a3b9ae5fb"}, + {file = "xxhash-3.6.0-cp310-cp310-win_arm64.whl", hash = "sha256:4a082ffff8c6ac07707fb6b671caf7c6e020c75226c561830b73d862060f281d"}, + {file = "xxhash-3.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b47bbd8cf2d72797f3c2772eaaac0ded3d3af26481a26d7d7d41dc2d3c46b04a"}, + {file = "xxhash-3.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2b6821e94346f96db75abaa6e255706fb06ebd530899ed76d32cd99f20dc52fa"}, + {file = "xxhash-3.6.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d0a9751f71a1a65ce3584e9cae4467651c7e70c9d31017fa57574583a4540248"}, + {file = "xxhash-3.6.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b29ee68625ab37b04c0b40c3fafdf24d2f75ccd778333cfb698f65f6c463f62"}, + {file = "xxhash-3.6.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6812c25fe0d6c36a46ccb002f40f27ac903bf18af9f6dd8f9669cb4d176ab18f"}, + {file = "xxhash-3.6.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4ccbff013972390b51a18ef1255ef5ac125c92dc9143b2d1909f59abc765540e"}, + {file = "xxhash-3.6.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:297b7fbf86c82c550e12e8fb71968b3f033d27b874276ba3624ea868c11165a8"}, + {file = "xxhash-3.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dea26ae1eb293db089798d3973a5fc928a18fdd97cc8801226fae705b02b14b0"}, + {file = "xxhash-3.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7a0b169aafb98f4284f73635a8e93f0735f9cbde17bd5ec332480484241aaa77"}, + {file = "xxhash-3.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:08d45aef063a4531b785cd72de4887766d01dc8f362a515693df349fdb825e0c"}, + {file = "xxhash-3.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:929142361a48ee07f09121fe9e96a84950e8d4df3bb298ca5d88061969f34d7b"}, + {file = "xxhash-3.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:51312c768403d8540487dbbfb557454cfc55589bbde6424456951f7fcd4facb3"}, + {file = "xxhash-3.6.0-cp311-cp311-win32.whl", hash = "sha256:d1927a69feddc24c987b337ce81ac15c4720955b667fe9b588e02254b80446fd"}, + {file = "xxhash-3.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:26734cdc2d4ffe449b41d186bbeac416f704a482ed835d375a5c0cb02bc63fef"}, + {file = "xxhash-3.6.0-cp311-cp311-win_arm64.whl", hash = "sha256:d72f67ef8bf36e05f5b6c65e8524f265bd61071471cd4cf1d36743ebeeeb06b7"}, + {file = "xxhash-3.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:01362c4331775398e7bb34e3ab403bc9ee9f7c497bc7dee6272114055277dd3c"}, + {file = "xxhash-3.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b7b2df81a23f8cb99656378e72501b2cb41b1827c0f5a86f87d6b06b69f9f204"}, + {file = "xxhash-3.6.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:dc94790144e66b14f67b10ac8ed75b39ca47536bf8800eb7c24b50271ea0c490"}, + {file = "xxhash-3.6.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93f107c673bccf0d592cdba077dedaf52fe7f42dcd7676eba1f6d6f0c3efffd2"}, + {file = "xxhash-3.6.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aa5ee3444c25b69813663c9f8067dcfaa2e126dc55e8dddf40f4d1c25d7effa"}, + {file = "xxhash-3.6.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7f99123f0e1194fa59cc69ad46dbae2e07becec5df50a0509a808f90a0f03f0"}, + {file = "xxhash-3.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49e03e6fe2cac4a1bc64952dd250cf0dbc5ef4ebb7b8d96bce82e2de163c82a2"}, + {file = "xxhash-3.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bd17fede52a17a4f9a7bc4472a5867cb0b160deeb431795c0e4abe158bc784e9"}, + {file = "xxhash-3.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6fb5f5476bef678f69db04f2bd1efbed3030d2aba305b0fc1773645f187d6a4e"}, + {file = "xxhash-3.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:843b52f6d88071f87eba1631b684fcb4b2068cd2180a0224122fe4ef011a9374"}, + {file = "xxhash-3.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7d14a6cfaf03b1b6f5f9790f76880601ccc7896aff7ab9cd8978a939c1eb7e0d"}, + {file = "xxhash-3.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:418daf3db71e1413cfe211c2f9a528456936645c17f46b5204705581a45390ae"}, + {file = "xxhash-3.6.0-cp312-cp312-win32.whl", hash = "sha256:50fc255f39428a27299c20e280d6193d8b63b8ef8028995323bf834a026b4fbb"}, + {file = "xxhash-3.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:c0f2ab8c715630565ab8991b536ecded9416d615538be8ecddce43ccf26cbc7c"}, + {file = "xxhash-3.6.0-cp312-cp312-win_arm64.whl", hash = "sha256:eae5c13f3bc455a3bbb68bdc513912dc7356de7e2280363ea235f71f54064829"}, + {file = "xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:599e64ba7f67472481ceb6ee80fa3bd828fd61ba59fb11475572cc5ee52b89ec"}, + {file = "xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d8b8aaa30fca4f16f0c84a5c8d7ddee0e25250ec2796c973775373257dde8f1"}, + {file = "xxhash-3.6.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d597acf8506d6e7101a4a44a5e428977a51c0fadbbfd3c39650cca9253f6e5a6"}, + {file = "xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:858dc935963a33bc33490128edc1c12b0c14d9c7ebaa4e387a7869ecc4f3e263"}, + {file = "xxhash-3.6.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba284920194615cb8edf73bf52236ce2e1664ccd4a38fdb543506413529cc546"}, + {file = "xxhash-3.6.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b54219177f6c6674d5378bd862c6aedf64725f70dd29c472eaae154df1a2e89"}, + {file = "xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42c36dd7dbad2f5238950c377fcbf6811b1cdb1c444fab447960030cea60504d"}, + {file = "xxhash-3.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f22927652cba98c44639ffdc7aaf35828dccf679b10b31c4ad72a5b530a18eb7"}, + {file = "xxhash-3.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b45fad44d9c5c119e9c6fbf2e1c656a46dc68e280275007bbfd3d572b21426db"}, + {file = "xxhash-3.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6f2580ffab1a8b68ef2b901cde7e55fa8da5e4be0977c68f78fc80f3c143de42"}, + {file = "xxhash-3.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40c391dd3cd041ebc3ffe6f2c862f402e306eb571422e0aa918d8070ba31da11"}, + {file = "xxhash-3.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f205badabde7aafd1a31e8ca2a3e5a763107a71c397c4481d6a804eb5063d8bd"}, + {file = "xxhash-3.6.0-cp313-cp313-win32.whl", hash = "sha256:2577b276e060b73b73a53042ea5bd5203d3e6347ce0d09f98500f418a9fcf799"}, + {file = "xxhash-3.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:757320d45d2fbcce8f30c42a6b2f47862967aea7bf458b9625b4bbe7ee390392"}, + {file = "xxhash-3.6.0-cp313-cp313-win_arm64.whl", hash = "sha256:457b8f85dec5825eed7b69c11ae86834a018b8e3df5e77783c999663da2f96d6"}, + {file = "xxhash-3.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a42e633d75cdad6d625434e3468126c73f13f7584545a9cf34e883aa1710e702"}, + {file = "xxhash-3.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:568a6d743219e717b07b4e03b0a828ce593833e498c3b64752e0f5df6bfe84db"}, + {file = "xxhash-3.6.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bec91b562d8012dae276af8025a55811b875baace6af510412a5e58e3121bc54"}, + {file = "xxhash-3.6.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78e7f2f4c521c30ad5e786fdd6bae89d47a32672a80195467b5de0480aa97b1f"}, + {file = "xxhash-3.6.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3ed0df1b11a79856df5ffcab572cbd6b9627034c1c748c5566fa79df9048a7c5"}, + {file = "xxhash-3.6.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0e4edbfc7d420925b0dd5e792478ed393d6e75ff8fc219a6546fb446b6a417b1"}, + {file = "xxhash-3.6.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fba27a198363a7ef87f8c0f6b171ec36b674fe9053742c58dd7e3201c1ab30ee"}, + {file = "xxhash-3.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:794fe9145fe60191c6532fa95063765529770edcdd67b3d537793e8004cabbfd"}, + {file = "xxhash-3.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:6105ef7e62b5ac73a837778efc331a591d8442f8ef5c7e102376506cb4ae2729"}, + {file = "xxhash-3.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f01375c0e55395b814a679b3eea205db7919ac2af213f4a6682e01220e5fe292"}, + {file = "xxhash-3.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:d706dca2d24d834a4661619dcacf51a75c16d65985718d6a7d73c1eeeb903ddf"}, + {file = "xxhash-3.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5f059d9faeacd49c0215d66f4056e1326c80503f51a1532ca336a385edadd033"}, + {file = "xxhash-3.6.0-cp313-cp313t-win32.whl", hash = "sha256:1244460adc3a9be84731d72b8e80625788e5815b68da3da8b83f78115a40a7ec"}, + {file = "xxhash-3.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b1e420ef35c503869c4064f4a2f2b08ad6431ab7b229a05cce39d74268bca6b8"}, + {file = "xxhash-3.6.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ec44b73a4220623235f67a996c862049f375df3b1052d9899f40a6382c32d746"}, + {file = "xxhash-3.6.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:a40a3d35b204b7cc7643cbcf8c9976d818cb47befcfac8bbefec8038ac363f3e"}, + {file = "xxhash-3.6.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a54844be970d3fc22630b32d515e79a90d0a3ddb2644d8d7402e3c4c8da61405"}, + {file = "xxhash-3.6.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:016e9190af8f0a4e3741343777710e3d5717427f175adfdc3e72508f59e2a7f3"}, + {file = "xxhash-3.6.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f6f72232f849eb9d0141e2ebe2677ece15adfd0fa599bc058aad83c714bb2c6"}, + {file = "xxhash-3.6.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:63275a8aba7865e44b1813d2177e0f5ea7eadad3dd063a21f7cf9afdc7054063"}, + {file = "xxhash-3.6.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cd01fa2aa00d8b017c97eb46b9a794fbdca53fc14f845f5a328c71254b0abb7"}, + {file = "xxhash-3.6.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0226aa89035b62b6a86d3c68df4d7c1f47a342b8683da2b60cedcddb46c4d95b"}, + {file = "xxhash-3.6.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c6e193e9f56e4ca4923c61238cdaced324f0feac782544eb4c6d55ad5cc99ddd"}, + {file = "xxhash-3.6.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9176dcaddf4ca963d4deb93866d739a343c01c969231dbe21680e13a5d1a5bf0"}, + {file = "xxhash-3.6.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c1ce4009c97a752e682b897aa99aef84191077a9433eb237774689f14f8ec152"}, + {file = "xxhash-3.6.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:8cb2f4f679b01513b7adbb9b1b2f0f9cdc31b70007eaf9d59d0878809f385b11"}, + {file = "xxhash-3.6.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:653a91d7c2ab54a92c19ccf43508b6a555440b9be1bc8be553376778be7f20b5"}, + {file = "xxhash-3.6.0-cp314-cp314-win32.whl", hash = "sha256:a756fe893389483ee8c394d06b5ab765d96e68fbbfe6fde7aa17e11f5720559f"}, + {file = "xxhash-3.6.0-cp314-cp314-win_amd64.whl", hash = "sha256:39be8e4e142550ef69629c9cd71b88c90e9a5db703fecbcf265546d9536ca4ad"}, + {file = "xxhash-3.6.0-cp314-cp314-win_arm64.whl", hash = "sha256:25915e6000338999236f1eb68a02a32c3275ac338628a7eaa5a269c401995679"}, + {file = "xxhash-3.6.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c5294f596a9017ca5a3e3f8884c00b91ab2ad2933cf288f4923c3fd4346cf3d4"}, + {file = "xxhash-3.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1cf9dcc4ab9cff01dfbba78544297a3a01dafd60f3bde4e2bfd016cf7e4ddc67"}, + {file = "xxhash-3.6.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:01262da8798422d0685f7cef03b2bd3f4f46511b02830861df548d7def4402ad"}, + {file = "xxhash-3.6.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51a73fb7cb3a3ead9f7a8b583ffd9b8038e277cdb8cb87cf890e88b3456afa0b"}, + {file = "xxhash-3.6.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b9c6df83594f7df8f7f708ce5ebeacfc69f72c9fbaaababf6cf4758eaada0c9b"}, + {file = "xxhash-3.6.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:627f0af069b0ea56f312fd5189001c24578868643203bca1abbc2c52d3a6f3ca"}, + {file = "xxhash-3.6.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa912c62f842dfd013c5f21a642c9c10cd9f4c4e943e0af83618b4a404d9091a"}, + {file = "xxhash-3.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b465afd7909db30168ab62afe40b2fcf79eedc0b89a6c0ab3123515dc0df8b99"}, + {file = "xxhash-3.6.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a881851cf38b0a70e7c4d3ce81fc7afd86fbc2a024f4cfb2a97cf49ce04b75d3"}, + {file = "xxhash-3.6.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9b3222c686a919a0f3253cfc12bb118b8b103506612253b5baeaac10d8027cf6"}, + {file = "xxhash-3.6.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:c5aa639bc113e9286137cec8fadc20e9cd732b2cc385c0b7fa673b84fc1f2a93"}, + {file = "xxhash-3.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5c1343d49ac102799905e115aee590183c3921d475356cb24b4de29a4bc56518"}, + {file = "xxhash-3.6.0-cp314-cp314t-win32.whl", hash = "sha256:5851f033c3030dd95c086b4a36a2683c2ff4a799b23af60977188b057e467119"}, + {file = "xxhash-3.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0444e7967dac37569052d2409b00a8860c2135cff05502df4da80267d384849f"}, + {file = "xxhash-3.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:bb79b1e63f6fd84ec778a4b1916dfe0a7c3fdb986c06addd5db3a0d413819d95"}, + {file = "xxhash-3.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7dac94fad14a3d1c92affb661021e1d5cbcf3876be5f5b4d90730775ccb7ac41"}, + {file = "xxhash-3.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6965e0e90f1f0e6cb78da568c13d4a348eeb7f40acfd6d43690a666a459458b8"}, + {file = "xxhash-3.6.0-cp38-cp38-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2ab89a6b80f22214b43d98693c30da66af910c04f9858dd39c8e570749593d7e"}, + {file = "xxhash-3.6.0-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4903530e866b7a9c1eadfd3fa2fbe1b97d3aed4739a80abf506eb9318561c850"}, + {file = "xxhash-3.6.0-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4da8168ae52c01ac64c511d6f4a709479da8b7a4a1d7621ed51652f93747dffa"}, + {file = "xxhash-3.6.0-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:97460eec202017f719e839a0d3551fbc0b2fcc9c6c6ffaa5af85bbd5de432788"}, + {file = "xxhash-3.6.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:45aae0c9df92e7fa46fbb738737324a563c727990755ec1965a6a339ea10a1df"}, + {file = "xxhash-3.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0d50101e57aad86f4344ca9b32d091a2135a9d0a4396f19133426c88025b09f1"}, + {file = "xxhash-3.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9085e798c163ce310d91f8aa6b325dda3c2944c93c6ce1edb314030d4167cc65"}, + {file = "xxhash-3.6.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:a87f271a33fad0e5bf3be282be55d78df3a45ae457950deb5241998790326f87"}, + {file = "xxhash-3.6.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:9e040d3e762f84500961791fa3709ffa4784d4dcd7690afc655c095e02fff05f"}, + {file = "xxhash-3.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b0359391c3dad6de872fefb0cf5b69d55b0655c55ee78b1bb7a568979b2ce96b"}, + {file = "xxhash-3.6.0-cp38-cp38-win32.whl", hash = "sha256:e4ff728a2894e7f436b9e94c667b0f426b9c74b71f900cf37d5468c6b5da0536"}, + {file = "xxhash-3.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:01be0c5b500c5362871fc9cfdf58c69b3e5c4f531a82229ddb9eb1eb14138004"}, + {file = "xxhash-3.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cc604dc06027dbeb8281aeac5899c35fcfe7c77b25212833709f0bff4ce74d2a"}, + {file = "xxhash-3.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:277175a73900ad43a8caeb8b99b9604f21fe8d7c842f2f9061a364a7e220ddb7"}, + {file = "xxhash-3.6.0-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cfbc5b91397c8c2972fdac13fb3e4ed2f7f8ccac85cd2c644887557780a9b6e2"}, + {file = "xxhash-3.6.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2762bfff264c4e73c0e507274b40634ff465e025f0eaf050897e88ec8367575d"}, + {file = "xxhash-3.6.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2f171a900d59d51511209f7476933c34a0c2c711078d3c80e74e0fe4f38680ec"}, + {file = "xxhash-3.6.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:780b90c313348f030b811efc37b0fa1431163cb8db8064cf88a7936b6ce5f222"}, + {file = "xxhash-3.6.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b242455eccdfcd1fa4134c431a30737d2b4f045770f8fe84356b3469d4b919"}, + {file = "xxhash-3.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a75ffc1bd5def584129774c158e108e5d768e10b75813f2b32650bb041066ed6"}, + {file = "xxhash-3.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1fc1ed882d1e8df932a66e2999429ba6cc4d5172914c904ab193381fba825360"}, + {file = "xxhash-3.6.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:44e342e8cc11b4e79dae5c57f2fb6360c3c20cc57d32049af8f567f5b4bcb5f4"}, + {file = "xxhash-3.6.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c2f9ccd5c4be370939a2e17602fbc49995299203da72a3429db013d44d590e86"}, + {file = "xxhash-3.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02ea4cb627c76f48cd9fb37cf7ab22bd51e57e1b519807234b473faebe526796"}, + {file = "xxhash-3.6.0-cp39-cp39-win32.whl", hash = "sha256:6551880383f0e6971dc23e512c9ccc986147ce7bfa1cd2e4b520b876c53e9f3d"}, + {file = "xxhash-3.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:7c35c4cdc65f2a29f34425c446f2f5cdcd0e3c34158931e1cc927ece925ab802"}, + {file = "xxhash-3.6.0-cp39-cp39-win_arm64.whl", hash = "sha256:ffc578717a347baf25be8397cb10d2528802d24f94cfc005c0e44fef44b5cdd6"}, + {file = "xxhash-3.6.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0f7b7e2ec26c1666ad5fc9dbfa426a6a3367ceaf79db5dd76264659d509d73b0"}, + {file = "xxhash-3.6.0-pp311-pypy311_pp73-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5dc1e14d14fa0f5789ec29a7062004b5933964bb9b02aae6622b8f530dc40296"}, + {file = "xxhash-3.6.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:881b47fc47e051b37d94d13e7455131054b56749b91b508b0907eb07900d1c13"}, + {file = "xxhash-3.6.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c6dc31591899f5e5666f04cc2e529e69b4072827085c1ef15294d91a004bc1bd"}, + {file = "xxhash-3.6.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:15e0dac10eb9309508bfc41f7f9deaa7755c69e35af835db9cb10751adebc35d"}, + {file = "xxhash-3.6.0.tar.gz", hash = "sha256:f0162a78b13a0d7617b2845b90c763339d1f1d82bb04a4b07f4ab535cc5e05d6"}, ] [[package]] name = "zstandard" -version = "0.23.0" +version = "0.25.0" description = "Zstandard bindings for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9"}, - {file = "zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c"}, - {file = "zstandard-0.23.0-cp310-cp310-win32.whl", hash = "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813"}, - {file = "zstandard-0.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4"}, - {file = "zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e"}, - {file = "zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473"}, - {file = "zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160"}, - {file = "zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0"}, - {file = "zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094"}, - {file = "zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35"}, - {file = "zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d"}, - {file = "zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b"}, - {file = "zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9"}, - {file = "zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33"}, - {file = "zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd"}, - {file = "zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b"}, - {file = "zstandard-0.23.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2ef3775758346d9ac6214123887d25c7061c92afe1f2b354f9388e9e4d48acfc"}, - {file = "zstandard-0.23.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4051e406288b8cdbb993798b9a45c59a4896b6ecee2f875424ec10276a895740"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2d1a054f8f0a191004675755448d12be47fa9bebbcffa3cdf01db19f2d30a54"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f83fa6cae3fff8e98691248c9320356971b59678a17f20656a9e59cd32cee6d8"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32ba3b5ccde2d581b1e6aa952c836a6291e8435d788f656fe5976445865ae045"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f146f50723defec2975fb7e388ae3a024eb7151542d1599527ec2aa9cacb152"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1bfe8de1da6d104f15a60d4a8a768288f66aa953bbe00d027398b93fb9680b26"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:29a2bc7c1b09b0af938b7a8343174b987ae021705acabcbae560166567f5a8db"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:61f89436cbfede4bc4e91b4397eaa3e2108ebe96d05e93d6ccc95ab5714be512"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:53ea7cdc96c6eb56e76bb06894bcfb5dfa93b7adcf59d61c6b92674e24e2dd5e"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a4ae99c57668ca1e78597d8b06d5af837f377f340f4cce993b551b2d7731778d"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:379b378ae694ba78cef921581ebd420c938936a153ded602c4fea612b7eaa90d"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:50a80baba0285386f97ea36239855f6020ce452456605f262b2d33ac35c7770b"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:61062387ad820c654b6a6b5f0b94484fa19515e0c5116faf29f41a6bc91ded6e"}, - {file = "zstandard-0.23.0-cp38-cp38-win32.whl", hash = "sha256:b8c0bd73aeac689beacd4e7667d48c299f61b959475cdbb91e7d3d88d27c56b9"}, - {file = "zstandard-0.23.0-cp38-cp38-win_amd64.whl", hash = "sha256:a05e6d6218461eb1b4771d973728f0133b2a4613a6779995df557f70794fd60f"}, - {file = "zstandard-0.23.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa014d55c3af933c1315eb4bb06dd0459661cc0b15cd61077afa6489bec63bb"}, - {file = "zstandard-0.23.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7f0804bb3799414af278e9ad51be25edf67f78f916e08afdb983e74161b916"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb2b1ecfef1e67897d336de3a0e3f52478182d6a47eda86cbd42504c5cbd009a"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:837bb6764be6919963ef41235fd56a6486b132ea64afe5fafb4cb279ac44f259"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1516c8c37d3a053b01c1c15b182f3b5f5eef19ced9b930b684a73bad121addf4"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48ef6a43b1846f6025dde6ed9fee0c24e1149c1c25f7fb0a0585572b2f3adc58"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11e3bf3c924853a2d5835b24f03eeba7fc9b07d8ca499e247e06ff5676461a15"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2fb4535137de7e244c230e24f9d1ec194f61721c86ebea04e1581d9d06ea1269"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8c24f21fa2af4bb9f2c492a86fe0c34e6d2c63812a839590edaf177b7398f700"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a8c86881813a78a6f4508ef9daf9d4995b8ac2d147dcb1a450448941398091c9"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe3b385d996ee0822fd46528d9f0443b880d4d05528fd26a9119a54ec3f91c69"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:82d17e94d735c99621bf8ebf9995f870a6b3e6d14543b99e201ae046dfe7de70"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c7c517d74bea1a6afd39aa612fa025e6b8011982a0897768a2f7c8ab4ebb78a2"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fd7e0f1cfb70eb2f95a19b472ee7ad6d9a0a992ec0ae53286870c104ca939e5"}, - {file = "zstandard-0.23.0-cp39-cp39-win32.whl", hash = "sha256:43da0f0092281bf501f9c5f6f3b4c975a8a0ea82de49ba3f7100e64d422a1274"}, - {file = "zstandard-0.23.0-cp39-cp39-win_amd64.whl", hash = "sha256:f8346bfa098532bc1fb6c7ef06783e969d87a99dd1d2a5a18a892c1d7a643c58"}, - {file = "zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09"}, + {file = "zstandard-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e59fdc271772f6686e01e1b3b74537259800f57e24280be3f29c8a0deb1904dd"}, + {file = "zstandard-0.25.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d441506e9b372386a5271c64125f72d5df6d2a8e8a2a45a0ae09b03cb781ef7"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:ab85470ab54c2cb96e176f40342d9ed41e58ca5733be6a893b730e7af9c40550"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e05ab82ea7753354bb054b92e2f288afb750e6b439ff6ca78af52939ebbc476d"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:78228d8a6a1c177a96b94f7e2e8d012c55f9c760761980da16ae7546a15a8e9b"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b6bd67528ee8b5c5f10255735abc21aa106931f0dbaf297c7be0c886353c3d0"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4b6d83057e713ff235a12e73916b6d356e3084fd3d14ced499d84240f3eecee0"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9174f4ed06f790a6869b41cba05b43eeb9a35f8993c4422ab853b705e8112bbd"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:25f8f3cd45087d089aef5ba3848cd9efe3ad41163d3400862fb42f81a3a46701"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3756b3e9da9b83da1796f8809dd57cb024f838b9eeafde28f3cb472012797ac1"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:81dad8d145d8fd981b2962b686b2241d3a1ea07733e76a2f15435dfb7fb60150"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a5a419712cf88862a45a23def0ae063686db3d324cec7edbe40509d1a79a0aab"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e7360eae90809efd19b886e59a09dad07da4ca9ba096752e61a2e03c8aca188e"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:75ffc32a569fb049499e63ce68c743155477610532da1eb38e7f24bf7cd29e74"}, + {file = "zstandard-0.25.0-cp310-cp310-win32.whl", hash = "sha256:106281ae350e494f4ac8a80470e66d1fe27e497052c8d9c3b95dc4cf1ade81aa"}, + {file = "zstandard-0.25.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea9d54cc3d8064260114a0bbf3479fc4a98b21dffc89b3459edd506b69262f6e"}, + {file = "zstandard-0.25.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:933b65d7680ea337180733cf9e87293cc5500cc0eb3fc8769f4d3c88d724ec5c"}, + {file = "zstandard-0.25.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3f79487c687b1fc69f19e487cd949bf3aae653d181dfb5fde3bf6d18894706f"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0bbc9a0c65ce0eea3c34a691e3c4b6889f5f3909ba4822ab385fab9057099431"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:01582723b3ccd6939ab7b3a78622c573799d5d8737b534b86d0e06ac18dbde4a"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5f1ad7bf88535edcf30038f6919abe087f606f62c00a87d7e33e7fc57cb69fcc"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:06acb75eebeedb77b69048031282737717a63e71e4ae3f77cc0c3b9508320df6"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9300d02ea7c6506f00e627e287e0492a5eb0371ec1670ae852fefffa6164b072"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfd06b1c5584b657a2892a6014c2f4c20e0db0208c159148fa78c65f7e0b0277"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f373da2c1757bb7f1acaf09369cdc1d51d84131e50d5fa9863982fd626466313"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6c0e5a65158a7946e7a7affa6418878ef97ab66636f13353b8502d7ea03c8097"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c8e167d5adf59476fa3e37bee730890e389410c354771a62e3c076c86f9f7778"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:98750a309eb2f020da61e727de7d7ba3c57c97cf6213f6f6277bb7fb42a8e065"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:22a086cff1b6ceca18a8dd6096ec631e430e93a8e70a9ca5efa7561a00f826fa"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:72d35d7aa0bba323965da807a462b0966c91608ef3a48ba761678cb20ce5d8b7"}, + {file = "zstandard-0.25.0-cp311-cp311-win32.whl", hash = "sha256:f5aeea11ded7320a84dcdd62a3d95b5186834224a9e55b92ccae35d21a8b63d4"}, + {file = "zstandard-0.25.0-cp311-cp311-win_amd64.whl", hash = "sha256:daab68faadb847063d0c56f361a289c4f268706b598afbf9ad113cbe5c38b6b2"}, + {file = "zstandard-0.25.0-cp311-cp311-win_arm64.whl", hash = "sha256:22a06c5df3751bb7dc67406f5374734ccee8ed37fc5981bf1ad7041831fa1137"}, + {file = "zstandard-0.25.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7b3c3a3ab9daa3eed242d6ecceead93aebbb8f5f84318d82cee643e019c4b73b"}, + {file = "zstandard-0.25.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:913cbd31a400febff93b564a23e17c3ed2d56c064006f54efec210d586171c00"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:011d388c76b11a0c165374ce660ce2c8efa8e5d87f34996aa80f9c0816698b64"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dffecc361d079bb48d7caef5d673c88c8988d3d33fb74ab95b7ee6da42652ea"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7149623bba7fdf7e7f24312953bcf73cae103db8cae49f8154dd1eadc8a29ecb"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6a573a35693e03cf1d67799fd01b50ff578515a8aeadd4595d2a7fa9f3ec002a"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5a56ba0db2d244117ed744dfa8f6f5b366e14148e00de44723413b2f3938a902"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:10ef2a79ab8e2974e2075fb984e5b9806c64134810fac21576f0668e7ea19f8f"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aaf21ba8fb76d102b696781bddaa0954b782536446083ae3fdaa6f16b25a1c4b"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1869da9571d5e94a85a5e8d57e4e8807b175c9e4a6294e3b66fa4efb074d90f6"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:809c5bcb2c67cd0ed81e9229d227d4ca28f82d0f778fc5fea624a9def3963f91"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f27662e4f7dbf9f9c12391cb37b4c4c3cb90ffbd3b1fb9284dadbbb8935fa708"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99c0c846e6e61718715a3c9437ccc625de26593fea60189567f0118dc9db7512"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:474d2596a2dbc241a556e965fb76002c1ce655445e4e3bf38e5477d413165ffa"}, + {file = "zstandard-0.25.0-cp312-cp312-win32.whl", hash = "sha256:23ebc8f17a03133b4426bcc04aabd68f8236eb78c3760f12783385171b0fd8bd"}, + {file = "zstandard-0.25.0-cp312-cp312-win_amd64.whl", hash = "sha256:ffef5a74088f1e09947aecf91011136665152e0b4b359c42be3373897fb39b01"}, + {file = "zstandard-0.25.0-cp312-cp312-win_arm64.whl", hash = "sha256:181eb40e0b6a29b3cd2849f825e0fa34397f649170673d385f3598ae17cca2e9"}, + {file = "zstandard-0.25.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94"}, + {file = "zstandard-0.25.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:e96594a5537722fdfb79951672a2a63aec5ebfb823e7560586f7484819f2a08f"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1673b7199bbe763365b81a4f3252b8e80f44c9e323fc42940dc8843bfeaf9851"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf"}, + {file = "zstandard-0.25.0-cp313-cp313-win32.whl", hash = "sha256:7030defa83eef3e51ff26f0b7bfb229f0204b66fe18e04359ce3474ac33cbc09"}, + {file = "zstandard-0.25.0-cp313-cp313-win_amd64.whl", hash = "sha256:1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5"}, + {file = "zstandard-0.25.0-cp313-cp313-win_arm64.whl", hash = "sha256:85304a43f4d513f5464ceb938aa02c1e78c2943b29f44a750b48b25ac999a049"}, + {file = "zstandard-0.25.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3"}, + {file = "zstandard-0.25.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f604efd28f239cc21b3adb53eb061e2a205dc164be408e553b41ba2ffe0ca15c"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e54296a283f3ab5a26fc9b8b5d4978ea0532f37b231644f367aa588930aa043"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca54090275939dc8ec5dea2d2afb400e0f83444b2fc24e07df7fdef677110859"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a9ec8c642d1ec73287ae3e726792dd86c96f5681eb8df274a757bf62b750eae7"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4089a10e598eae6393756b036e0f419e8c1d60f44a831520f9af41c14216cf2"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f67e8f1a324a900e75b5e28ffb152bcac9fbed1cc7b43f99cd90f395c4375344"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:9654dbc012d8b06fc3d19cc825af3f7bf8ae242226df5f83936cb39f5fdc846c"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4203ce3b31aec23012d3a4cf4a2ed64d12fea5269c49aed5e4c3611b938e4088"}, + {file = "zstandard-0.25.0-cp314-cp314-win32.whl", hash = "sha256:da469dc041701583e34de852d8634703550348d5822e66a0c827d39b05365b12"}, + {file = "zstandard-0.25.0-cp314-cp314-win_amd64.whl", hash = "sha256:c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2"}, + {file = "zstandard-0.25.0-cp314-cp314-win_arm64.whl", hash = "sha256:d7541afd73985c630bafcd6338d2518ae96060075f9463d7dc14cfb33514383d"}, + {file = "zstandard-0.25.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b9af1fe743828123e12b41dd8091eca1074d0c1569cc42e6e1eee98027f2bbd0"}, + {file = "zstandard-0.25.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b14abacf83dfb5c25eb4e4a79520de9e7e205f72c9ee7702f91233ae57d33a2"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:a51ff14f8017338e2f2e5dab738ce1ec3b5a851f23b18c1ae1359b1eecbee6df"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3b870ce5a02d4b22286cf4944c628e0f0881b11b3f14667c1d62185a99e04f53"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:05353cef599a7b0b98baca9b068dd36810c3ef0f42bf282583f438caf6ddcee3"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:19796b39075201d51d5f5f790bf849221e58b48a39a5fc74837675d8bafc7362"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:53e08b2445a6bc241261fea89d065536f00a581f02535f8122eba42db9375530"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1f3689581a72eaba9131b1d9bdbfe520ccd169999219b41000ede2fca5c1bfdb"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d8c56bb4e6c795fc77d74d8e8b80846e1fb8292fc0b5060cd8131d522974b751"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:53f94448fe5b10ee75d246497168e5825135d54325458c4bfffbaafabcc0a577"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c2ba942c94e0691467ab901fc51b6f2085ff48f2eea77b1a48240f011e8247c7"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:07b527a69c1e1c8b5ab1ab14e2afe0675614a09182213f21a0717b62027b5936"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:51526324f1b23229001eb3735bc8c94f9c578b1bd9e867a0a646a3b17109f388"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89c4b48479a43f820b749df49cd7ba2dbc2b1b78560ecb5ab52985574fd40b27"}, + {file = "zstandard-0.25.0-cp39-cp39-win32.whl", hash = "sha256:1cd5da4d8e8ee0e88be976c294db744773459d51bb32f707a0f166e5ad5c8649"}, + {file = "zstandard-0.25.0-cp39-cp39-win_amd64.whl", hash = "sha256:37daddd452c0ffb65da00620afb8e17abd4adaae6ce6310702841760c2c26860"}, + {file = "zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b"}, ] -[package.dependencies] -cffi = {version = ">=1.11", markers = "platform_python_implementation == \"PyPy\""} - [package.extras] -cffi = ["cffi (>=1.11)"] +cffi = ["cffi (>=1.17,<2.0)", "cffi (>=2.0.0b)"] [metadata] lock-version = "2.1" -python-versions = ">=3.9,<3.14" -content-hash = "d0419622e53316243bb16adb07eab6c1ec0d929d03bb0756816a41fb8b312112" +python-versions = ">=3.10,<3.14" +content-hash = "f5f666ea14e2dc6ba66c89bf8e3ec396f8da16e6d9c8690cd88fac81c18349fc" diff --git a/pyproject.toml b/pyproject.toml index 1705254..ee45de2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langgraph-checkpoint-redis" -version = "0.1.3" +version = "0.2.0" description = "Redis implementation of the LangGraph agent checkpoint saver and store." authors = ["Redis Inc. ", "Brian Sam-Bodden "] license = "MIT" @@ -8,7 +8,6 @@ readme = "README.md" repository = "https://www.github.com/redis-developer/langgraph-redis" keywords = ["ai", "redis", "redis-client", "vector-database", "agents", "langgraph", "langchain"] classifiers = [ - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", @@ -18,9 +17,9 @@ classifiers = [ packages = [{ include = "langgraph" }] [tool.poetry.dependencies] -python = ">=3.9,<3.14" -langgraph-checkpoint = ">=2.0.21,<3.0.0" -redisvl = ">=0.5.1,<1.0.0" +python = ">=3.10,<3.14" +langgraph-checkpoint = ">=3.0.0,<4.0.0" +redisvl = ">=0.11.0,<1.0.0" redis = ">=5.2.1,<7.0.0" orjson = "^3.9.0" tomli = { version = "^2.0.1", python = "<3.11" } @@ -45,6 +44,7 @@ pytest-cov = "^6.2.1" vulture = "^2.14" pympler = "^1.1" aiofiles = "^24.1.0" +langmem = "^0.0.30" [tool.pytest.ini_options] # --strict-markers will raise errors on unknown marks. @@ -55,6 +55,13 @@ aiofiles = "^24.1.0" # section of the configuration file raise errors. addopts = "--strict-markers --strict-config --durations=5 -vv" asyncio_mode = "auto" +filterwarnings = [ + # Ignore testcontainers internal deprecation warnings (they haven't fixed their own code yet) + "ignore::DeprecationWarning:testcontainers.core.waiting_utils", + "ignore::DeprecationWarning:testcontainers.redis", + # Ignore trustcall library's deprecated import (used by langmem) + "ignore:Importing Send from langgraph.constants is deprecated.*:langgraph.errors.LangGraphDeprecatedSinceV10:trustcall._base", +] [tool.poetry.scripts] format = "scripts:format" @@ -75,7 +82,7 @@ requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" [tool.black] -target-version = ['py39', 'py310', 'py311', 'py312', 'py313'] +target-version = ['py310', 'py311', 'py312', 'py313'] exclude = ''' ( | \.egg diff --git a/test_jsonplus_redis_serializer.py b/test_jsonplus_redis_serializer.py deleted file mode 100644 index d348560..0000000 --- a/test_jsonplus_redis_serializer.py +++ /dev/null @@ -1,166 +0,0 @@ -"""Standalone test to verify the JsonPlusRedisSerializer fix works. - -This can be run directly without pytest infrastructure: - python test_fix_standalone.py -""" - -from langchain_core.messages import AIMessage, HumanMessage, SystemMessage -from langgraph.checkpoint.redis.jsonplus_redis import JsonPlusRedisSerializer - - -def test_human_message_serialization(): - """Test that HumanMessage can be serialized without TypeError.""" - print("Testing HumanMessage serialization...") - - serializer = JsonPlusRedisSerializer() - msg = HumanMessage(content="What is the weather?", id="msg-1") - - # This would raise TypeError before the fix - serialized = serializer.dumps(msg) - print(f" ✓ Serialized to {len(serialized)} bytes") - - # Deserialize - deserialized = serializer.loads(serialized) - assert isinstance(deserialized, HumanMessage) - assert deserialized.content == "What is the weather?" - assert deserialized.id == "msg-1" - print(f" ✓ Deserialized correctly: {deserialized.content}") - - -def test_all_message_types(): - """Test all LangChain message types.""" - print("\nTesting all message types...") - - serializer = JsonPlusRedisSerializer() - messages = [ - HumanMessage(content="Hello"), - AIMessage(content="Hi!"), - SystemMessage(content="System prompt"), - ] - - for msg in messages: - serialized = serializer.dumps(msg) - deserialized = serializer.loads(serialized) - assert type(deserialized) == type(msg) - print(f" ✓ {type(msg).__name__} works") - - -def test_message_list(): - """Test list of messages (common pattern in LangGraph).""" - print("\nTesting message list...") - - serializer = JsonPlusRedisSerializer() - messages = [ - HumanMessage(content="Question 1"), - AIMessage(content="Answer 1"), - HumanMessage(content="Question 2"), - ] - - serialized = serializer.dumps(messages) - deserialized = serializer.loads(serialized) - - assert isinstance(deserialized, list) - assert len(deserialized) == 3 - assert all(isinstance(m, (HumanMessage, AIMessage)) for m in deserialized) - print(f" ✓ List of {len(deserialized)} messages works") - - -def test_nested_structure(): - """Test nested structure with messages (realistic LangGraph state).""" - print("\nTesting nested structure with messages...") - - serializer = JsonPlusRedisSerializer() - state = { - "messages": [ - HumanMessage(content="Query"), - AIMessage(content="Response"), - ], - "step": 1, - } - - serialized = serializer.dumps(state) - deserialized = serializer.loads(serialized) - - assert "messages" in deserialized - assert len(deserialized["messages"]) == 2 - assert isinstance(deserialized["messages"][0], HumanMessage) - assert isinstance(deserialized["messages"][1], AIMessage) - print(f" ✓ Nested structure works") - - -def test_dumps_typed(): - """Test dumps_typed (what checkpointer actually uses).""" - print("\nTesting dumps_typed...") - - serializer = JsonPlusRedisSerializer() - msg = HumanMessage(content="Test", id="test-123") - - type_str, blob = serializer.dumps_typed(msg) - assert type_str == "json" - assert isinstance(blob, str) - print(f" ✓ dumps_typed returns: type='{type_str}', blob={len(blob)} chars") - - deserialized = serializer.loads_typed((type_str, blob)) - assert isinstance(deserialized, HumanMessage) - assert deserialized.content == "Test" - print(f" ✓ loads_typed works correctly") - - -def test_backwards_compatibility(): - """Test that regular objects still work.""" - print("\nTesting backwards compatibility...") - - serializer = JsonPlusRedisSerializer() - test_cases = [ - ("string", "hello"), - ("int", 42), - ("dict", {"key": "value"}), - ("list", [1, 2, 3]), - ] - - for name, obj in test_cases: - serialized = serializer.dumps(obj) - deserialized = serializer.loads(serialized) - assert deserialized == obj - print(f" ✓ {name} works") - - -def main(): - """Run all tests.""" - print("=" * 70) - print("JsonPlusRedisSerializer Fix Validation") - print("=" * 70) - - tests = [ - test_human_message_serialization, - test_all_message_types, - test_message_list, - test_nested_structure, - test_dumps_typed, - test_backwards_compatibility, - ] - - passed = 0 - failed = 0 - for test in tests: - try: - test() - passed += 1 - except Exception as e: - print(f" ✗ {test.__name__} FAILED: {e}") - failed += 1 - - print("\n" + "=" * 70) - print(f"Results: {passed}/{len(tests)} tests passed") - print("=" * 70) - - if failed == 0: - print("\n✅ ALL TESTS PASSED - Fix is working correctly!") - return 0 - else: - print(f"\n❌ {failed} TESTS FAILED - Fix may not be working") - return 1 - - -if __name__ == "__main__": - exit(main()) diff --git a/tests/test_async.py b/tests/test_async.py index 6578adf..73e53b8 100644 --- a/tests/test_async.py +++ b/tests/test_async.py @@ -1,6 +1,7 @@ """Tests for AsyncRedisSaver.""" import asyncio +import base64 import json import time from concurrent.futures import ThreadPoolExecutor @@ -283,10 +284,7 @@ async def test_from_conn_string_cleanup(redis_url: str) -> None: @pytest.mark.asyncio async def test_async_client_info_setting(redis_url: str, monkeypatch) -> None: """Test that async client_setinfo is called with correct library information.""" - from langgraph.checkpoint.redis.version import __redisvl_version__ - - # Expected client info format - expected_client_info = f"redis-py(redisvl_v{__redisvl_version__})" + from langgraph.checkpoint.redis.version import __full_lib_name__ # Track if client_setinfo was called with the right parameters client_info_called = False @@ -297,9 +295,8 @@ async def test_async_client_info_setting(redis_url: str, monkeypatch) -> None: # Create a mock function for client_setinfo async def mock_client_setinfo(self, key, value): nonlocal client_info_called - # Note: RedisVL might call this with its own lib name first - # We only track calls with our full lib name - if key == "LIB-NAME" and value == expected_client_info: + # Track calls with our full lib name + if key == "LIB-NAME" and value == __full_lib_name__: client_info_called = True # Call original method to ensure normal function return await original_client_setinfo(self, key, value) @@ -516,9 +513,10 @@ async def test_search_writes_async(redis_url: str) -> None: doc2 = json.loads(results.docs[1].json) doc3 = json.loads(results.docs[2].json) - assert doc1["blob"] == '"value1"' - assert doc2["blob"] == '"value2"' - assert doc3["blob"] == '"value3"' + # Blobs are now base64-encoded in Redis (checkpoint 3.0) + assert base64.b64decode(doc1["blob"]).decode() == '"value1"' + assert base64.b64decode(doc2["blob"]).decode() == '"value2"' + assert base64.b64decode(doc3["blob"]).decode() == '"value3"' @pytest.mark.asyncio diff --git a/tests/test_async_store.py b/tests/test_async_store.py index 6546860..26e52cf 100644 --- a/tests/test_async_store.py +++ b/tests/test_async_store.py @@ -544,10 +544,7 @@ async def test_async_redis_store_client_info(redis_url: str, monkeypatch) -> Non """Test that AsyncRedisStore sets client info correctly.""" from redis.asyncio import Redis - from langgraph.checkpoint.redis.version import __redisvl_version__ - - # Expected client info format - expected_client_info = f"redis-py(redisvl_v{__redisvl_version__})" + from langgraph.checkpoint.redis.version import __full_lib_name__ # Track if client_setinfo was called with the right parameters client_info_called = False @@ -558,9 +555,8 @@ async def test_async_redis_store_client_info(redis_url: str, monkeypatch) -> Non # Create a mock function for client_setinfo async def mock_client_setinfo(self, key, value): nonlocal client_info_called - # Note: RedisVL might call this with its own lib name first - # We only track calls with our full lib name - if key == "LIB-NAME" and value == expected_client_info: + # Track calls with our full lib name + if key == "LIB-NAME" and value == __full_lib_name__: client_info_called = True # Call original method to ensure normal function return await original_client_setinfo(self, key, value) @@ -584,10 +580,7 @@ async def test_async_redis_store_client_info_fallback( from redis.asyncio import Redis from redis.exceptions import ResponseError - from langgraph.checkpoint.redis.version import __redisvl_version__ - - # Expected client info format - expected_client_info = f"redis-py(redisvl_v{__redisvl_version__})" + from langgraph.checkpoint.redis.version import __full_lib_name__ # Remove client_setinfo to simulate older Redis version async def mock_client_setinfo(self, key, value): @@ -601,7 +594,7 @@ async def mock_client_setinfo(self, key, value): async def mock_echo(self, message): nonlocal echo_called echo_called = True - assert message == expected_client_info + assert message == __full_lib_name__ return await original_echo(self, message) # Apply the mocks diff --git a/tests/test_base_client_info_and_ttl.py b/tests/test_base_client_info_and_ttl.py index 0b3a8f1..0e84406 100644 --- a/tests/test_base_client_info_and_ttl.py +++ b/tests/test_base_client_info_and_ttl.py @@ -90,12 +90,10 @@ async def test_aset_client_info_success(): # Mock async client_setinfo saver._redis.client_setinfo = AsyncMock() - with patch("langgraph.checkpoint.redis.version.__redisvl_version__", "1.2.3"): + with patch("langgraph.checkpoint.redis.version.__full_lib_name__", "test-lib-v1.0"): await saver.aset_client_info() - saver._redis.client_setinfo.assert_called_once_with( - "LIB-NAME", "redis-py(redisvl_v1.2.3)" - ) + saver._redis.client_setinfo.assert_called_once_with("LIB-NAME", "test-lib-v1.0") @pytest.mark.asyncio @@ -112,7 +110,7 @@ async def mock_echo(msg): saver._redis.echo = mock_echo - with patch("langgraph.checkpoint.redis.version.__redisvl_version__", "1.2.3"): + with patch("langgraph.checkpoint.redis.version.__full_lib_name__", "test-lib-v1.0"): await saver.aset_client_info() saver._redis.client_setinfo.assert_called_once() diff --git a/tests/test_checkpoint_serialization.py b/tests/test_checkpoint_serialization.py index 4da7863..0f1802a 100644 --- a/tests/test_checkpoint_serialization.py +++ b/tests/test_checkpoint_serialization.py @@ -166,14 +166,13 @@ def test_issue_83_pending_sends_type_compatibility(redis_url: str) -> None: # Serialize type_str, blob = saver.serde.dumps_typed(test_data) assert isinstance(type_str, str) - assert isinstance(blob, str) # JsonPlusRedisSerializer returns strings + # Checkpoint 3.0: dumps_typed now returns bytes + assert isinstance(blob, bytes) - # Deserialize - should work with both string and bytes + # Deserialize with bytes (checkpoint 3.0 format) result1 = saver.serde.loads_typed((type_str, blob)) - result2 = saver.serde.loads_typed((type_str, blob.encode())) # bytes version assert result1 == test_data - assert result2 == test_data def test_load_blobs_method(redis_url: str) -> None: @@ -508,7 +507,8 @@ def test_langchain_message_serialization(redis_url: str) -> None: # Serialize type_, data = serializer.dumps_typed(human_msg) assert type_ == "json" - assert isinstance(data, str) + # Checkpoint 3.0: dumps_typed now returns bytes + assert isinstance(data, bytes) # Deserialize deserialized = serializer.loads_typed((type_, data)) @@ -702,7 +702,7 @@ def test_message_dict_format_handling(redis_url: str) -> None: json_str = json.dumps(message_dict) # This should properly deserialize to a HumanMessage - deserialized = serializer.loads(json_str.encode()) + deserialized = serializer.loads_typed(("json", json_str.encode())) # Should be a HumanMessage object, not a dict from langchain_core.messages import HumanMessage diff --git a/tests/test_cluster_mode.py b/tests/test_cluster_mode.py index 205e230..0813c2a 100644 --- a/tests/test_cluster_mode.py +++ b/tests/test_cluster_mode.py @@ -92,6 +92,14 @@ def cluster(self, subcmd: str, *args, **kwargs): raise ResponseError("ERR This instance has cluster support disabled") return {} + def client_setinfo(self, key, value): + """Mock client_setinfo for testing.""" + return "OK" + + def echo(self, message): + """Mock echo for testing.""" + return message + class MockRedis(BaseMockRedis, Redis): pass diff --git a/tests/test_issue_113_interrupt_serialization.py b/tests/test_issue_113_interrupt_serialization.py index f3c6390..57828c4 100644 --- a/tests/test_issue_113_interrupt_serialization.py +++ b/tests/test_issue_113_interrupt_serialization.py @@ -53,14 +53,14 @@ def test_interrupt_serialization_roundtrip(redis_url: str) -> None: serializer = JsonPlusRedisSerializer() - # Create an Interrupt object - original_interrupt = Interrupt(value={"test": "data"}, resumable=True) + # Create an Interrupt object (LangGraph 1.0 API: only value and id) + original_interrupt = Interrupt(value={"test": "data"}, id="test-interrupt-id") # Serialize it - serialized = serializer.dumps(original_interrupt) + type_str, serialized = serializer.dumps_typed(original_interrupt) # Deserialize it - deserialized = serializer.loads(serialized) + deserialized = serializer.loads_typed((type_str, serialized)) # This should be an Interrupt object, not a dict assert isinstance(deserialized, Interrupt), ( @@ -68,7 +68,7 @@ def test_interrupt_serialization_roundtrip(redis_url: str) -> None: f"This causes AttributeError when LangGraph tries to access attributes" ) assert deserialized.value == {"test": "data"} - assert deserialized.resumable is True + assert deserialized.id == "test-interrupt-id" def test_interrupt_in_pending_sends(redis_url: str) -> None: @@ -86,15 +86,15 @@ def test_interrupt_in_pending_sends(redis_url: str) -> None: # In the real scenario, pending_sends contains tuples of (channel, value) # where value might be an Interrupt object pending_sends = [ - ("__interrupt__", [Interrupt(value={"test": "data"}, resumable=False)]), + ("__interrupt__", [Interrupt(value={"test": "data"}, id="pending-interrupt")]), ("messages", ["some message"]), ] # Serialize the pending_sends - serialized = serializer.dumps(pending_sends) + type_str, serialized = serializer.dumps_typed(pending_sends) # Deserialize - deserialized = serializer.loads(serialized) + deserialized = serializer.loads_typed((type_str, serialized)) # Check the structure assert isinstance(deserialized, list) @@ -112,7 +112,7 @@ def test_interrupt_in_pending_sends(redis_url: str) -> None: f"This is the root cause of 'dict' object has no attribute error" ) assert value[0].value == {"test": "data"} - assert value[0].resumable is False + assert value[0].id == "pending-interrupt" def test_interrupt_resume_workflow(redis_url: str) -> None: diff --git a/tests/test_issue_85_message_coercion.py b/tests/test_issue_85_message_coercion.py index 1686bbe..4a64651 100644 --- a/tests/test_issue_85_message_coercion.py +++ b/tests/test_issue_85_message_coercion.py @@ -212,7 +212,7 @@ def test_message_dict_format_causes_error(): # Convert to JSON and back (simulating storage/retrieval) json_str = json.dumps(problematic_message_dict) - deserialized = serializer.loads(json_str.encode()) + deserialized = serializer.loads_typed(("json", json_str.encode())) # Should be a proper HumanMessage, not the dict assert isinstance( diff --git a/tests/test_jsonplus_redis_serializer_v3.py b/tests/test_jsonplus_redis_serializer_v3.py new file mode 100644 index 0000000..16e3ed7 --- /dev/null +++ b/tests/test_jsonplus_redis_serializer_v3.py @@ -0,0 +1,192 @@ +""" +Test JsonPlusRedisSerializer compatibility with langgraph-checkpoint 3.0. + +This test suite verifies that our custom serializer works with the new +checkpoint 3.0 API which changed the dumps_typed/loads_typed signatures. +""" + +from langchain_core.messages import AIMessage, HumanMessage +from langgraph.types import Interrupt + +from langgraph.checkpoint.redis.jsonplus_redis import JsonPlusRedisSerializer + + +def test_dumps_typed_returns_bytes_not_string() -> None: + """Test that dumps_typed returns tuple[str, bytes], not tuple[str, str].""" + serializer = JsonPlusRedisSerializer() + + # Test with simple object + obj = {"test": "data", "number": 42} + type_str, data = serializer.dumps_typed(obj) + + # Verify signature: must return (str, bytes) + assert isinstance(type_str, str), f"Expected str, got {type(type_str)}" + assert isinstance(data, bytes), f"Expected bytes, got {type(data)}" + + +def test_loads_typed_accepts_bytes() -> None: + """Test that loads_typed accepts tuple[str, bytes].""" + serializer = JsonPlusRedisSerializer() + + obj = {"test": "data"} + type_str, data_bytes = serializer.dumps_typed(obj) + + # loads_typed must accept (str, bytes) + result = serializer.loads_typed((type_str, data_bytes)) + assert result == obj + + +def test_serialization_roundtrip_simple_objects() -> None: + """Test serialization roundtrip for simple Python objects.""" + serializer = JsonPlusRedisSerializer() + + test_cases = [ + None, + {"key": "value"}, + [1, 2, 3], + "string", + 42, + 3.14, + True, + False, + ] + + for obj in test_cases: + type_str, data_bytes = serializer.dumps_typed(obj) + result = serializer.loads_typed((type_str, data_bytes)) + assert result == obj, f"Roundtrip failed for {obj}" + + +def test_serialization_roundtrip_bytes() -> None: + """Test serialization roundtrip for bytes objects.""" + serializer = JsonPlusRedisSerializer() + + test_bytes = b"hello world" + type_str, data_bytes = serializer.dumps_typed(test_bytes) + + assert type_str == "bytes" + assert isinstance(data_bytes, bytes) + + result = serializer.loads_typed((type_str, data_bytes)) + assert result == test_bytes + assert isinstance(result, bytes) + + +def test_serialization_roundtrip_bytearray() -> None: + """Test serialization roundtrip for bytearray objects.""" + serializer = JsonPlusRedisSerializer() + + test_bytearray = bytearray(b"hello world") + type_str, data_bytes = serializer.dumps_typed(test_bytearray) + + assert type_str == "bytearray" + assert isinstance(data_bytes, bytes) + + result = serializer.loads_typed((type_str, data_bytes)) + assert result == test_bytearray + assert isinstance(result, bytearray) + + +def test_serialization_roundtrip_langchain_messages() -> None: + """Test serialization roundtrip for LangChain message objects.""" + serializer = JsonPlusRedisSerializer() + + messages = [ + HumanMessage(content="Hello", id="human-1"), + AIMessage(content="Hi there!", id="ai-1"), + ] + + for msg in messages: + type_str, data_bytes = serializer.dumps_typed(msg) + + assert isinstance(type_str, str) + assert isinstance(data_bytes, bytes) + + result = serializer.loads_typed((type_str, data_bytes)) + + # Should deserialize back to the same message type + assert type(result) == type(msg) + assert result.content == msg.content + + +def test_serialization_roundtrip_interrupt_objects() -> None: + """Test serialization roundtrip for Interrupt objects (Issue #113).""" + serializer = JsonPlusRedisSerializer() + + interrupt = Interrupt(value={"test": "data"}, id="test-id") + + type_str, data_bytes = serializer.dumps_typed(interrupt) + + assert isinstance(type_str, str) + assert isinstance(data_bytes, bytes) + + result = serializer.loads_typed((type_str, data_bytes)) + + # CRITICAL: Must deserialize back to Interrupt, not dict + assert isinstance(result, Interrupt), ( + f"Expected Interrupt object, got {type(result)}. " + f"This is the Issue #113 regression!" + ) + assert result.value == {"test": "data"} + assert result.id == "test-id" + + +def test_serialization_roundtrip_nested_interrupts() -> None: + """Test serialization of nested Interrupt objects.""" + serializer = JsonPlusRedisSerializer() + + # Interrupt containing another Interrupt in value + nested = Interrupt( + value={"nested": Interrupt(value={"inner": "data"}, id="inner-id")}, + id="outer-id", + ) + + type_str, data_bytes = serializer.dumps_typed(nested) + result = serializer.loads_typed((type_str, data_bytes)) + + assert isinstance(result, Interrupt) + assert isinstance(result.value["nested"], Interrupt) + assert result.value["nested"].value == {"inner": "data"} + assert result.value["nested"].id == "inner-id" + + +def test_serialization_roundtrip_list_of_interrupts() -> None: + """Test serialization of lists containing Interrupt objects.""" + serializer = JsonPlusRedisSerializer() + + pending_sends = [ + ("__interrupt__", [Interrupt(value={"test": "data"}, id="list-interrupt")]), + ("messages", ["some message"]), + ] + + type_str, data_bytes = serializer.dumps_typed(pending_sends) + result = serializer.loads_typed((type_str, data_bytes)) + + assert isinstance(result, list) + assert len(result) == 2 + + channel, value = result[0] + assert channel == "__interrupt__" + assert isinstance(value, list) + assert len(value) == 1 + + # CRITICAL: Must be Interrupt object, not dict (Issue #113) + assert isinstance(value[0], Interrupt) + assert value[0].value == {"test": "data"} + assert value[0].id == "list-interrupt" + + +def test_no_public_dumps_loads_methods() -> None: + """Verify that dumps/loads are not part of the SerializerProtocol in 3.0.""" + from langgraph.checkpoint.serde.base import SerializerProtocol + + # SerializerProtocol should only have dumps_typed and loads_typed + protocol_methods = [ + name for name in dir(SerializerProtocol) if not name.startswith("_") + ] + + assert "dumps_typed" in protocol_methods + assert "loads_typed" in protocol_methods + # In 3.0, dumps and loads are NOT in the protocol + assert "dumps" not in protocol_methods + assert "loads" not in protocol_methods diff --git a/tests/test_jsonplus_serializer_default_handler.py b/tests/test_jsonplus_serializer_default_handler.py index faf603b..0dce963 100644 --- a/tests/test_jsonplus_serializer_default_handler.py +++ b/tests/test_jsonplus_serializer_default_handler.py @@ -14,6 +14,24 @@ from langgraph.checkpoint.redis.jsonplus_redis import JsonPlusRedisSerializer +# Helper functions for backward compatibility with tests +def dumps_helper(serializer: JsonPlusRedisSerializer, obj): + """Helper to simulate old dumps() method using dumps_typed(). + + Returns the full (type_str, data_bytes) tuple to preserve type information. + """ + return serializer.dumps_typed(obj) + + +def loads_helper(serializer: JsonPlusRedisSerializer, typed_data): + """Helper to simulate old loads() method using loads_typed(). + + Args: + typed_data: Full (type_str, data_bytes) tuple from dumps_helper + """ + return serializer.loads_typed(typed_data) + + def test_serializer_uses_default_handler_for_messages(): """Test that dumps() uses the default handler for LangChain message objects. @@ -28,11 +46,12 @@ def test_serializer_uses_default_handler_for_messages(): human_msg = HumanMessage(content="What is the weather?", id="msg-1") # This should NOT raise TypeError - serialized_bytes = serializer.dumps(human_msg) + typed_data = dumps_helper(serializer, human_msg) + type_str, serialized_bytes = typed_data assert isinstance(serialized_bytes, bytes) # Deserialize and verify - deserialized = serializer.loads(serialized_bytes) + deserialized = loads_helper(serializer, typed_data) assert isinstance(deserialized, HumanMessage) assert deserialized.content == "What is the weather?" assert deserialized.id == "msg-1" @@ -54,11 +73,12 @@ def test_serializer_handles_all_message_types(): for msg in messages: # Serialize - serialized = serializer.dumps(msg) + typed_data = dumps_helper(serializer, msg) + type_str, serialized = typed_data assert isinstance(serialized, bytes) # Deserialize - deserialized = serializer.loads(serialized) + deserialized = loads_helper(serializer, typed_data) # Verify type is preserved assert type(deserialized) == type(msg) @@ -80,11 +100,12 @@ def test_serializer_handles_message_lists(): ] # Serialize the list - serialized = serializer.dumps(messages) + typed_data = dumps_helper(serializer, messages) + type_str, serialized = typed_data assert isinstance(serialized, bytes) # Deserialize - deserialized = serializer.loads(serialized) + deserialized = loads_helper(serializer, typed_data) # Verify structure assert isinstance(deserialized, list) @@ -113,11 +134,12 @@ def test_serializer_handles_nested_structures_with_messages(): } # Serialize - serialized = serializer.dumps(state) + typed_data = dumps_helper(serializer, state) + type_str, serialized = typed_data assert isinstance(serialized, bytes) # Deserialize - deserialized = serializer.loads(serialized) + deserialized = loads_helper(serializer, typed_data) # Verify structure assert "messages" in deserialized @@ -140,7 +162,8 @@ def test_dumps_typed_with_messages(): type_str, blob = serializer.dumps_typed(msg) assert type_str == "json" - assert isinstance(blob, str) + # Checkpoint 3.0: dumps_typed now returns bytes, not str + assert isinstance(blob, bytes) # Deserialize deserialized = serializer.loads_typed((type_str, blob)) @@ -169,8 +192,8 @@ def test_serializer_backwards_compatible(): ] for obj in test_cases: - serialized = serializer.dumps(obj) - deserialized = serializer.loads(serialized) + serialized = dumps_helper(serializer, obj) + deserialized = loads_helper(serializer, serialized) assert deserialized == obj @@ -194,8 +217,8 @@ def test_serializer_with_langchain_serialized_format(): } # Serialize and deserialize - serialized = serializer.dumps(message_dict) - deserialized = serializer.loads(serialized) + serialized = dumps_helper(serializer, message_dict) + deserialized = loads_helper(serializer, serialized) # Should be revived as a HumanMessage assert isinstance(deserialized, HumanMessage) diff --git a/tests/test_langmem_serialization.py b/tests/test_langmem_serialization.py new file mode 100644 index 0000000..ee65403 --- /dev/null +++ b/tests/test_langmem_serialization.py @@ -0,0 +1,118 @@ +"""Integration tests for langmem object serialization with JsonPlusRedisSerializer.""" + +import sys + +import pytest + +from langgraph.checkpoint.redis.jsonplus_redis import JsonPlusRedisSerializer + +# langmem requires Python 3.11+ (uses typing.NotRequired) +# Try to import, skip all tests if it fails +try: + from langmem.short_term.summarization import RunningSummary +except (ImportError, AttributeError): + # Skip entire module if langmem can't be imported (Python < 3.11) + pytestmark = pytest.mark.skip( + reason="langmem requires Python 3.11+ (uses typing.NotRequired)" + ) + RunningSummary = None # type: ignore + + +class TestLangmemSerialization: + """Test that langmem objects are properly serialized and deserialized.""" + + def test_running_summary_serialization(self) -> None: + """Test that RunningSummary objects roundtrip correctly through serialization.""" + serializer = JsonPlusRedisSerializer() + + # Create a RunningSummary object similar to what langmem creates + original = RunningSummary( + summary="This is a summary of the conversation", + summarized_message_ids={"msg1", "msg2", "msg3"}, + last_summarized_message_id="msg3", + ) + + # Serialize it + type_str, data_bytes = serializer.dumps_typed(original) + + # Deserialize it + deserialized = serializer.loads_typed((type_str, data_bytes)) + + # Check that it's still a RunningSummary object, not a dict + assert isinstance( + deserialized, RunningSummary + ), f"Expected RunningSummary, got {type(deserialized)}" + assert deserialized.summary == original.summary + assert deserialized.summarized_message_ids == original.summarized_message_ids + assert ( + deserialized.last_summarized_message_id + == original.last_summarized_message_id + ) + + def test_state_with_context_containing_running_summary(self) -> None: + """Test that state dicts with RunningSummary in context are properly handled. + + This tests the real-world scenario where create_react_agent stores + RunningSummary objects in the state's context field. + """ + serializer = JsonPlusRedisSerializer() + + # Create a state similar to what create_react_agent uses + state = { + "messages": [], + "context": { + "running_summary": RunningSummary( + summary="Previous conversation summary", + summarized_message_ids={"msg1", "msg2"}, + last_summarized_message_id="msg2", + ) + }, + } + + # Serialize it + type_str, data_bytes = serializer.dumps_typed(state) + + # Deserialize it + deserialized = serializer.loads_typed((type_str, data_bytes)) + + # Check that the running_summary is still a RunningSummary object + assert "context" in deserialized + assert "running_summary" in deserialized["context"] + running_summary = deserialized["context"]["running_summary"] + + assert isinstance( + running_summary, RunningSummary + ), f"Expected RunningSummary, got {type(running_summary)}" + assert hasattr( + running_summary, "summarized_message_ids" + ), "Missing summarized_message_ids attribute" + assert running_summary.summarized_message_ids == {"msg1", "msg2"} + + def test_nested_running_summary_in_list(self) -> None: + """Test that RunningSummary objects nested in lists are properly handled.""" + serializer = JsonPlusRedisSerializer() + + state = { + "summaries": [ + RunningSummary( + summary="First summary", + summarized_message_ids={"msg1"}, + last_summarized_message_id="msg1", + ), + RunningSummary( + summary="Second summary", + summarized_message_ids={"msg2", "msg3"}, + last_summarized_message_id="msg3", + ), + ] + } + + # Serialize and deserialize + type_str, data_bytes = serializer.dumps_typed(state) + deserialized = serializer.loads_typed((type_str, data_bytes)) + + # Check both summaries are properly reconstructed + assert len(deserialized["summaries"]) == 2 + for summary in deserialized["summaries"]: + assert isinstance(summary, RunningSummary) + assert hasattr(summary, "summarized_message_ids") diff --git a/tests/test_shallow_async.py b/tests/test_shallow_async.py index 75a4aea..e563117 100644 --- a/tests/test_shallow_async.py +++ b/tests/test_shallow_async.py @@ -262,10 +262,7 @@ async def test_from_conn_string_errors(redis_url: str) -> None: @pytest.mark.asyncio async def test_async_shallow_client_info_setting(redis_url: str, monkeypatch) -> None: """Test that client_setinfo is called with correct library information in AsyncShallowRedisSaver.""" - from langgraph.checkpoint.redis.version import __redisvl_version__ - - # Expected client info format - expected_client_info = f"redis-py(redisvl_v{__redisvl_version__})" + from langgraph.checkpoint.redis.version import __full_lib_name__ # Track if client_setinfo was called with the right parameters client_info_called = False @@ -276,9 +273,8 @@ async def test_async_shallow_client_info_setting(redis_url: str, monkeypatch) -> # Create a mock function for client_setinfo async def mock_client_setinfo(self, key, value): nonlocal client_info_called - # Note: RedisVL might call this with its own lib name first - # We only track calls with our full lib name - if key == "LIB-NAME" and value == expected_client_info: + # Track calls with our full lib name + if key == "LIB-NAME" and value == __full_lib_name__: client_info_called = True # Call original method to ensure normal function return await original_client_setinfo(self, key, value) @@ -300,10 +296,7 @@ async def test_async_shallow_client_info_fallback(redis_url: str, monkeypatch) - from redis.asyncio import Redis from redis.exceptions import ResponseError - from langgraph.checkpoint.redis.version import __redisvl_version__ - - # Expected client info format - expected_client_info = f"redis-py(redisvl_v{__redisvl_version__})" + from langgraph.checkpoint.redis.version import __full_lib_name__ # Create a Redis client directly first - this bypasses RedisVL validation client = Redis.from_url(redis_url) @@ -321,7 +314,7 @@ async def mock_client_setinfo(self, key, value): async def mock_echo(self, message): nonlocal echo_called, echo_messages echo_messages.append(message) - if message == expected_client_info: + if message == __full_lib_name__: echo_called = True return ( await original_echo(self, message) diff --git a/tests/test_store.py b/tests/test_store.py index c37e8d5..baa5263 100644 --- a/tests/test_store.py +++ b/tests/test_store.py @@ -530,10 +530,7 @@ def test_redis_store_client_info(redis_url: str, monkeypatch) -> None: """Test that RedisStore sets client info correctly.""" from redis import Redis as NativeRedis - from langgraph.checkpoint.redis.version import __redisvl_version__ - - # Expected client info format - expected_client_info = f"redis-py(redisvl_v{__redisvl_version__})" + from langgraph.checkpoint.redis.version import __full_lib_name__ # Create a direct Redis client to bypass RedisVL validation client = NativeRedis.from_url(redis_url) @@ -546,7 +543,7 @@ def test_redis_store_client_info(redis_url: str, monkeypatch) -> None: def mock_client_setinfo(self, key, value): nonlocal client_info_called # We only track calls with our full lib name - if key == "LIB-NAME" and value == expected_client_info: + if key == "LIB-NAME" and value == __full_lib_name__: client_info_called = True return original_client_setinfo(self, key, value) @@ -568,10 +565,7 @@ def test_redis_store_client_info_fallback(redis_url: str, monkeypatch) -> None: """Test that RedisStore falls back to echo when client_setinfo is not available.""" from redis import Redis as NativeRedis - from langgraph.checkpoint.redis.version import __redisvl_version__ - - # Expected client info format - expected_client_info = f"redis-py(redisvl_v{__redisvl_version__})" + from langgraph.checkpoint.redis.version import __full_lib_name__ # Create a direct Redis client to bypass RedisVL validation client = NativeRedis.from_url(redis_url) @@ -588,7 +582,7 @@ def mock_client_setinfo(self, key, value): def mock_echo(self, message): nonlocal echo_called # We only want to track our library's echo calls - if message == expected_client_info: + if message == __full_lib_name__: echo_called = True return original_echo(self, message) diff --git a/tests/test_sync.py b/tests/test_sync.py index d418be8..55f73e9 100644 --- a/tests/test_sync.py +++ b/tests/test_sync.py @@ -1,3 +1,4 @@ +import base64 import json import time from concurrent.futures import ThreadPoolExecutor @@ -267,9 +268,10 @@ def test_search_writes(redis_url: str) -> None: doc2 = json.loads(results.docs[1].json) doc3 = json.loads(results.docs[2].json) - assert doc1["blob"] == '"value1"' - assert doc2["blob"] == '"value2"' - assert doc3["blob"] == '"value3"' + # Blobs are now base64-encoded in Redis (checkpoint 3.0) + assert base64.b64decode(doc1["blob"]).decode() == '"value1"' + assert base64.b64decode(doc2["blob"]).decode() == '"value2"' + assert base64.b64decode(doc3["blob"]).decode() == '"value3"' def test_from_conn_string_with_url(redis_url: str) -> None: