From be02ac2134f7c8161ab41f0ae6bbb9dd3060b2a0 Mon Sep 17 00:00:00 2001 From: Maple Xu Date: Fri, 17 Apr 2026 16:17:40 -0400 Subject: [PATCH 01/14] Add LangSmith tracing sample with basic and chatbot examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Demonstrates the LangSmithPlugin for automatic LangSmith tracing in Temporal workflows. Includes two examples: - basic/: one-shot LLM workflow (prompt → OpenAI → result) - chatbot/: conversational loop with save_note/read_note tools, signals, queries, and dynamic trace names Co-Authored-By: Claude Opus 4.6 (1M context) --- langsmith_tracing/README.md | 68 +++ langsmith_tracing/__init__.py | 0 langsmith_tracing/basic/__init__.py | 0 langsmith_tracing/basic/activities.py | 29 + langsmith_tracing/basic/starter.py | 35 ++ langsmith_tracing/basic/worker.py | 50 ++ langsmith_tracing/basic/workflows.py | 24 + langsmith_tracing/chatbot/__init__.py | 0 langsmith_tracing/chatbot/activities.py | 44 ++ langsmith_tracing/chatbot/starter.py | 74 +++ langsmith_tracing/chatbot/worker.py | 50 ++ langsmith_tracing/chatbot/workflows.py | 154 +++++ pyproject.toml | 14 + tests/langsmith_tracing/__init__.py | 0 tests/langsmith_tracing/test_basic.py | 64 ++ tests/langsmith_tracing/test_chatbot.py | 206 +++++++ uv.lock | 770 ++++++++++++------------ 17 files changed, 1191 insertions(+), 391 deletions(-) create mode 100644 langsmith_tracing/README.md create mode 100644 langsmith_tracing/__init__.py create mode 100644 langsmith_tracing/basic/__init__.py create mode 100644 langsmith_tracing/basic/activities.py create mode 100644 langsmith_tracing/basic/starter.py create mode 100644 langsmith_tracing/basic/worker.py create mode 100644 langsmith_tracing/basic/workflows.py create mode 100644 langsmith_tracing/chatbot/__init__.py create mode 100644 langsmith_tracing/chatbot/activities.py create mode 100644 langsmith_tracing/chatbot/starter.py create mode 100644 langsmith_tracing/chatbot/worker.py create mode 100644 langsmith_tracing/chatbot/workflows.py create mode 100644 tests/langsmith_tracing/__init__.py create mode 100644 tests/langsmith_tracing/test_basic.py create mode 100644 tests/langsmith_tracing/test_chatbot.py diff --git a/langsmith_tracing/README.md b/langsmith_tracing/README.md new file mode 100644 index 00000000..a6cf626a --- /dev/null +++ b/langsmith_tracing/README.md @@ -0,0 +1,68 @@ +# LangSmith Tracing + +This sample demonstrates [LangSmith](https://smith.langchain.com/) tracing integration with Temporal workflows using the `LangSmithPlugin`. + +Two examples are included: + +- **basic/** — A one-shot LLM workflow that sends a prompt to OpenAI and returns the response. +- **chatbot/** — A long-running conversational workflow with tool calls (save/read notes), signals, and queries. + +## Prerequisites + +Install dependencies: + +```bash +uv sync --group langsmith-tracing +``` + +Set environment variables: + +```bash +export OPENAI_API_KEY="sk-..." +export LANGSMITH_API_KEY="lsv2_..." +export LANGCHAIN_TRACING_V2=true +``` + +A local Temporal server must be running (`temporal server start-dev`). + +## Basic Example + +Runs a single workflow that asks OpenAI "What is Temporal?" and returns the response. + +```bash +# Terminal 1 — start the worker +python -m langsmith_tracing.basic.worker + +# Terminal 2 — run the workflow +python -m langsmith_tracing.basic.starter +``` + +## Chatbot Example + +Starts a long-running workflow that accepts messages via signals and responds via queries. The model has two tools: + +- `save_note(name, content)` — saves a note durably (calls an activity) +- `read_note(name)` — reads a note from workflow state (no activity needed) + +```bash +# Terminal 1 — start the worker +python -m langsmith_tracing.chatbot.worker + +# Terminal 2 — interactive CLI +python -m langsmith_tracing.chatbot.starter +``` + +Commands in the CLI: +- Type a message and press Enter to chat +- `notes` — display all saved notes +- `exit` — end the session + +## `add_temporal_runs` + +By default, `LangSmithPlugin(add_temporal_runs=False)` only propagates LangSmith context so that `@traceable` and `wrap_openai` calls nest under the correct parent trace. + +Set `add_temporal_runs=True` to also create LangSmith runs for each Temporal workflow execution and activity execution, giving you visibility into Temporal operations alongside your LLM calls. + +## Viewing Traces + +After running either example, open [LangSmith](https://smith.langchain.com/) and look for the project name (`langsmith-basic` or `langsmith-chatbot`). diff --git a/langsmith_tracing/__init__.py b/langsmith_tracing/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/langsmith_tracing/basic/__init__.py b/langsmith_tracing/basic/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/langsmith_tracing/basic/activities.py b/langsmith_tracing/basic/activities.py new file mode 100644 index 00000000..c3faeea7 --- /dev/null +++ b/langsmith_tracing/basic/activities.py @@ -0,0 +1,29 @@ +"""Basic LLM activity with LangSmith tracing.""" + +from dataclasses import dataclass + +from langsmith import traceable +from langsmith.wrappers import wrap_openai +from openai import AsyncOpenAI +from openai.types.responses import Response +from temporalio import activity + + +@dataclass +class OpenAIRequest: + model: str + input: str + instructions: str = "You are a helpful assistant." + + +@traceable(name="Call OpenAI") +@activity.defn +async def call_openai(request: OpenAIRequest) -> Response: + """Call OpenAI Responses API. Retries handled by Temporal.""" + client = wrap_openai(AsyncOpenAI(max_retries=0)) + return await client.responses.create( + model=request.model, + instructions=request.instructions, + input=request.input, + timeout=30, + ) diff --git a/langsmith_tracing/basic/starter.py b/langsmith_tracing/basic/starter.py new file mode 100644 index 00000000..7b0555dd --- /dev/null +++ b/langsmith_tracing/basic/starter.py @@ -0,0 +1,35 @@ +"""Starter for the basic LangSmith sample.""" + +import asyncio + +from temporalio.client import Client +from temporalio.contrib.langsmith import LangSmithPlugin +from temporalio.contrib.pydantic import pydantic_data_converter +from temporalio.envconfig import ClientConfig + +from langsmith_tracing.basic.workflows import BasicLLMWorkflow + + +async def main(): + config = ClientConfig.load_client_connect_config() + config.setdefault("target_host", "localhost:7233") + + plugin = LangSmithPlugin(project_name="langsmith-basic") + + client = await Client.connect( + **config, + data_converter=pydantic_data_converter, + plugins=[plugin], + ) + + result = await client.execute_workflow( + BasicLLMWorkflow.run, + "What is Temporal?", + id="langsmith-basic-workflow-id", + task_queue="langsmith-basic-task-queue", + ) + print(f"Workflow result: {result}") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/langsmith_tracing/basic/worker.py b/langsmith_tracing/basic/worker.py new file mode 100644 index 00000000..6837b479 --- /dev/null +++ b/langsmith_tracing/basic/worker.py @@ -0,0 +1,50 @@ +"""Worker for the basic LangSmith sample.""" + +import asyncio +import logging + +from temporalio.client import Client +from temporalio.contrib.langsmith import LangSmithPlugin +from temporalio.contrib.pydantic import pydantic_data_converter +from temporalio.envconfig import ClientConfig +from temporalio.worker import Worker + +from langsmith_tracing.basic.activities import call_openai +from langsmith_tracing.basic.workflows import BasicLLMWorkflow + +interrupt_event = asyncio.Event() + + +async def main(): + logging.basicConfig(level=logging.INFO) + + config = ClientConfig.load_client_connect_config() + config.setdefault("target_host", "localhost:7233") + + client = await Client.connect( + **config, + data_converter=pydantic_data_converter, + ) + + plugin = LangSmithPlugin(project_name="langsmith-basic") + + async with Worker( + client, + task_queue="langsmith-basic-task-queue", + workflows=[BasicLLMWorkflow], + activities=[call_openai], + plugins=[plugin], + max_cached_workflows=0, + ): + print("Worker started, ctrl+c to exit") + await interrupt_event.wait() + print("Shutting down") + + +if __name__ == "__main__": + loop = asyncio.new_event_loop() + try: + loop.run_until_complete(main()) + except KeyboardInterrupt: + interrupt_event.set() + loop.run_until_complete(loop.shutdown_asyncgens()) diff --git a/langsmith_tracing/basic/workflows.py b/langsmith_tracing/basic/workflows.py new file mode 100644 index 00000000..dd26f1b0 --- /dev/null +++ b/langsmith_tracing/basic/workflows.py @@ -0,0 +1,24 @@ +"""Basic one-shot LLM workflow.""" + +from datetime import timedelta + +from temporalio import workflow +from temporalio.common import RetryPolicy + +with workflow.unsafe.imports_passed_through(): + from langsmith_tracing.basic.activities import OpenAIRequest, call_openai + +RETRY = RetryPolicy(initial_interval=timedelta(seconds=2), maximum_attempts=3) + + +@workflow.defn +class BasicLLMWorkflow: + @workflow.run + async def run(self, prompt: str) -> str: + response = await workflow.execute_activity( + call_openai, + OpenAIRequest(model="gpt-4o-mini", input=prompt), + start_to_close_timeout=timedelta(seconds=60), + retry_policy=RETRY, + ) + return response.output_text diff --git a/langsmith_tracing/chatbot/__init__.py b/langsmith_tracing/chatbot/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/langsmith_tracing/chatbot/activities.py b/langsmith_tracing/chatbot/activities.py new file mode 100644 index 00000000..1023c706 --- /dev/null +++ b/langsmith_tracing/chatbot/activities.py @@ -0,0 +1,44 @@ +"""Chatbot activities with LangSmith tracing.""" + +from dataclasses import dataclass, field + +from langsmith import traceable +from langsmith.wrappers import wrap_openai +from openai import AsyncOpenAI +from openai.types.responses import Response +from temporalio import activity + + +@dataclass +class OpenAIRequest: + model: str + input: str | list + instructions: str = "You are a helpful assistant with note-taking abilities. Use save_note to remember things and read_note to recall them." + tools: list | None = None + previous_response_id: str | None = None + + +@traceable(name="Call OpenAI") +@activity.defn +async def call_openai(request: OpenAIRequest) -> Response: + """Call OpenAI Responses API. Retries handled by Temporal.""" + client = wrap_openai(AsyncOpenAI(max_retries=0)) + kwargs: dict = { + "model": request.model, + "instructions": request.instructions, + "input": request.input, + "timeout": 30, + } + if request.tools: + kwargs["tools"] = request.tools + if request.previous_response_id: + kwargs["previous_response_id"] = request.previous_response_id + return await client.responses.create(**kwargs) + + +@traceable(name="Save Note", run_type="tool") +@activity.defn +async def save_note(name: str, content: str) -> str: + """Save a note. Durable side effect — survives worker crashes.""" + activity.logger.info(f"Saving note '{name}': {content[:80]}") + return f"Saved note '{name}'." diff --git a/langsmith_tracing/chatbot/starter.py b/langsmith_tracing/chatbot/starter.py new file mode 100644 index 00000000..c16e3ab7 --- /dev/null +++ b/langsmith_tracing/chatbot/starter.py @@ -0,0 +1,74 @@ +"""Interactive CLI starter for the chatbot LangSmith sample.""" + +import asyncio +import readline # noqa: F401 — enables input() line editing +import uuid + +import langsmith as ls +from temporalio.client import Client +from temporalio.contrib.langsmith import LangSmithPlugin +from temporalio.contrib.pydantic import pydantic_data_converter +from temporalio.envconfig import ClientConfig + +from langsmith_tracing.chatbot.workflows import ChatbotWorkflow + + +async def main(): + config = ClientConfig.load_client_connect_config() + config.setdefault("target_host", "localhost:7233") + + plugin = LangSmithPlugin(project_name="langsmith-chatbot") + + client = await Client.connect( + **config, + data_converter=pydantic_data_converter, + plugins=[plugin], + ) + + wf_handle = await client.start_workflow( + ChatbotWorkflow.run, + id=f"langsmith-chatbot-{uuid.uuid4().hex[:8]}", + task_queue="langsmith-chatbot-task-queue", + ) + print(f"Started workflow: {wf_handle.id}") + print('Type a message, "notes" to see saved notes, or "exit" to quit.\n') + + try: + while True: + user_input = input("You: ").strip() + if not user_input: + continue + + if user_input.lower() == "exit": + await wf_handle.signal(ChatbotWorkflow.exit) + result = await wf_handle.result() + print(f"\nWorkflow finished: {result}") + break + + if user_input.lower() == "notes": + notes = await wf_handle.query(ChatbotWorkflow.notes) + if notes: + for name, content in notes.items(): + print(f" [{name}]: {content}") + else: + print(" (no notes yet)") + continue + + prev_response = await wf_handle.query(ChatbotWorkflow.last_response) + await wf_handle.signal(ChatbotWorkflow.user_message, user_input) + + # Poll for a new response + for _ in range(60): + await asyncio.sleep(0.5) + response = await wf_handle.query(ChatbotWorkflow.last_response) + if response != prev_response: + print(f"Bot: {response}\n") + break + else: + print("(timed out waiting for response)") + finally: + ls.flush() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/langsmith_tracing/chatbot/worker.py b/langsmith_tracing/chatbot/worker.py new file mode 100644 index 00000000..f2530145 --- /dev/null +++ b/langsmith_tracing/chatbot/worker.py @@ -0,0 +1,50 @@ +"""Worker for the chatbot LangSmith sample.""" + +import asyncio +import logging + +from temporalio.client import Client +from temporalio.contrib.langsmith import LangSmithPlugin +from temporalio.contrib.pydantic import pydantic_data_converter +from temporalio.envconfig import ClientConfig +from temporalio.worker import Worker + +from langsmith_tracing.chatbot.activities import call_openai, save_note +from langsmith_tracing.chatbot.workflows import ChatbotWorkflow + +interrupt_event = asyncio.Event() + + +async def main(): + logging.basicConfig(level=logging.INFO) + + config = ClientConfig.load_client_connect_config() + config.setdefault("target_host", "localhost:7233") + + client = await Client.connect( + **config, + data_converter=pydantic_data_converter, + ) + + plugin = LangSmithPlugin(project_name="langsmith-chatbot") + + async with Worker( + client, + task_queue="langsmith-chatbot-task-queue", + workflows=[ChatbotWorkflow], + activities=[call_openai, save_note], + plugins=[plugin], + max_cached_workflows=0, + ): + print("Worker started, ctrl+c to exit") + await interrupt_event.wait() + print("Shutting down") + + +if __name__ == "__main__": + loop = asyncio.new_event_loop() + try: + loop.run_until_complete(main()) + except KeyboardInterrupt: + interrupt_event.set() + loop.run_until_complete(loop.shutdown_asyncgens()) diff --git a/langsmith_tracing/chatbot/workflows.py b/langsmith_tracing/chatbot/workflows.py new file mode 100644 index 00000000..180b108f --- /dev/null +++ b/langsmith_tracing/chatbot/workflows.py @@ -0,0 +1,154 @@ +"""Conversational chatbot workflow with tool loop.""" + +import json +from datetime import timedelta + +from temporalio import workflow +from temporalio.common import RetryPolicy + +with workflow.unsafe.imports_passed_through(): + from langsmith import traceable + + from langsmith_tracing.chatbot.activities import ( + OpenAIRequest, + call_openai, + save_note, + ) + +RETRY = RetryPolicy(initial_interval=timedelta(seconds=2), maximum_attempts=3) + +TOOLS = [ + { + "type": "function", + "name": "save_note", + "description": "Save or update a note.", + "parameters": { + "type": "object", + "properties": { + "name": {"type": "string", "description": "Name/key for the note."}, + "content": { + "type": "string", + "description": "Content of the note.", + }, + }, + "required": ["name", "content"], + }, + }, + { + "type": "function", + "name": "read_note", + "description": "Read a previously saved note.", + "parameters": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name/key of the note to read.", + }, + }, + "required": ["name"], + }, + }, +] + + +@workflow.defn +class ChatbotWorkflow: + def __init__(self): + self._pending_message: str | None = None + self._last_response: str = "" + self._previous_response_id: str | None = None + self._notes: dict[str, str] = {} + self._done = False + + @workflow.signal + async def user_message(self, message: str) -> None: + self._pending_message = message + + @workflow.signal + async def exit(self) -> None: + self._done = True + + @workflow.query + def last_response(self) -> str: + return self._last_response + + @workflow.query + def notes(self) -> dict[str, str]: + return dict(self._notes) + + @workflow.run + async def run(self) -> str: + now = workflow.now().strftime("%b %d %H:%M") + return await traceable( + name=f"Session {now}", + run_type="chain", + )(self._session)() + + async def _session(self) -> str: + while not self._done: + await workflow.wait_condition( + lambda: self._pending_message is not None or self._done + ) + if self._done: + break + message = self._pending_message + self._pending_message = None + self._last_response = await self._query_openai(message) + + return "Session ended." + + async def _query_openai(self, message: str | None) -> str: + @traceable(name=f"Request: {(message or '')[:60]}", run_type="chain") + async def _traced(): + input_for_next: str | list = message or "" + while True: + response = await workflow.execute_activity( + call_openai, + OpenAIRequest( + model="gpt-4o-mini", + input=input_for_next, + tools=TOOLS, + previous_response_id=self._previous_response_id, + ), + start_to_close_timeout=timedelta(seconds=60), + retry_policy=RETRY, + ) + self._previous_response_id = response.id + + tool_results = [] + for item in response.output: + if item.type != "function_call": + continue + args = json.loads(item.arguments) + if item.name == "save_note": + self._notes[args["name"]] = args["content"] + result = await workflow.execute_activity( + save_note, + args=[args["name"], args["content"]], + start_to_close_timeout=timedelta(seconds=10), + retry_policy=RETRY, + ) + tool_results.append( + { + "type": "function_call_output", + "call_id": item.call_id, + "output": result, + } + ) + elif item.name == "read_note": + content = self._notes.get(args["name"], "Note not found.") + tool_results.append( + { + "type": "function_call_output", + "call_id": item.call_id, + "output": content, + } + ) + + if not tool_results: + return response.output_text or "Done." + + input_for_next = tool_results + + return await _traced() diff --git a/pyproject.toml b/pyproject.toml index f65ff1c2..0932edde 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,6 +39,11 @@ langchain = [ "tqdm>=4.62.0,<5", "uvicorn[standard]>=0.31.0,<0.32.0", ] +langsmith-tracing = [ + "openai>=1.4.0,<2", + "langsmith>=0.7.0", + "temporalio[pydantic]", +] nexus = ["nexus-rpc>=1.1.0,<2"] open-telemetry = [ "temporalio[opentelemetry]", @@ -80,6 +85,7 @@ packages = [ "gevent_async", "hello", "langchain", + "langsmith_tracing", "message_passing", "nexus", "open_telemetry", @@ -126,6 +132,14 @@ log_cli = true log_cli_level = "INFO" log_cli_format = "%(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)" +[tool.uv] +conflicts = [ + [ + { group = "langchain" }, + { group = "langsmith-tracing" }, + ], +] + [tool.ruff] target-version = "py310" diff --git a/tests/langsmith_tracing/__init__.py b/tests/langsmith_tracing/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/langsmith_tracing/test_basic.py b/tests/langsmith_tracing/test_basic.py new file mode 100644 index 00000000..5da4a359 --- /dev/null +++ b/tests/langsmith_tracing/test_basic.py @@ -0,0 +1,64 @@ +import uuid + +from openai.types.responses import Response +from openai.types.responses.response_output_message import ResponseOutputMessage +from openai.types.responses.response_output_text import ResponseOutputText +from temporalio import activity +from temporalio.client import Client +from temporalio.testing import WorkflowEnvironment +from temporalio.worker import Worker + +from langsmith_tracing.basic.activities import OpenAIRequest, call_openai +from langsmith_tracing.basic.workflows import BasicLLMWorkflow + + +def _make_text_response(text: str) -> Response: + """Build a minimal Response with a text output.""" + return Response.model_construct( + id="resp_mock", + created_at=0.0, + model="gpt-4o-mini", + object="response", + output=[ + ResponseOutputMessage.model_construct( + id="msg_mock", + type="message", + role="assistant", + status="completed", + content=[ + ResponseOutputText.model_construct( + type="output_text", + text=text, + annotations=[], + ) + ], + ) + ], + parallel_tool_calls=False, + tool_choice="auto", + tools=[], + ) + + +async def test_basic_workflow(client: Client, env: WorkflowEnvironment): + expected_text = "Temporal is a durable execution platform." + mock_response = _make_text_response(expected_text) + + @activity.defn(name="call_openai") + async def mock_call_openai(request: OpenAIRequest) -> Response: + return mock_response + + async with Worker( + client, + task_queue="test-langsmith-basic", + workflows=[BasicLLMWorkflow], + activities=[mock_call_openai], + ): + result = await client.execute_workflow( + BasicLLMWorkflow.run, + "What is Temporal?", + id=f"test-basic-{uuid.uuid4().hex[:8]}", + task_queue="test-langsmith-basic", + ) + + assert result == expected_text diff --git a/tests/langsmith_tracing/test_chatbot.py b/tests/langsmith_tracing/test_chatbot.py new file mode 100644 index 00000000..12d87015 --- /dev/null +++ b/tests/langsmith_tracing/test_chatbot.py @@ -0,0 +1,206 @@ +import json +import uuid + +import pytest +from openai.types.responses import Response +from openai.types.responses.response_function_tool_call import ( + ResponseFunctionToolCall, +) +from openai.types.responses.response_output_message import ResponseOutputMessage +from openai.types.responses.response_output_text import ResponseOutputText +from temporalio import activity +from temporalio.client import Client +from temporalio.testing import WorkflowEnvironment +from temporalio.worker import Worker + +try: + from temporalio.contrib.langsmith import LangSmithPlugin +except ImportError: + LangSmithPlugin = None # type: ignore[assignment,misc] + +pytestmark = pytest.mark.skipif( + LangSmithPlugin is None, + reason="temporalio.contrib.langsmith not available", +) + +from langsmith_tracing.chatbot.activities import OpenAIRequest, call_openai, save_note +from langsmith_tracing.chatbot.workflows import ChatbotWorkflow + +_call_count = 0 + + +def _make_text_response(text: str) -> Response: + return Response.model_construct( + id="resp_text", + created_at=0.0, + model="gpt-4o-mini", + object="response", + output=[ + ResponseOutputMessage.model_construct( + id="msg_mock", + type="message", + role="assistant", + status="completed", + content=[ + ResponseOutputText.model_construct( + type="output_text", + text=text, + annotations=[], + ) + ], + ) + ], + parallel_tool_calls=False, + tool_choice="auto", + tools=[], + ) + + +def _make_function_call_response( + name: str, arguments: dict, call_id: str = "call_123" +) -> Response: + return Response.model_construct( + id="resp_tool", + created_at=0.0, + model="gpt-4o-mini", + object="response", + output=[ + ResponseFunctionToolCall.model_construct( + id="fc_mock", + type="function_call", + name=name, + arguments=json.dumps(arguments), + call_id=call_id, + status="completed", + ) + ], + parallel_tool_calls=False, + tool_choice="auto", + tools=[], + ) + + +async def test_chatbot_save_note(client: Client, env: WorkflowEnvironment): + call_count = 0 + + @activity.defn(name="call_openai") + async def mock_call_openai(request: OpenAIRequest) -> Response: + nonlocal call_count + call_count += 1 + if call_count == 1: + # First call: model wants to save a note + return _make_function_call_response( + name="save_note", + arguments={"name": "greeting", "content": "Hello world"}, + ) + # Second call: model returns text after tool result + return _make_text_response("Note saved successfully!") + + @activity.defn(name="save_note") + async def mock_save_note(name: str, content: str) -> str: + return f"Saved note '{name}'." + + async with Worker( + client, + task_queue="test-langsmith-chatbot", + workflows=[ChatbotWorkflow], + activities=[mock_call_openai, mock_save_note], + plugins=[LangSmithPlugin()], + ): + wf_handle = await client.start_workflow( + ChatbotWorkflow.run, + id=f"test-chatbot-{uuid.uuid4().hex[:8]}", + task_queue="test-langsmith-chatbot", + ) + + # Send a message + await wf_handle.signal(ChatbotWorkflow.user_message, "Save a note") + + # Wait for response + import asyncio + + for _ in range(20): + await asyncio.sleep(0.2) + response = await wf_handle.query(ChatbotWorkflow.last_response) + if response: + break + + assert response == "Note saved successfully!" + + # Verify note was stored + notes = await wf_handle.query(ChatbotWorkflow.notes) + assert notes == {"greeting": "Hello world"} + + # Exit + await wf_handle.signal(ChatbotWorkflow.exit) + result = await wf_handle.result() + assert result == "Session ended." + + +async def test_chatbot_read_note(client: Client, env: WorkflowEnvironment): + """Test that read_note returns from workflow state without calling an activity.""" + call_count = 0 + + @activity.defn(name="call_openai") + async def mock_call_openai(request: OpenAIRequest) -> Response: + nonlocal call_count + call_count += 1 + if call_count == 1: + # First call: save a note + return _make_function_call_response( + name="save_note", + arguments={"name": "todo", "content": "Buy milk"}, + call_id="call_save", + ) + if call_count == 2: + # After save_note tool result, return text + return _make_text_response("Saved your todo!") + if call_count == 3: + # Second user message: model wants to read the note + return _make_function_call_response( + name="read_note", + arguments={"name": "todo"}, + call_id="call_read", + ) + # After read_note tool result, return the content + return _make_text_response("Your todo says: Buy milk") + + @activity.defn(name="save_note") + async def mock_save_note(name: str, content: str) -> str: + return f"Saved note '{name}'." + + async with Worker( + client, + task_queue="test-langsmith-chatbot-read", + workflows=[ChatbotWorkflow], + activities=[mock_call_openai, mock_save_note], + plugins=[LangSmithPlugin()], + ): + wf_handle = await client.start_workflow( + ChatbotWorkflow.run, + id=f"test-chatbot-read-{uuid.uuid4().hex[:8]}", + task_queue="test-langsmith-chatbot-read", + ) + + import asyncio + + # Save a note first + await wf_handle.signal(ChatbotWorkflow.user_message, "Save my todo") + for _ in range(20): + await asyncio.sleep(0.2) + response = await wf_handle.query(ChatbotWorkflow.last_response) + if response: + break + assert response == "Saved your todo!" + + # Now read it back — read_note should use workflow state, no activity + await wf_handle.signal(ChatbotWorkflow.user_message, "Read my todo") + for _ in range(20): + await asyncio.sleep(0.2) + new_response = await wf_handle.query(ChatbotWorkflow.last_response) + if new_response and new_response != response: + break + assert new_response == "Your todo says: Buy milk" + + await wf_handle.signal(ChatbotWorkflow.exit) + await wf_handle.result() diff --git a/uv.lock b/uv.lock index 4a22edea..2fcd64fe 100644 --- a/uv.lock +++ b/uv.lock @@ -2,12 +2,24 @@ version = 1 revision = 3 requires-python = ">=3.10" resolution-markers = [ - "python_full_version >= '3.13'", - "python_full_version >= '3.12.4' and python_full_version < '3.13'", - "python_full_version >= '3.12' and python_full_version < '3.12.4'", - "python_full_version == '3.11.*'", - "python_full_version < '3.11'", -] + "python_full_version >= '3.13' and extra != 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version == '3.12.*' and extra != 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version == '3.11.*' and extra != 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version < '3.11' and extra != 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version >= '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version >= '3.12' and python_full_version < '3.12.4' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version == '3.11.*' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version < '3.11' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version >= '3.13' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version == '3.12.*' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version == '3.11.*' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version < '3.11' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", +] +conflicts = [[ + { package = "temporalio-samples", group = "langchain" }, + { package = "temporalio-samples", group = "langsmith-tracing" }, +]] [[package]] name = "aiohappyeyeballs" @@ -25,7 +37,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, { name = "aiosignal" }, - { name = "async-timeout", marker = "python_full_version < '3.11'" }, + { name = "async-timeout", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, { name = "attrs" }, { name = "frozenlist" }, { name = "multidict" }, @@ -110,7 +122,7 @@ version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frozenlist" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } wheels = [ @@ -131,10 +143,10 @@ name = "anyio" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, { name = "idna" }, { name = "sniffio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload-time = "2025-03-17T00:02:54.77Z" } wheels = [ @@ -319,7 +331,7 @@ name = "click" version = "8.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } wheels = [ @@ -367,6 +379,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/94/35/386550fd60316d1e37eccdda609b074113298f23cef5bddb2049823fe666/dacite-1.9.2-py3-none-any.whl", hash = "sha256:053f7c3f5128ca2e9aceb66892b1a3c8936d02c686e707bee96e19deef4bc4a0", size = 16600, upload-time = "2025-02-05T09:27:24.345Z" }, ] +[[package]] +name = "dataclasses-json" +version = "0.6.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "marshmallow" }, + { name = "typing-inspect" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/a4/f71d9cf3a5ac257c993b5ca3f93df5f7fb395c725e7f1e6479d2514173c3/dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0", size = 32227, upload-time = "2024-06-09T16:20:19.103Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686, upload-time = "2024-06-09T16:20:16.715Z" }, +] + [[package]] name = "distro" version = "1.9.0" @@ -381,7 +406,7 @@ name = "exceptiongroup" version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" } wheels = [ @@ -402,69 +427,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e5/47/d63c60f59a59467fda0f93f46335c9d18526d7071f025cb5b89d5353ea42/fastapi-0.116.1-py3-none-any.whl", hash = "sha256:c46ac7c312df840f0c9e220f7964bada936781bc4e2e6eb71f1c4d7553786565", size = 95631, upload-time = "2025-07-11T16:22:30.485Z" }, ] -[[package]] -name = "fastuuid" -version = "0.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c3/7d/d9daedf0f2ebcacd20d599928f8913e9d2aea1d56d2d355a93bfa2b611d7/fastuuid-0.14.0.tar.gz", hash = "sha256:178947fc2f995b38497a74172adee64fdeb8b7ec18f2a5934d037641ba265d26", size = 18232, upload-time = "2025-10-19T22:19:22.402Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/b2/731a6696e37cd20eed353f69a09f37a984a43c9713764ee3f7ad5f57f7f9/fastuuid-0.14.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:6e6243d40f6c793c3e2ee14c13769e341b90be5ef0c23c82fa6515a96145181a", size = 516760, upload-time = "2025-10-19T22:25:21.509Z" }, - { url = "https://files.pythonhosted.org/packages/c5/79/c73c47be2a3b8734d16e628982653517f80bbe0570e27185d91af6096507/fastuuid-0.14.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:13ec4f2c3b04271f62be2e1ce7e95ad2dd1cf97e94503a3760db739afbd48f00", size = 264748, upload-time = "2025-10-19T22:41:52.873Z" }, - { url = "https://files.pythonhosted.org/packages/24/c5/84c1eea05977c8ba5173555b0133e3558dc628bcf868d6bf1689ff14aedc/fastuuid-0.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b2fdd48b5e4236df145a149d7125badb28e0a383372add3fbaac9a6b7a394470", size = 254537, upload-time = "2025-10-19T22:33:55.603Z" }, - { url = "https://files.pythonhosted.org/packages/0e/23/4e362367b7fa17dbed646922f216b9921efb486e7abe02147e4b917359f8/fastuuid-0.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f74631b8322d2780ebcf2d2d75d58045c3e9378625ec51865fe0b5620800c39d", size = 278994, upload-time = "2025-10-19T22:26:17.631Z" }, - { url = "https://files.pythonhosted.org/packages/b2/72/3985be633b5a428e9eaec4287ed4b873b7c4c53a9639a8b416637223c4cd/fastuuid-0.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83cffc144dc93eb604b87b179837f2ce2af44871a7b323f2bfed40e8acb40ba8", size = 280003, upload-time = "2025-10-19T22:23:45.415Z" }, - { url = "https://files.pythonhosted.org/packages/b3/6d/6ef192a6df34e2266d5c9deb39cd3eea986df650cbcfeaf171aa52a059c3/fastuuid-0.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a771f135ab4523eb786e95493803942a5d1fc1610915f131b363f55af53b219", size = 303583, upload-time = "2025-10-19T22:26:00.756Z" }, - { url = "https://files.pythonhosted.org/packages/9d/11/8a2ea753c68d4fece29d5d7c6f3f903948cc6e82d1823bc9f7f7c0355db3/fastuuid-0.14.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4edc56b877d960b4eda2c4232f953a61490c3134da94f3c28af129fb9c62a4f6", size = 460955, upload-time = "2025-10-19T22:36:25.196Z" }, - { url = "https://files.pythonhosted.org/packages/23/42/7a32c93b6ce12642d9a152ee4753a078f372c9ebb893bc489d838dd4afd5/fastuuid-0.14.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bcc96ee819c282e7c09b2eed2b9bd13084e3b749fdb2faf58c318d498df2efbe", size = 480763, upload-time = "2025-10-19T22:24:28.451Z" }, - { url = "https://files.pythonhosted.org/packages/b9/e9/a5f6f686b46e3ed4ed3b93770111c233baac87dd6586a411b4988018ef1d/fastuuid-0.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7a3c0bca61eacc1843ea97b288d6789fbad7400d16db24e36a66c28c268cfe3d", size = 452613, upload-time = "2025-10-19T22:25:06.827Z" }, - { url = "https://files.pythonhosted.org/packages/b4/c9/18abc73c9c5b7fc0e476c1733b678783b2e8a35b0be9babd423571d44e98/fastuuid-0.14.0-cp310-cp310-win32.whl", hash = "sha256:7f2f3efade4937fae4e77efae1af571902263de7b78a0aee1a1653795a093b2a", size = 155045, upload-time = "2025-10-19T22:28:32.732Z" }, - { url = "https://files.pythonhosted.org/packages/5e/8a/d9e33f4eb4d4f6d9f2c5c7d7e96b5cdbb535c93f3b1ad6acce97ee9d4bf8/fastuuid-0.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:ae64ba730d179f439b0736208b4c279b8bc9c089b102aec23f86512ea458c8a4", size = 156122, upload-time = "2025-10-19T22:23:15.59Z" }, - { url = "https://files.pythonhosted.org/packages/98/f3/12481bda4e5b6d3e698fbf525df4443cc7dce746f246b86b6fcb2fba1844/fastuuid-0.14.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:73946cb950c8caf65127d4e9a325e2b6be0442a224fd51ba3b6ac44e1912ce34", size = 516386, upload-time = "2025-10-19T22:42:40.176Z" }, - { url = "https://files.pythonhosted.org/packages/59/19/2fc58a1446e4d72b655648eb0879b04e88ed6fa70d474efcf550f640f6ec/fastuuid-0.14.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:12ac85024637586a5b69645e7ed986f7535106ed3013640a393a03e461740cb7", size = 264569, upload-time = "2025-10-19T22:25:50.977Z" }, - { url = "https://files.pythonhosted.org/packages/78/29/3c74756e5b02c40cfcc8b1d8b5bac4edbd532b55917a6bcc9113550e99d1/fastuuid-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:05a8dde1f395e0c9b4be515b7a521403d1e8349443e7641761af07c7ad1624b1", size = 254366, upload-time = "2025-10-19T22:29:49.166Z" }, - { url = "https://files.pythonhosted.org/packages/52/96/d761da3fccfa84f0f353ce6e3eb8b7f76b3aa21fd25e1b00a19f9c80a063/fastuuid-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09378a05020e3e4883dfdab438926f31fea15fd17604908f3d39cbeb22a0b4dc", size = 278978, upload-time = "2025-10-19T22:35:41.306Z" }, - { url = "https://files.pythonhosted.org/packages/fc/c2/f84c90167cc7765cb82b3ff7808057608b21c14a38531845d933a4637307/fastuuid-0.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbb0c4b15d66b435d2538f3827f05e44e2baafcc003dd7d8472dc67807ab8fd8", size = 279692, upload-time = "2025-10-19T22:25:36.997Z" }, - { url = "https://files.pythonhosted.org/packages/af/7b/4bacd03897b88c12348e7bd77943bac32ccf80ff98100598fcff74f75f2e/fastuuid-0.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cd5a7f648d4365b41dbf0e38fe8da4884e57bed4e77c83598e076ac0c93995e7", size = 303384, upload-time = "2025-10-19T22:29:46.578Z" }, - { url = "https://files.pythonhosted.org/packages/c0/a2/584f2c29641df8bd810d00c1f21d408c12e9ad0c0dafdb8b7b29e5ddf787/fastuuid-0.14.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c0a94245afae4d7af8c43b3159d5e3934c53f47140be0be624b96acd672ceb73", size = 460921, upload-time = "2025-10-19T22:36:42.006Z" }, - { url = "https://files.pythonhosted.org/packages/24/68/c6b77443bb7764c760e211002c8638c0c7cce11cb584927e723215ba1398/fastuuid-0.14.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b29e23c97e77c3a9514d70ce343571e469098ac7f5a269320a0f0b3e193ab36", size = 480575, upload-time = "2025-10-19T22:28:18.975Z" }, - { url = "https://files.pythonhosted.org/packages/5a/87/93f553111b33f9bb83145be12868c3c475bf8ea87c107063d01377cc0e8e/fastuuid-0.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1e690d48f923c253f28151b3a6b4e335f2b06bf669c68a02665bc150b7839e94", size = 452317, upload-time = "2025-10-19T22:25:32.75Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8c/a04d486ca55b5abb7eaa65b39df8d891b7b1635b22db2163734dc273579a/fastuuid-0.14.0-cp311-cp311-win32.whl", hash = "sha256:a6f46790d59ab38c6aa0e35c681c0484b50dc0acf9e2679c005d61e019313c24", size = 154804, upload-time = "2025-10-19T22:24:15.615Z" }, - { url = "https://files.pythonhosted.org/packages/9c/b2/2d40bf00820de94b9280366a122cbaa60090c8cf59e89ac3938cf5d75895/fastuuid-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:e150eab56c95dc9e3fefc234a0eedb342fac433dacc273cd4d150a5b0871e1fa", size = 156099, upload-time = "2025-10-19T22:24:31.646Z" }, - { url = "https://files.pythonhosted.org/packages/02/a2/e78fcc5df65467f0d207661b7ef86c5b7ac62eea337c0c0fcedbeee6fb13/fastuuid-0.14.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77e94728324b63660ebf8adb27055e92d2e4611645bf12ed9d88d30486471d0a", size = 510164, upload-time = "2025-10-19T22:31:45.635Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b3/c846f933f22f581f558ee63f81f29fa924acd971ce903dab1a9b6701816e/fastuuid-0.14.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:caa1f14d2102cb8d353096bc6ef6c13b2c81f347e6ab9d6fbd48b9dea41c153d", size = 261837, upload-time = "2025-10-19T22:38:38.53Z" }, - { url = "https://files.pythonhosted.org/packages/54/ea/682551030f8c4fa9a769d9825570ad28c0c71e30cf34020b85c1f7ee7382/fastuuid-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d23ef06f9e67163be38cece704170486715b177f6baae338110983f99a72c070", size = 251370, upload-time = "2025-10-19T22:40:26.07Z" }, - { url = "https://files.pythonhosted.org/packages/14/dd/5927f0a523d8e6a76b70968e6004966ee7df30322f5fc9b6cdfb0276646a/fastuuid-0.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c9ec605ace243b6dbe3bd27ebdd5d33b00d8d1d3f580b39fdd15cd96fd71796", size = 277766, upload-time = "2025-10-19T22:37:23.779Z" }, - { url = "https://files.pythonhosted.org/packages/16/6e/c0fb547eef61293153348f12e0f75a06abb322664b34a1573a7760501336/fastuuid-0.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:808527f2407f58a76c916d6aa15d58692a4a019fdf8d4c32ac7ff303b7d7af09", size = 278105, upload-time = "2025-10-19T22:26:56.821Z" }, - { url = "https://files.pythonhosted.org/packages/2d/b1/b9c75e03b768f61cf2e84ee193dc18601aeaf89a4684b20f2f0e9f52b62c/fastuuid-0.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fb3c0d7fef6674bbeacdd6dbd386924a7b60b26de849266d1ff6602937675c8", size = 301564, upload-time = "2025-10-19T22:30:31.604Z" }, - { url = "https://files.pythonhosted.org/packages/fc/fa/f7395fdac07c7a54f18f801744573707321ca0cee082e638e36452355a9d/fastuuid-0.14.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab3f5d36e4393e628a4df337c2c039069344db5f4b9d2a3c9cea48284f1dd741", size = 459659, upload-time = "2025-10-19T22:31:32.341Z" }, - { url = "https://files.pythonhosted.org/packages/66/49/c9fd06a4a0b1f0f048aacb6599e7d96e5d6bc6fa680ed0d46bf111929d1b/fastuuid-0.14.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b9a0ca4f03b7e0b01425281ffd44e99d360e15c895f1907ca105854ed85e2057", size = 478430, upload-time = "2025-10-19T22:26:22.962Z" }, - { url = "https://files.pythonhosted.org/packages/be/9c/909e8c95b494e8e140e8be6165d5fc3f61fdc46198c1554df7b3e1764471/fastuuid-0.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3acdf655684cc09e60fb7e4cf524e8f42ea760031945aa8086c7eae2eeeabeb8", size = 450894, upload-time = "2025-10-19T22:27:01.647Z" }, - { url = "https://files.pythonhosted.org/packages/90/eb/d29d17521976e673c55ef7f210d4cdd72091a9ec6755d0fd4710d9b3c871/fastuuid-0.14.0-cp312-cp312-win32.whl", hash = "sha256:9579618be6280700ae36ac42c3efd157049fe4dd40ca49b021280481c78c3176", size = 154374, upload-time = "2025-10-19T22:29:19.879Z" }, - { url = "https://files.pythonhosted.org/packages/cc/fc/f5c799a6ea6d877faec0472d0b27c079b47c86b1cdc577720a5386483b36/fastuuid-0.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:d9e4332dc4ba054434a9594cbfaf7823b57993d7d8e7267831c3e059857cf397", size = 156550, upload-time = "2025-10-19T22:27:49.658Z" }, - { url = "https://files.pythonhosted.org/packages/a5/83/ae12dd39b9a39b55d7f90abb8971f1a5f3c321fd72d5aa83f90dc67fe9ed/fastuuid-0.14.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77a09cb7427e7af74c594e409f7731a0cf887221de2f698e1ca0ebf0f3139021", size = 510720, upload-time = "2025-10-19T22:42:34.633Z" }, - { url = "https://files.pythonhosted.org/packages/53/b0/a4b03ff5d00f563cc7546b933c28cb3f2a07344b2aec5834e874f7d44143/fastuuid-0.14.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:9bd57289daf7b153bfa3e8013446aa144ce5e8c825e9e366d455155ede5ea2dc", size = 262024, upload-time = "2025-10-19T22:30:25.482Z" }, - { url = "https://files.pythonhosted.org/packages/9c/6d/64aee0a0f6a58eeabadd582e55d0d7d70258ffdd01d093b30c53d668303b/fastuuid-0.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ac60fc860cdf3c3f327374db87ab8e064c86566ca8c49d2e30df15eda1b0c2d5", size = 251679, upload-time = "2025-10-19T22:36:14.096Z" }, - { url = "https://files.pythonhosted.org/packages/60/f5/a7e9cda8369e4f7919d36552db9b2ae21db7915083bc6336f1b0082c8b2e/fastuuid-0.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab32f74bd56565b186f036e33129da77db8be09178cd2f5206a5d4035fb2a23f", size = 277862, upload-time = "2025-10-19T22:36:23.302Z" }, - { url = "https://files.pythonhosted.org/packages/f0/d3/8ce11827c783affffd5bd4d6378b28eb6cc6d2ddf41474006b8d62e7448e/fastuuid-0.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e678459cf4addaedd9936bbb038e35b3f6b2061330fd8f2f6a1d80414c0f87", size = 278278, upload-time = "2025-10-19T22:29:43.809Z" }, - { url = "https://files.pythonhosted.org/packages/a2/51/680fb6352d0bbade04036da46264a8001f74b7484e2fd1f4da9e3db1c666/fastuuid-0.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1e3cc56742f76cd25ecb98e4b82a25f978ccffba02e4bdce8aba857b6d85d87b", size = 301788, upload-time = "2025-10-19T22:36:06.825Z" }, - { url = "https://files.pythonhosted.org/packages/fa/7c/2014b5785bd8ebdab04ec857635ebd84d5ee4950186a577db9eff0fb8ff6/fastuuid-0.14.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cb9a030f609194b679e1660f7e32733b7a0f332d519c5d5a6a0a580991290022", size = 459819, upload-time = "2025-10-19T22:35:31.623Z" }, - { url = "https://files.pythonhosted.org/packages/01/d2/524d4ceeba9160e7a9bc2ea3e8f4ccf1ad78f3bde34090ca0c51f09a5e91/fastuuid-0.14.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:09098762aad4f8da3a888eb9ae01c84430c907a297b97166b8abc07b640f2995", size = 478546, upload-time = "2025-10-19T22:26:03.023Z" }, - { url = "https://files.pythonhosted.org/packages/bc/17/354d04951ce114bf4afc78e27a18cfbd6ee319ab1829c2d5fb5e94063ac6/fastuuid-0.14.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1383fff584fa249b16329a059c68ad45d030d5a4b70fb7c73a08d98fd53bcdab", size = 450921, upload-time = "2025-10-19T22:31:02.151Z" }, - { url = "https://files.pythonhosted.org/packages/fb/be/d7be8670151d16d88f15bb121c5b66cdb5ea6a0c2a362d0dcf30276ade53/fastuuid-0.14.0-cp313-cp313-win32.whl", hash = "sha256:a0809f8cc5731c066c909047f9a314d5f536c871a7a22e815cc4967c110ac9ad", size = 154559, upload-time = "2025-10-19T22:36:36.011Z" }, - { url = "https://files.pythonhosted.org/packages/22/1d/5573ef3624ceb7abf4a46073d3554e37191c868abc3aecd5289a72f9810a/fastuuid-0.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:0df14e92e7ad3276327631c9e7cec09e32572ce82089c55cb1bb8df71cf394ed", size = 156539, upload-time = "2025-10-19T22:33:35.898Z" }, - { url = "https://files.pythonhosted.org/packages/16/c9/8c7660d1fe3862e3f8acabd9be7fc9ad71eb270f1c65cce9a2b7a31329ab/fastuuid-0.14.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:b852a870a61cfc26c884af205d502881a2e59cc07076b60ab4a951cc0c94d1ad", size = 510600, upload-time = "2025-10-19T22:43:44.17Z" }, - { url = "https://files.pythonhosted.org/packages/4c/f4/a989c82f9a90d0ad995aa957b3e572ebef163c5299823b4027986f133dfb/fastuuid-0.14.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c7502d6f54cd08024c3ea9b3514e2d6f190feb2f46e6dbcd3747882264bb5f7b", size = 262069, upload-time = "2025-10-19T22:43:38.38Z" }, - { url = "https://files.pythonhosted.org/packages/da/6c/a1a24f73574ac995482b1326cf7ab41301af0fabaa3e37eeb6b3df00e6e2/fastuuid-0.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1ca61b592120cf314cfd66e662a5b54a578c5a15b26305e1b8b618a6f22df714", size = 251543, upload-time = "2025-10-19T22:32:22.537Z" }, - { url = "https://files.pythonhosted.org/packages/1a/20/2a9b59185ba7a6c7b37808431477c2d739fcbdabbf63e00243e37bd6bf49/fastuuid-0.14.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa75b6657ec129d0abded3bec745e6f7ab642e6dba3a5272a68247e85f5f316f", size = 277798, upload-time = "2025-10-19T22:33:53.821Z" }, - { url = "https://files.pythonhosted.org/packages/ef/33/4105ca574f6ded0af6a797d39add041bcfb468a1255fbbe82fcb6f592da2/fastuuid-0.14.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8a0dfea3972200f72d4c7df02c8ac70bad1bb4c58d7e0ec1e6f341679073a7f", size = 278283, upload-time = "2025-10-19T22:29:02.812Z" }, - { url = "https://files.pythonhosted.org/packages/fe/8c/fca59f8e21c4deb013f574eae05723737ddb1d2937ce87cb2a5d20992dc3/fastuuid-0.14.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1bf539a7a95f35b419f9ad105d5a8a35036df35fdafae48fb2fd2e5f318f0d75", size = 301627, upload-time = "2025-10-19T22:35:54.985Z" }, - { url = "https://files.pythonhosted.org/packages/cb/e2/f78c271b909c034d429218f2798ca4e89eeda7983f4257d7865976ddbb6c/fastuuid-0.14.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:9a133bf9cc78fdbd1179cb58a59ad0100aa32d8675508150f3658814aeefeaa4", size = 459778, upload-time = "2025-10-19T22:28:00.999Z" }, - { url = "https://files.pythonhosted.org/packages/1e/f0/5ff209d865897667a2ff3e7a572267a9ced8f7313919f6d6043aed8b1caa/fastuuid-0.14.0-cp314-cp314-musllinux_1_1_i686.whl", hash = "sha256:f54d5b36c56a2d5e1a31e73b950b28a0d83eb0c37b91d10408875a5a29494bad", size = 478605, upload-time = "2025-10-19T22:36:21.764Z" }, - { url = "https://files.pythonhosted.org/packages/e0/c8/2ce1c78f983a2c4987ea865d9516dbdfb141a120fd3abb977ae6f02ba7ca/fastuuid-0.14.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:ec27778c6ca3393ef662e2762dba8af13f4ec1aaa32d08d77f71f2a70ae9feb8", size = 450837, upload-time = "2025-10-19T22:34:37.178Z" }, - { url = "https://files.pythonhosted.org/packages/df/60/dad662ec9a33b4a5fe44f60699258da64172c39bd041da2994422cdc40fe/fastuuid-0.14.0-cp314-cp314-win32.whl", hash = "sha256:e23fc6a83f112de4be0cc1990e5b127c27663ae43f866353166f87df58e73d06", size = 154532, upload-time = "2025-10-19T22:35:18.217Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f6/da4db31001e854025ffd26bc9ba0740a9cbba2c3259695f7c5834908b336/fastuuid-0.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:df61342889d0f5e7a32f7284e55ef95103f2110fee433c2ae7c2c0956d76ac8a", size = 156457, upload-time = "2025-10-19T22:33:44.579Z" }, -] - [[package]] name = "filelock" version = "3.18.0" @@ -582,8 +544,8 @@ name = "gevent" version = "25.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi", marker = "platform_python_implementation == 'CPython' and sys_platform == 'win32'" }, - { name = "greenlet", marker = "platform_python_implementation == 'CPython'" }, + { name = "cffi", marker = "(platform_python_implementation == 'CPython' and sys_platform == 'win32') or (platform_python_implementation != 'CPython' and extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (sys_platform != 'win32' and extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "greenlet", marker = "platform_python_implementation == 'CPython' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, { name = "zope-event" }, { name = "zope-interface" }, ] @@ -693,12 +655,15 @@ wheels = [ ] [[package]] -name = "griffelib" -version = "2.0.2" +name = "griffe" +version = "1.7.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9d/82/74f4a3310cdabfbb10da554c3a672847f1ed33c6f61dd472681ce7f1fe67/griffelib-2.0.2.tar.gz", hash = "sha256:3cf20b3bc470e83763ffbf236e0076b1211bac1bc67de13daf494640f2de707e", size = 166461, upload-time = "2026-03-27T11:34:51.091Z" } +dependencies = [ + { name = "colorama" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/3e/5aa9a61f7c3c47b0b52a1d930302992229d191bf4bc76447b324b731510a/griffe-1.7.3.tar.gz", hash = "sha256:52ee893c6a3a968b639ace8015bec9d36594961e156e23315c8e8e51401fa50b", size = 395137, upload-time = "2025-04-23T11:29:09.147Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/8c/c9138d881c79aa0ea9ed83cbd58d5ca75624378b38cee225dcf5c42cc91f/griffelib-2.0.2-py3-none-any.whl", hash = "sha256:925c857658fb1ba40c0772c37acbc2ab650bd794d9c1b9726922e36ea4117ea1", size = 142357, upload-time = "2026-03-27T11:34:46.275Z" }, + { url = "https://files.pythonhosted.org/packages/58/c6/5c20af38c2a57c15d87f7f38bee77d63c1d2a3689f74fefaf35915dd12b2/griffe-1.7.3-py3-none-any.whl", hash = "sha256:c6b3ee30c2f0f17f30bcdef5068d6ab7a2a4f1b8bf1a3e74b56fffd21e1c5f75", size = 129303, upload-time = "2025-04-23T11:29:07.145Z" }, ] [[package]] @@ -866,7 +831,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, { name = "fsspec" }, - { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, { name = "packaging" }, { name = "pyyaml" }, { name = "requests" }, @@ -1051,111 +1016,125 @@ wheels = [ [[package]] name = "langchain" -version = "1.2.15" +version = "0.1.20" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "aiohttp" }, + { name = "async-timeout", marker = "python_full_version < '3.11'" }, + { name = "dataclasses-json" }, + { name = "langchain-community" }, { name = "langchain-core" }, - { name = "langgraph" }, - { name = "pydantic" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/98/3f/888a7099d2bd2917f8b0c3ffc7e347f1e664cf64267820b0b923c4f339fc/langchain-1.2.15.tar.gz", hash = "sha256:1717b6719daefae90b2728314a5e2a117ff916291e2862595b6c3d6fba33d652", size = 574732, upload-time = "2026-04-03T14:26:03.994Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/e8/a3b8cb0005553f6a876865073c81ef93bd7c5b18381bcb9ba4013af96ebc/langchain-1.2.15-py3-none-any.whl", hash = "sha256:e349db349cb3e9550c4044077cf90a1717691756cc236438404b23500e615874", size = 112714, upload-time = "2026-04-03T14:26:02.557Z" }, -] - -[[package]] -name = "langchain-core" -version = "1.2.30" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jsonpatch" }, - { name = "langsmith" }, - { name = "packaging" }, + { name = "langchain-text-splitters" }, + { name = "langsmith", version = "0.1.147", source = { registry = "https://pypi.org/simple" } }, + { name = "numpy" }, { name = "pydantic" }, { name = "pyyaml" }, + { name = "requests" }, + { name = "sqlalchemy" }, { name = "tenacity" }, - { name = "typing-extensions" }, - { name = "uuid-utils" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/f149313d1536de8fe45619d460a12308b5a87947a37d4958024d79b011b0/langchain_core-1.2.30.tar.gz", hash = "sha256:ee6c6b3476215c4be438231bab7003d880359230b9fdf1f65e0ffa1bde8a58e0", size = 850262, upload-time = "2026-04-15T20:37:13.946Z" } +sdist = { url = "https://files.pythonhosted.org/packages/88/94/8d917da143b30c3088be9f51719634827ab19207cb290a51de3859747783/langchain-0.1.20.tar.gz", hash = "sha256:f35c95eed8c8375e02dce95a34f2fd4856a4c98269d6dc34547a23dba5beab7e", size = 420688, upload-time = "2024-05-10T21:59:40.736Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/46/e988e9f024e762750f9f53878316980bdaea2ab1f19600df01a7c39eda89/langchain_core-1.2.30-py3-none-any.whl", hash = "sha256:26fa50894449b29b31b3712fa4975db679d26abe8241a966ea2c5978b68d8394", size = 513005, upload-time = "2026-04-15T20:37:12.396Z" }, + { url = "https://files.pythonhosted.org/packages/4b/28/da40a6b12e7842a0c8b443f8cc5c6f59e49d7a9071cfad064b9639c6b044/langchain-0.1.20-py3-none-any.whl", hash = "sha256:09991999fbd6c3421a12db3c7d1f52d55601fc41d9b2a3ef51aab2e0e9c38da9", size = 1014619, upload-time = "2024-05-10T21:59:36.417Z" }, ] [[package]] -name = "langchain-openai" -version = "1.1.13" +name = "langchain-community" +version = "0.0.38" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "aiohttp" }, + { name = "dataclasses-json" }, { name = "langchain-core" }, - { name = "openai" }, - { name = "tiktoken" }, + { name = "langsmith", version = "0.1.147", source = { registry = "https://pypi.org/simple" } }, + { name = "numpy" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "sqlalchemy" }, + { name = "tenacity" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c3/63/0fed7cae7103e4b7aced76208aa92c02ae78bdf1be48bd9d83e4051d6c31/langchain_openai-1.1.13.tar.gz", hash = "sha256:88e13342407016785bd3c48be32ded1f28b992403bbb82505b558d81b038adc2", size = 1114743, upload-time = "2026-04-15T01:37:19.409Z" } +sdist = { url = "https://files.pythonhosted.org/packages/74/b7/c20502452183d27b8c0466febb227fae3213f77e9a13683de685e7227f39/langchain_community-0.0.38.tar.gz", hash = "sha256:127fc4b75bc67b62fe827c66c02e715a730fef8fe69bd2023d466bab06b5810d", size = 1373468, upload-time = "2024-05-08T22:44:26.295Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/d1/ca789988897096883289f9597ee653574b67b4b2a8f40bc306dfd73742d5/langchain_openai-1.1.13-py3-none-any.whl", hash = "sha256:54ba1e9f2f0f428aeea68271a87823a0a1b22360283990a713c731d2ef7da926", size = 88723, upload-time = "2026-04-15T01:37:18.062Z" }, + { url = "https://files.pythonhosted.org/packages/1b/d3/1f4d1941ae5a627299c8ea052847b99ad6674b97b699d8a08fc4faf25d3e/langchain_community-0.0.38-py3-none-any.whl", hash = "sha256:ecb48660a70a08c90229be46b0cc5f6bc9f38f2833ee44c57dfab9bf3a2c121a", size = 2028164, upload-time = "2024-05-08T22:44:23.434Z" }, ] [[package]] -name = "langgraph" -version = "1.1.6" +name = "langchain-core" +version = "0.1.53" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "langchain-core" }, - { name = "langgraph-checkpoint" }, - { name = "langgraph-prebuilt" }, - { name = "langgraph-sdk" }, + { name = "jsonpatch" }, + { name = "langsmith", version = "0.1.147", source = { registry = "https://pypi.org/simple" } }, + { name = "packaging" }, { name = "pydantic" }, - { name = "xxhash" }, + { name = "pyyaml" }, + { name = "tenacity" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5c/e5/d3f72ead3c7f15769d5a9c07e373628f1fbaf6cbe7735694d7085859acf6/langgraph-1.1.6.tar.gz", hash = "sha256:1783f764b08a607e9f288dbcf6da61caeb0dd40b337e5c9fb8b412341fbc0b60", size = 549634, upload-time = "2026-04-03T19:01:32.561Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/65/3aaff91481b9d629a31630a40000d403bff24b3c62d9abc87dc998298cce/langchain_core-0.1.53.tar.gz", hash = "sha256:df3773a553b5335eb645827b99a61a7018cea4b11dc45efa2613fde156441cec", size = 236665, upload-time = "2024-11-02T00:27:25.16Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/71/e6/b36ecdb3ff4ba9a290708d514bae89ebbe2f554b6abbe4642acf3fddbe51/langgraph-1.1.6-py3-none-any.whl", hash = "sha256:fdbf5f54fa5a5a4c4b09b7b5e537f1b2fa283d2f0f610d3457ddeecb479458b9", size = 169755, upload-time = "2026-04-03T19:01:30.686Z" }, + { url = "https://files.pythonhosted.org/packages/6a/10/285fa149ce95300d91ea0bb124eec28889e5ebbcb59434d1fe2f31098d72/langchain_core-0.1.53-py3-none-any.whl", hash = "sha256:02a88a21e3bd294441b5b741625fa4b53b1c684fd58ba6e5d9028e53cbe8542f", size = 303059, upload-time = "2024-11-02T00:27:23.144Z" }, ] [[package]] -name = "langgraph-checkpoint" -version = "4.0.2" +name = "langchain-openai" +version = "0.0.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, - { name = "ormsgpack" }, + { name = "numpy" }, + { name = "openai" }, + { name = "tiktoken" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2e/f2/cf8086e1f1a3358d9228805614e72602c281b18307f3fae64a5b854aad2d/langgraph_checkpoint-4.0.2.tar.gz", hash = "sha256:4f6f99cba8e272deabf81b2d8cdc96582af07a57a6ad591cdf216bb310497039", size = 160810, upload-time = "2026-04-15T21:03:00.062Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/bd/2963a5b9f7dcf5759144bbe590984730daccfd8ced01d9de5cbf23072ac5/langchain_openai-0.0.6.tar.gz", hash = "sha256:f5c4ebe46f2c8635c8f0c26cc8df27700aacafea025410e418d5a080039974dd", size = 22653, upload-time = "2024-02-13T21:20:07.283Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/5a/6dba29dd89b0a46ae21c707da0f9d17e94f27d3e481ed15bc99d6bd20aa6/langgraph_checkpoint-4.0.2-py3-none-any.whl", hash = "sha256:59b0f29216128a629c58dd07c98aa004f82f51805d5573126ffb419b753ff253", size = 51000, upload-time = "2026-04-15T21:02:59.096Z" }, + { url = "https://files.pythonhosted.org/packages/07/48/84e1840c25592bb76deea48d187d9fc8f864c9c82ddf3f084da4c9b8a15b/langchain_openai-0.0.6-py3-none-any.whl", hash = "sha256:2ef040e4447a26a9d3bd45dfac9cefa00797ea58555a3d91ab4f88699eb3a005", size = 29200, upload-time = "2024-02-13T21:20:04.664Z" }, ] [[package]] -name = "langgraph-prebuilt" -version = "1.0.9" +name = "langchain-text-splitters" +version = "0.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, - { name = "langgraph-checkpoint" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/4c/06dac899f4945bedb0c3a1583c19484c2cc894114ea30d9a538dd270086e/langgraph_prebuilt-1.0.9.tar.gz", hash = "sha256:93de7512e9caade4b77ead92428f6215c521fdb71b8ffda8cd55f0ad814e64de", size = 165850, upload-time = "2026-04-03T14:06:37.721Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/fa/88d65b0f696d8d4f37037f1418f89bc1078cd74d20054623bb7fffcecaf1/langchain_text_splitters-0.0.2.tar.gz", hash = "sha256:ac8927dc0ba08eba702f6961c9ed7df7cead8de19a9f7101ab2b5ea34201b3c1", size = 18638, upload-time = "2024-05-16T03:16:36.815Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/a2/8368ac187b75e7f9d938ca075d34f116683f5cfc48d924029ee79aea147b/langgraph_prebuilt-1.0.9-py3-none-any.whl", hash = "sha256:776c8e3154a5aef5ad0e5bf3f263f2dcaab3983786cc20014b7f955d99d2d1b2", size = 35958, upload-time = "2026-04-03T14:06:36.58Z" }, + { url = "https://files.pythonhosted.org/packages/68/6a/804fe5ca07129046a4cedc0697222ddde6156cd874c4c4ba29e4d271828a/langchain_text_splitters-0.0.2-py3-none-any.whl", hash = "sha256:13887f32705862c1e1454213cb7834a63aae57c26fcd80346703a1d09c46168d", size = 23539, upload-time = "2024-05-16T03:16:35.727Z" }, ] [[package]] -name = "langgraph-sdk" -version = "0.3.6" +name = "langsmith" +version = "0.1.147" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version >= '3.12.4' and python_full_version < '3.13'", + "python_full_version >= '3.12' and python_full_version < '3.12.4'", + "python_full_version == '3.11.*'", + "python_full_version < '3.11'", +] dependencies = [ { name = "httpx" }, - { name = "orjson" }, + { name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "requests-toolbelt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3e/ec/477fa8b408f948b145d90fd935c0a9f37945fa5ec1dfabfc71e7cafba6d8/langgraph_sdk-0.3.6.tar.gz", hash = "sha256:7650f607f89c1586db5bee391b1a8754cbe1fc83b721ff2f1450f8906e790bd7", size = 182666, upload-time = "2026-02-14T19:46:03.752Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/56/201dd94d492ae47c1bf9b50cacc1985113dc2288d8f15857e1f4a6818376/langsmith-0.1.147.tar.gz", hash = "sha256:2e933220318a4e73034657103b3b1a3a6109cc5db3566a7e8e03be8d6d7def7a", size = 300453, upload-time = "2024-11-27T17:32:41.297Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/61/12508e12652edd1874327271a5a8834c728a605f53a1a1c945f13ab69664/langgraph_sdk-0.3.6-py3-none-any.whl", hash = "sha256:7df2fd552ad7262d0baf8e1f849dce1d62186e76dcdd36db9dc5bdfa5c3fc20f", size = 88277, upload-time = "2026-02-14T19:46:02.48Z" }, + { url = "https://files.pythonhosted.org/packages/de/f0/63b06b99b730b9954f8709f6f7d9b8d076fa0a973e472efe278089bde42b/langsmith-0.1.147-py3-none-any.whl", hash = "sha256:7166fc23b965ccf839d64945a78e9f1157757add228b086141eb03a60d699a15", size = 311812, upload-time = "2024-11-27T17:32:39.569Z" }, ] [[package]] name = "langsmith" -version = "0.3.45" +version = "0.7.32" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version == '3.12.*'", + "python_full_version == '3.11.*'", + "python_full_version < '3.11'", +] dependencies = [ { name = "httpx" }, { name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, @@ -1163,21 +1142,22 @@ dependencies = [ { name = "pydantic" }, { name = "requests" }, { name = "requests-toolbelt" }, + { name = "uuid-utils" }, + { name = "xxhash" }, { name = "zstandard" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/be/86/b941012013260f95af2e90a3d9415af4a76a003a28412033fc4b09f35731/langsmith-0.3.45.tar.gz", hash = "sha256:1df3c6820c73ed210b2c7bc5cdb7bfa19ddc9126cd03fdf0da54e2e171e6094d", size = 348201, upload-time = "2025-06-05T05:10:28.948Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/b4/a0b4a501bee6b8a741ce29f8c48155b132118483cddc6f9247735ddb38fa/langsmith-0.7.32.tar.gz", hash = "sha256:b59b8e106d0e4c4842e158229296086e2aa7c561e3f602acda73d3ad0062e915", size = 1184518, upload-time = "2026-04-15T23:42:41.885Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/f4/c206c0888f8a506404cb4f16ad89593bdc2f70cf00de26a1a0a7a76ad7a3/langsmith-0.3.45-py3-none-any.whl", hash = "sha256:5b55f0518601fa65f3bb6b1a3100379a96aa7b3ed5e9380581615ba9c65ed8ed", size = 363002, upload-time = "2025-06-05T05:10:27.228Z" }, + { url = "https://files.pythonhosted.org/packages/62/bc/148f98ac7dad73ac5e1b1c985290079cfeeb9ba13d760a24f25002beb2c9/langsmith-0.7.32-py3-none-any.whl", hash = "sha256:e1fde928990c4c52f47dc5132708cec674355d9101723d564183e965f383bf5f", size = 378272, upload-time = "2026-04-15T23:42:39.905Z" }, ] [[package]] name = "litellm" -version = "1.83.0" +version = "1.74.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, { name = "click" }, - { name = "fastuuid" }, { name = "httpx" }, { name = "importlib-metadata" }, { name = "jinja2" }, @@ -1188,9 +1168,9 @@ dependencies = [ { name = "tiktoken" }, { name = "tokenizers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/22/92/6ce9737554994ca8e536e5f4f6a87cc7c4774b656c9eb9add071caf7d54b/litellm-1.83.0.tar.gz", hash = "sha256:860bebc76c4bb27b4cf90b4a77acd66dba25aced37e3db98750de8a1766bfb7a", size = 17333062, upload-time = "2026-03-31T05:08:25.331Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/16/89c5123c808cbc51e398afc2f1a56da1d75d5e8ef7be417895a3794f0416/litellm-1.74.8.tar.gz", hash = "sha256:6e0a18aecf62459d465ee6d9a2526fcb33719a595b972500519abe95fe4906e0", size = 9639701, upload-time = "2025-07-23T23:38:02.903Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/2c/a670cc050fcd6f45c6199eb99e259c73aea92edba8d5c2fc1b3686d36217/litellm-1.83.0-py3-none-any.whl", hash = "sha256:88c536d339248f3987571493015784671ba3f193a328e1ea6780dbebaa2094a8", size = 15610306, upload-time = "2026-03-31T05:08:21.987Z" }, + { url = "https://files.pythonhosted.org/packages/af/4a/eba1b617acb7fa597d169cdd1b5ce98502bd179138f130721a2367d2deb8/litellm-1.74.8-py3-none-any.whl", hash = "sha256:f9433207d1e12e545495e5960fe02d93e413ecac4a28225c522488e1ab1157a1", size = 8713698, upload-time = "2025-07-23T23:38:00.708Z" }, ] [[package]] @@ -1263,9 +1243,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, ] +[[package]] +name = "marshmallow" +version = "3.26.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/5e/5e53d26b42ab75491cda89b871dab9e97c840bf12c63ec58a1919710cd06/marshmallow-3.26.1.tar.gz", hash = "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6", size = 221825, upload-time = "2025-02-03T15:32:25.093Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/75/51952c7b2d3873b44a0028b1bd26a25078c18f92f256608e8d1dc61b39fd/marshmallow-3.26.1-py3-none-any.whl", hash = "sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c", size = 50878, upload-time = "2025-02-03T15:32:22.295Z" }, +] + [[package]] name = "mcp" -version = "1.27.0" +version = "1.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1274,18 +1266,15 @@ dependencies = [ { name = "jsonschema" }, { name = "pydantic" }, { name = "pydantic-settings" }, - { name = "pyjwt", extra = ["crypto"] }, { name = "python-multipart" }, - { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "pywin32", marker = "sys_platform == 'win32' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, { name = "sse-starlette" }, { name = "starlette" }, - { name = "typing-extensions" }, - { name = "typing-inspection" }, - { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, + { name = "uvicorn", marker = "sys_platform != 'emscripten' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/eb/c0cfc62075dc6e1ec1c64d352ae09ac051d9334311ed226f1f425312848a/mcp-1.27.0.tar.gz", hash = "sha256:d3dc35a7eec0d458c1da4976a48f982097ddaab87e278c5511d5a4a56e852b83", size = 607509, upload-time = "2026-04-02T14:48:08.88Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/f5/9506eb5578d5bbe9819ee8ba3198d0ad0e2fbe3bab8b257e4131ceb7dfb6/mcp-1.11.0.tar.gz", hash = "sha256:49a213df56bb9472ff83b3132a4825f5c8f5b120a90246f08b0dac6bedac44c8", size = 406907, upload-time = "2025-07-10T16:41:09.388Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/46/f6b4ad632c67ef35209a66127e4bddc95759649dd595f71f13fba11bdf9a/mcp-1.27.0-py3-none-any.whl", hash = "sha256:5ce1fa81614958e267b21fb2aa34e0aea8e2c6ede60d52aba45fd47246b4d741", size = 215967, upload-time = "2026-04-02T14:48:07.24Z" }, + { url = "https://files.pythonhosted.org/packages/92/9c/c9ca79f9c512e4113a5d07043013110bb3369fc7770040c61378c7fbcf70/mcp-1.11.0-py3-none-any.whl", hash = "sha256:58deac37f7483e4b338524b98bc949b7c2b7c33d978f5fafab5bde041c5e2595", size = 155880, upload-time = "2025-07-10T16:41:07.935Z" }, ] [[package]] @@ -1302,7 +1291,7 @@ name = "multidict" version = "6.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3d/2c/5dad12e82fbdf7470f29bff2171484bf07cb3b16ada60a6589af8f376440/multidict-6.6.3.tar.gz", hash = "sha256:798a9eb12dab0a6c2e29c1de6f3468af5cb2da6053a20dfa3344907eed0937cc", size = 101006, upload-time = "2025-06-30T15:53:46.929Z" } wheels = [ @@ -1406,7 +1395,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, { name = "pathspec" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "tomli", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/81/69/92c7fa98112e4d9eb075a239caa4ef4649ad7d441545ccffbd5e34607cbb/mypy-1.16.1.tar.gz", hash = "sha256:6bd00a0a2094841c5e47e7374bb42b83d64c527a502e3334e1173a0c24437bab", size = 3324747, upload-time = "2025-06-16T16:51:35.145Z" } @@ -1449,14 +1438,14 @@ wheels = [ [[package]] name = "nexus-rpc" -version = "1.4.0" +version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/35/d5/cd1ffb202b76ebc1b33c1332a3416e55a39929006982adc2b1eb069aaa9b/nexus_rpc-1.4.0.tar.gz", hash = "sha256:3b8b373d4865671789cc43623e3dc0bcbf192562e40e13727e17f1c149050fba", size = 82367, upload-time = "2026-02-25T22:01:34.053Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/f2/d54f5c03d8f4672ccc0875787a385f53dcb61f98a8ae594b5620e85b9cb3/nexus_rpc-1.3.0.tar.gz", hash = "sha256:e56d3b57b60d707ce7a72f83f23f106b86eca1043aa658e44582ab5ff30ab9ad", size = 75650, upload-time = "2025-12-08T22:59:13.002Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/52/6327a5f4fda01207205038a106a99848a41c83e933cd23ea2cab3d2ebc6c/nexus_rpc-1.4.0-py3-none-any.whl", hash = "sha256:14c953d3519113f8ccec533a9efdb6b10c28afef75d11cdd6d422640c40b3a49", size = 29645, upload-time = "2026-02-25T22:01:33.122Z" }, + { url = "https://files.pythonhosted.org/packages/d6/74/0afd841de3199c148146c1d43b4bfb5605b2f1dc4c9a9087fe395091ea5a/nexus_rpc-1.3.0-py3-none-any.whl", hash = "sha256:aee0707b4861b22d8124ecb3f27d62dafbe8777dc50c66c91e49c006f971b92d", size = 28873, upload-time = "2025-12-08T22:59:12.024Z" }, ] [[package]] @@ -1502,7 +1491,7 @@ wheels = [ [[package]] name = "openai" -version = "2.32.0" +version = "1.108.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1514,28 +1503,27 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ed/59/bdcc6b759b8c42dd73afaf5bf8f902c04b37987a5514dbc1c64dba390fef/openai-2.32.0.tar.gz", hash = "sha256:c54b27a9e4cb8d51f0dd94972ffd1a04437efeb259a9e60d8922b8bd26fe55e0", size = 693286, upload-time = "2026-04-15T22:28:19.434Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/7a/3f2fbdf82a22d48405c1872f7c3176a705eee80ff2d2715d29472089171f/openai-1.108.1.tar.gz", hash = "sha256:6648468c1aec4eacfa554001e933a9fa075f57bacfc27588c2e34456cee9fef9", size = 563735, upload-time = "2025-09-19T16:52:20.399Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/c1/d6e64ccd0536bf616556f0cad2b6d94a8125f508d25cfd814b1d2db4e2f1/openai-2.32.0-py3-none-any.whl", hash = "sha256:4dcc9badeb4bf54ad0d187453742f290226d30150890b7890711bda4f32f192f", size = 1162570, upload-time = "2026-04-15T22:28:17.714Z" }, + { url = "https://files.pythonhosted.org/packages/38/87/6ad18ce0e7b910e3706480451df48ff9e0af3b55e5db565adafd68a0706a/openai-1.108.1-py3-none-any.whl", hash = "sha256:952fc027e300b2ac23be92b064eac136a2bc58274cec16f5d2906c361340d59b", size = 948394, upload-time = "2025-09-19T16:52:18.369Z" }, ] [[package]] name = "openai-agents" -version = "0.14.1" +version = "0.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "griffelib" }, + { name = "griffe" }, { name = "mcp" }, { name = "openai" }, { name = "pydantic" }, { name = "requests" }, { name = "types-requests" }, { name = "typing-extensions" }, - { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/16/ae/8af117a3a4a06ad72b4a60759fbab98a7158f0eb36c47d90d5d883610781/openai_agents-0.14.1.tar.gz", hash = "sha256:7baac1b4c0a171d32c82eb6e9c207fd010e0d08dd39a5e8cd762ee27969457dc", size = 5256058, upload-time = "2026-04-15T19:26:52.42Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/9f/dafa9f80653778179822e1abf77c7f0d9da5a16806c96b5bb9e0e46bd747/openai_agents-0.3.2.tar.gz", hash = "sha256:b71ac04ee9f502f1bc0f4d142407df4ec69db4442db86c4da252b4558fa90cd5", size = 1727988, upload-time = "2025-09-23T20:37:20.7Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ac/1c/98efddc1e10b23a397ca901b6f6d251908be2e6a30a92e0c25fb5dff6348/openai_agents-0.14.1-py3-none-any.whl", hash = "sha256:09ea6e9c49c785dc490e071e17ea3a0b0cce9c5f97daeb50ee6dc8fb490dc817", size = 797518, upload-time = "2026-04-15T19:26:50.106Z" }, + { url = "https://files.pythonhosted.org/packages/27/7e/6a8437f9f40937bb473ceb120a65e1b37bc87bcee6da67be4c05b25c6a89/openai_agents-0.3.2-py3-none-any.whl", hash = "sha256:55e02c57f2aaf3170ff0aa0ab7c337c28fd06b43b3bb9edc28b77ffd8142b425", size = 194221, upload-time = "2025-09-23T20:37:19.121Z" }, ] [package.optional-dependencies] @@ -1706,62 +1694,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1a/bf/def5e25d4d8bfce296a9a7c8248109bf58622c21618b590678f945a2c59c/orjson-3.11.4-cp314-cp314-win_arm64.whl", hash = "sha256:78b999999039db3cf58f6d230f524f04f75f129ba3d1ca2ed121f8657e575d3d", size = 126151, upload-time = "2025-10-24T15:50:15.878Z" }, ] -[[package]] -name = "ormsgpack" -version = "1.12.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/12/0c/f1761e21486942ab9bb6feaebc610fa074f7c5e496e6962dea5873348077/ormsgpack-1.12.2.tar.gz", hash = "sha256:944a2233640273bee67521795a73cf1e959538e0dfb7ac635505010455e53b33", size = 39031, upload-time = "2026-01-18T20:55:28.023Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/93/fa/a91f70829ebccf6387c4946e0a1a109f6ba0d6a28d65f628bedfad94b890/ormsgpack-1.12.2-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:c1429217f8f4d7fcb053523bbbac6bed5e981af0b85ba616e6df7cce53c19657", size = 378262, upload-time = "2026-01-18T20:55:22.284Z" }, - { url = "https://files.pythonhosted.org/packages/5f/62/3698a9a0c487252b5c6a91926e5654e79e665708ea61f67a8bdeceb022bf/ormsgpack-1.12.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f13034dc6c84a6280c6c33db7ac420253852ea233fc3ee27c8875f8dd651163", size = 203034, upload-time = "2026-01-18T20:55:53.324Z" }, - { url = "https://files.pythonhosted.org/packages/66/3a/f716f64edc4aec2744e817660b317e2f9bb8de372338a95a96198efa1ac1/ormsgpack-1.12.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:59f5da97000c12bc2d50e988bdc8576b21f6ab4e608489879d35b2c07a8ab51a", size = 210538, upload-time = "2026-01-18T20:55:20.097Z" }, - { url = "https://files.pythonhosted.org/packages/72/30/a436be9ce27d693d4e19fa94900028067133779f09fc45776db3f689c822/ormsgpack-1.12.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e4459c3f27066beadb2b81ea48a076a417aafffff7df1d3c11c519190ed44f2", size = 212401, upload-time = "2026-01-18T20:55:46.447Z" }, - { url = "https://files.pythonhosted.org/packages/10/c5/cde98300fd33fee84ca71de4751b19aeeca675f0cf3c0ec4b043f40f3b76/ormsgpack-1.12.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a1c460655d7288407ffa09065e322a7231997c0d62ce914bf3a96ad2dc6dedd", size = 387080, upload-time = "2026-01-18T20:56:00.884Z" }, - { url = "https://files.pythonhosted.org/packages/6a/31/30bf445ef827546747c10889dd254b3d84f92b591300efe4979d792f4c41/ormsgpack-1.12.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:458e4568be13d311ef7d8877275e7ccbe06c0e01b39baaac874caaa0f46d826c", size = 482346, upload-time = "2026-01-18T20:55:39.831Z" }, - { url = "https://files.pythonhosted.org/packages/2e/f5/e1745ddf4fa246c921b5ca253636c4c700ff768d78032f79171289159f6e/ormsgpack-1.12.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8cde5eaa6c6cbc8622db71e4a23de56828e3d876aeb6460ffbcb5b8aff91093b", size = 425178, upload-time = "2026-01-18T20:55:27.106Z" }, - { url = "https://files.pythonhosted.org/packages/8d/a2/e6532ed7716aed03dede8df2d0d0d4150710c2122647d94b474147ccd891/ormsgpack-1.12.2-cp310-cp310-win_amd64.whl", hash = "sha256:dc7a33be14c347893edbb1ceda89afbf14c467d593a5ee92c11de4f1666b4d4f", size = 117183, upload-time = "2026-01-18T20:55:55.52Z" }, - { url = "https://files.pythonhosted.org/packages/4b/08/8b68f24b18e69d92238aa8f258218e6dfeacf4381d9d07ab8df303f524a9/ormsgpack-1.12.2-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:bd5f4bf04c37888e864f08e740c5a573c4017f6fd6e99fa944c5c935fabf2dd9", size = 378266, upload-time = "2026-01-18T20:55:59.876Z" }, - { url = "https://files.pythonhosted.org/packages/0d/24/29fc13044ecb7c153523ae0a1972269fcd613650d1fa1a9cec1044c6b666/ormsgpack-1.12.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34d5b28b3570e9fed9a5a76528fc7230c3c76333bc214798958e58e9b79cc18a", size = 203035, upload-time = "2026-01-18T20:55:30.59Z" }, - { url = "https://files.pythonhosted.org/packages/ad/c2/00169fb25dd8f9213f5e8a549dfb73e4d592009ebc85fbbcd3e1dcac575b/ormsgpack-1.12.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3708693412c28f3538fb5a65da93787b6bbab3484f6bc6e935bfb77a62400ae5", size = 210539, upload-time = "2026-01-18T20:55:48.569Z" }, - { url = "https://files.pythonhosted.org/packages/1b/33/543627f323ff3c73091f51d6a20db28a1a33531af30873ea90c5ac95a9b5/ormsgpack-1.12.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43013a3f3e2e902e1d05e72c0f1aeb5bedbb8e09240b51e26792a3c89267e181", size = 212401, upload-time = "2026-01-18T20:56:10.101Z" }, - { url = "https://files.pythonhosted.org/packages/e8/5d/f70e2c3da414f46186659d24745483757bcc9adccb481a6eb93e2b729301/ormsgpack-1.12.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7c8b1667a72cbba74f0ae7ecf3105a5e01304620ed14528b2cb4320679d2869b", size = 387082, upload-time = "2026-01-18T20:56:12.047Z" }, - { url = "https://files.pythonhosted.org/packages/c0/d6/06e8dc920c7903e051f30934d874d4afccc9bb1c09dcaf0bc03a7de4b343/ormsgpack-1.12.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:df6961442140193e517303d0b5d7bc2e20e69a879c2d774316125350c4a76b92", size = 482346, upload-time = "2026-01-18T20:56:05.152Z" }, - { url = "https://files.pythonhosted.org/packages/66/c4/f337ac0905eed9c393ef990c54565cd33644918e0a8031fe48c098c71dbf/ormsgpack-1.12.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c6a4c34ddef109647c769d69be65fa1de7a6022b02ad45546a69b3216573eb4a", size = 425181, upload-time = "2026-01-18T20:55:37.83Z" }, - { url = "https://files.pythonhosted.org/packages/78/29/6d5758fabef3babdf4bbbc453738cc7de9cd3334e4c38dd5737e27b85653/ormsgpack-1.12.2-cp311-cp311-win_amd64.whl", hash = "sha256:73670ed0375ecc303858e3613f407628dd1fca18fe6ac57b7b7ce66cc7bb006c", size = 117182, upload-time = "2026-01-18T20:55:31.472Z" }, - { url = "https://files.pythonhosted.org/packages/c4/57/17a15549233c37e7fd054c48fe9207492e06b026dbd872b826a0b5f833b6/ormsgpack-1.12.2-cp311-cp311-win_arm64.whl", hash = "sha256:c2be829954434e33601ae5da328cccce3266b098927ca7a30246a0baec2ce7bd", size = 111464, upload-time = "2026-01-18T20:55:38.811Z" }, - { url = "https://files.pythonhosted.org/packages/4c/36/16c4b1921c308a92cef3bf6663226ae283395aa0ff6e154f925c32e91ff5/ormsgpack-1.12.2-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7a29d09b64b9694b588ff2f80e9826bdceb3a2b91523c5beae1fab27d5c940e7", size = 378618, upload-time = "2026-01-18T20:55:50.835Z" }, - { url = "https://files.pythonhosted.org/packages/c0/68/468de634079615abf66ed13bb5c34ff71da237213f29294363beeeca5306/ormsgpack-1.12.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b39e629fd2e1c5b2f46f99778450b59454d1f901bc507963168985e79f09c5d", size = 203186, upload-time = "2026-01-18T20:56:11.163Z" }, - { url = "https://files.pythonhosted.org/packages/73/a9/d756e01961442688b7939bacd87ce13bfad7d26ce24f910f6028178b2cc8/ormsgpack-1.12.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:958dcb270d30a7cb633a45ee62b9444433fa571a752d2ca484efdac07480876e", size = 210738, upload-time = "2026-01-18T20:56:09.181Z" }, - { url = "https://files.pythonhosted.org/packages/7b/ba/795b1036888542c9113269a3f5690ab53dd2258c6fb17676ac4bd44fcf94/ormsgpack-1.12.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d379d72b6c5e964851c77cfedfb386e474adee4fd39791c2c5d9efb53505cc", size = 212569, upload-time = "2026-01-18T20:56:06.135Z" }, - { url = "https://files.pythonhosted.org/packages/6c/aa/bff73c57497b9e0cba8837c7e4bcab584b1a6dbc91a5dd5526784a5030c8/ormsgpack-1.12.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8463a3fc5f09832e67bdb0e2fda6d518dc4281b133166146a67f54c08496442e", size = 387166, upload-time = "2026-01-18T20:55:36.738Z" }, - { url = "https://files.pythonhosted.org/packages/d3/cf/f8283cba44bcb7b14f97b6274d449db276b3a86589bdb363169b51bc12de/ormsgpack-1.12.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:eddffb77eff0bad4e67547d67a130604e7e2dfbb7b0cde0796045be4090f35c6", size = 482498, upload-time = "2026-01-18T20:55:29.626Z" }, - { url = "https://files.pythonhosted.org/packages/05/be/71e37b852d723dfcbe952ad04178c030df60d6b78eba26bfd14c9a40575e/ormsgpack-1.12.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fcd55e5f6ba0dbce624942adf9f152062135f991a0126064889f68eb850de0dd", size = 425518, upload-time = "2026-01-18T20:55:49.556Z" }, - { url = "https://files.pythonhosted.org/packages/7a/0c/9803aa883d18c7ef197213cd2cbf73ba76472a11fe100fb7dab2884edf48/ormsgpack-1.12.2-cp312-cp312-win_amd64.whl", hash = "sha256:d024b40828f1dde5654faebd0d824f9cc29ad46891f626272dd5bfd7af2333a4", size = 117462, upload-time = "2026-01-18T20:55:47.726Z" }, - { url = "https://files.pythonhosted.org/packages/c8/9e/029e898298b2cc662f10d7a15652a53e3b525b1e7f07e21fef8536a09bb8/ormsgpack-1.12.2-cp312-cp312-win_arm64.whl", hash = "sha256:da538c542bac7d1c8f3f2a937863dba36f013108ce63e55745941dda4b75dbb6", size = 111559, upload-time = "2026-01-18T20:55:54.273Z" }, - { url = "https://files.pythonhosted.org/packages/eb/29/bb0eba3288c0449efbb013e9c6f58aea79cf5cb9ee1921f8865f04c1a9d7/ormsgpack-1.12.2-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5ea60cb5f210b1cfbad8c002948d73447508e629ec375acb82910e3efa8ff355", size = 378661, upload-time = "2026-01-18T20:55:57.765Z" }, - { url = "https://files.pythonhosted.org/packages/6e/31/5efa31346affdac489acade2926989e019e8ca98129658a183e3add7af5e/ormsgpack-1.12.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3601f19afdbea273ed70b06495e5794606a8b690a568d6c996a90d7255e51c1", size = 203194, upload-time = "2026-01-18T20:56:08.252Z" }, - { url = "https://files.pythonhosted.org/packages/eb/56/d0087278beef833187e0167f8527235ebe6f6ffc2a143e9de12a98b1ce87/ormsgpack-1.12.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29a9f17a3dac6054c0dce7925e0f4995c727f7c41859adf9b5572180f640d172", size = 210778, upload-time = "2026-01-18T20:55:17.694Z" }, - { url = "https://files.pythonhosted.org/packages/1c/a2/072343e1413d9443e5a252a8eb591c2d5b1bffbe5e7bfc78c069361b92eb/ormsgpack-1.12.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39c1bd2092880e413902910388be8715f70b9f15f20779d44e673033a6146f2d", size = 212592, upload-time = "2026-01-18T20:55:32.747Z" }, - { url = "https://files.pythonhosted.org/packages/a2/8b/a0da3b98a91d41187a63b02dda14267eefc2a74fcb43cc2701066cf1510e/ormsgpack-1.12.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:50b7249244382209877deedeee838aef1542f3d0fc28b8fe71ca9d7e1896a0d7", size = 387164, upload-time = "2026-01-18T20:55:40.853Z" }, - { url = "https://files.pythonhosted.org/packages/19/bb/6d226bc4cf9fc20d8eb1d976d027a3f7c3491e8f08289a2e76abe96a65f3/ormsgpack-1.12.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:5af04800d844451cf102a59c74a841324868d3f1625c296a06cc655c542a6685", size = 482516, upload-time = "2026-01-18T20:55:42.033Z" }, - { url = "https://files.pythonhosted.org/packages/fb/f1/bb2c7223398543dedb3dbf8bb93aaa737b387de61c5feaad6f908841b782/ormsgpack-1.12.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cec70477d4371cd524534cd16472d8b9cc187e0e3043a8790545a9a9b296c258", size = 425539, upload-time = "2026-01-18T20:55:24.727Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e8/0fb45f57a2ada1fed374f7494c8cd55e2f88ccd0ab0a669aa3468716bf5f/ormsgpack-1.12.2-cp313-cp313-win_amd64.whl", hash = "sha256:21f4276caca5c03a818041d637e4019bc84f9d6ca8baa5ea03e5cc8bf56140e9", size = 117459, upload-time = "2026-01-18T20:55:56.876Z" }, - { url = "https://files.pythonhosted.org/packages/7a/d4/0cfeea1e960d550a131001a7f38a5132c7ae3ebde4c82af1f364ccc5d904/ormsgpack-1.12.2-cp313-cp313-win_arm64.whl", hash = "sha256:baca4b6773d20a82e36d6fd25f341064244f9f86a13dead95dd7d7f996f51709", size = 111577, upload-time = "2026-01-18T20:55:43.605Z" }, - { url = "https://files.pythonhosted.org/packages/94/16/24d18851334be09c25e87f74307c84950f18c324a4d3c0b41dabdbf19c29/ormsgpack-1.12.2-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:bc68dd5915f4acf66ff2010ee47c8906dc1cf07399b16f4089f8c71733f6e36c", size = 378717, upload-time = "2026-01-18T20:55:26.164Z" }, - { url = "https://files.pythonhosted.org/packages/b5/a2/88b9b56f83adae8032ac6a6fa7f080c65b3baf9b6b64fd3d37bd202991d4/ormsgpack-1.12.2-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46d084427b4132553940070ad95107266656cb646ea9da4975f85cb1a6676553", size = 203183, upload-time = "2026-01-18T20:55:18.815Z" }, - { url = "https://files.pythonhosted.org/packages/a9/80/43e4555963bf602e5bdc79cbc8debd8b6d5456c00d2504df9775e74b450b/ormsgpack-1.12.2-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c010da16235806cf1d7bc4c96bf286bfa91c686853395a299b3ddb49499a3e13", size = 210814, upload-time = "2026-01-18T20:55:33.973Z" }, - { url = "https://files.pythonhosted.org/packages/78/e1/7cfbf28de8bca6efe7e525b329c31277d1b64ce08dcba723971c241a9d60/ormsgpack-1.12.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18867233df592c997154ff942a6503df274b5ac1765215bceba7a231bea2745d", size = 212634, upload-time = "2026-01-18T20:55:28.634Z" }, - { url = "https://files.pythonhosted.org/packages/95/f8/30ae5716e88d792a4e879debee195653c26ddd3964c968594ddef0a3cc7e/ormsgpack-1.12.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b009049086ddc6b8f80c76b3955df1aa22a5fbd7673c525cd63bf91f23122ede", size = 387139, upload-time = "2026-01-18T20:56:02.013Z" }, - { url = "https://files.pythonhosted.org/packages/dc/81/aee5b18a3e3a0e52f718b37ab4b8af6fae0d9d6a65103036a90c2a8ffb5d/ormsgpack-1.12.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:1dcc17d92b6390d4f18f937cf0b99054824a7815818012ddca925d6e01c2e49e", size = 482578, upload-time = "2026-01-18T20:55:35.117Z" }, - { url = "https://files.pythonhosted.org/packages/bd/17/71c9ba472d5d45f7546317f467a5fc941929cd68fb32796ca3d13dcbaec2/ormsgpack-1.12.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f04b5e896d510b07c0ad733d7fce2d44b260c5e6c402d272128f8941984e4285", size = 425539, upload-time = "2026-01-18T20:56:04.009Z" }, - { url = "https://files.pythonhosted.org/packages/2e/a6/ac99cd7fe77e822fed5250ff4b86fa66dd4238937dd178d2299f10b69816/ormsgpack-1.12.2-cp314-cp314-win_amd64.whl", hash = "sha256:ae3aba7eed4ca7cb79fd3436eddd29140f17ea254b91604aa1eb19bfcedb990f", size = 117493, upload-time = "2026-01-18T20:56:07.343Z" }, - { url = "https://files.pythonhosted.org/packages/3a/67/339872846a1ae4592535385a1c1f93614138566d7af094200c9c3b45d1e5/ormsgpack-1.12.2-cp314-cp314-win_arm64.whl", hash = "sha256:118576ea6006893aea811b17429bfc561b4778fad393f5f538c84af70b01260c", size = 111579, upload-time = "2026-01-18T20:55:21.161Z" }, - { url = "https://files.pythonhosted.org/packages/49/c2/6feb972dc87285ad381749d3882d8aecbde9f6ecf908dd717d33d66df095/ormsgpack-1.12.2-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7121b3d355d3858781dc40dafe25a32ff8a8242b9d80c692fd548a4b1f7fd3c8", size = 378721, upload-time = "2026-01-18T20:55:52.12Z" }, - { url = "https://files.pythonhosted.org/packages/a3/9a/900a6b9b413e0f8a471cf07830f9cf65939af039a362204b36bd5b581d8b/ormsgpack-1.12.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ee766d2e78251b7a63daf1cddfac36a73562d3ddef68cacfb41b2af64698033", size = 203170, upload-time = "2026-01-18T20:55:44.469Z" }, - { url = "https://files.pythonhosted.org/packages/87/4c/27a95466354606b256f24fad464d7c97ab62bce6cc529dd4673e1179b8fb/ormsgpack-1.12.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:292410a7d23de9b40444636b9b8f1e4e4b814af7f1ef476e44887e52a123f09d", size = 212816, upload-time = "2026-01-18T20:55:23.501Z" }, - { url = "https://files.pythonhosted.org/packages/73/cd/29cee6007bddf7a834e6cd6f536754c0535fcb939d384f0f37a38b1cddb8/ormsgpack-1.12.2-cp314-cp314t-win_amd64.whl", hash = "sha256:837dd316584485b72ef451d08dd3e96c4a11d12e4963aedb40e08f89685d8ec2", size = 117232, upload-time = "2026-01-18T20:55:45.448Z" }, -] - [[package]] name = "outcome" version = "1.3.0.post0" @@ -1785,7 +1717,7 @@ wheels = [ [[package]] name = "pandas" -version = "2.3.3" +version = "2.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, @@ -1793,55 +1725,42 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/f7/f425a00df4fcc22b292c6895c6831c0c8ae1d9fac1e024d16f98a9ce8749/pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c", size = 11555763, upload-time = "2025-09-29T23:16:53.287Z" }, - { url = "https://files.pythonhosted.org/packages/13/4f/66d99628ff8ce7857aca52fed8f0066ce209f96be2fede6cef9f84e8d04f/pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a", size = 10801217, upload-time = "2025-09-29T23:17:04.522Z" }, - { url = "https://files.pythonhosted.org/packages/1d/03/3fc4a529a7710f890a239cc496fc6d50ad4a0995657dccc1d64695adb9f4/pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1", size = 12148791, upload-time = "2025-09-29T23:17:18.444Z" }, - { url = "https://files.pythonhosted.org/packages/40/a8/4dac1f8f8235e5d25b9955d02ff6f29396191d4e665d71122c3722ca83c5/pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838", size = 12769373, upload-time = "2025-09-29T23:17:35.846Z" }, - { url = "https://files.pythonhosted.org/packages/df/91/82cc5169b6b25440a7fc0ef3a694582418d875c8e3ebf796a6d6470aa578/pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250", size = 13200444, upload-time = "2025-09-29T23:17:49.341Z" }, - { url = "https://files.pythonhosted.org/packages/10/ae/89b3283800ab58f7af2952704078555fa60c807fff764395bb57ea0b0dbd/pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4", size = 13858459, upload-time = "2025-09-29T23:18:03.722Z" }, - { url = "https://files.pythonhosted.org/packages/85/72/530900610650f54a35a19476eca5104f38555afccda1aa11a92ee14cb21d/pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826", size = 11346086, upload-time = "2025-09-29T23:18:18.505Z" }, - { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, - { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, - { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, - { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, - { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, - { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, - { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, - { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, - { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, - { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, - { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, - { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, - { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, - { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, - { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, - { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, - { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, - { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, - { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, - { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, - { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, - { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, - { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, - { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, - { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, - { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, - { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, - { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, - { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, - { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, - { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, - { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, - { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, - { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, - { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, - { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, - { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, - { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, - { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, - { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/d1/6f/75aa71f8a14267117adeeed5d21b204770189c0a0025acbdc03c337b28fc/pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2", size = 4487493, upload-time = "2025-07-07T19:20:04.079Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/ca/aa97b47287221fa37a49634532e520300088e290b20d690b21ce3e448143/pandas-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22c2e866f7209ebc3a8f08d75766566aae02bcc91d196935a1d9e59c7b990ac9", size = 11542731, upload-time = "2025-07-07T19:18:12.619Z" }, + { url = "https://files.pythonhosted.org/packages/80/bf/7938dddc5f01e18e573dcfb0f1b8c9357d9b5fa6ffdee6e605b92efbdff2/pandas-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3583d348546201aff730c8c47e49bc159833f971c2899d6097bce68b9112a4f1", size = 10790031, upload-time = "2025-07-07T19:18:16.611Z" }, + { url = "https://files.pythonhosted.org/packages/ee/2f/9af748366763b2a494fed477f88051dbf06f56053d5c00eba652697e3f94/pandas-2.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f951fbb702dacd390561e0ea45cdd8ecfa7fb56935eb3dd78e306c19104b9b0", size = 11724083, upload-time = "2025-07-07T19:18:20.512Z" }, + { url = "https://files.pythonhosted.org/packages/2c/95/79ab37aa4c25d1e7df953dde407bb9c3e4ae47d154bc0dd1692f3a6dcf8c/pandas-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd05b72ec02ebfb993569b4931b2e16fbb4d6ad6ce80224a3ee838387d83a191", size = 12342360, upload-time = "2025-07-07T19:18:23.194Z" }, + { url = "https://files.pythonhosted.org/packages/75/a7/d65e5d8665c12c3c6ff5edd9709d5836ec9b6f80071b7f4a718c6106e86e/pandas-2.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1b916a627919a247d865aed068eb65eb91a344b13f5b57ab9f610b7716c92de1", size = 13202098, upload-time = "2025-07-07T19:18:25.558Z" }, + { url = "https://files.pythonhosted.org/packages/65/f3/4c1dbd754dbaa79dbf8b537800cb2fa1a6e534764fef50ab1f7533226c5c/pandas-2.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fe67dc676818c186d5a3d5425250e40f179c2a89145df477dd82945eaea89e97", size = 13837228, upload-time = "2025-07-07T19:18:28.344Z" }, + { url = "https://files.pythonhosted.org/packages/3f/d6/d7f5777162aa9b48ec3910bca5a58c9b5927cfd9cfde3aa64322f5ba4b9f/pandas-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:2eb789ae0274672acbd3c575b0598d213345660120a257b47b5dafdc618aec83", size = 11336561, upload-time = "2025-07-07T19:18:31.211Z" }, + { url = "https://files.pythonhosted.org/packages/76/1c/ccf70029e927e473a4476c00e0d5b32e623bff27f0402d0a92b7fc29bb9f/pandas-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2b0540963d83431f5ce8870ea02a7430adca100cec8a050f0811f8e31035541b", size = 11566608, upload-time = "2025-07-07T19:18:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d3/3c37cb724d76a841f14b8f5fe57e5e3645207cc67370e4f84717e8bb7657/pandas-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fe7317f578c6a153912bd2292f02e40c1d8f253e93c599e82620c7f69755c74f", size = 10823181, upload-time = "2025-07-07T19:18:36.151Z" }, + { url = "https://files.pythonhosted.org/packages/8a/4c/367c98854a1251940edf54a4df0826dcacfb987f9068abf3e3064081a382/pandas-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6723a27ad7b244c0c79d8e7007092d7c8f0f11305770e2f4cd778b3ad5f9f85", size = 11793570, upload-time = "2025-07-07T19:18:38.385Z" }, + { url = "https://files.pythonhosted.org/packages/07/5f/63760ff107bcf5146eee41b38b3985f9055e710a72fdd637b791dea3495c/pandas-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3462c3735fe19f2638f2c3a40bd94ec2dc5ba13abbb032dd2fa1f540a075509d", size = 12378887, upload-time = "2025-07-07T19:18:41.284Z" }, + { url = "https://files.pythonhosted.org/packages/15/53/f31a9b4dfe73fe4711c3a609bd8e60238022f48eacedc257cd13ae9327a7/pandas-2.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:98bcc8b5bf7afed22cc753a28bc4d9e26e078e777066bc53fac7904ddef9a678", size = 13230957, upload-time = "2025-07-07T19:18:44.187Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/6fce6bf85b5056d065e0a7933cba2616dcb48596f7ba3c6341ec4bcc529d/pandas-2.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d544806b485ddf29e52d75b1f559142514e60ef58a832f74fb38e48d757b299", size = 13883883, upload-time = "2025-07-07T19:18:46.498Z" }, + { url = "https://files.pythonhosted.org/packages/c8/7b/bdcb1ed8fccb63d04bdb7635161d0ec26596d92c9d7a6cce964e7876b6c1/pandas-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b3cd4273d3cb3707b6fffd217204c52ed92859533e31dc03b7c5008aa933aaab", size = 11340212, upload-time = "2025-07-07T19:18:49.293Z" }, + { url = "https://files.pythonhosted.org/packages/46/de/b8445e0f5d217a99fe0eeb2f4988070908979bec3587c0633e5428ab596c/pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3", size = 11588172, upload-time = "2025-07-07T19:18:52.054Z" }, + { url = "https://files.pythonhosted.org/packages/1e/e0/801cdb3564e65a5ac041ab99ea6f1d802a6c325bb6e58c79c06a3f1cd010/pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232", size = 10717365, upload-time = "2025-07-07T19:18:54.785Z" }, + { url = "https://files.pythonhosted.org/packages/51/a5/c76a8311833c24ae61a376dbf360eb1b1c9247a5d9c1e8b356563b31b80c/pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e", size = 11280411, upload-time = "2025-07-07T19:18:57.045Z" }, + { url = "https://files.pythonhosted.org/packages/da/01/e383018feba0a1ead6cf5fe8728e5d767fee02f06a3d800e82c489e5daaf/pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4", size = 11988013, upload-time = "2025-07-07T19:18:59.771Z" }, + { url = "https://files.pythonhosted.org/packages/5b/14/cec7760d7c9507f11c97d64f29022e12a6cc4fc03ac694535e89f88ad2ec/pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8", size = 12767210, upload-time = "2025-07-07T19:19:02.944Z" }, + { url = "https://files.pythonhosted.org/packages/50/b9/6e2d2c6728ed29fb3d4d4d302504fb66f1a543e37eb2e43f352a86365cdf/pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679", size = 13440571, upload-time = "2025-07-07T19:19:06.82Z" }, + { url = "https://files.pythonhosted.org/packages/80/a5/3a92893e7399a691bad7664d977cb5e7c81cf666c81f89ea76ba2bff483d/pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8", size = 10987601, upload-time = "2025-07-07T19:19:09.589Z" }, + { url = "https://files.pythonhosted.org/packages/32/ed/ff0a67a2c5505e1854e6715586ac6693dd860fbf52ef9f81edee200266e7/pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22", size = 11531393, upload-time = "2025-07-07T19:19:12.245Z" }, + { url = "https://files.pythonhosted.org/packages/c7/db/d8f24a7cc9fb0972adab0cc80b6817e8bef888cfd0024eeb5a21c0bb5c4a/pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a", size = 10668750, upload-time = "2025-07-07T19:19:14.612Z" }, + { url = "https://files.pythonhosted.org/packages/0f/b0/80f6ec783313f1e2356b28b4fd8d2148c378370045da918c73145e6aab50/pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928", size = 11342004, upload-time = "2025-07-07T19:19:16.857Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e2/20a317688435470872885e7fc8f95109ae9683dec7c50be29b56911515a5/pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9", size = 12050869, upload-time = "2025-07-07T19:19:19.265Z" }, + { url = "https://files.pythonhosted.org/packages/55/79/20d746b0a96c67203a5bee5fb4e00ac49c3e8009a39e1f78de264ecc5729/pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12", size = 12750218, upload-time = "2025-07-07T19:19:21.547Z" }, + { url = "https://files.pythonhosted.org/packages/7c/0f/145c8b41e48dbf03dd18fdd7f24f8ba95b8254a97a3379048378f33e7838/pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb", size = 13416763, upload-time = "2025-07-07T19:19:23.939Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c0/54415af59db5cdd86a3d3bf79863e8cc3fa9ed265f0745254061ac09d5f2/pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956", size = 10987482, upload-time = "2025-07-07T19:19:42.699Z" }, + { url = "https://files.pythonhosted.org/packages/48/64/2fd2e400073a1230e13b8cd604c9bc95d9e3b962e5d44088ead2e8f0cfec/pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a", size = 12029159, upload-time = "2025-07-07T19:19:26.362Z" }, + { url = "https://files.pythonhosted.org/packages/d8/0a/d84fd79b0293b7ef88c760d7dca69828d867c89b6d9bc52d6a27e4d87316/pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9", size = 11393287, upload-time = "2025-07-07T19:19:29.157Z" }, + { url = "https://files.pythonhosted.org/packages/50/ae/ff885d2b6e88f3c7520bb74ba319268b42f05d7e583b5dded9837da2723f/pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275", size = 11309381, upload-time = "2025-07-07T19:19:31.436Z" }, + { url = "https://files.pythonhosted.org/packages/85/86/1fa345fc17caf5d7780d2699985c03dbe186c68fee00b526813939062bb0/pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab", size = 11883998, upload-time = "2025-07-07T19:19:34.267Z" }, + { url = "https://files.pythonhosted.org/packages/81/aa/e58541a49b5e6310d89474333e994ee57fea97c8aaa8fc7f00b873059bbf/pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96", size = 12704705, upload-time = "2025-07-07T19:19:36.856Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f9/07086f5b0f2a19872554abeea7658200824f5835c58a106fa8f2ae96a46c/pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444", size = 13189044, upload-time = "2025-07-07T19:19:39.999Z" }, ] [[package]] @@ -1878,7 +1797,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pastel" }, { name = "pyyaml" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "tomli", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cf/ac/311c8a492dc887f0b7a54d0ec3324cb2f9538b7b78ea06e5f7ae1f167e52/poethepoet-0.36.0.tar.gz", hash = "sha256:2217b49cb4e4c64af0b42ff8c4814b17f02e107d38bc461542517348ede25663", size = 66854, upload-time = "2025-06-29T19:54:50.444Z" } wheels = [ @@ -2210,23 +2129,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] -[[package]] -name = "pyjwt" -version = "2.12.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c2/27/a3b6e5bf6ff856d2509292e95c8f57f0df7017cf5394921fc4e4ef40308a/pyjwt-2.12.1.tar.gz", hash = "sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b", size = 102564, upload-time = "2026-03-13T19:27:37.25Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/7a/8dd906bd22e79e47397a61742927f6747fe93242ef86645ee9092e610244/pyjwt-2.12.1-py3-none-any.whl", hash = "sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c", size = 29726, upload-time = "2026-03-13T19:27:35.677Z" }, -] - -[package.optional-dependencies] -crypto = [ - { name = "cryptography" }, -] - [[package]] name = "pyright" version = "1.1.403" @@ -2245,12 +2147,12 @@ name = "pytest" version = "7.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "tomli", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/80/1f/9d8e98e4133ffb16c90f3b405c43e38d3abb715bb5d7a63a5a684f7e46a3/pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", size = 1357116, upload-time = "2023-12-31T12:00:18.035Z" } wheels = [ @@ -2395,7 +2297,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "rpds-py" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } wheels = [ @@ -2505,7 +2407,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload-time = "2025-03-30T14:15:14.23Z" } wheels = [ @@ -2724,6 +2626,51 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, ] +[[package]] +name = "sqlalchemy" +version = "2.0.41" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/66/45b165c595ec89aa7dcc2c1cd222ab269bc753f1fc7a1e68f8481bd957bf/sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9", size = 9689424, upload-time = "2025-05-14T17:10:32.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/12/d7c445b1940276a828efce7331cb0cb09d6e5f049651db22f4ebb0922b77/sqlalchemy-2.0.41-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b1f09b6821406ea1f94053f346f28f8215e293344209129a9c0fcc3578598d7b", size = 2117967, upload-time = "2025-05-14T17:48:15.841Z" }, + { url = "https://files.pythonhosted.org/packages/6f/b8/cb90f23157e28946b27eb01ef401af80a1fab7553762e87df51507eaed61/sqlalchemy-2.0.41-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1936af879e3db023601196a1684d28e12f19ccf93af01bf3280a3262c4b6b4e5", size = 2107583, upload-time = "2025-05-14T17:48:18.688Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c2/eef84283a1c8164a207d898e063edf193d36a24fb6a5bb3ce0634b92a1e8/sqlalchemy-2.0.41-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2ac41acfc8d965fb0c464eb8f44995770239668956dc4cdf502d1b1ffe0d747", size = 3186025, upload-time = "2025-05-14T17:51:51.226Z" }, + { url = "https://files.pythonhosted.org/packages/bd/72/49d52bd3c5e63a1d458fd6d289a1523a8015adedbddf2c07408ff556e772/sqlalchemy-2.0.41-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81c24e0c0fde47a9723c81d5806569cddef103aebbf79dbc9fcbb617153dea30", size = 3186259, upload-time = "2025-05-14T17:55:22.526Z" }, + { url = "https://files.pythonhosted.org/packages/4f/9e/e3ffc37d29a3679a50b6bbbba94b115f90e565a2b4545abb17924b94c52d/sqlalchemy-2.0.41-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23a8825495d8b195c4aa9ff1c430c28f2c821e8c5e2d98089228af887e5d7e29", size = 3126803, upload-time = "2025-05-14T17:51:53.277Z" }, + { url = "https://files.pythonhosted.org/packages/8a/76/56b21e363f6039978ae0b72690237b38383e4657281285a09456f313dd77/sqlalchemy-2.0.41-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:60c578c45c949f909a4026b7807044e7e564adf793537fc762b2489d522f3d11", size = 3148566, upload-time = "2025-05-14T17:55:24.398Z" }, + { url = "https://files.pythonhosted.org/packages/3b/92/11b8e1b69bf191bc69e300a99badbbb5f2f1102f2b08b39d9eee2e21f565/sqlalchemy-2.0.41-cp310-cp310-win32.whl", hash = "sha256:118c16cd3f1b00c76d69343e38602006c9cfb9998fa4f798606d28d63f23beda", size = 2086696, upload-time = "2025-05-14T17:55:59.136Z" }, + { url = "https://files.pythonhosted.org/packages/5c/88/2d706c9cc4502654860f4576cd54f7db70487b66c3b619ba98e0be1a4642/sqlalchemy-2.0.41-cp310-cp310-win_amd64.whl", hash = "sha256:7492967c3386df69f80cf67efd665c0f667cee67032090fe01d7d74b0e19bb08", size = 2110200, upload-time = "2025-05-14T17:56:00.757Z" }, + { url = "https://files.pythonhosted.org/packages/37/4e/b00e3ffae32b74b5180e15d2ab4040531ee1bef4c19755fe7926622dc958/sqlalchemy-2.0.41-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6375cd674fe82d7aa9816d1cb96ec592bac1726c11e0cafbf40eeee9a4516b5f", size = 2121232, upload-time = "2025-05-14T17:48:20.444Z" }, + { url = "https://files.pythonhosted.org/packages/ef/30/6547ebb10875302074a37e1970a5dce7985240665778cfdee2323709f749/sqlalchemy-2.0.41-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f8c9fdd15a55d9465e590a402f42082705d66b05afc3ffd2d2eb3c6ba919560", size = 2110897, upload-time = "2025-05-14T17:48:21.634Z" }, + { url = "https://files.pythonhosted.org/packages/9e/21/59df2b41b0f6c62da55cd64798232d7349a9378befa7f1bb18cf1dfd510a/sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f9dc8c44acdee06c8fc6440db9eae8b4af8b01e4b1aee7bdd7241c22edff4f", size = 3273313, upload-time = "2025-05-14T17:51:56.205Z" }, + { url = "https://files.pythonhosted.org/packages/62/e4/b9a7a0e5c6f79d49bcd6efb6e90d7536dc604dab64582a9dec220dab54b6/sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c11ceb9a1f482c752a71f203a81858625d8df5746d787a4786bca4ffdf71c6", size = 3273807, upload-time = "2025-05-14T17:55:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/39/d8/79f2427251b44ddee18676c04eab038d043cff0e764d2d8bb08261d6135d/sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:911cc493ebd60de5f285bcae0491a60b4f2a9f0f5c270edd1c4dbaef7a38fc04", size = 3209632, upload-time = "2025-05-14T17:51:59.384Z" }, + { url = "https://files.pythonhosted.org/packages/d4/16/730a82dda30765f63e0454918c982fb7193f6b398b31d63c7c3bd3652ae5/sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03968a349db483936c249f4d9cd14ff2c296adfa1290b660ba6516f973139582", size = 3233642, upload-time = "2025-05-14T17:55:29.901Z" }, + { url = "https://files.pythonhosted.org/packages/04/61/c0d4607f7799efa8b8ea3c49b4621e861c8f5c41fd4b5b636c534fcb7d73/sqlalchemy-2.0.41-cp311-cp311-win32.whl", hash = "sha256:293cd444d82b18da48c9f71cd7005844dbbd06ca19be1ccf6779154439eec0b8", size = 2086475, upload-time = "2025-05-14T17:56:02.095Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8e/8344f8ae1cb6a479d0741c02cd4f666925b2bf02e2468ddaf5ce44111f30/sqlalchemy-2.0.41-cp311-cp311-win_amd64.whl", hash = "sha256:3d3549fc3e40667ec7199033a4e40a2f669898a00a7b18a931d3efb4c7900504", size = 2110903, upload-time = "2025-05-14T17:56:03.499Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2a/f1f4e068b371154740dd10fb81afb5240d5af4aa0087b88d8b308b5429c2/sqlalchemy-2.0.41-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:81f413674d85cfd0dfcd6512e10e0f33c19c21860342a4890c3a2b59479929f9", size = 2119645, upload-time = "2025-05-14T17:55:24.854Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e8/c664a7e73d36fbfc4730f8cf2bf930444ea87270f2825efbe17bf808b998/sqlalchemy-2.0.41-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:598d9ebc1e796431bbd068e41e4de4dc34312b7aa3292571bb3674a0cb415dd1", size = 2107399, upload-time = "2025-05-14T17:55:28.097Z" }, + { url = "https://files.pythonhosted.org/packages/5c/78/8a9cf6c5e7135540cb682128d091d6afa1b9e48bd049b0d691bf54114f70/sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a104c5694dfd2d864a6f91b0956eb5d5883234119cb40010115fd45a16da5e70", size = 3293269, upload-time = "2025-05-14T17:50:38.227Z" }, + { url = "https://files.pythonhosted.org/packages/3c/35/f74add3978c20de6323fb11cb5162702670cc7a9420033befb43d8d5b7a4/sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6145afea51ff0af7f2564a05fa95eb46f542919e6523729663a5d285ecb3cf5e", size = 3303364, upload-time = "2025-05-14T17:51:49.829Z" }, + { url = "https://files.pythonhosted.org/packages/6a/d4/c990f37f52c3f7748ebe98883e2a0f7d038108c2c5a82468d1ff3eec50b7/sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b46fa6eae1cd1c20e6e6f44e19984d438b6b2d8616d21d783d150df714f44078", size = 3229072, upload-time = "2025-05-14T17:50:39.774Z" }, + { url = "https://files.pythonhosted.org/packages/15/69/cab11fecc7eb64bc561011be2bd03d065b762d87add52a4ca0aca2e12904/sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41836fe661cc98abfae476e14ba1906220f92c4e528771a8a3ae6a151242d2ae", size = 3268074, upload-time = "2025-05-14T17:51:51.736Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ca/0c19ec16858585d37767b167fc9602593f98998a68a798450558239fb04a/sqlalchemy-2.0.41-cp312-cp312-win32.whl", hash = "sha256:a8808d5cf866c781150d36a3c8eb3adccfa41a8105d031bf27e92c251e3969d6", size = 2084514, upload-time = "2025-05-14T17:55:49.915Z" }, + { url = "https://files.pythonhosted.org/packages/7f/23/4c2833d78ff3010a4e17f984c734f52b531a8c9060a50429c9d4b0211be6/sqlalchemy-2.0.41-cp312-cp312-win_amd64.whl", hash = "sha256:5b14e97886199c1f52c14629c11d90c11fbb09e9334fa7bb5f6d068d9ced0ce0", size = 2111557, upload-time = "2025-05-14T17:55:51.349Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ad/2e1c6d4f235a97eeef52d0200d8ddda16f6c4dd70ae5ad88c46963440480/sqlalchemy-2.0.41-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eeb195cdedaf17aab6b247894ff2734dcead6c08f748e617bfe05bd5a218443", size = 2115491, upload-time = "2025-05-14T17:55:31.177Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8d/be490e5db8400dacc89056f78a52d44b04fbf75e8439569d5b879623a53b/sqlalchemy-2.0.41-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d4ae769b9c1c7757e4ccce94b0641bc203bbdf43ba7a2413ab2523d8d047d8dc", size = 2102827, upload-time = "2025-05-14T17:55:34.921Z" }, + { url = "https://files.pythonhosted.org/packages/a0/72/c97ad430f0b0e78efaf2791342e13ffeafcbb3c06242f01a3bb8fe44f65d/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a62448526dd9ed3e3beedc93df9bb6b55a436ed1474db31a2af13b313a70a7e1", size = 3225224, upload-time = "2025-05-14T17:50:41.418Z" }, + { url = "https://files.pythonhosted.org/packages/5e/51/5ba9ea3246ea068630acf35a6ba0d181e99f1af1afd17e159eac7e8bc2b8/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc56c9788617b8964ad02e8fcfeed4001c1f8ba91a9e1f31483c0dffb207002a", size = 3230045, upload-time = "2025-05-14T17:51:54.722Z" }, + { url = "https://files.pythonhosted.org/packages/78/2f/8c14443b2acea700c62f9b4a8bad9e49fc1b65cfb260edead71fd38e9f19/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c153265408d18de4cc5ded1941dcd8315894572cddd3c58df5d5b5705b3fa28d", size = 3159357, upload-time = "2025-05-14T17:50:43.483Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b2/43eacbf6ccc5276d76cea18cb7c3d73e294d6fb21f9ff8b4eef9b42bbfd5/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f67766965996e63bb46cfbf2ce5355fc32d9dd3b8ad7e536a920ff9ee422e23", size = 3197511, upload-time = "2025-05-14T17:51:57.308Z" }, + { url = "https://files.pythonhosted.org/packages/fa/2e/677c17c5d6a004c3c45334ab1dbe7b7deb834430b282b8a0f75ae220c8eb/sqlalchemy-2.0.41-cp313-cp313-win32.whl", hash = "sha256:bfc9064f6658a3d1cadeaa0ba07570b83ce6801a1314985bf98ec9b95d74e15f", size = 2082420, upload-time = "2025-05-14T17:55:52.69Z" }, + { url = "https://files.pythonhosted.org/packages/e9/61/e8c1b9b6307c57157d328dd8b8348ddc4c47ffdf1279365a13b2b98b8049/sqlalchemy-2.0.41-cp313-cp313-win_amd64.whl", hash = "sha256:82ca366a844eb551daff9d2e6e7a9e5e76d2612c8564f58db6c19a726869c1df", size = 2108329, upload-time = "2025-05-14T17:55:54.495Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fc/9ba22f01b5cdacc8f5ed0d22304718d2c758fce3fd49a5372b886a86f37c/sqlalchemy-2.0.41-py3-none-any.whl", hash = "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576", size = 1911224, upload-time = "2025-05-14T17:39:42.154Z" }, +] + [[package]] name = "sse-starlette" version = "2.4.1" @@ -2742,7 +2689,7 @@ version = "0.47.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0a/69/662169fdb92fb96ec3eaee218cf540a629d629c86d7993d9651226a6789b/starlette-0.47.1.tar.gz", hash = "sha256:aef012dd2b6be325ffa16698f9dc533614fb1cebd593a906b90dc1025529a79b", size = 2583072, upload-time = "2025-06-21T04:03:17.337Z" } wheels = [ @@ -2751,22 +2698,22 @@ wheels = [ [[package]] name = "temporalio" -version = "1.26.0" +version = "1.23.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "nexus-rpc" }, { name = "protobuf" }, - { name = "python-dateutil", marker = "python_full_version < '3.11'" }, + { name = "python-dateutil", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, { name = "types-protobuf" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/d4/fa21150a225393f87732ed6fef3cc9735d9e751edc6be415fe6e375105c6/temporalio-1.26.0.tar.gz", hash = "sha256:f4bfb35125e6f5e8c7f7ed1277c7354d812c6fac7ed5f8dbd50536cf289aaaa7", size = 2388994, upload-time = "2026-04-15T23:43:00.911Z" } +sdist = { url = "https://files.pythonhosted.org/packages/67/48/ba7413e2fab8dcd277b9df00bafa572da24e9ca32de2f38d428dc3a2825c/temporalio-1.23.0.tar.gz", hash = "sha256:72750494b00eb73ded9db76195e3a9b53ff548780f73d878ec3f807ee3191410", size = 1933051, upload-time = "2026-02-18T17:48:22.353Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/27/8c421c622d18cc8e034247d5d72b89e6456937344b5bec1de40abef3c085/temporalio-1.26.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:5489040c0cf621edeb36984199dd9e4fbd2b3a07d61a4f2a8da1f2cb9820ef26", size = 14221070, upload-time = "2026-04-15T23:42:26.21Z" }, - { url = "https://files.pythonhosted.org/packages/49/7c/d2b691d16ec5db87198c2e08dbfba58e286c096faee15753613a581abdce/temporalio-1.26.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:b18dd85771509c19ef059a31908bcd4e6130d1f67037c4db519702f3f2ad6d4a", size = 13583991, upload-time = "2026-04-15T23:42:34.357Z" }, - { url = "https://files.pythonhosted.org/packages/05/ca/b8728451320ca9d8bb6e1680b9bd23767118f86d5b8644edf2304d533f1b/temporalio-1.26.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46187d5f82ca2ae81f35ea5916a76db0e2f067210dc6b1852c3749475721946e", size = 13808036, upload-time = "2026-04-15T23:42:42.757Z" }, - { url = "https://files.pythonhosted.org/packages/cb/54/3113f5e0ac58655790abac64656373e06191b351d74bfb94692e81bd6784/temporalio-1.26.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03300c3e5237443367ac61bb20bd726c656b3daa50310bdd436599d5bdc7cf97", size = 14336604, upload-time = "2026-04-15T23:42:49.851Z" }, - { url = "https://files.pythonhosted.org/packages/fd/9b/c50840a26af3587c0c8d9af04d9976743e22496996dc1a377efc75dcd316/temporalio-1.26.0-cp310-abi3-win_amd64.whl", hash = "sha256:1c4a0d82f0a3796cbf78864c799f8dca0b94cdaec68e7b8b224c859005686ec4", size = 14525849, upload-time = "2026-04-15T23:42:57.589Z" }, + { url = "https://files.pythonhosted.org/packages/6f/71/26c8f21dca9092201b3b9cb7aff42460b4864b5999aa4c6a4343ac66f1fd/temporalio-1.23.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:6b69ac8d75f2d90e66f4edce4316f6a33badc4a30b22efc50e9eddaa9acdc216", size = 12311037, upload-time = "2026-02-18T17:47:47.628Z" }, + { url = "https://files.pythonhosted.org/packages/ec/47/43102816139f2d346680cb7cc1e53da5f6968355ac65b4d35d4edbfca896/temporalio-1.23.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:1bbbb2f9c3cdd09451565163f6d741e51f109694c49435d475fdfa42b597219d", size = 11821906, upload-time = "2026-02-18T17:47:55.314Z" }, + { url = "https://files.pythonhosted.org/packages/00/b0/899ff28464a0e17adf17476bdfac8faf4ea41870358ff2d14737e43f9e66/temporalio-1.23.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf6570e0ee696f99a38d855da4441a890c7187357c16505ed458ac9ef274ed70", size = 12063601, upload-time = "2026-02-18T17:48:03.994Z" }, + { url = "https://files.pythonhosted.org/packages/ed/17/b8c6d2ec3e113c6a788322513a5ff635bdd54b3791d092ed0e273467748a/temporalio-1.23.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b82d6cca54c9f376b50e941dd10d12f7fe5b692a314fb087be72cd2898646a79", size = 12394579, upload-time = "2026-02-18T17:48:11.65Z" }, + { url = "https://files.pythonhosted.org/packages/b4/b7/f9ef7fd5ee65aef7d59ab1e95cb1b45df2fe49c17e3aa4d650ae3322f015/temporalio-1.23.0-cp310-abi3-win_amd64.whl", hash = "sha256:43c3b99a46dd329761a256f3855710c4a5b322afc879785e468bdd0b94faace6", size = 12834494, upload-time = "2026-02-18T17:48:19.071Z" }, ] [package.optional-dependencies] @@ -2778,6 +2725,9 @@ opentelemetry = [ { name = "opentelemetry-api" }, { name = "opentelemetry-sdk" }, ] +pydantic = [ + { name = "pydantic" }, +] [[package]] name = "temporalio-samples" @@ -2793,8 +2743,8 @@ bedrock = [ ] cloud-export-to-parquet = [ { name = "boto3" }, - { name = "numpy", marker = "python_full_version < '3.13'" }, - { name = "pandas", marker = "python_full_version < '4'" }, + { name = "numpy", marker = "python_full_version < '3.13' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "pandas", marker = "python_full_version < '4' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, { name = "pyarrow" }, ] dev = [ @@ -2824,10 +2774,15 @@ langchain = [ { name = "fastapi" }, { name = "langchain", marker = "python_full_version < '4'" }, { name = "langchain-openai", marker = "python_full_version < '4'" }, - { name = "langsmith", marker = "python_full_version < '4'" }, + { name = "langsmith", version = "0.1.147", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '4'" }, { name = "openai" }, { name = "tqdm" }, - { name = "uvicorn", extra = ["standard"] }, + { name = "uvicorn", extra = ["standard"], marker = "extra == 'group-18-temporalio-samples-langchain'" }, +] +langsmith-tracing = [ + { name = "langsmith", version = "0.7.32", source = { registry = "https://pypi.org/simple" } }, + { name = "openai" }, + { name = "temporalio", extra = ["pydantic"], marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, ] nexus = [ { name = "nexus-rpc" }, @@ -2839,7 +2794,7 @@ open-telemetry = [ openai-agents = [ { name = "openai-agents", extra = ["litellm"] }, { name = "requests" }, - { name = "temporalio", extra = ["openai-agents", "opentelemetry"] }, + { name = "temporalio", extra = ["openai-agents"] }, ] pydantic-converter = [ { name = "pydantic" }, @@ -2853,7 +2808,7 @@ trio-async = [ ] [package.metadata] -requires-dist = [{ name = "temporalio", specifier = ">=1.26.0,<2" }] +requires-dist = [{ name = "temporalio", specifier = ">=1.23.0,<2" }] [package.metadata.requires-dev] bedrock = [{ name = "boto3", specifier = ">=1.34.92,<2" }] @@ -2886,12 +2841,17 @@ encryption = [ gevent = [{ name = "gevent", marker = "python_full_version >= '3.8'", specifier = ">=25.4.2" }] langchain = [ { name = "fastapi", specifier = ">=0.115.12" }, - { name = "langchain", marker = "python_full_version >= '3.9' and python_full_version < '4'", specifier = ">=1.2.15,<2" }, - { name = "langchain-openai", marker = "python_full_version >= '3.9' and python_full_version < '4'", specifier = ">=1.1.13,<2" }, - { name = "langsmith", marker = "python_full_version >= '3.9' and python_full_version < '4'", specifier = ">=0.3.45,<0.4" }, - { name = "openai", specifier = ">=2.0.0,<3" }, + { name = "langchain", marker = "python_full_version >= '3.9' and python_full_version < '4'", specifier = ">=0.1.7,<0.2" }, + { name = "langchain-openai", marker = "python_full_version >= '3.9' and python_full_version < '4'", specifier = ">=0.0.6,<0.0.7" }, + { name = "langsmith", marker = "python_full_version >= '3.9' and python_full_version < '4'", specifier = ">=0.1.22,<0.2" }, + { name = "openai", specifier = ">=1.4.0,<2" }, { name = "tqdm", specifier = ">=4.62.0,<5" }, - { name = "uvicorn", extras = ["standard"], specifier = ">=0.31.0,<0.32.0" }, + { name = "uvicorn", extras = ["standard"], specifier = ">=0.24.0.post1,<0.25" }, +] +langsmith-tracing = [ + { name = "langsmith", specifier = ">=0.7.0" }, + { name = "openai", specifier = ">=1.4.0,<2" }, + { name = "temporalio", extras = ["pydantic"] }, ] nexus = [{ name = "nexus-rpc", specifier = ">=1.1.0,<2" }] open-telemetry = [ @@ -2899,9 +2859,9 @@ open-telemetry = [ { name = "temporalio", extras = ["opentelemetry"] }, ] openai-agents = [ - { name = "openai-agents", extras = ["litellm"], specifier = ">=0.14.1" }, + { name = "openai-agents", extras = ["litellm"], specifier = "==0.3.2" }, { name = "requests", specifier = ">=2.32.0,<3" }, - { name = "temporalio", extras = ["openai-agents", "opentelemetry"], specifier = ">=1.26.0" }, + { name = "temporalio", extras = ["openai-agents"], specifier = ">=1.18.0" }, ] pydantic-converter = [{ name = "pydantic", specifier = ">=2.10.6,<3" }] sentry = [{ name = "sentry-sdk", specifier = ">=2.13.0" }] @@ -3049,7 +3009,7 @@ name = "tqdm" version = "4.67.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } wheels = [ @@ -3062,8 +3022,8 @@ version = "0.28.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, - { name = "cffi", marker = "implementation_name != 'pypy' and os_name == 'nt'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "cffi", marker = "(implementation_name != 'pypy' and os_name == 'nt') or (implementation_name == 'pypy' and extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (os_name != 'nt' and extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, { name = "idna" }, { name = "outcome" }, { name = "sniffio" }, @@ -3079,7 +3039,7 @@ name = "trio-asyncio" version = "0.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, { name = "greenlet" }, { name = "outcome" }, { name = "sniffio" }, @@ -3129,6 +3089,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" }, ] +[[package]] +name = "typing-inspect" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78", size = 13825, upload-time = "2023-05-24T20:25:47.612Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827, upload-time = "2023-05-24T20:25:45.287Z" }, +] + [[package]] name = "typing-inspection" version = "0.4.2" @@ -3190,16 +3163,16 @@ wheels = [ [[package]] name = "uvicorn" -version = "0.31.1" +version = "0.24.0.post1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/87/a886eda9ed495a3a4506d5a125cd07c54524280718c4969bde88f075fe98/uvicorn-0.31.1.tar.gz", hash = "sha256:f5167919867b161b7bcaf32646c6a94cdbd4c3aa2eb5c17d36bb9aa5cfd8c493", size = 77368, upload-time = "2024-10-09T19:44:20.152Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/84/d43ce8fe6b31a316ef0ed04ea0d58cab981bdf7f17f8423491fa8b4f50b6/uvicorn-0.24.0.post1.tar.gz", hash = "sha256:09c8e5a79dc466bdf28dead50093957db184de356fcdc48697bad3bde4c2588e", size = 40102, upload-time = "2023-11-06T06:37:42.283Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/55/37407280931038a3f21fa0245d60edeaa76f18419581aa3f4397761c78df/uvicorn-0.31.1-py3-none-any.whl", hash = "sha256:adc42d9cac80cf3e51af97c1851648066841e7cfb6993a4ca8de29ac1548ed41", size = 63666, upload-time = "2024-10-09T19:44:18.734Z" }, + { url = "https://files.pythonhosted.org/packages/7e/17/4b7a76fffa7babf397481040d8aef2725b2b81ae19f1a31b5ca0c17d49e6/uvicorn-0.24.0.post1-py3-none-any.whl", hash = "sha256:7c84fea70c619d4a710153482c0d230929af7bcf76c7bfa6de151f0a3a80121e", size = 59687, upload-time = "2023-11-06T06:37:37.726Z" }, ] [package.optional-dependencies] @@ -3679,75 +3652,90 @@ wheels = [ [[package]] name = "zstandard" -version = "0.23.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "platform_python_implementation == 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/2ac0287b442160a89d726b17a9184a4c615bb5237db763791a7fd16d9df1/zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", size = 681701, upload-time = "2024-07-15T00:18:06.141Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/55/bd0487e86679db1823fc9ee0d8c9c78ae2413d34c0b461193b5f4c31d22f/zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9", size = 788701, upload-time = "2024-07-15T00:13:27.351Z" }, - { url = "https://files.pythonhosted.org/packages/e1/8a/ccb516b684f3ad987dfee27570d635822e3038645b1a950c5e8022df1145/zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880", size = 633678, upload-time = "2024-07-15T00:13:30.24Z" }, - { url = "https://files.pythonhosted.org/packages/12/89/75e633d0611c028e0d9af6df199423bf43f54bea5007e6718ab7132e234c/zstandard-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc", size = 4941098, upload-time = "2024-07-15T00:13:32.526Z" }, - { url = "https://files.pythonhosted.org/packages/4a/7a/bd7f6a21802de358b63f1ee636ab823711c25ce043a3e9f043b4fcb5ba32/zstandard-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573", size = 5308798, upload-time = "2024-07-15T00:13:34.925Z" }, - { url = "https://files.pythonhosted.org/packages/79/3b/775f851a4a65013e88ca559c8ae42ac1352db6fcd96b028d0df4d7d1d7b4/zstandard-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391", size = 5341840, upload-time = "2024-07-15T00:13:37.376Z" }, - { url = "https://files.pythonhosted.org/packages/09/4f/0cc49570141dd72d4d95dd6fcf09328d1b702c47a6ec12fbed3b8aed18a5/zstandard-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e", size = 5440337, upload-time = "2024-07-15T00:13:39.772Z" }, - { url = "https://files.pythonhosted.org/packages/e7/7c/aaa7cd27148bae2dc095191529c0570d16058c54c4597a7d118de4b21676/zstandard-0.23.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd", size = 4861182, upload-time = "2024-07-15T00:13:42.495Z" }, - { url = "https://files.pythonhosted.org/packages/ac/eb/4b58b5c071d177f7dc027129d20bd2a44161faca6592a67f8fcb0b88b3ae/zstandard-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4", size = 4932936, upload-time = "2024-07-15T00:13:44.234Z" }, - { url = "https://files.pythonhosted.org/packages/44/f9/21a5fb9bb7c9a274b05ad700a82ad22ce82f7ef0f485980a1e98ed6e8c5f/zstandard-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea", size = 5464705, upload-time = "2024-07-15T00:13:46.822Z" }, - { url = "https://files.pythonhosted.org/packages/49/74/b7b3e61db3f88632776b78b1db597af3f44c91ce17d533e14a25ce6a2816/zstandard-0.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2", size = 4857882, upload-time = "2024-07-15T00:13:49.297Z" }, - { url = "https://files.pythonhosted.org/packages/4a/7f/d8eb1cb123d8e4c541d4465167080bec88481ab54cd0b31eb4013ba04b95/zstandard-0.23.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9", size = 4697672, upload-time = "2024-07-15T00:13:51.447Z" }, - { url = "https://files.pythonhosted.org/packages/5e/05/f7dccdf3d121309b60342da454d3e706453a31073e2c4dac8e1581861e44/zstandard-0.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a", size = 5206043, upload-time = "2024-07-15T00:13:53.587Z" }, - { url = "https://files.pythonhosted.org/packages/86/9d/3677a02e172dccd8dd3a941307621c0cbd7691d77cb435ac3c75ab6a3105/zstandard-0.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0", size = 5667390, upload-time = "2024-07-15T00:13:56.137Z" }, - { url = "https://files.pythonhosted.org/packages/41/7e/0012a02458e74a7ba122cd9cafe491facc602c9a17f590367da369929498/zstandard-0.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c", size = 5198901, upload-time = "2024-07-15T00:13:58.584Z" }, - { url = "https://files.pythonhosted.org/packages/65/3a/8f715b97bd7bcfc7342d8adcd99a026cb2fb550e44866a3b6c348e1b0f02/zstandard-0.23.0-cp310-cp310-win32.whl", hash = "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813", size = 430596, upload-time = "2024-07-15T00:14:00.693Z" }, - { url = "https://files.pythonhosted.org/packages/19/b7/b2b9eca5e5a01111e4fe8a8ffb56bdcdf56b12448a24effe6cfe4a252034/zstandard-0.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4", size = 495498, upload-time = "2024-07-15T00:14:02.741Z" }, - { url = "https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e", size = 788699, upload-time = "2024-07-15T00:14:04.909Z" }, - { url = "https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23", size = 633681, upload-time = "2024-07-15T00:14:13.99Z" }, - { url = "https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a", size = 4944328, upload-time = "2024-07-15T00:14:16.588Z" }, - { url = "https://files.pythonhosted.org/packages/59/cc/e76acb4c42afa05a9d20827116d1f9287e9c32b7ad58cc3af0721ce2b481/zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db", size = 5311955, upload-time = "2024-07-15T00:14:19.389Z" }, - { url = "https://files.pythonhosted.org/packages/78/e4/644b8075f18fc7f632130c32e8f36f6dc1b93065bf2dd87f03223b187f26/zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2", size = 5344944, upload-time = "2024-07-15T00:14:22.173Z" }, - { url = "https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca", size = 5442927, upload-time = "2024-07-15T00:14:24.825Z" }, - { url = "https://files.pythonhosted.org/packages/0c/c3/d24a01a19b6733b9f218e94d1a87c477d523237e07f94899e1c10f6fd06c/zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c", size = 4864910, upload-time = "2024-07-15T00:14:26.982Z" }, - { url = "https://files.pythonhosted.org/packages/1c/a9/cf8f78ead4597264f7618d0875be01f9bc23c9d1d11afb6d225b867cb423/zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e", size = 4935544, upload-time = "2024-07-15T00:14:29.582Z" }, - { url = "https://files.pythonhosted.org/packages/2c/96/8af1e3731b67965fb995a940c04a2c20997a7b3b14826b9d1301cf160879/zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5", size = 5467094, upload-time = "2024-07-15T00:14:40.126Z" }, - { url = "https://files.pythonhosted.org/packages/ff/57/43ea9df642c636cb79f88a13ab07d92d88d3bfe3e550b55a25a07a26d878/zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48", size = 4860440, upload-time = "2024-07-15T00:14:42.786Z" }, - { url = "https://files.pythonhosted.org/packages/46/37/edb78f33c7f44f806525f27baa300341918fd4c4af9472fbc2c3094be2e8/zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c", size = 4700091, upload-time = "2024-07-15T00:14:45.184Z" }, - { url = "https://files.pythonhosted.org/packages/c1/f1/454ac3962671a754f3cb49242472df5c2cced4eb959ae203a377b45b1a3c/zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003", size = 5208682, upload-time = "2024-07-15T00:14:47.407Z" }, - { url = "https://files.pythonhosted.org/packages/85/b2/1734b0fff1634390b1b887202d557d2dd542de84a4c155c258cf75da4773/zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78", size = 5669707, upload-time = "2024-07-15T00:15:03.529Z" }, - { url = "https://files.pythonhosted.org/packages/52/5a/87d6971f0997c4b9b09c495bf92189fb63de86a83cadc4977dc19735f652/zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473", size = 5201792, upload-time = "2024-07-15T00:15:28.372Z" }, - { url = "https://files.pythonhosted.org/packages/79/02/6f6a42cc84459d399bd1a4e1adfc78d4dfe45e56d05b072008d10040e13b/zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160", size = 430586, upload-time = "2024-07-15T00:15:32.26Z" }, - { url = "https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0", size = 495420, upload-time = "2024-07-15T00:15:34.004Z" }, - { url = "https://files.pythonhosted.org/packages/7b/83/f23338c963bd9de687d47bf32efe9fd30164e722ba27fb59df33e6b1719b/zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094", size = 788713, upload-time = "2024-07-15T00:15:35.815Z" }, - { url = "https://files.pythonhosted.org/packages/5b/b3/1a028f6750fd9227ee0b937a278a434ab7f7fdc3066c3173f64366fe2466/zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8", size = 633459, upload-time = "2024-07-15T00:15:37.995Z" }, - { url = "https://files.pythonhosted.org/packages/26/af/36d89aae0c1f95a0a98e50711bc5d92c144939efc1f81a2fcd3e78d7f4c1/zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1", size = 4945707, upload-time = "2024-07-15T00:15:39.872Z" }, - { url = "https://files.pythonhosted.org/packages/cd/2e/2051f5c772f4dfc0aae3741d5fc72c3dcfe3aaeb461cc231668a4db1ce14/zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072", size = 5306545, upload-time = "2024-07-15T00:15:41.75Z" }, - { url = "https://files.pythonhosted.org/packages/0a/9e/a11c97b087f89cab030fa71206963090d2fecd8eb83e67bb8f3ffb84c024/zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20", size = 5337533, upload-time = "2024-07-15T00:15:44.114Z" }, - { url = "https://files.pythonhosted.org/packages/fc/79/edeb217c57fe1bf16d890aa91a1c2c96b28c07b46afed54a5dcf310c3f6f/zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373", size = 5436510, upload-time = "2024-07-15T00:15:46.509Z" }, - { url = "https://files.pythonhosted.org/packages/81/4f/c21383d97cb7a422ddf1ae824b53ce4b51063d0eeb2afa757eb40804a8ef/zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db", size = 4859973, upload-time = "2024-07-15T00:15:49.939Z" }, - { url = "https://files.pythonhosted.org/packages/ab/15/08d22e87753304405ccac8be2493a495f529edd81d39a0870621462276ef/zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772", size = 4936968, upload-time = "2024-07-15T00:15:52.025Z" }, - { url = "https://files.pythonhosted.org/packages/eb/fa/f3670a597949fe7dcf38119a39f7da49a8a84a6f0b1a2e46b2f71a0ab83f/zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105", size = 5467179, upload-time = "2024-07-15T00:15:54.971Z" }, - { url = "https://files.pythonhosted.org/packages/4e/a9/dad2ab22020211e380adc477a1dbf9f109b1f8d94c614944843e20dc2a99/zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba", size = 4848577, upload-time = "2024-07-15T00:15:57.634Z" }, - { url = "https://files.pythonhosted.org/packages/08/03/dd28b4484b0770f1e23478413e01bee476ae8227bbc81561f9c329e12564/zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd", size = 4693899, upload-time = "2024-07-15T00:16:00.811Z" }, - { url = "https://files.pythonhosted.org/packages/2b/64/3da7497eb635d025841e958bcd66a86117ae320c3b14b0ae86e9e8627518/zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a", size = 5199964, upload-time = "2024-07-15T00:16:03.669Z" }, - { url = "https://files.pythonhosted.org/packages/43/a4/d82decbab158a0e8a6ebb7fc98bc4d903266bce85b6e9aaedea1d288338c/zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90", size = 5655398, upload-time = "2024-07-15T00:16:06.694Z" }, - { url = "https://files.pythonhosted.org/packages/f2/61/ac78a1263bc83a5cf29e7458b77a568eda5a8f81980691bbc6eb6a0d45cc/zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35", size = 5191313, upload-time = "2024-07-15T00:16:09.758Z" }, - { url = "https://files.pythonhosted.org/packages/e7/54/967c478314e16af5baf849b6ee9d6ea724ae5b100eb506011f045d3d4e16/zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d", size = 430877, upload-time = "2024-07-15T00:16:11.758Z" }, - { url = "https://files.pythonhosted.org/packages/75/37/872d74bd7739639c4553bf94c84af7d54d8211b626b352bc57f0fd8d1e3f/zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b", size = 495595, upload-time = "2024-07-15T00:16:13.731Z" }, - { url = "https://files.pythonhosted.org/packages/80/f1/8386f3f7c10261fe85fbc2c012fdb3d4db793b921c9abcc995d8da1b7a80/zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9", size = 788975, upload-time = "2024-07-15T00:16:16.005Z" }, - { url = "https://files.pythonhosted.org/packages/16/e8/cbf01077550b3e5dc86089035ff8f6fbbb312bc0983757c2d1117ebba242/zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a", size = 633448, upload-time = "2024-07-15T00:16:17.897Z" }, - { url = "https://files.pythonhosted.org/packages/06/27/4a1b4c267c29a464a161aeb2589aff212b4db653a1d96bffe3598f3f0d22/zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2", size = 4945269, upload-time = "2024-07-15T00:16:20.136Z" }, - { url = "https://files.pythonhosted.org/packages/7c/64/d99261cc57afd9ae65b707e38045ed8269fbdae73544fd2e4a4d50d0ed83/zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5", size = 5306228, upload-time = "2024-07-15T00:16:23.398Z" }, - { url = "https://files.pythonhosted.org/packages/7a/cf/27b74c6f22541f0263016a0fd6369b1b7818941de639215c84e4e94b2a1c/zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f", size = 5336891, upload-time = "2024-07-15T00:16:26.391Z" }, - { url = "https://files.pythonhosted.org/packages/fa/18/89ac62eac46b69948bf35fcd90d37103f38722968e2981f752d69081ec4d/zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed", size = 5436310, upload-time = "2024-07-15T00:16:29.018Z" }, - { url = "https://files.pythonhosted.org/packages/a8/a8/5ca5328ee568a873f5118d5b5f70d1f36c6387716efe2e369010289a5738/zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea", size = 4859912, upload-time = "2024-07-15T00:16:31.871Z" }, - { url = "https://files.pythonhosted.org/packages/ea/ca/3781059c95fd0868658b1cf0440edd832b942f84ae60685d0cfdb808bca1/zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847", size = 4936946, upload-time = "2024-07-15T00:16:34.593Z" }, - { url = "https://files.pythonhosted.org/packages/ce/11/41a58986f809532742c2b832c53b74ba0e0a5dae7e8ab4642bf5876f35de/zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171", size = 5466994, upload-time = "2024-07-15T00:16:36.887Z" }, - { url = "https://files.pythonhosted.org/packages/83/e3/97d84fe95edd38d7053af05159465d298c8b20cebe9ccb3d26783faa9094/zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840", size = 4848681, upload-time = "2024-07-15T00:16:39.709Z" }, - { url = "https://files.pythonhosted.org/packages/6e/99/cb1e63e931de15c88af26085e3f2d9af9ce53ccafac73b6e48418fd5a6e6/zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690", size = 4694239, upload-time = "2024-07-15T00:16:41.83Z" }, - { url = "https://files.pythonhosted.org/packages/ab/50/b1e703016eebbc6501fc92f34db7b1c68e54e567ef39e6e59cf5fb6f2ec0/zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b", size = 5200149, upload-time = "2024-07-15T00:16:44.287Z" }, - { url = "https://files.pythonhosted.org/packages/aa/e0/932388630aaba70197c78bdb10cce2c91fae01a7e553b76ce85471aec690/zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057", size = 5655392, upload-time = "2024-07-15T00:16:46.423Z" }, - { url = "https://files.pythonhosted.org/packages/02/90/2633473864f67a15526324b007a9f96c96f56d5f32ef2a56cc12f9548723/zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33", size = 5191299, upload-time = "2024-07-15T00:16:49.053Z" }, - { url = "https://files.pythonhosted.org/packages/b0/4c/315ca5c32da7e2dc3455f3b2caee5c8c2246074a61aac6ec3378a97b7136/zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd", size = 430862, upload-time = "2024-07-15T00:16:51.003Z" }, - { url = "https://files.pythonhosted.org/packages/a2/bf/c6aaba098e2d04781e8f4f7c0ba3c7aa73d00e4c436bcc0cf059a66691d1/zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b", size = 495578, upload-time = "2024-07-15T00:16:53.135Z" }, +version = "0.25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513, upload-time = "2025-09-14T22:15:54.002Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/7a/28efd1d371f1acd037ac64ed1c5e2b41514a6cc937dd6ab6a13ab9f0702f/zstandard-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e59fdc271772f6686e01e1b3b74537259800f57e24280be3f29c8a0deb1904dd", size = 795256, upload-time = "2025-09-14T22:15:56.415Z" }, + { url = "https://files.pythonhosted.org/packages/96/34/ef34ef77f1ee38fc8e4f9775217a613b452916e633c4f1d98f31db52c4a5/zstandard-0.25.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d441506e9b372386a5271c64125f72d5df6d2a8e8a2a45a0ae09b03cb781ef7", size = 640565, upload-time = "2025-09-14T22:15:58.177Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1b/4fdb2c12eb58f31f28c4d28e8dc36611dd7205df8452e63f52fb6261d13e/zstandard-0.25.0-cp310-cp310-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:ab85470ab54c2cb96e176f40342d9ed41e58ca5733be6a893b730e7af9c40550", size = 5345306, upload-time = "2025-09-14T22:16:00.165Z" }, + { url = "https://files.pythonhosted.org/packages/73/28/a44bdece01bca027b079f0e00be3b6bd89a4df180071da59a3dd7381665b/zstandard-0.25.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e05ab82ea7753354bb054b92e2f288afb750e6b439ff6ca78af52939ebbc476d", size = 5055561, upload-time = "2025-09-14T22:16:02.22Z" }, + { url = "https://files.pythonhosted.org/packages/e9/74/68341185a4f32b274e0fc3410d5ad0750497e1acc20bd0f5b5f64ce17785/zstandard-0.25.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:78228d8a6a1c177a96b94f7e2e8d012c55f9c760761980da16ae7546a15a8e9b", size = 5402214, upload-time = "2025-09-14T22:16:04.109Z" }, + { url = "https://files.pythonhosted.org/packages/8b/67/f92e64e748fd6aaffe01e2b75a083c0c4fd27abe1c8747fee4555fcee7dd/zstandard-0.25.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b6bd67528ee8b5c5f10255735abc21aa106931f0dbaf297c7be0c886353c3d0", size = 5449703, upload-time = "2025-09-14T22:16:06.312Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e5/6d36f92a197c3c17729a2125e29c169f460538a7d939a27eaaa6dcfcba8e/zstandard-0.25.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4b6d83057e713ff235a12e73916b6d356e3084fd3d14ced499d84240f3eecee0", size = 5556583, upload-time = "2025-09-14T22:16:08.457Z" }, + { url = "https://files.pythonhosted.org/packages/d7/83/41939e60d8d7ebfe2b747be022d0806953799140a702b90ffe214d557638/zstandard-0.25.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9174f4ed06f790a6869b41cba05b43eeb9a35f8993c4422ab853b705e8112bbd", size = 5045332, upload-time = "2025-09-14T22:16:10.444Z" }, + { url = "https://files.pythonhosted.org/packages/b3/87/d3ee185e3d1aa0133399893697ae91f221fda79deb61adbe998a7235c43f/zstandard-0.25.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:25f8f3cd45087d089aef5ba3848cd9efe3ad41163d3400862fb42f81a3a46701", size = 5572283, upload-time = "2025-09-14T22:16:12.128Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1d/58635ae6104df96671076ac7d4ae7816838ce7debd94aecf83e30b7121b0/zstandard-0.25.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3756b3e9da9b83da1796f8809dd57cb024f838b9eeafde28f3cb472012797ac1", size = 4959754, upload-time = "2025-09-14T22:16:14.225Z" }, + { url = "https://files.pythonhosted.org/packages/75/d6/57e9cb0a9983e9a229dd8fd2e6e96593ef2aa82a3907188436f22b111ccd/zstandard-0.25.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:81dad8d145d8fd981b2962b686b2241d3a1ea07733e76a2f15435dfb7fb60150", size = 5266477, upload-time = "2025-09-14T22:16:16.343Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a9/ee891e5edf33a6ebce0a028726f0bbd8567effe20fe3d5808c42323e8542/zstandard-0.25.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a5a419712cf88862a45a23def0ae063686db3d324cec7edbe40509d1a79a0aab", size = 5440914, upload-time = "2025-09-14T22:16:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/58/08/a8522c28c08031a9521f27abc6f78dbdee7312a7463dd2cfc658b813323b/zstandard-0.25.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e7360eae90809efd19b886e59a09dad07da4ca9ba096752e61a2e03c8aca188e", size = 5819847, upload-time = "2025-09-14T22:16:20.559Z" }, + { url = "https://files.pythonhosted.org/packages/6f/11/4c91411805c3f7b6f31c60e78ce347ca48f6f16d552fc659af6ec3b73202/zstandard-0.25.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:75ffc32a569fb049499e63ce68c743155477610532da1eb38e7f24bf7cd29e74", size = 5363131, upload-time = "2025-09-14T22:16:22.206Z" }, + { url = "https://files.pythonhosted.org/packages/ef/d6/8c4bd38a3b24c4c7676a7a3d8de85d6ee7a983602a734b9f9cdefb04a5d6/zstandard-0.25.0-cp310-cp310-win32.whl", hash = "sha256:106281ae350e494f4ac8a80470e66d1fe27e497052c8d9c3b95dc4cf1ade81aa", size = 436469, upload-time = "2025-09-14T22:16:25.002Z" }, + { url = "https://files.pythonhosted.org/packages/93/90/96d50ad417a8ace5f841b3228e93d1bb13e6ad356737f42e2dde30d8bd68/zstandard-0.25.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea9d54cc3d8064260114a0bbf3479fc4a98b21dffc89b3459edd506b69262f6e", size = 506100, upload-time = "2025-09-14T22:16:23.569Z" }, + { url = "https://files.pythonhosted.org/packages/2a/83/c3ca27c363d104980f1c9cee1101cc8ba724ac8c28a033ede6aab89585b1/zstandard-0.25.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:933b65d7680ea337180733cf9e87293cc5500cc0eb3fc8769f4d3c88d724ec5c", size = 795254, upload-time = "2025-09-14T22:16:26.137Z" }, + { url = "https://files.pythonhosted.org/packages/ac/4d/e66465c5411a7cf4866aeadc7d108081d8ceba9bc7abe6b14aa21c671ec3/zstandard-0.25.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3f79487c687b1fc69f19e487cd949bf3aae653d181dfb5fde3bf6d18894706f", size = 640559, upload-time = "2025-09-14T22:16:27.973Z" }, + { url = "https://files.pythonhosted.org/packages/12/56/354fe655905f290d3b147b33fe946b0f27e791e4b50a5f004c802cb3eb7b/zstandard-0.25.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0bbc9a0c65ce0eea3c34a691e3c4b6889f5f3909ba4822ab385fab9057099431", size = 5348020, upload-time = "2025-09-14T22:16:29.523Z" }, + { url = "https://files.pythonhosted.org/packages/3b/13/2b7ed68bd85e69a2069bcc72141d378f22cae5a0f3b353a2c8f50ef30c1b/zstandard-0.25.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:01582723b3ccd6939ab7b3a78622c573799d5d8737b534b86d0e06ac18dbde4a", size = 5058126, upload-time = "2025-09-14T22:16:31.811Z" }, + { url = "https://files.pythonhosted.org/packages/c9/dd/fdaf0674f4b10d92cb120ccff58bbb6626bf8368f00ebfd2a41ba4a0dc99/zstandard-0.25.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5f1ad7bf88535edcf30038f6919abe087f606f62c00a87d7e33e7fc57cb69fcc", size = 5405390, upload-time = "2025-09-14T22:16:33.486Z" }, + { url = "https://files.pythonhosted.org/packages/0f/67/354d1555575bc2490435f90d67ca4dd65238ff2f119f30f72d5cde09c2ad/zstandard-0.25.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:06acb75eebeedb77b69048031282737717a63e71e4ae3f77cc0c3b9508320df6", size = 5452914, upload-time = "2025-09-14T22:16:35.277Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1f/e9cfd801a3f9190bf3e759c422bbfd2247db9d7f3d54a56ecde70137791a/zstandard-0.25.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9300d02ea7c6506f00e627e287e0492a5eb0371ec1670ae852fefffa6164b072", size = 5559635, upload-time = "2025-09-14T22:16:37.141Z" }, + { url = "https://files.pythonhosted.org/packages/21/88/5ba550f797ca953a52d708c8e4f380959e7e3280af029e38fbf47b55916e/zstandard-0.25.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfd06b1c5584b657a2892a6014c2f4c20e0db0208c159148fa78c65f7e0b0277", size = 5048277, upload-time = "2025-09-14T22:16:38.807Z" }, + { url = "https://files.pythonhosted.org/packages/46/c0/ca3e533b4fa03112facbe7fbe7779cb1ebec215688e5df576fe5429172e0/zstandard-0.25.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f373da2c1757bb7f1acaf09369cdc1d51d84131e50d5fa9863982fd626466313", size = 5574377, upload-time = "2025-09-14T22:16:40.523Z" }, + { url = "https://files.pythonhosted.org/packages/12/9b/3fb626390113f272abd0799fd677ea33d5fc3ec185e62e6be534493c4b60/zstandard-0.25.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6c0e5a65158a7946e7a7affa6418878ef97ab66636f13353b8502d7ea03c8097", size = 4961493, upload-time = "2025-09-14T22:16:43.3Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d3/23094a6b6a4b1343b27ae68249daa17ae0651fcfec9ed4de09d14b940285/zstandard-0.25.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c8e167d5adf59476fa3e37bee730890e389410c354771a62e3c076c86f9f7778", size = 5269018, upload-time = "2025-09-14T22:16:45.292Z" }, + { url = "https://files.pythonhosted.org/packages/8c/a7/bb5a0c1c0f3f4b5e9d5b55198e39de91e04ba7c205cc46fcb0f95f0383c1/zstandard-0.25.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:98750a309eb2f020da61e727de7d7ba3c57c97cf6213f6f6277bb7fb42a8e065", size = 5443672, upload-time = "2025-09-14T22:16:47.076Z" }, + { url = "https://files.pythonhosted.org/packages/27/22/503347aa08d073993f25109c36c8d9f029c7d5949198050962cb568dfa5e/zstandard-0.25.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:22a086cff1b6ceca18a8dd6096ec631e430e93a8e70a9ca5efa7561a00f826fa", size = 5822753, upload-time = "2025-09-14T22:16:49.316Z" }, + { url = "https://files.pythonhosted.org/packages/e2/be/94267dc6ee64f0f8ba2b2ae7c7a2df934a816baaa7291db9e1aa77394c3c/zstandard-0.25.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:72d35d7aa0bba323965da807a462b0966c91608ef3a48ba761678cb20ce5d8b7", size = 5366047, upload-time = "2025-09-14T22:16:51.328Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a3/732893eab0a3a7aecff8b99052fecf9f605cf0fb5fb6d0290e36beee47a4/zstandard-0.25.0-cp311-cp311-win32.whl", hash = "sha256:f5aeea11ded7320a84dcdd62a3d95b5186834224a9e55b92ccae35d21a8b63d4", size = 436484, upload-time = "2025-09-14T22:16:55.005Z" }, + { url = "https://files.pythonhosted.org/packages/43/a3/c6155f5c1cce691cb80dfd38627046e50af3ee9ddc5d0b45b9b063bfb8c9/zstandard-0.25.0-cp311-cp311-win_amd64.whl", hash = "sha256:daab68faadb847063d0c56f361a289c4f268706b598afbf9ad113cbe5c38b6b2", size = 506183, upload-time = "2025-09-14T22:16:52.753Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3e/8945ab86a0820cc0e0cdbf38086a92868a9172020fdab8a03ac19662b0e5/zstandard-0.25.0-cp311-cp311-win_arm64.whl", hash = "sha256:22a06c5df3751bb7dc67406f5374734ccee8ed37fc5981bf1ad7041831fa1137", size = 462533, upload-time = "2025-09-14T22:16:53.878Z" }, + { url = "https://files.pythonhosted.org/packages/82/fc/f26eb6ef91ae723a03e16eddb198abcfce2bc5a42e224d44cc8b6765e57e/zstandard-0.25.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7b3c3a3ab9daa3eed242d6ecceead93aebbb8f5f84318d82cee643e019c4b73b", size = 795738, upload-time = "2025-09-14T22:16:56.237Z" }, + { url = "https://files.pythonhosted.org/packages/aa/1c/d920d64b22f8dd028a8b90e2d756e431a5d86194caa78e3819c7bf53b4b3/zstandard-0.25.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:913cbd31a400febff93b564a23e17c3ed2d56c064006f54efec210d586171c00", size = 640436, upload-time = "2025-09-14T22:16:57.774Z" }, + { url = "https://files.pythonhosted.org/packages/53/6c/288c3f0bd9fcfe9ca41e2c2fbfd17b2097f6af57b62a81161941f09afa76/zstandard-0.25.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:011d388c76b11a0c165374ce660ce2c8efa8e5d87f34996aa80f9c0816698b64", size = 5343019, upload-time = "2025-09-14T22:16:59.302Z" }, + { url = "https://files.pythonhosted.org/packages/1e/15/efef5a2f204a64bdb5571e6161d49f7ef0fffdbca953a615efbec045f60f/zstandard-0.25.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dffecc361d079bb48d7caef5d673c88c8988d3d33fb74ab95b7ee6da42652ea", size = 5063012, upload-time = "2025-09-14T22:17:01.156Z" }, + { url = "https://files.pythonhosted.org/packages/b7/37/a6ce629ffdb43959e92e87ebdaeebb5ac81c944b6a75c9c47e300f85abdf/zstandard-0.25.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7149623bba7fdf7e7f24312953bcf73cae103db8cae49f8154dd1eadc8a29ecb", size = 5394148, upload-time = "2025-09-14T22:17:03.091Z" }, + { url = "https://files.pythonhosted.org/packages/e3/79/2bf870b3abeb5c070fe2d670a5a8d1057a8270f125ef7676d29ea900f496/zstandard-0.25.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6a573a35693e03cf1d67799fd01b50ff578515a8aeadd4595d2a7fa9f3ec002a", size = 5451652, upload-time = "2025-09-14T22:17:04.979Z" }, + { url = "https://files.pythonhosted.org/packages/53/60/7be26e610767316c028a2cbedb9a3beabdbe33e2182c373f71a1c0b88f36/zstandard-0.25.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5a56ba0db2d244117ed744dfa8f6f5b366e14148e00de44723413b2f3938a902", size = 5546993, upload-time = "2025-09-14T22:17:06.781Z" }, + { url = "https://files.pythonhosted.org/packages/85/c7/3483ad9ff0662623f3648479b0380d2de5510abf00990468c286c6b04017/zstandard-0.25.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:10ef2a79ab8e2974e2075fb984e5b9806c64134810fac21576f0668e7ea19f8f", size = 5046806, upload-time = "2025-09-14T22:17:08.415Z" }, + { url = "https://files.pythonhosted.org/packages/08/b3/206883dd25b8d1591a1caa44b54c2aad84badccf2f1de9e2d60a446f9a25/zstandard-0.25.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aaf21ba8fb76d102b696781bddaa0954b782536446083ae3fdaa6f16b25a1c4b", size = 5576659, upload-time = "2025-09-14T22:17:10.164Z" }, + { url = "https://files.pythonhosted.org/packages/9d/31/76c0779101453e6c117b0ff22565865c54f48f8bd807df2b00c2c404b8e0/zstandard-0.25.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1869da9571d5e94a85a5e8d57e4e8807b175c9e4a6294e3b66fa4efb074d90f6", size = 4953933, upload-time = "2025-09-14T22:17:11.857Z" }, + { url = "https://files.pythonhosted.org/packages/18/e1/97680c664a1bf9a247a280a053d98e251424af51f1b196c6d52f117c9720/zstandard-0.25.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:809c5bcb2c67cd0ed81e9229d227d4ca28f82d0f778fc5fea624a9def3963f91", size = 5268008, upload-time = "2025-09-14T22:17:13.627Z" }, + { url = "https://files.pythonhosted.org/packages/1e/73/316e4010de585ac798e154e88fd81bb16afc5c5cb1a72eeb16dd37e8024a/zstandard-0.25.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f27662e4f7dbf9f9c12391cb37b4c4c3cb90ffbd3b1fb9284dadbbb8935fa708", size = 5433517, upload-time = "2025-09-14T22:17:16.103Z" }, + { url = "https://files.pythonhosted.org/packages/5b/60/dd0f8cfa8129c5a0ce3ea6b7f70be5b33d2618013a161e1ff26c2b39787c/zstandard-0.25.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99c0c846e6e61718715a3c9437ccc625de26593fea60189567f0118dc9db7512", size = 5814292, upload-time = "2025-09-14T22:17:17.827Z" }, + { url = "https://files.pythonhosted.org/packages/fc/5f/75aafd4b9d11b5407b641b8e41a57864097663699f23e9ad4dbb91dc6bfe/zstandard-0.25.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:474d2596a2dbc241a556e965fb76002c1ce655445e4e3bf38e5477d413165ffa", size = 5360237, upload-time = "2025-09-14T22:17:19.954Z" }, + { url = "https://files.pythonhosted.org/packages/ff/8d/0309daffea4fcac7981021dbf21cdb2e3427a9e76bafbcdbdf5392ff99a4/zstandard-0.25.0-cp312-cp312-win32.whl", hash = "sha256:23ebc8f17a03133b4426bcc04aabd68f8236eb78c3760f12783385171b0fd8bd", size = 436922, upload-time = "2025-09-14T22:17:24.398Z" }, + { url = "https://files.pythonhosted.org/packages/79/3b/fa54d9015f945330510cb5d0b0501e8253c127cca7ebe8ba46a965df18c5/zstandard-0.25.0-cp312-cp312-win_amd64.whl", hash = "sha256:ffef5a74088f1e09947aecf91011136665152e0b4b359c42be3373897fb39b01", size = 506276, upload-time = "2025-09-14T22:17:21.429Z" }, + { url = "https://files.pythonhosted.org/packages/ea/6b/8b51697e5319b1f9ac71087b0af9a40d8a6288ff8025c36486e0c12abcc4/zstandard-0.25.0-cp312-cp312-win_arm64.whl", hash = "sha256:181eb40e0b6a29b3cd2849f825e0fa34397f649170673d385f3598ae17cca2e9", size = 462679, upload-time = "2025-09-14T22:17:23.147Z" }, + { url = "https://files.pythonhosted.org/packages/35/0b/8df9c4ad06af91d39e94fa96cc010a24ac4ef1378d3efab9223cc8593d40/zstandard-0.25.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94", size = 795735, upload-time = "2025-09-14T22:17:26.042Z" }, + { url = "https://files.pythonhosted.org/packages/3f/06/9ae96a3e5dcfd119377ba33d4c42a7d89da1efabd5cb3e366b156c45ff4d/zstandard-0.25.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1", size = 640440, upload-time = "2025-09-14T22:17:27.366Z" }, + { url = "https://files.pythonhosted.org/packages/d9/14/933d27204c2bd404229c69f445862454dcc101cd69ef8c6068f15aaec12c/zstandard-0.25.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:e96594a5537722fdfb79951672a2a63aec5ebfb823e7560586f7484819f2a08f", size = 5343070, upload-time = "2025-09-14T22:17:28.896Z" }, + { url = "https://files.pythonhosted.org/packages/6d/db/ddb11011826ed7db9d0e485d13df79b58586bfdec56e5c84a928a9a78c1c/zstandard-0.25.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea", size = 5063001, upload-time = "2025-09-14T22:17:31.044Z" }, + { url = "https://files.pythonhosted.org/packages/db/00/87466ea3f99599d02a5238498b87bf84a6348290c19571051839ca943777/zstandard-0.25.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e", size = 5394120, upload-time = "2025-09-14T22:17:32.711Z" }, + { url = "https://files.pythonhosted.org/packages/2b/95/fc5531d9c618a679a20ff6c29e2b3ef1d1f4ad66c5e161ae6ff847d102a9/zstandard-0.25.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551", size = 5451230, upload-time = "2025-09-14T22:17:34.41Z" }, + { url = "https://files.pythonhosted.org/packages/63/4b/e3678b4e776db00f9f7b2fe58e547e8928ef32727d7a1ff01dea010f3f13/zstandard-0.25.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a", size = 5547173, upload-time = "2025-09-14T22:17:36.084Z" }, + { url = "https://files.pythonhosted.org/packages/4e/d5/ba05ed95c6b8ec30bd468dfeab20589f2cf709b5c940483e31d991f2ca58/zstandard-0.25.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611", size = 5046736, upload-time = "2025-09-14T22:17:37.891Z" }, + { url = "https://files.pythonhosted.org/packages/50/d5/870aa06b3a76c73eced65c044b92286a3c4e00554005ff51962deef28e28/zstandard-0.25.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3", size = 5576368, upload-time = "2025-09-14T22:17:40.206Z" }, + { url = "https://files.pythonhosted.org/packages/5d/35/398dc2ffc89d304d59bc12f0fdd931b4ce455bddf7038a0a67733a25f550/zstandard-0.25.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b", size = 4954022, upload-time = "2025-09-14T22:17:41.879Z" }, + { url = "https://files.pythonhosted.org/packages/9a/5c/36ba1e5507d56d2213202ec2b05e8541734af5f2ce378c5d1ceaf4d88dc4/zstandard-0.25.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1673b7199bbe763365b81a4f3252b8e80f44c9e323fc42940dc8843bfeaf9851", size = 5267889, upload-time = "2025-09-14T22:17:43.577Z" }, + { url = "https://files.pythonhosted.org/packages/70/e8/2ec6b6fb7358b2ec0113ae202647ca7c0e9d15b61c005ae5225ad0995df5/zstandard-0.25.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250", size = 5433952, upload-time = "2025-09-14T22:17:45.271Z" }, + { url = "https://files.pythonhosted.org/packages/7b/01/b5f4d4dbc59ef193e870495c6f1275f5b2928e01ff5a81fecb22a06e22fb/zstandard-0.25.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98", size = 5814054, upload-time = "2025-09-14T22:17:47.08Z" }, + { url = "https://files.pythonhosted.org/packages/b2/e5/fbd822d5c6f427cf158316d012c5a12f233473c2f9c5fe5ab1ae5d21f3d8/zstandard-0.25.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf", size = 5360113, upload-time = "2025-09-14T22:17:48.893Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e0/69a553d2047f9a2c7347caa225bb3a63b6d7704ad74610cb7823baa08ed7/zstandard-0.25.0-cp313-cp313-win32.whl", hash = "sha256:7030defa83eef3e51ff26f0b7bfb229f0204b66fe18e04359ce3474ac33cbc09", size = 436936, upload-time = "2025-09-14T22:17:52.658Z" }, + { url = "https://files.pythonhosted.org/packages/d9/82/b9c06c870f3bd8767c201f1edbdf9e8dc34be5b0fbc5682c4f80fe948475/zstandard-0.25.0-cp313-cp313-win_amd64.whl", hash = "sha256:1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5", size = 506232, upload-time = "2025-09-14T22:17:50.402Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/60c3c01243bb81d381c9916e2a6d9e149ab8627c0c7d7abb2d73384b3c0c/zstandard-0.25.0-cp313-cp313-win_arm64.whl", hash = "sha256:85304a43f4d513f5464ceb938aa02c1e78c2943b29f44a750b48b25ac999a049", size = 462671, upload-time = "2025-09-14T22:17:51.533Z" }, + { url = "https://files.pythonhosted.org/packages/3d/5c/f8923b595b55fe49e30612987ad8bf053aef555c14f05bb659dd5dbe3e8a/zstandard-0.25.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3", size = 795887, upload-time = "2025-09-14T22:17:54.198Z" }, + { url = "https://files.pythonhosted.org/packages/8d/09/d0a2a14fc3439c5f874042dca72a79c70a532090b7ba0003be73fee37ae2/zstandard-0.25.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f", size = 640658, upload-time = "2025-09-14T22:17:55.423Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7c/8b6b71b1ddd517f68ffb55e10834388d4f793c49c6b83effaaa05785b0b4/zstandard-0.25.0-cp314-cp314-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f604efd28f239cc21b3adb53eb061e2a205dc164be408e553b41ba2ffe0ca15c", size = 5379849, upload-time = "2025-09-14T22:17:57.372Z" }, + { url = "https://files.pythonhosted.org/packages/a4/86/a48e56320d0a17189ab7a42645387334fba2200e904ee47fc5a26c1fd8ca/zstandard-0.25.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439", size = 5058095, upload-time = "2025-09-14T22:17:59.498Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ad/eb659984ee2c0a779f9d06dbfe45e2dc39d99ff40a319895df2d3d9a48e5/zstandard-0.25.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e54296a283f3ab5a26fc9b8b5d4978ea0532f37b231644f367aa588930aa043", size = 5551751, upload-time = "2025-09-14T22:18:01.618Z" }, + { url = "https://files.pythonhosted.org/packages/61/b3/b637faea43677eb7bd42ab204dfb7053bd5c4582bfe6b1baefa80ac0c47b/zstandard-0.25.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca54090275939dc8ec5dea2d2afb400e0f83444b2fc24e07df7fdef677110859", size = 6364818, upload-time = "2025-09-14T22:18:03.769Z" }, + { url = "https://files.pythonhosted.org/packages/31/dc/cc50210e11e465c975462439a492516a73300ab8caa8f5e0902544fd748b/zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0", size = 5560402, upload-time = "2025-09-14T22:18:05.954Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ae/56523ae9c142f0c08efd5e868a6da613ae76614eca1305259c3bf6a0ed43/zstandard-0.25.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a9ec8c642d1ec73287ae3e726792dd86c96f5681eb8df274a757bf62b750eae7", size = 4955108, upload-time = "2025-09-14T22:18:07.68Z" }, + { url = "https://files.pythonhosted.org/packages/98/cf/c899f2d6df0840d5e384cf4c4121458c72802e8bda19691f3b16619f51e9/zstandard-0.25.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4089a10e598eae6393756b036e0f419e8c1d60f44a831520f9af41c14216cf2", size = 5269248, upload-time = "2025-09-14T22:18:09.753Z" }, + { url = "https://files.pythonhosted.org/packages/1b/c0/59e912a531d91e1c192d3085fc0f6fb2852753c301a812d856d857ea03c6/zstandard-0.25.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f67e8f1a324a900e75b5e28ffb152bcac9fbed1cc7b43f99cd90f395c4375344", size = 5430330, upload-time = "2025-09-14T22:18:11.966Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/7e31db1240de2df22a58e2ea9a93fc6e38cc29353e660c0272b6735d6669/zstandard-0.25.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:9654dbc012d8b06fc3d19cc825af3f7bf8ae242226df5f83936cb39f5fdc846c", size = 5811123, upload-time = "2025-09-14T22:18:13.907Z" }, + { url = "https://files.pythonhosted.org/packages/f6/49/fac46df5ad353d50535e118d6983069df68ca5908d4d65b8c466150a4ff1/zstandard-0.25.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4203ce3b31aec23012d3a4cf4a2ed64d12fea5269c49aed5e4c3611b938e4088", size = 5359591, upload-time = "2025-09-14T22:18:16.465Z" }, + { url = "https://files.pythonhosted.org/packages/c2/38/f249a2050ad1eea0bb364046153942e34abba95dd5520af199aed86fbb49/zstandard-0.25.0-cp314-cp314-win32.whl", hash = "sha256:da469dc041701583e34de852d8634703550348d5822e66a0c827d39b05365b12", size = 444513, upload-time = "2025-09-14T22:18:20.61Z" }, + { url = "https://files.pythonhosted.org/packages/3a/43/241f9615bcf8ba8903b3f0432da069e857fc4fd1783bd26183db53c4804b/zstandard-0.25.0-cp314-cp314-win_amd64.whl", hash = "sha256:c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2", size = 516118, upload-time = "2025-09-14T22:18:17.849Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ef/da163ce2450ed4febf6467d77ccb4cd52c4c30ab45624bad26ca0a27260c/zstandard-0.25.0-cp314-cp314-win_arm64.whl", hash = "sha256:d7541afd73985c630bafcd6338d2518ae96060075f9463d7dc14cfb33514383d", size = 476940, upload-time = "2025-09-14T22:18:19.088Z" }, ] From 2457a66134dbc733af7396f44124616060da0100 Mon Sep 17 00:00:00 2001 From: Maple Xu Date: Fri, 17 Apr 2026 23:12:20 -0400 Subject: [PATCH 02/14] Enrich LangSmith tracing usage across basic and chatbot samples - Add @traceable with metadata, tags, and run_type variety to workflows - Add client-side @traceable on starters for end-to-end trace linking - Add --temporal-runs flag to workers and starters for add_temporal_runs toggle - Use run_type="llm" for OpenAI calls, "tool" for save_note, "chain" for orchestration - Add trace tree diagrams to README showing both add_temporal_runs modes - Add "Three Layers of Tracing" section to README (wrap_openai, @traceable, Temporal plugin) - Skip all tests when temporalio.contrib.langsmith is unavailable (pending SDK release) Co-Authored-By: Claude Opus 4.6 (1M context) --- langsmith_tracing/README.md | 64 +++++++++++++++++++++++-- langsmith_tracing/basic/starter.py | 27 ++++++++--- langsmith_tracing/basic/worker.py | 13 ++++- langsmith_tracing/basic/workflows.py | 28 ++++++++--- langsmith_tracing/chatbot/activities.py | 13 +++-- langsmith_tracing/chatbot/starter.py | 64 ++++++++++++++++++------- langsmith_tracing/chatbot/worker.py | 11 ++++- langsmith_tracing/chatbot/workflows.py | 23 ++++++++- tests/langsmith_tracing/test_basic.py | 16 ++++++- 9 files changed, 213 insertions(+), 46 deletions(-) diff --git a/langsmith_tracing/README.md b/langsmith_tracing/README.md index a6cf626a..78284169 100644 --- a/langsmith_tracing/README.md +++ b/langsmith_tracing/README.md @@ -25,6 +25,16 @@ export LANGCHAIN_TRACING_V2=true A local Temporal server must be running (`temporal server start-dev`). +## Three Layers of Tracing + +This sample shows three complementary ways LangSmith captures trace data: + +1. **Automatic (`wrap_openai`)** — Wrapping the OpenAI client with `wrap_openai()` automatically captures model parameters, token usage, and latency for every LLM call. No extra code needed. + +2. **Explicit (`@traceable`)** — Decorating functions with `@traceable` creates named spans for your business logic. You control the name, tags, metadata, and `run_type` (chain, llm, tool, retriever). This is how you structure traces to tell a story about what your application is doing. + +3. **Temporal (`add_temporal_runs=True`)** — The `LangSmithPlugin` can optionally create LangSmith runs for each Temporal workflow execution and activity execution, giving visibility into the orchestration layer alongside your LLM calls. + ## Basic Example Runs a single workflow that asks OpenAI "What is Temporal?" and returns the response. @@ -37,11 +47,39 @@ python -m langsmith_tracing.basic.worker python -m langsmith_tracing.basic.starter ``` +### Trace output (`add_temporal_runs=False`, default) + +``` +Basic LLM Request (@traceable, client-side) +└── Ask: What is Temporal? (@traceable, workflow) + └── Call OpenAI (@traceable, activity) + └── openai.responses.create (automatic via wrap_openai) +``` + +### Trace output (`add_temporal_runs=True`) + +Pass `--temporal-runs` to both the worker and starter: + +```bash +python -m langsmith_tracing.basic.worker --temporal-runs +python -m langsmith_tracing.basic.starter --temporal-runs +``` + +``` +Basic LLM Request (@traceable, client-side) +└── StartWorkflow:BasicLLMWorkflow (automatic, Temporal plugin) + └── RunWorkflow:BasicLLMWorkflow (automatic, Temporal plugin) + └── Ask: What is Temporal? (@traceable, workflow) + └── ExecuteActivity:call_openai (automatic, Temporal plugin) + └── Call OpenAI (@traceable, activity) + └── openai.responses.create (automatic via wrap_openai) +``` + ## Chatbot Example Starts a long-running workflow that accepts messages via signals and responds via queries. The model has two tools: -- `save_note(name, content)` — saves a note durably (calls an activity) +- `save_note(name, content)` — saves a note durably via an activity - `read_note(name)` — reads a note from workflow state (no activity needed) ```bash @@ -57,11 +95,29 @@ Commands in the CLI: - `notes` — display all saved notes - `exit` — end the session -## `add_temporal_runs` +### Trace output (conversation with tool calls) -By default, `LangSmithPlugin(add_temporal_runs=False)` only propagates LangSmith context so that `@traceable` and `wrap_openai` calls nest under the correct parent trace. +``` +Chatbot Session a1b2c3d4 (@traceable, client-side) +├── Turn: What's the capital of Fr.. (@traceable, client-side) +├── Turn: Save that as a note call.. (@traceable, client-side) +└── Turn: What did I save about pa.. (@traceable, client-side) +``` + +On the worker side: -Set `add_temporal_runs=True` to also create LangSmith runs for each Temporal workflow execution and activity execution, giving you visibility into Temporal operations alongside your LLM calls. +``` +Session Apr 17 10:30 (@traceable, workflow) +├── Request: What's the capital of France? (@traceable, workflow) +│ └── Call OpenAI (@traceable + wrap_openai, activity) +├── Request: Save that as a note called paris (@traceable, workflow) +│ ├── Call OpenAI → returns function_call: save_note +│ ├── Save Note (@traceable, activity) +│ └── Call OpenAI → returns text response +└── Request: What did I save about paris? (@traceable, workflow) + ├── Call OpenAI → returns function_call: read_note + └── Call OpenAI → returns text (read_note is a workflow state lookup, no activity) +``` ## Viewing Traces diff --git a/langsmith_tracing/basic/starter.py b/langsmith_tracing/basic/starter.py index 7b0555dd..f73e5156 100644 --- a/langsmith_tracing/basic/starter.py +++ b/langsmith_tracing/basic/starter.py @@ -1,7 +1,9 @@ """Starter for the basic LangSmith sample.""" import asyncio +import sys +from langsmith import traceable from temporalio.client import Client from temporalio.contrib.langsmith import LangSmithPlugin from temporalio.contrib.pydantic import pydantic_data_converter @@ -11,10 +13,15 @@ async def main(): + add_temporal_runs = "--temporal-runs" in sys.argv + config = ClientConfig.load_client_connect_config() config.setdefault("target_host", "localhost:7233") - plugin = LangSmithPlugin(project_name="langsmith-basic") + plugin = LangSmithPlugin( + project_name="langsmith-basic", + add_temporal_runs=add_temporal_runs, + ) client = await Client.connect( **config, @@ -22,12 +29,18 @@ async def main(): plugins=[plugin], ) - result = await client.execute_workflow( - BasicLLMWorkflow.run, - "What is Temporal?", - id="langsmith-basic-workflow-id", - task_queue="langsmith-basic-task-queue", - ) + # Client-side @traceable wraps the entire workflow call, creating a + # root span in LangSmith that the workflow and activity traces nest under. + @traceable(name="Basic LLM Request", run_type="chain", tags=["client-side"]) + async def run_workflow(prompt: str) -> str: + return await client.execute_workflow( + BasicLLMWorkflow.run, + prompt, + id="langsmith-basic-workflow-id", + task_queue="langsmith-basic-task-queue", + ) + + result = await run_workflow("What is Temporal?") print(f"Workflow result: {result}") diff --git a/langsmith_tracing/basic/worker.py b/langsmith_tracing/basic/worker.py index 6837b479..1a26bbba 100644 --- a/langsmith_tracing/basic/worker.py +++ b/langsmith_tracing/basic/worker.py @@ -2,6 +2,7 @@ import asyncio import logging +import sys from temporalio.client import Client from temporalio.contrib.langsmith import LangSmithPlugin @@ -18,6 +19,10 @@ async def main(): logging.basicConfig(level=logging.INFO) + # add_temporal_runs=True creates LangSmith runs for each Temporal + # workflow/activity execution. False (default) only propagates context. + add_temporal_runs = "--temporal-runs" in sys.argv + config = ClientConfig.load_client_connect_config() config.setdefault("target_host", "localhost:7233") @@ -26,7 +31,10 @@ async def main(): data_converter=pydantic_data_converter, ) - plugin = LangSmithPlugin(project_name="langsmith-basic") + plugin = LangSmithPlugin( + project_name="langsmith-basic", + add_temporal_runs=add_temporal_runs, + ) async with Worker( client, @@ -36,7 +44,8 @@ async def main(): plugins=[plugin], max_cached_workflows=0, ): - print("Worker started, ctrl+c to exit") + label = "with" if add_temporal_runs else "without" + print(f"Worker started ({label} Temporal runs in traces), ctrl+c to exit") await interrupt_event.wait() print("Shutting down") diff --git a/langsmith_tracing/basic/workflows.py b/langsmith_tracing/basic/workflows.py index dd26f1b0..2ef95131 100644 --- a/langsmith_tracing/basic/workflows.py +++ b/langsmith_tracing/basic/workflows.py @@ -1,4 +1,4 @@ -"""Basic one-shot LLM workflow.""" +"""Basic one-shot LLM workflow with LangSmith tracing.""" from datetime import timedelta @@ -6,6 +6,8 @@ from temporalio.common import RetryPolicy with workflow.unsafe.imports_passed_through(): + from langsmith import traceable + from langsmith_tracing.basic.activities import OpenAIRequest, call_openai RETRY = RetryPolicy(initial_interval=timedelta(seconds=2), maximum_attempts=3) @@ -15,10 +17,22 @@ class BasicLLMWorkflow: @workflow.run async def run(self, prompt: str) -> str: - response = await workflow.execute_activity( - call_openai, - OpenAIRequest(model="gpt-4o-mini", input=prompt), - start_to_close_timeout=timedelta(seconds=60), - retry_policy=RETRY, + # @traceable creates a named span in LangSmith. Inside a workflow, + # it nests under the workflow's trace (when add_temporal_runs=True) + # or stands alone as a root span (when add_temporal_runs=False). + @traceable( + name=f"Ask: {prompt[:60]}", + run_type="chain", + metadata={"workflow_id": workflow.info().workflow_id}, + tags=["basic-llm"], ) - return response.output_text + async def _run() -> str: + response = await workflow.execute_activity( + call_openai, + OpenAIRequest(model="gpt-4o-mini", input=prompt), + start_to_close_timeout=timedelta(seconds=60), + retry_policy=RETRY, + ) + return response.output_text + + return await _run() diff --git a/langsmith_tracing/chatbot/activities.py b/langsmith_tracing/chatbot/activities.py index 1023c706..27310b5b 100644 --- a/langsmith_tracing/chatbot/activities.py +++ b/langsmith_tracing/chatbot/activities.py @@ -1,6 +1,6 @@ """Chatbot activities with LangSmith tracing.""" -from dataclasses import dataclass, field +from dataclasses import dataclass from langsmith import traceable from langsmith.wrappers import wrap_openai @@ -13,12 +13,17 @@ class OpenAIRequest: model: str input: str | list - instructions: str = "You are a helpful assistant with note-taking abilities. Use save_note to remember things and read_note to recall them." + instructions: str = ( + "You are a helpful assistant with note-taking abilities. " + "Use save_note to remember things and read_note to recall them." + ) tools: list | None = None previous_response_id: str | None = None -@traceable(name="Call OpenAI") +# wrap_openai automatically traces LLM calls in LangSmith — capturing +# model parameters, token usage, and latency without extra code. +@traceable(name="Call OpenAI", run_type="llm") @activity.defn async def call_openai(request: OpenAIRequest) -> Response: """Call OpenAI Responses API. Retries handled by Temporal.""" @@ -36,6 +41,8 @@ async def call_openai(request: OpenAIRequest) -> Response: return await client.responses.create(**kwargs) +# run_type="tool" tells LangSmith this is a tool execution, which renders +# distinctly in the trace UI alongside LLM calls and chains. @traceable(name="Save Note", run_type="tool") @activity.defn async def save_note(name: str, content: str) -> str: diff --git a/langsmith_tracing/chatbot/starter.py b/langsmith_tracing/chatbot/starter.py index c16e3ab7..7f97eca2 100644 --- a/langsmith_tracing/chatbot/starter.py +++ b/langsmith_tracing/chatbot/starter.py @@ -2,9 +2,11 @@ import asyncio import readline # noqa: F401 — enables input() line editing +import sys import uuid import langsmith as ls +from langsmith import traceable from temporalio.client import Client from temporalio.contrib.langsmith import LangSmithPlugin from temporalio.contrib.pydantic import pydantic_data_converter @@ -14,10 +16,15 @@ async def main(): + add_temporal_runs = "--temporal-runs" in sys.argv + config = ClientConfig.load_client_connect_config() config.setdefault("target_host", "localhost:7233") - plugin = LangSmithPlugin(project_name="langsmith-chatbot") + plugin = LangSmithPlugin( + project_name="langsmith-chatbot", + add_temporal_runs=add_temporal_runs, + ) client = await Client.connect( **config, @@ -25,15 +32,24 @@ async def main(): plugins=[plugin], ) - wf_handle = await client.start_workflow( - ChatbotWorkflow.run, - id=f"langsmith-chatbot-{uuid.uuid4().hex[:8]}", - task_queue="langsmith-chatbot-task-queue", + wf_id = f"langsmith-chatbot-{uuid.uuid4().hex[:8]}" + + # Client-side trace wraps the full interactive session. Each turn + # (signal + query poll) nests under this root span in LangSmith. + @traceable( + name=f"Chatbot Session {wf_id[-8:]}", + run_type="chain", + tags=["client-side", "chatbot"], ) - print(f"Started workflow: {wf_handle.id}") - print('Type a message, "notes" to see saved notes, or "exit" to quit.\n') + async def run_session(): + wf_handle = await client.start_workflow( + ChatbotWorkflow.run, + id=wf_id, + task_queue="langsmith-chatbot-task-queue", + ) + print(f"Started workflow: {wf_handle.id}") + print('Type a message, "notes" to see saved notes, or "exit" to quit.\n') - try: while True: user_input = input("You: ").strip() if not user_input: @@ -43,7 +59,7 @@ async def main(): await wf_handle.signal(ChatbotWorkflow.exit) result = await wf_handle.result() print(f"\nWorkflow finished: {result}") - break + return if user_input.lower() == "notes": notes = await wf_handle.query(ChatbotWorkflow.notes) @@ -54,18 +70,30 @@ async def main(): print(" (no notes yet)") continue - prev_response = await wf_handle.query(ChatbotWorkflow.last_response) - await wf_handle.signal(ChatbotWorkflow.user_message, user_input) + # Each turn gets its own trace span + @traceable( + name=f"Turn: {user_input[:40]}", + run_type="chain", + tags=["client-turn"], + ) + async def send_and_wait(msg: str): + prev_response = await wf_handle.query(ChatbotWorkflow.last_response) + await wf_handle.signal(ChatbotWorkflow.user_message, msg) + for _ in range(60): + await asyncio.sleep(0.5) + response = await wf_handle.query(ChatbotWorkflow.last_response) + if response != prev_response: + return response + return None - # Poll for a new response - for _ in range(60): - await asyncio.sleep(0.5) - response = await wf_handle.query(ChatbotWorkflow.last_response) - if response != prev_response: - print(f"Bot: {response}\n") - break + response = await send_and_wait(user_input) + if response: + print(f"Bot: {response}\n") else: print("(timed out waiting for response)") + + try: + await run_session() finally: ls.flush() diff --git a/langsmith_tracing/chatbot/worker.py b/langsmith_tracing/chatbot/worker.py index f2530145..95c0bbbd 100644 --- a/langsmith_tracing/chatbot/worker.py +++ b/langsmith_tracing/chatbot/worker.py @@ -2,6 +2,7 @@ import asyncio import logging +import sys from temporalio.client import Client from temporalio.contrib.langsmith import LangSmithPlugin @@ -18,6 +19,8 @@ async def main(): logging.basicConfig(level=logging.INFO) + add_temporal_runs = "--temporal-runs" in sys.argv + config = ClientConfig.load_client_connect_config() config.setdefault("target_host", "localhost:7233") @@ -26,7 +29,10 @@ async def main(): data_converter=pydantic_data_converter, ) - plugin = LangSmithPlugin(project_name="langsmith-chatbot") + plugin = LangSmithPlugin( + project_name="langsmith-chatbot", + add_temporal_runs=add_temporal_runs, + ) async with Worker( client, @@ -36,7 +42,8 @@ async def main(): plugins=[plugin], max_cached_workflows=0, ): - print("Worker started, ctrl+c to exit") + label = "with" if add_temporal_runs else "without" + print(f"Worker started ({label} Temporal runs in traces), ctrl+c to exit") await interrupt_event.wait() print("Shutting down") diff --git a/langsmith_tracing/chatbot/workflows.py b/langsmith_tracing/chatbot/workflows.py index 180b108f..5992117e 100644 --- a/langsmith_tracing/chatbot/workflows.py +++ b/langsmith_tracing/chatbot/workflows.py @@ -1,4 +1,4 @@ -"""Conversational chatbot workflow with tool loop.""" +"""Conversational chatbot workflow with tool loop and LangSmith tracing.""" import json from datetime import timedelta @@ -79,10 +79,14 @@ def notes(self) -> dict[str, str]: @workflow.run async def run(self) -> str: + # Dynamic trace name — each session gets a unique, timestamped span + # in LangSmith so you can distinguish between sessions. now = workflow.now().strftime("%b %d %H:%M") return await traceable( name=f"Session {now}", run_type="chain", + metadata={"workflow_id": workflow.info().workflow_id}, + tags=["chatbot-session"], )(self._session)() async def _session(self) -> str: @@ -99,7 +103,20 @@ async def _session(self) -> str: return "Session ended." async def _query_openai(self, message: str | None) -> str: - @traceable(name=f"Request: {(message or '')[:60]}", run_type="chain") + # Each user message gets its own named span. In LangSmith you'll see: + # Session Apr 17 10:30 + # ├── Request: What's the capital of France? + # │ └── Call OpenAI (activity) + # ├── Request: Save that as a note called "paris" + # │ ├── Call OpenAI (activity) → function_call: save_note + # │ ├── Save Note (activity) + # │ └── Call OpenAI (activity) → text response + # └── ... + @traceable( + name=f"Request: {(message or '')[:60]}", + run_type="chain", + tags=["user-message"], + ) async def _traced(): input_for_next: str | list = message or "" while True: @@ -137,6 +154,8 @@ async def _traced(): } ) elif item.name == "read_note": + # read_note is a pure workflow state lookup — no + # activity needed, no I/O, just a dict.get(). content = self._notes.get(args["name"], "Note not found.") tool_results.append( { diff --git a/tests/langsmith_tracing/test_basic.py b/tests/langsmith_tracing/test_basic.py index 5da4a359..1b3ebc12 100644 --- a/tests/langsmith_tracing/test_basic.py +++ b/tests/langsmith_tracing/test_basic.py @@ -1,5 +1,6 @@ import uuid +import pytest from openai.types.responses import Response from openai.types.responses.response_output_message import ResponseOutputMessage from openai.types.responses.response_output_text import ResponseOutputText @@ -8,9 +9,21 @@ from temporalio.testing import WorkflowEnvironment from temporalio.worker import Worker -from langsmith_tracing.basic.activities import OpenAIRequest, call_openai +try: + from temporalio.contrib.langsmith import LangSmithPlugin +except ImportError: + LangSmithPlugin = None # type: ignore[assignment,misc] + +from langsmith_tracing.basic.activities import OpenAIRequest from langsmith_tracing.basic.workflows import BasicLLMWorkflow +# The workflow uses @traceable which requires the LangSmithPlugin's +# aio_to_thread patch to work inside the workflow sandbox. +pytestmark = pytest.mark.skipif( + LangSmithPlugin is None, + reason="temporalio.contrib.langsmith not available", +) + def _make_text_response(text: str) -> Response: """Build a minimal Response with a text output.""" @@ -53,6 +66,7 @@ async def mock_call_openai(request: OpenAIRequest) -> Response: task_queue="test-langsmith-basic", workflows=[BasicLLMWorkflow], activities=[mock_call_openai], + plugins=[LangSmithPlugin()], ): result = await client.execute_workflow( BasicLLMWorkflow.run, From 5098f630a2a3c579bd7c55cc50b01db17d09c7b1 Mon Sep 17 00:00:00 2001 From: Maple Xu Date: Mon, 20 Apr 2026 14:42:03 -0400 Subject: [PATCH 03/14] Address review feedback: READMEs, comments, activity conventions - Split top-level README into per-sample READMEs (basic/ and chatbot/) with detailed trace structure diagrams and screenshot placeholders - Add replay safety comment on @workflow.run methods explaining why @traceable must wrap an inner function - Make read_note a proper activity for LangSmith trace visibility - Change save_note/read_note to use NoteRequest dataclass (single arg) - Fix misplaced comments in activities (wrap_openai, run_type docs) - Add links to LangSmith docs and Temporal SDK plugin docs - Add add_temporal_runs explanation section to top-level README Co-Authored-By: Claude Opus 4.6 (1M context) --- langsmith_tracing/README.md | 97 +++---------------------- langsmith_tracing/basic/README.md | 49 +++++++++++++ langsmith_tracing/basic/activities.py | 4 +- langsmith_tracing/basic/workflows.py | 6 +- langsmith_tracing/chatbot/README.md | 76 +++++++++++++++++++ langsmith_tracing/chatbot/activities.py | 29 ++++++-- langsmith_tracing/chatbot/worker.py | 4 +- langsmith_tracing/chatbot/workflows.py | 27 +++---- tests/langsmith_tracing/test_chatbot.py | 43 +++++------ 9 files changed, 196 insertions(+), 139 deletions(-) create mode 100644 langsmith_tracing/basic/README.md create mode 100644 langsmith_tracing/chatbot/README.md diff --git a/langsmith_tracing/README.md b/langsmith_tracing/README.md index 78284169..babeba55 100644 --- a/langsmith_tracing/README.md +++ b/langsmith_tracing/README.md @@ -1,11 +1,11 @@ # LangSmith Tracing -This sample demonstrates [LangSmith](https://smith.langchain.com/) tracing integration with Temporal workflows using the `LangSmithPlugin`. +This sample demonstrates [LangSmith](https://smith.langchain.com/) tracing integration with Temporal workflows using the [`LangSmithPlugin`](https://python.temporal.io/temporalio.contrib.langsmith.html). Two examples are included: -- **basic/** — A one-shot LLM workflow that sends a prompt to OpenAI and returns the response. -- **chatbot/** — A long-running conversational workflow with tool calls (save/read notes), signals, and queries. +- **[basic/](basic/)** — A one-shot LLM workflow that sends a prompt to OpenAI and returns the response. +- **[chatbot/](chatbot/)** — A long-running conversational workflow with tool calls (save/read notes), signals, and queries. ## Prerequisites @@ -35,90 +35,15 @@ This sample shows three complementary ways LangSmith captures trace data: 3. **Temporal (`add_temporal_runs=True`)** — The `LangSmithPlugin` can optionally create LangSmith runs for each Temporal workflow execution and activity execution, giving visibility into the orchestration layer alongside your LLM calls. -## Basic Example +## `add_temporal_runs` -Runs a single workflow that asks OpenAI "What is Temporal?" and returns the response. +By default, `LangSmithPlugin(add_temporal_runs=False)` only propagates LangSmith context so that `@traceable` and `wrap_openai` calls nest correctly. -```bash -# Terminal 1 — start the worker -python -m langsmith_tracing.basic.worker - -# Terminal 2 — run the workflow -python -m langsmith_tracing.basic.starter -``` - -### Trace output (`add_temporal_runs=False`, default) - -``` -Basic LLM Request (@traceable, client-side) -└── Ask: What is Temporal? (@traceable, workflow) - └── Call OpenAI (@traceable, activity) - └── openai.responses.create (automatic via wrap_openai) -``` - -### Trace output (`add_temporal_runs=True`) - -Pass `--temporal-runs` to both the worker and starter: - -```bash -python -m langsmith_tracing.basic.worker --temporal-runs -python -m langsmith_tracing.basic.starter --temporal-runs -``` - -``` -Basic LLM Request (@traceable, client-side) -└── StartWorkflow:BasicLLMWorkflow (automatic, Temporal plugin) - └── RunWorkflow:BasicLLMWorkflow (automatic, Temporal plugin) - └── Ask: What is Temporal? (@traceable, workflow) - └── ExecuteActivity:call_openai (automatic, Temporal plugin) - └── Call OpenAI (@traceable, activity) - └── openai.responses.create (automatic via wrap_openai) -``` - -## Chatbot Example - -Starts a long-running workflow that accepts messages via signals and responds via queries. The model has two tools: - -- `save_note(name, content)` — saves a note durably via an activity -- `read_note(name)` — reads a note from workflow state (no activity needed) - -```bash -# Terminal 1 — start the worker -python -m langsmith_tracing.chatbot.worker - -# Terminal 2 — interactive CLI -python -m langsmith_tracing.chatbot.starter -``` - -Commands in the CLI: -- Type a message and press Enter to chat -- `notes` — display all saved notes -- `exit` — end the session - -### Trace output (conversation with tool calls) - -``` -Chatbot Session a1b2c3d4 (@traceable, client-side) -├── Turn: What's the capital of Fr.. (@traceable, client-side) -├── Turn: Save that as a note call.. (@traceable, client-side) -└── Turn: What did I save about pa.. (@traceable, client-side) -``` - -On the worker side: - -``` -Session Apr 17 10:30 (@traceable, workflow) -├── Request: What's the capital of France? (@traceable, workflow) -│ └── Call OpenAI (@traceable + wrap_openai, activity) -├── Request: Save that as a note called paris (@traceable, workflow) -│ ├── Call OpenAI → returns function_call: save_note -│ ├── Save Note (@traceable, activity) -│ └── Call OpenAI → returns text response -└── Request: What did I save about paris? (@traceable, workflow) - ├── Call OpenAI → returns function_call: read_note - └── Call OpenAI → returns text (read_note is a workflow state lookup, no activity) -``` +Set `add_temporal_runs=True` to also create LangSmith runs for Temporal operations (workflow executions, activity executions, signals, etc.), giving full visibility into the orchestration layer. Both examples support a `--temporal-runs` CLI flag to toggle this. -## Viewing Traces +## Further Reading -After running either example, open [LangSmith](https://smith.langchain.com/) and look for the project name (`langsmith-basic` or `langsmith-chatbot`). +- [LangSmith documentation](https://docs.smith.langchain.com/) +- [Temporal Python SDK LangSmith plugin](https://python.temporal.io/temporalio.contrib.langsmith.html) +- [LangSmith `@traceable` guide](https://docs.smith.langchain.com/observability/how-to/annotate-code) +- [LangSmith `wrap_openai` guide](https://docs.smith.langchain.com/observability/how-to/trace-with-openai) diff --git a/langsmith_tracing/basic/README.md b/langsmith_tracing/basic/README.md new file mode 100644 index 00000000..7f5a099f --- /dev/null +++ b/langsmith_tracing/basic/README.md @@ -0,0 +1,49 @@ +# Basic LLM Workflow + +A one-shot workflow that sends a prompt to OpenAI and returns the response. This is the simplest possible example of LangSmith tracing with Temporal. + +See the [parent README](../README.md) for prerequisites. + +## Running + +```bash +# Terminal 1 — start the worker +python -m langsmith_tracing.basic.worker + +# Terminal 2 — run the workflow +python -m langsmith_tracing.basic.starter +``` + +## Trace Structure + +### `add_temporal_runs=False` (default) + +``` +Basic LLM Request (@traceable, client-side) +└── Ask: What is Temporal? (@traceable, workflow) + └── Call OpenAI (@traceable, activity) + └── openai.responses.create (automatic via wrap_openai) +``` + + + +### `add_temporal_runs=True` + +Pass `--temporal-runs` to both the worker and starter: + +```bash +python -m langsmith_tracing.basic.worker --temporal-runs +python -m langsmith_tracing.basic.starter --temporal-runs +``` + +``` +Basic LLM Request (@traceable, client-side) +└── StartWorkflow:BasicLLMWorkflow (automatic, Temporal plugin) + └── RunWorkflow:BasicLLMWorkflow (automatic, Temporal plugin) + └── Ask: What is Temporal? (@traceable, workflow) + └── ExecuteActivity:call_openai (automatic, Temporal plugin) + └── Call OpenAI (@traceable, activity) + └── openai.responses.create (automatic via wrap_openai) +``` + + diff --git a/langsmith_tracing/basic/activities.py b/langsmith_tracing/basic/activities.py index c3faeea7..ee36057e 100644 --- a/langsmith_tracing/basic/activities.py +++ b/langsmith_tracing/basic/activities.py @@ -16,7 +16,9 @@ class OpenAIRequest: instructions: str = "You are a helpful assistant." -@traceable(name="Call OpenAI") +# @traceable creates a named span in LangSmith. wrap_openai further enriches +# the trace with model parameters, token counts, and latency automatically. +@traceable(name="Call OpenAI", run_type="llm") @activity.defn async def call_openai(request: OpenAIRequest) -> Response: """Call OpenAI Responses API. Retries handled by Temporal.""" diff --git a/langsmith_tracing/basic/workflows.py b/langsmith_tracing/basic/workflows.py index 2ef95131..4d4a75e6 100644 --- a/langsmith_tracing/basic/workflows.py +++ b/langsmith_tracing/basic/workflows.py @@ -15,11 +15,11 @@ @workflow.defn class BasicLLMWorkflow: + # Do not put @traceable directly on the @workflow.run method — it would + # violate replay safety. Instead, wrap an inner function so that + # Temporal's replay mechanism can invoke `run()` without side effects. @workflow.run async def run(self, prompt: str) -> str: - # @traceable creates a named span in LangSmith. Inside a workflow, - # it nests under the workflow's trace (when add_temporal_runs=True) - # or stands alone as a root span (when add_temporal_runs=False). @traceable( name=f"Ask: {prompt[:60]}", run_type="chain", diff --git a/langsmith_tracing/chatbot/README.md b/langsmith_tracing/chatbot/README.md new file mode 100644 index 00000000..dda8f76d --- /dev/null +++ b/langsmith_tracing/chatbot/README.md @@ -0,0 +1,76 @@ +# Chatbot with Tool Calls + +A long-running conversational workflow with tool calls, signals, and queries. Demonstrates how LangSmith traces an agentic loop where the model calls tools across multiple turns. + +See the [parent README](../README.md) for prerequisites. + +## Running + +```bash +# Terminal 1 — start the worker +python -m langsmith_tracing.chatbot.worker + +# Terminal 2 — interactive CLI +python -m langsmith_tracing.chatbot.starter +``` + +Commands in the CLI: +- Type a message and press Enter to chat +- `notes` — display all saved notes +- `exit` — end the session + +## Tools + +The model has two tools: + +- **`save_note(name, content)`** — Saves a note durably via a Temporal activity. The workflow stores the note in its state dict and calls the activity, which creates a visible trace span in LangSmith. +- **`read_note(name)`** — Reads a note via a Temporal activity. The workflow looks up the note from its state dict and passes it to the activity for tracing visibility. + +## Trace Structure + +### Client-side traces + +``` +Chatbot Session a1b2c3d4 (@traceable, client-side) +├── Turn: What's the capital of Fr.. (@traceable, client-side per-turn) +├── Turn: Save that as a note call.. (@traceable, client-side per-turn) +└── Turn: What did I save about pa.. (@traceable, client-side per-turn) +``` + + + +### Worker-side traces (`add_temporal_runs=False`) + +``` +Session Apr 17 10:30 (@traceable, workflow) +├── Request: What's the capital of France? (@traceable, per-message) +│ └── Call OpenAI (@traceable + wrap_openai) +├── Request: Save that as a note called paris (@traceable, per-message) +│ ├── Call OpenAI → function_call: save_note +│ ├── Save Note (@traceable, activity) +│ └── Call OpenAI → text response +└── Request: What did I save about paris? (@traceable, per-message) + ├── Call OpenAI → function_call: read_note + ├── Read Note (@traceable, activity) + └── Call OpenAI → text response +``` + + + +### Worker-side traces (`add_temporal_runs=True`) + +With `--temporal-runs`, Temporal operation spans wrap each `@traceable` span: + +``` +RunWorkflow:ChatbotWorkflow (automatic, Temporal plugin) +└── Session Apr 17 10:30 (@traceable, workflow) + └── Request: Save that as a note called paris (@traceable, per-message) + ├── ExecuteActivity:call_openai (automatic, Temporal plugin) + │ └── Call OpenAI (@traceable + wrap_openai) + ├── ExecuteActivity:save_note (automatic, Temporal plugin) + │ └── Save Note (@traceable, activity) + └── ExecuteActivity:call_openai (automatic, Temporal plugin) + └── Call OpenAI (@traceable + wrap_openai) +``` + + diff --git a/langsmith_tracing/chatbot/activities.py b/langsmith_tracing/chatbot/activities.py index 27310b5b..27abfbd2 100644 --- a/langsmith_tracing/chatbot/activities.py +++ b/langsmith_tracing/chatbot/activities.py @@ -21,8 +21,15 @@ class OpenAIRequest: previous_response_id: str | None = None -# wrap_openai automatically traces LLM calls in LangSmith — capturing -# model parameters, token usage, and latency without extra code. +@dataclass +class NoteRequest: + name: str + content: str + + +# @traceable creates a named span in LangSmith. run_type="llm" tells +# LangSmith this span represents an LLM call (vs. "chain" or "tool"). +# wrap_openai further enriches the trace with model params and token counts. @traceable(name="Call OpenAI", run_type="llm") @activity.defn async def call_openai(request: OpenAIRequest) -> Response: @@ -41,11 +48,19 @@ async def call_openai(request: OpenAIRequest) -> Response: return await client.responses.create(**kwargs) -# run_type="tool" tells LangSmith this is a tool execution, which renders -# distinctly in the trace UI alongside LLM calls and chains. +# run_type="tool" renders distinctly in the LangSmith trace UI, +# making it easy to spot tool executions alongside LLM calls. @traceable(name="Save Note", run_type="tool") @activity.defn -async def save_note(name: str, content: str) -> str: +async def save_note(request: NoteRequest) -> str: """Save a note. Durable side effect — survives worker crashes.""" - activity.logger.info(f"Saving note '{name}': {content[:80]}") - return f"Saved note '{name}'." + activity.logger.info(f"Saving note '{request.name}': {request.content[:80]}") + return f"Saved note '{request.name}'." + + +@traceable(name="Read Note", run_type="tool") +@activity.defn +async def read_note(request: NoteRequest) -> str: + """Read a note. The content is passed from workflow state.""" + activity.logger.info(f"Reading note '{request.name}'") + return request.content diff --git a/langsmith_tracing/chatbot/worker.py b/langsmith_tracing/chatbot/worker.py index 95c0bbbd..9a6e0434 100644 --- a/langsmith_tracing/chatbot/worker.py +++ b/langsmith_tracing/chatbot/worker.py @@ -10,7 +10,7 @@ from temporalio.envconfig import ClientConfig from temporalio.worker import Worker -from langsmith_tracing.chatbot.activities import call_openai, save_note +from langsmith_tracing.chatbot.activities import call_openai, read_note, save_note from langsmith_tracing.chatbot.workflows import ChatbotWorkflow interrupt_event = asyncio.Event() @@ -38,7 +38,7 @@ async def main(): client, task_queue="langsmith-chatbot-task-queue", workflows=[ChatbotWorkflow], - activities=[call_openai, save_note], + activities=[call_openai, save_note, read_note], plugins=[plugin], max_cached_workflows=0, ): diff --git a/langsmith_tracing/chatbot/workflows.py b/langsmith_tracing/chatbot/workflows.py index 5992117e..7e7df85c 100644 --- a/langsmith_tracing/chatbot/workflows.py +++ b/langsmith_tracing/chatbot/workflows.py @@ -10,8 +10,10 @@ from langsmith import traceable from langsmith_tracing.chatbot.activities import ( + NoteRequest, OpenAIRequest, call_openai, + read_note, save_note, ) @@ -77,10 +79,10 @@ def last_response(self) -> str: def notes(self) -> dict[str, str]: return dict(self._notes) + # Do not put @traceable directly on the @workflow.run method — it would + # violate replay safety. Instead, wrap an inner function. @workflow.run async def run(self) -> str: - # Dynamic trace name — each session gets a unique, timestamped span - # in LangSmith so you can distinguish between sessions. now = workflow.now().strftime("%b %d %H:%M") return await traceable( name=f"Session {now}", @@ -103,15 +105,6 @@ async def _session(self) -> str: return "Session ended." async def _query_openai(self, message: str | None) -> str: - # Each user message gets its own named span. In LangSmith you'll see: - # Session Apr 17 10:30 - # ├── Request: What's the capital of France? - # │ └── Call OpenAI (activity) - # ├── Request: Save that as a note called "paris" - # │ ├── Call OpenAI (activity) → function_call: save_note - # │ ├── Save Note (activity) - # │ └── Call OpenAI (activity) → text response - # └── ... @traceable( name=f"Request: {(message or '')[:60]}", run_type="chain", @@ -142,7 +135,7 @@ async def _traced(): self._notes[args["name"]] = args["content"] result = await workflow.execute_activity( save_note, - args=[args["name"], args["content"]], + NoteRequest(name=args["name"], content=args["content"]), start_to_close_timeout=timedelta(seconds=10), retry_policy=RETRY, ) @@ -154,14 +147,18 @@ async def _traced(): } ) elif item.name == "read_note": - # read_note is a pure workflow state lookup — no - # activity needed, no I/O, just a dict.get(). content = self._notes.get(args["name"], "Note not found.") + result = await workflow.execute_activity( + read_note, + NoteRequest(name=args["name"], content=content), + start_to_close_timeout=timedelta(seconds=10), + retry_policy=RETRY, + ) tool_results.append( { "type": "function_call_output", "call_id": item.call_id, - "output": content, + "output": result, } ) diff --git a/tests/langsmith_tracing/test_chatbot.py b/tests/langsmith_tracing/test_chatbot.py index 12d87015..193bd89e 100644 --- a/tests/langsmith_tracing/test_chatbot.py +++ b/tests/langsmith_tracing/test_chatbot.py @@ -1,3 +1,4 @@ +import asyncio import json import uuid @@ -23,11 +24,9 @@ reason="temporalio.contrib.langsmith not available", ) -from langsmith_tracing.chatbot.activities import OpenAIRequest, call_openai, save_note +from langsmith_tracing.chatbot.activities import NoteRequest, OpenAIRequest from langsmith_tracing.chatbot.workflows import ChatbotWorkflow -_call_count = 0 - def _make_text_response(text: str) -> Response: return Response.model_construct( @@ -88,23 +87,25 @@ async def mock_call_openai(request: OpenAIRequest) -> Response: nonlocal call_count call_count += 1 if call_count == 1: - # First call: model wants to save a note return _make_function_call_response( name="save_note", arguments={"name": "greeting", "content": "Hello world"}, ) - # Second call: model returns text after tool result return _make_text_response("Note saved successfully!") @activity.defn(name="save_note") - async def mock_save_note(name: str, content: str) -> str: - return f"Saved note '{name}'." + async def mock_save_note(request: NoteRequest) -> str: + return f"Saved note '{request.name}'." + + @activity.defn(name="read_note") + async def mock_read_note(request: NoteRequest) -> str: + return request.content async with Worker( client, task_queue="test-langsmith-chatbot", workflows=[ChatbotWorkflow], - activities=[mock_call_openai, mock_save_note], + activities=[mock_call_openai, mock_save_note, mock_read_note], plugins=[LangSmithPlugin()], ): wf_handle = await client.start_workflow( @@ -113,12 +114,8 @@ async def mock_save_note(name: str, content: str) -> str: task_queue="test-langsmith-chatbot", ) - # Send a message await wf_handle.signal(ChatbotWorkflow.user_message, "Save a note") - # Wait for response - import asyncio - for _ in range(20): await asyncio.sleep(0.2) response = await wf_handle.query(ChatbotWorkflow.last_response) @@ -127,18 +124,16 @@ async def mock_save_note(name: str, content: str) -> str: assert response == "Note saved successfully!" - # Verify note was stored notes = await wf_handle.query(ChatbotWorkflow.notes) assert notes == {"greeting": "Hello world"} - # Exit await wf_handle.signal(ChatbotWorkflow.exit) result = await wf_handle.result() assert result == "Session ended." async def test_chatbot_read_note(client: Client, env: WorkflowEnvironment): - """Test that read_note returns from workflow state without calling an activity.""" + """Test that read_note calls an activity with the content from workflow state.""" call_count = 0 @activity.defn(name="call_openai") @@ -146,34 +141,34 @@ async def mock_call_openai(request: OpenAIRequest) -> Response: nonlocal call_count call_count += 1 if call_count == 1: - # First call: save a note return _make_function_call_response( name="save_note", arguments={"name": "todo", "content": "Buy milk"}, call_id="call_save", ) if call_count == 2: - # After save_note tool result, return text return _make_text_response("Saved your todo!") if call_count == 3: - # Second user message: model wants to read the note return _make_function_call_response( name="read_note", arguments={"name": "todo"}, call_id="call_read", ) - # After read_note tool result, return the content return _make_text_response("Your todo says: Buy milk") @activity.defn(name="save_note") - async def mock_save_note(name: str, content: str) -> str: - return f"Saved note '{name}'." + async def mock_save_note(request: NoteRequest) -> str: + return f"Saved note '{request.name}'." + + @activity.defn(name="read_note") + async def mock_read_note(request: NoteRequest) -> str: + return request.content async with Worker( client, task_queue="test-langsmith-chatbot-read", workflows=[ChatbotWorkflow], - activities=[mock_call_openai, mock_save_note], + activities=[mock_call_openai, mock_save_note, mock_read_note], plugins=[LangSmithPlugin()], ): wf_handle = await client.start_workflow( @@ -182,8 +177,6 @@ async def mock_save_note(name: str, content: str) -> str: task_queue="test-langsmith-chatbot-read", ) - import asyncio - # Save a note first await wf_handle.signal(ChatbotWorkflow.user_message, "Save my todo") for _ in range(20): @@ -193,7 +186,7 @@ async def mock_save_note(name: str, content: str) -> str: break assert response == "Saved your todo!" - # Now read it back — read_note should use workflow state, no activity + # Now read it back via the read_note activity await wf_handle.signal(ChatbotWorkflow.user_message, "Read my todo") for _ in range(20): await asyncio.sleep(0.2) From f927d2bf00ecd4cfb82dc8d06aef3b936d318a1c Mon Sep 17 00:00:00 2001 From: Maple Xu Date: Mon, 20 Apr 2026 15:09:19 -0400 Subject: [PATCH 04/14] Address audit findings: types, comments, tests, consistency Audit findings addressed: - Remove max_cached_workflows=0 (debugging leftover, not needed) - Expand replay safety comment to explain why (I/O on replay) - Tighten type annotations: str|list[dict[str,Any]], dict[str,Any] - Clarify read_note docstring (passthrough for tracing visibility) - Clarify activity docstrings (retries handled by Temporal, not OpenAI) - Make trace tree annotations consistent across basic/chatbot READMEs - Extract shared test helpers (make_text_response, poll_last_response) - Add TimeoutError on poll failure instead of silent assertion - Fix "simplest possible" wording to "very simple" Co-Authored-By: Claude Opus 4.6 (1M context) --- langsmith_tracing/basic/README.md | 2 +- langsmith_tracing/basic/activities.py | 2 +- langsmith_tracing/basic/worker.py | 1 - langsmith_tracing/basic/workflows.py | 6 +-- langsmith_tracing/chatbot/README.md | 21 ++++++--- langsmith_tracing/chatbot/activities.py | 13 +++-- langsmith_tracing/chatbot/worker.py | 1 - langsmith_tracing/chatbot/workflows.py | 5 +- tests/langsmith_tracing/helpers.py | 56 ++++++++++++++++++++++ tests/langsmith_tracing/test_basic.py | 33 +------------ tests/langsmith_tracing/test_chatbot.py | 63 ++++--------------------- 11 files changed, 98 insertions(+), 105 deletions(-) create mode 100644 tests/langsmith_tracing/helpers.py diff --git a/langsmith_tracing/basic/README.md b/langsmith_tracing/basic/README.md index 7f5a099f..46f29165 100644 --- a/langsmith_tracing/basic/README.md +++ b/langsmith_tracing/basic/README.md @@ -1,6 +1,6 @@ # Basic LLM Workflow -A one-shot workflow that sends a prompt to OpenAI and returns the response. This is the simplest possible example of LangSmith tracing with Temporal. +A one-shot workflow that sends a prompt to OpenAI and returns the response. A very simple example of LangSmith tracing with Temporal. See the [parent README](../README.md) for prerequisites. diff --git a/langsmith_tracing/basic/activities.py b/langsmith_tracing/basic/activities.py index ee36057e..72b9ad4d 100644 --- a/langsmith_tracing/basic/activities.py +++ b/langsmith_tracing/basic/activities.py @@ -21,7 +21,7 @@ class OpenAIRequest: @traceable(name="Call OpenAI", run_type="llm") @activity.defn async def call_openai(request: OpenAIRequest) -> Response: - """Call OpenAI Responses API. Retries handled by Temporal.""" + """Call OpenAI Responses API. Retries handled by Temporal, not the OpenAI client.""" client = wrap_openai(AsyncOpenAI(max_retries=0)) return await client.responses.create( model=request.model, diff --git a/langsmith_tracing/basic/worker.py b/langsmith_tracing/basic/worker.py index 1a26bbba..56e36576 100644 --- a/langsmith_tracing/basic/worker.py +++ b/langsmith_tracing/basic/worker.py @@ -42,7 +42,6 @@ async def main(): workflows=[BasicLLMWorkflow], activities=[call_openai], plugins=[plugin], - max_cached_workflows=0, ): label = "with" if add_temporal_runs else "without" print(f"Worker started ({label} Temporal runs in traces), ctrl+c to exit") diff --git a/langsmith_tracing/basic/workflows.py b/langsmith_tracing/basic/workflows.py index 4d4a75e6..a342f8b4 100644 --- a/langsmith_tracing/basic/workflows.py +++ b/langsmith_tracing/basic/workflows.py @@ -15,9 +15,9 @@ @workflow.defn class BasicLLMWorkflow: - # Do not put @traceable directly on the @workflow.run method — it would - # violate replay safety. Instead, wrap an inner function so that - # Temporal's replay mechanism can invoke `run()` without side effects. + # Do not put @traceable directly on the @workflow.run method — + # @traceable performs I/O (trace submission) that would fire on every + # replay, violating replay safety. Instead, wrap an inner function. @workflow.run async def run(self, prompt: str) -> str: @traceable( diff --git a/langsmith_tracing/chatbot/README.md b/langsmith_tracing/chatbot/README.md index dda8f76d..04572783 100644 --- a/langsmith_tracing/chatbot/README.md +++ b/langsmith_tracing/chatbot/README.md @@ -44,15 +44,20 @@ Chatbot Session a1b2c3d4 (@traceable, client-side) ``` Session Apr 17 10:30 (@traceable, workflow) ├── Request: What's the capital of France? (@traceable, per-message) -│ └── Call OpenAI (@traceable + wrap_openai) +│ └── Call OpenAI (@traceable, activity) +│ └── openai.responses.create (automatic via wrap_openai) ├── Request: Save that as a note called paris (@traceable, per-message) -│ ├── Call OpenAI → function_call: save_note +│ ├── Call OpenAI (@traceable, activity) +│ │ └── openai.responses.create → function_call: save_note │ ├── Save Note (@traceable, activity) -│ └── Call OpenAI → text response +│ └── Call OpenAI (@traceable, activity) +│ └── openai.responses.create → text response └── Request: What did I save about paris? (@traceable, per-message) - ├── Call OpenAI → function_call: read_note + ├── Call OpenAI (@traceable, activity) + │ └── openai.responses.create → function_call: read_note ├── Read Note (@traceable, activity) - └── Call OpenAI → text response + └── Call OpenAI (@traceable, activity) + └── openai.responses.create → text response ``` @@ -66,11 +71,13 @@ RunWorkflow:ChatbotWorkflow (automatic, Temporal plugin) └── Session Apr 17 10:30 (@traceable, workflow) └── Request: Save that as a note called paris (@traceable, per-message) ├── ExecuteActivity:call_openai (automatic, Temporal plugin) - │ └── Call OpenAI (@traceable + wrap_openai) + │ └── Call OpenAI (@traceable, activity) + │ └── openai.responses.create (automatic via wrap_openai) ├── ExecuteActivity:save_note (automatic, Temporal plugin) │ └── Save Note (@traceable, activity) └── ExecuteActivity:call_openai (automatic, Temporal plugin) - └── Call OpenAI (@traceable + wrap_openai) + └── Call OpenAI (@traceable, activity) + └── openai.responses.create (automatic via wrap_openai) ``` diff --git a/langsmith_tracing/chatbot/activities.py b/langsmith_tracing/chatbot/activities.py index 27abfbd2..003394b6 100644 --- a/langsmith_tracing/chatbot/activities.py +++ b/langsmith_tracing/chatbot/activities.py @@ -1,6 +1,7 @@ """Chatbot activities with LangSmith tracing.""" from dataclasses import dataclass +from typing import Any from langsmith import traceable from langsmith.wrappers import wrap_openai @@ -12,12 +13,13 @@ @dataclass class OpenAIRequest: model: str - input: str | list + # str for the initial user prompt, list for tool call results fed back + input: str | list[dict[str, Any]] instructions: str = ( "You are a helpful assistant with note-taking abilities. " "Use save_note to remember things and read_note to recall them." ) - tools: list | None = None + tools: list[dict[str, Any]] | None = None previous_response_id: str | None = None @@ -33,9 +35,9 @@ class NoteRequest: @traceable(name="Call OpenAI", run_type="llm") @activity.defn async def call_openai(request: OpenAIRequest) -> Response: - """Call OpenAI Responses API. Retries handled by Temporal.""" + """Call OpenAI Responses API. Retries handled by Temporal, not the OpenAI client.""" client = wrap_openai(AsyncOpenAI(max_retries=0)) - kwargs: dict = { + kwargs: dict[str, Any] = { "model": request.model, "instructions": request.instructions, "input": request.input, @@ -61,6 +63,7 @@ async def save_note(request: NoteRequest) -> str: @traceable(name="Read Note", run_type="tool") @activity.defn async def read_note(request: NoteRequest) -> str: - """Read a note. The content is passed from workflow state.""" + """Read a note. Content is passed from workflow state; the activity + exists so the read appears as a traced span in LangSmith.""" activity.logger.info(f"Reading note '{request.name}'") return request.content diff --git a/langsmith_tracing/chatbot/worker.py b/langsmith_tracing/chatbot/worker.py index 9a6e0434..f8d7b239 100644 --- a/langsmith_tracing/chatbot/worker.py +++ b/langsmith_tracing/chatbot/worker.py @@ -40,7 +40,6 @@ async def main(): workflows=[ChatbotWorkflow], activities=[call_openai, save_note, read_note], plugins=[plugin], - max_cached_workflows=0, ): label = "with" if add_temporal_runs else "without" print(f"Worker started ({label} Temporal runs in traces), ctrl+c to exit") diff --git a/langsmith_tracing/chatbot/workflows.py b/langsmith_tracing/chatbot/workflows.py index 7e7df85c..f4f2a871 100644 --- a/langsmith_tracing/chatbot/workflows.py +++ b/langsmith_tracing/chatbot/workflows.py @@ -79,8 +79,9 @@ def last_response(self) -> str: def notes(self) -> dict[str, str]: return dict(self._notes) - # Do not put @traceable directly on the @workflow.run method — it would - # violate replay safety. Instead, wrap an inner function. + # Do not put @traceable directly on the @workflow.run method — + # @traceable performs I/O (trace submission) that would fire on every + # replay, violating replay safety. Instead, wrap an inner function. @workflow.run async def run(self) -> str: now = workflow.now().strftime("%b %d %H:%M") diff --git a/tests/langsmith_tracing/helpers.py b/tests/langsmith_tracing/helpers.py new file mode 100644 index 00000000..5dff3807 --- /dev/null +++ b/tests/langsmith_tracing/helpers.py @@ -0,0 +1,56 @@ +"""Shared test helpers for LangSmith tracing tests.""" + +import asyncio +from typing import Any + +from openai.types.responses import Response +from openai.types.responses.response_output_message import ResponseOutputMessage +from openai.types.responses.response_output_text import ResponseOutputText +from temporalio.client import WorkflowHandle + + +def make_text_response(text: str) -> Response: + """Build a minimal OpenAI Response with a text output.""" + return Response.model_construct( + id="resp_mock", + created_at=0.0, + model="gpt-4o-mini", + object="response", + output=[ + ResponseOutputMessage.model_construct( + id="msg_mock", + type="message", + role="assistant", + status="completed", + content=[ + ResponseOutputText.model_construct( + type="output_text", + text=text, + annotations=[], + ) + ], + ) + ], + parallel_tool_calls=False, + tool_choice="auto", + tools=[], + ) + + +async def poll_last_response( + wf_handle: WorkflowHandle[Any, Any], + query: Any, + prev_response: str = "", + timeout_seconds: float = 4.0, + interval: float = 0.2, +) -> str: + """Poll a workflow query until the response changes from prev_response.""" + iterations = int(timeout_seconds / interval) + for _ in range(iterations): + await asyncio.sleep(interval) + response = await wf_handle.query(query) + if response and response != prev_response: + return response # type: ignore[return-value] + raise TimeoutError( + f"Timed out after {timeout_seconds}s waiting for workflow response" + ) diff --git a/tests/langsmith_tracing/test_basic.py b/tests/langsmith_tracing/test_basic.py index 1b3ebc12..d4b1d3ec 100644 --- a/tests/langsmith_tracing/test_basic.py +++ b/tests/langsmith_tracing/test_basic.py @@ -2,8 +2,6 @@ import pytest from openai.types.responses import Response -from openai.types.responses.response_output_message import ResponseOutputMessage -from openai.types.responses.response_output_text import ResponseOutputText from temporalio import activity from temporalio.client import Client from temporalio.testing import WorkflowEnvironment @@ -16,6 +14,7 @@ from langsmith_tracing.basic.activities import OpenAIRequest from langsmith_tracing.basic.workflows import BasicLLMWorkflow +from tests.langsmith_tracing.helpers import make_text_response # The workflow uses @traceable which requires the LangSmithPlugin's # aio_to_thread patch to work inside the workflow sandbox. @@ -25,37 +24,9 @@ ) -def _make_text_response(text: str) -> Response: - """Build a minimal Response with a text output.""" - return Response.model_construct( - id="resp_mock", - created_at=0.0, - model="gpt-4o-mini", - object="response", - output=[ - ResponseOutputMessage.model_construct( - id="msg_mock", - type="message", - role="assistant", - status="completed", - content=[ - ResponseOutputText.model_construct( - type="output_text", - text=text, - annotations=[], - ) - ], - ) - ], - parallel_tool_calls=False, - tool_choice="auto", - tools=[], - ) - - async def test_basic_workflow(client: Client, env: WorkflowEnvironment): expected_text = "Temporal is a durable execution platform." - mock_response = _make_text_response(expected_text) + mock_response = make_text_response(expected_text) @activity.defn(name="call_openai") async def mock_call_openai(request: OpenAIRequest) -> Response: diff --git a/tests/langsmith_tracing/test_chatbot.py b/tests/langsmith_tracing/test_chatbot.py index 193bd89e..b8fd25da 100644 --- a/tests/langsmith_tracing/test_chatbot.py +++ b/tests/langsmith_tracing/test_chatbot.py @@ -1,4 +1,3 @@ -import asyncio import json import uuid @@ -7,8 +6,6 @@ from openai.types.responses.response_function_tool_call import ( ResponseFunctionToolCall, ) -from openai.types.responses.response_output_message import ResponseOutputMessage -from openai.types.responses.response_output_text import ResponseOutputText from temporalio import activity from temporalio.client import Client from temporalio.testing import WorkflowEnvironment @@ -26,33 +23,7 @@ from langsmith_tracing.chatbot.activities import NoteRequest, OpenAIRequest from langsmith_tracing.chatbot.workflows import ChatbotWorkflow - - -def _make_text_response(text: str) -> Response: - return Response.model_construct( - id="resp_text", - created_at=0.0, - model="gpt-4o-mini", - object="response", - output=[ - ResponseOutputMessage.model_construct( - id="msg_mock", - type="message", - role="assistant", - status="completed", - content=[ - ResponseOutputText.model_construct( - type="output_text", - text=text, - annotations=[], - ) - ], - ) - ], - parallel_tool_calls=False, - tool_choice="auto", - tools=[], - ) +from tests.langsmith_tracing.helpers import make_text_response, poll_last_response def _make_function_call_response( @@ -91,7 +62,7 @@ async def mock_call_openai(request: OpenAIRequest) -> Response: name="save_note", arguments={"name": "greeting", "content": "Hello world"}, ) - return _make_text_response("Note saved successfully!") + return make_text_response("Note saved successfully!") @activity.defn(name="save_note") async def mock_save_note(request: NoteRequest) -> str: @@ -115,13 +86,7 @@ async def mock_read_note(request: NoteRequest) -> str: ) await wf_handle.signal(ChatbotWorkflow.user_message, "Save a note") - - for _ in range(20): - await asyncio.sleep(0.2) - response = await wf_handle.query(ChatbotWorkflow.last_response) - if response: - break - + response = await poll_last_response(wf_handle, ChatbotWorkflow.last_response) assert response == "Note saved successfully!" notes = await wf_handle.query(ChatbotWorkflow.notes) @@ -133,7 +98,7 @@ async def mock_read_note(request: NoteRequest) -> str: async def test_chatbot_read_note(client: Client, env: WorkflowEnvironment): - """Test that read_note calls an activity with the content from workflow state.""" + """Test that read_note calls an activity with content from workflow state.""" call_count = 0 @activity.defn(name="call_openai") @@ -147,14 +112,14 @@ async def mock_call_openai(request: OpenAIRequest) -> Response: call_id="call_save", ) if call_count == 2: - return _make_text_response("Saved your todo!") + return make_text_response("Saved your todo!") if call_count == 3: return _make_function_call_response( name="read_note", arguments={"name": "todo"}, call_id="call_read", ) - return _make_text_response("Your todo says: Buy milk") + return make_text_response("Your todo says: Buy milk") @activity.defn(name="save_note") async def mock_save_note(request: NoteRequest) -> str: @@ -177,22 +142,14 @@ async def mock_read_note(request: NoteRequest) -> str: task_queue="test-langsmith-chatbot-read", ) - # Save a note first await wf_handle.signal(ChatbotWorkflow.user_message, "Save my todo") - for _ in range(20): - await asyncio.sleep(0.2) - response = await wf_handle.query(ChatbotWorkflow.last_response) - if response: - break + response = await poll_last_response(wf_handle, ChatbotWorkflow.last_response) assert response == "Saved your todo!" - # Now read it back via the read_note activity await wf_handle.signal(ChatbotWorkflow.user_message, "Read my todo") - for _ in range(20): - await asyncio.sleep(0.2) - new_response = await wf_handle.query(ChatbotWorkflow.last_response) - if new_response and new_response != response: - break + new_response = await poll_last_response( + wf_handle, ChatbotWorkflow.last_response, prev_response=response + ) assert new_response == "Your todo says: Buy milk" await wf_handle.signal(ChatbotWorkflow.exit) From c61f978ad4c42a7125cd78a76ad84e0b7926291f Mon Sep 17 00:00:00 2001 From: Maple Xu Date: Mon, 20 Apr 2026 16:08:52 -0400 Subject: [PATCH 05/14] Rewrite replay safety comment to focus on outcome MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changed from explaining internals (I/O on replay) to describing what the user would see: duplicate or orphaned traces. Also swept all other comments for outcome-focus — no further changes needed. Co-Authored-By: Claude Opus 4.6 (1M context) --- langsmith_tracing/basic/workflows.py | 6 +++--- langsmith_tracing/chatbot/workflows.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/langsmith_tracing/basic/workflows.py b/langsmith_tracing/basic/workflows.py index a342f8b4..7df59c59 100644 --- a/langsmith_tracing/basic/workflows.py +++ b/langsmith_tracing/basic/workflows.py @@ -15,9 +15,9 @@ @workflow.defn class BasicLLMWorkflow: - # Do not put @traceable directly on the @workflow.run method — - # @traceable performs I/O (trace submission) that would fire on every - # replay, violating replay safety. Instead, wrap an inner function. + # Do not decorate @workflow.run with @traceable — it would violate + # replay safety and produce duplicate or orphaned traces. Instead, + # wrap an inner function. @workflow.run async def run(self, prompt: str) -> str: @traceable( diff --git a/langsmith_tracing/chatbot/workflows.py b/langsmith_tracing/chatbot/workflows.py index f4f2a871..797e6f6c 100644 --- a/langsmith_tracing/chatbot/workflows.py +++ b/langsmith_tracing/chatbot/workflows.py @@ -79,9 +79,9 @@ def last_response(self) -> str: def notes(self) -> dict[str, str]: return dict(self._notes) - # Do not put @traceable directly on the @workflow.run method — - # @traceable performs I/O (trace submission) that would fire on every - # replay, violating replay safety. Instead, wrap an inner function. + # Do not decorate @workflow.run with @traceable — it would violate + # replay safety and produce duplicate or orphaned traces. Instead, + # wrap an inner function. @workflow.run async def run(self) -> str: now = workflow.now().strftime("%b %d %H:%M") From 81e5edea666d0cbb36568c102a01a928b48bd06f Mon Sep 17 00:00:00 2001 From: Maple Xu Date: Mon, 20 Apr 2026 16:35:37 -0400 Subject: [PATCH 06/14] Move save_note/read_note from activities to workflow methods - save_note and read_note are now @traceable methods on ChatbotWorkflow, not activities. Notes live in workflow state (durable via event history). - Remove NoteRequest dataclass and activity registrations - Fix wrap_openai comment placement (describes child span, not parent) - Remove retry policy from basic workflow (unnecessary for simple example) - Add comment highlighting that non-@workflow.run methods can use @traceable - Update chatbot README trace trees to reflect workflow methods vs activities Co-Authored-By: Claude Opus 4.6 (1M context) --- langsmith_tracing/README.md | 2 +- langsmith_tracing/basic/activities.py | 4 +-- langsmith_tracing/basic/workflows.py | 4 --- langsmith_tracing/chatbot/README.md | 13 +++++---- langsmith_tracing/chatbot/activities.py | 30 ++------------------- langsmith_tracing/chatbot/worker.py | 4 +-- langsmith_tracing/chatbot/workflows.py | 36 +++++++++++-------------- tests/langsmith_tracing/test_basic.py | 2 -- tests/langsmith_tracing/test_chatbot.py | 25 ++++------------- 9 files changed, 33 insertions(+), 87 deletions(-) diff --git a/langsmith_tracing/README.md b/langsmith_tracing/README.md index babeba55..57067456 100644 --- a/langsmith_tracing/README.md +++ b/langsmith_tracing/README.md @@ -29,7 +29,7 @@ A local Temporal server must be running (`temporal server start-dev`). This sample shows three complementary ways LangSmith captures trace data: -1. **Automatic (`wrap_openai`)** — Wrapping the OpenAI client with `wrap_openai()` automatically captures model parameters, token usage, and latency for every LLM call. No extra code needed. +1. **Automatic (`wrap_openai`)** — Wrapping the OpenAI client with `wrap_openai()` automatically creates a child span for every LLM call, capturing model parameters, token usage, and latency. No extra code needed. 2. **Explicit (`@traceable`)** — Decorating functions with `@traceable` creates named spans for your business logic. You control the name, tags, metadata, and `run_type` (chain, llm, tool, retriever). This is how you structure traces to tell a story about what your application is doing. diff --git a/langsmith_tracing/basic/activities.py b/langsmith_tracing/basic/activities.py index 72b9ad4d..231f4078 100644 --- a/langsmith_tracing/basic/activities.py +++ b/langsmith_tracing/basic/activities.py @@ -16,12 +16,12 @@ class OpenAIRequest: instructions: str = "You are a helpful assistant." -# @traceable creates a named span in LangSmith. wrap_openai further enriches -# the trace with model parameters, token counts, and latency automatically. @traceable(name="Call OpenAI", run_type="llm") @activity.defn async def call_openai(request: OpenAIRequest) -> Response: """Call OpenAI Responses API. Retries handled by Temporal, not the OpenAI client.""" + # wrap_openai patches the client so each API call (e.g. responses.create) + # creates its own child span with model parameters and token usage. client = wrap_openai(AsyncOpenAI(max_retries=0)) return await client.responses.create( model=request.model, diff --git a/langsmith_tracing/basic/workflows.py b/langsmith_tracing/basic/workflows.py index 7df59c59..1421636e 100644 --- a/langsmith_tracing/basic/workflows.py +++ b/langsmith_tracing/basic/workflows.py @@ -3,15 +3,12 @@ from datetime import timedelta from temporalio import workflow -from temporalio.common import RetryPolicy with workflow.unsafe.imports_passed_through(): from langsmith import traceable from langsmith_tracing.basic.activities import OpenAIRequest, call_openai -RETRY = RetryPolicy(initial_interval=timedelta(seconds=2), maximum_attempts=3) - @workflow.defn class BasicLLMWorkflow: @@ -31,7 +28,6 @@ async def _run() -> str: call_openai, OpenAIRequest(model="gpt-4o-mini", input=prompt), start_to_close_timeout=timedelta(seconds=60), - retry_policy=RETRY, ) return response.output_text diff --git a/langsmith_tracing/chatbot/README.md b/langsmith_tracing/chatbot/README.md index 04572783..882e8fbf 100644 --- a/langsmith_tracing/chatbot/README.md +++ b/langsmith_tracing/chatbot/README.md @@ -21,10 +21,10 @@ Commands in the CLI: ## Tools -The model has two tools: +The model has two tools, both implemented as `@traceable` methods on the workflow class: -- **`save_note(name, content)`** — Saves a note durably via a Temporal activity. The workflow stores the note in its state dict and calls the activity, which creates a visible trace span in LangSmith. -- **`read_note(name)`** — Reads a note via a Temporal activity. The workflow looks up the note from its state dict and passes it to the activity for tracing visibility. +- **`save_note(name, content)`** — Stores a note in the workflow's in-memory dict. The note is durable because workflow state survives crashes and restarts via Temporal's event history. +- **`read_note(name)`** — Reads a note from the workflow's in-memory dict. ## Trace Structure @@ -49,13 +49,13 @@ Session Apr 17 10:30 (@traceable, workflow) ├── Request: Save that as a note called paris (@traceable, per-message) │ ├── Call OpenAI (@traceable, activity) │ │ └── openai.responses.create → function_call: save_note -│ ├── Save Note (@traceable, activity) +│ ├── Save Note (@traceable, workflow method) │ └── Call OpenAI (@traceable, activity) │ └── openai.responses.create → text response └── Request: What did I save about paris? (@traceable, per-message) ├── Call OpenAI (@traceable, activity) │ └── openai.responses.create → function_call: read_note - ├── Read Note (@traceable, activity) + ├── Read Note (@traceable, workflow method) └── Call OpenAI (@traceable, activity) └── openai.responses.create → text response ``` @@ -73,8 +73,7 @@ RunWorkflow:ChatbotWorkflow (automatic, Temporal plugin) ├── ExecuteActivity:call_openai (automatic, Temporal plugin) │ └── Call OpenAI (@traceable, activity) │ └── openai.responses.create (automatic via wrap_openai) - ├── ExecuteActivity:save_note (automatic, Temporal plugin) - │ └── Save Note (@traceable, activity) + ├── Save Note (@traceable, workflow method) └── ExecuteActivity:call_openai (automatic, Temporal plugin) └── Call OpenAI (@traceable, activity) └── openai.responses.create (automatic via wrap_openai) diff --git a/langsmith_tracing/chatbot/activities.py b/langsmith_tracing/chatbot/activities.py index 003394b6..6533a836 100644 --- a/langsmith_tracing/chatbot/activities.py +++ b/langsmith_tracing/chatbot/activities.py @@ -23,19 +23,12 @@ class OpenAIRequest: previous_response_id: str | None = None -@dataclass -class NoteRequest: - name: str - content: str - - -# @traceable creates a named span in LangSmith. run_type="llm" tells -# LangSmith this span represents an LLM call (vs. "chain" or "tool"). -# wrap_openai further enriches the trace with model params and token counts. @traceable(name="Call OpenAI", run_type="llm") @activity.defn async def call_openai(request: OpenAIRequest) -> Response: """Call OpenAI Responses API. Retries handled by Temporal, not the OpenAI client.""" + # wrap_openai patches the client so each API call (e.g. responses.create) + # creates its own child span with model parameters and token usage. client = wrap_openai(AsyncOpenAI(max_retries=0)) kwargs: dict[str, Any] = { "model": request.model, @@ -48,22 +41,3 @@ async def call_openai(request: OpenAIRequest) -> Response: if request.previous_response_id: kwargs["previous_response_id"] = request.previous_response_id return await client.responses.create(**kwargs) - - -# run_type="tool" renders distinctly in the LangSmith trace UI, -# making it easy to spot tool executions alongside LLM calls. -@traceable(name="Save Note", run_type="tool") -@activity.defn -async def save_note(request: NoteRequest) -> str: - """Save a note. Durable side effect — survives worker crashes.""" - activity.logger.info(f"Saving note '{request.name}': {request.content[:80]}") - return f"Saved note '{request.name}'." - - -@traceable(name="Read Note", run_type="tool") -@activity.defn -async def read_note(request: NoteRequest) -> str: - """Read a note. Content is passed from workflow state; the activity - exists so the read appears as a traced span in LangSmith.""" - activity.logger.info(f"Reading note '{request.name}'") - return request.content diff --git a/langsmith_tracing/chatbot/worker.py b/langsmith_tracing/chatbot/worker.py index f8d7b239..48987874 100644 --- a/langsmith_tracing/chatbot/worker.py +++ b/langsmith_tracing/chatbot/worker.py @@ -10,7 +10,7 @@ from temporalio.envconfig import ClientConfig from temporalio.worker import Worker -from langsmith_tracing.chatbot.activities import call_openai, read_note, save_note +from langsmith_tracing.chatbot.activities import call_openai from langsmith_tracing.chatbot.workflows import ChatbotWorkflow interrupt_event = asyncio.Event() @@ -38,7 +38,7 @@ async def main(): client, task_queue="langsmith-chatbot-task-queue", workflows=[ChatbotWorkflow], - activities=[call_openai, save_note, read_note], + activities=[call_openai], plugins=[plugin], ): label = "with" if add_temporal_runs else "without" diff --git a/langsmith_tracing/chatbot/workflows.py b/langsmith_tracing/chatbot/workflows.py index 797e6f6c..14b30207 100644 --- a/langsmith_tracing/chatbot/workflows.py +++ b/langsmith_tracing/chatbot/workflows.py @@ -9,13 +9,7 @@ with workflow.unsafe.imports_passed_through(): from langsmith import traceable - from langsmith_tracing.chatbot.activities import ( - NoteRequest, - OpenAIRequest, - call_openai, - read_note, - save_note, - ) + from langsmith_tracing.chatbot.activities import OpenAIRequest, call_openai RETRY = RetryPolicy(initial_interval=timedelta(seconds=2), maximum_attempts=3) @@ -105,6 +99,18 @@ async def _session(self) -> str: return "Session ended." + # Unlike @workflow.run, other workflow methods can be decorated with + # @traceable directly — they run inside the plugin-managed context + # where trace I/O is handled safely during replay. + @traceable(name="Save Note", run_type="tool") + def _save_note(self, name: str, content: str) -> str: + self._notes[name] = content + return f"Saved note '{name}'." + + @traceable(name="Read Note", run_type="tool") + def _read_note(self, name: str) -> str: + return self._notes.get(name, "Note not found.") + async def _query_openai(self, message: str | None) -> str: @traceable( name=f"Request: {(message or '')[:60]}", @@ -133,13 +139,7 @@ async def _traced(): continue args = json.loads(item.arguments) if item.name == "save_note": - self._notes[args["name"]] = args["content"] - result = await workflow.execute_activity( - save_note, - NoteRequest(name=args["name"], content=args["content"]), - start_to_close_timeout=timedelta(seconds=10), - retry_policy=RETRY, - ) + result = self._save_note(args["name"], args["content"]) tool_results.append( { "type": "function_call_output", @@ -148,13 +148,7 @@ async def _traced(): } ) elif item.name == "read_note": - content = self._notes.get(args["name"], "Note not found.") - result = await workflow.execute_activity( - read_note, - NoteRequest(name=args["name"], content=content), - start_to_close_timeout=timedelta(seconds=10), - retry_policy=RETRY, - ) + result = self._read_note(args["name"]) tool_results.append( { "type": "function_call_output", diff --git a/tests/langsmith_tracing/test_basic.py b/tests/langsmith_tracing/test_basic.py index d4b1d3ec..6a96ec6c 100644 --- a/tests/langsmith_tracing/test_basic.py +++ b/tests/langsmith_tracing/test_basic.py @@ -16,8 +16,6 @@ from langsmith_tracing.basic.workflows import BasicLLMWorkflow from tests.langsmith_tracing.helpers import make_text_response -# The workflow uses @traceable which requires the LangSmithPlugin's -# aio_to_thread patch to work inside the workflow sandbox. pytestmark = pytest.mark.skipif( LangSmithPlugin is None, reason="temporalio.contrib.langsmith not available", diff --git a/tests/langsmith_tracing/test_chatbot.py b/tests/langsmith_tracing/test_chatbot.py index b8fd25da..4b42049d 100644 --- a/tests/langsmith_tracing/test_chatbot.py +++ b/tests/langsmith_tracing/test_chatbot.py @@ -21,7 +21,7 @@ reason="temporalio.contrib.langsmith not available", ) -from langsmith_tracing.chatbot.activities import NoteRequest, OpenAIRequest +from langsmith_tracing.chatbot.activities import OpenAIRequest from langsmith_tracing.chatbot.workflows import ChatbotWorkflow from tests.langsmith_tracing.helpers import make_text_response, poll_last_response @@ -51,6 +51,7 @@ def _make_function_call_response( async def test_chatbot_save_note(client: Client, env: WorkflowEnvironment): + """Test save_note tool call loop — save_note runs as a workflow method.""" call_count = 0 @activity.defn(name="call_openai") @@ -64,19 +65,11 @@ async def mock_call_openai(request: OpenAIRequest) -> Response: ) return make_text_response("Note saved successfully!") - @activity.defn(name="save_note") - async def mock_save_note(request: NoteRequest) -> str: - return f"Saved note '{request.name}'." - - @activity.defn(name="read_note") - async def mock_read_note(request: NoteRequest) -> str: - return request.content - async with Worker( client, task_queue="test-langsmith-chatbot", workflows=[ChatbotWorkflow], - activities=[mock_call_openai, mock_save_note, mock_read_note], + activities=[mock_call_openai], plugins=[LangSmithPlugin()], ): wf_handle = await client.start_workflow( @@ -98,7 +91,7 @@ async def mock_read_note(request: NoteRequest) -> str: async def test_chatbot_read_note(client: Client, env: WorkflowEnvironment): - """Test that read_note calls an activity with content from workflow state.""" + """Test read_note tool call loop — read_note runs as a workflow method.""" call_count = 0 @activity.defn(name="call_openai") @@ -121,19 +114,11 @@ async def mock_call_openai(request: OpenAIRequest) -> Response: ) return make_text_response("Your todo says: Buy milk") - @activity.defn(name="save_note") - async def mock_save_note(request: NoteRequest) -> str: - return f"Saved note '{request.name}'." - - @activity.defn(name="read_note") - async def mock_read_note(request: NoteRequest) -> str: - return request.content - async with Worker( client, task_queue="test-langsmith-chatbot-read", workflows=[ChatbotWorkflow], - activities=[mock_call_openai, mock_save_note, mock_read_note], + activities=[mock_call_openai], plugins=[LangSmithPlugin()], ): wf_handle = await client.start_workflow( From be96deff2dbc25b131793463d3216bc1a5559122 Mon Sep 17 00:00:00 2001 From: Maple Xu Date: Mon, 20 Apr 2026 16:39:19 -0400 Subject: [PATCH 07/14] Remove screenshot placeholders, rename flag to --add-temporal-runs Co-Authored-By: Claude Opus 4.6 (1M context) --- langsmith_tracing/README.md | 2 +- langsmith_tracing/basic/README.md | 10 +++------- langsmith_tracing/basic/starter.py | 2 +- langsmith_tracing/basic/worker.py | 2 +- langsmith_tracing/chatbot/README.md | 8 +------- langsmith_tracing/chatbot/starter.py | 2 +- langsmith_tracing/chatbot/worker.py | 2 +- 7 files changed, 9 insertions(+), 19 deletions(-) diff --git a/langsmith_tracing/README.md b/langsmith_tracing/README.md index 57067456..ec9e0588 100644 --- a/langsmith_tracing/README.md +++ b/langsmith_tracing/README.md @@ -39,7 +39,7 @@ This sample shows three complementary ways LangSmith captures trace data: By default, `LangSmithPlugin(add_temporal_runs=False)` only propagates LangSmith context so that `@traceable` and `wrap_openai` calls nest correctly. -Set `add_temporal_runs=True` to also create LangSmith runs for Temporal operations (workflow executions, activity executions, signals, etc.), giving full visibility into the orchestration layer. Both examples support a `--temporal-runs` CLI flag to toggle this. +Set `add_temporal_runs=True` to also create LangSmith runs for Temporal operations (workflow executions, activity executions, signals, etc.), giving full visibility into the orchestration layer. Both examples support a `--add-temporal-runs` CLI flag to toggle this. ## Further Reading diff --git a/langsmith_tracing/basic/README.md b/langsmith_tracing/basic/README.md index 46f29165..9137dd03 100644 --- a/langsmith_tracing/basic/README.md +++ b/langsmith_tracing/basic/README.md @@ -25,15 +25,13 @@ Basic LLM Request (@traceable, client-side) └── openai.responses.create (automatic via wrap_openai) ``` - - ### `add_temporal_runs=True` -Pass `--temporal-runs` to both the worker and starter: +Pass `--add-temporal-runs` to both the worker and starter: ```bash -python -m langsmith_tracing.basic.worker --temporal-runs -python -m langsmith_tracing.basic.starter --temporal-runs +python -m langsmith_tracing.basic.worker --add-temporal-runs +python -m langsmith_tracing.basic.starter --add-temporal-runs ``` ``` @@ -45,5 +43,3 @@ Basic LLM Request (@traceable, client-side) └── Call OpenAI (@traceable, activity) └── openai.responses.create (automatic via wrap_openai) ``` - - diff --git a/langsmith_tracing/basic/starter.py b/langsmith_tracing/basic/starter.py index f73e5156..120bf8e3 100644 --- a/langsmith_tracing/basic/starter.py +++ b/langsmith_tracing/basic/starter.py @@ -13,7 +13,7 @@ async def main(): - add_temporal_runs = "--temporal-runs" in sys.argv + add_temporal_runs = "--add-temporal-runs" in sys.argv config = ClientConfig.load_client_connect_config() config.setdefault("target_host", "localhost:7233") diff --git a/langsmith_tracing/basic/worker.py b/langsmith_tracing/basic/worker.py index 56e36576..e3abfac7 100644 --- a/langsmith_tracing/basic/worker.py +++ b/langsmith_tracing/basic/worker.py @@ -21,7 +21,7 @@ async def main(): # add_temporal_runs=True creates LangSmith runs for each Temporal # workflow/activity execution. False (default) only propagates context. - add_temporal_runs = "--temporal-runs" in sys.argv + add_temporal_runs = "--add-temporal-runs" in sys.argv config = ClientConfig.load_client_connect_config() config.setdefault("target_host", "localhost:7233") diff --git a/langsmith_tracing/chatbot/README.md b/langsmith_tracing/chatbot/README.md index 882e8fbf..6f3b6442 100644 --- a/langsmith_tracing/chatbot/README.md +++ b/langsmith_tracing/chatbot/README.md @@ -37,8 +37,6 @@ Chatbot Session a1b2c3d4 (@traceable, client-side) └── Turn: What did I save about pa.. (@traceable, client-side per-turn) ``` - - ### Worker-side traces (`add_temporal_runs=False`) ``` @@ -60,11 +58,9 @@ Session Apr 17 10:30 (@traceable, workflow) └── openai.responses.create → text response ``` - - ### Worker-side traces (`add_temporal_runs=True`) -With `--temporal-runs`, Temporal operation spans wrap each `@traceable` span: +With `--add-temporal-runs`, Temporal operation spans wrap each `@traceable` span: ``` RunWorkflow:ChatbotWorkflow (automatic, Temporal plugin) @@ -78,5 +74,3 @@ RunWorkflow:ChatbotWorkflow (automatic, Temporal plugin) └── Call OpenAI (@traceable, activity) └── openai.responses.create (automatic via wrap_openai) ``` - - diff --git a/langsmith_tracing/chatbot/starter.py b/langsmith_tracing/chatbot/starter.py index 7f97eca2..c9cc183a 100644 --- a/langsmith_tracing/chatbot/starter.py +++ b/langsmith_tracing/chatbot/starter.py @@ -16,7 +16,7 @@ async def main(): - add_temporal_runs = "--temporal-runs" in sys.argv + add_temporal_runs = "--add-temporal-runs" in sys.argv config = ClientConfig.load_client_connect_config() config.setdefault("target_host", "localhost:7233") diff --git a/langsmith_tracing/chatbot/worker.py b/langsmith_tracing/chatbot/worker.py index 48987874..2295aae0 100644 --- a/langsmith_tracing/chatbot/worker.py +++ b/langsmith_tracing/chatbot/worker.py @@ -19,7 +19,7 @@ async def main(): logging.basicConfig(level=logging.INFO) - add_temporal_runs = "--temporal-runs" in sys.argv + add_temporal_runs = "--add-temporal-runs" in sys.argv config = ClientConfig.load_client_connect_config() config.setdefault("target_host", "localhost:7233") From b9d463eed15d6dc25dca98dbee51de0a447db488 Mon Sep 17 00:00:00 2001 From: Maple Xu Date: Mon, 20 Apr 2026 17:16:03 -0400 Subject: [PATCH 08/14] Clean up tests, naming, and dependencies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove skip markers from tests — CI should fail loudly if deps missing - Pin temporalio[pydantic,langsmith]>=1.26.0 (plugin is released) - Rename kwargs to response_args in chatbot activity - Remove notes CLI command from chatbot starter - Update chatbot README trace trees for accuracy - Change input prompt from "You: " to "> " Co-Authored-By: Claude Opus 4.6 (1M context) --- langsmith_tracing/chatbot/README.md | 24 +++++++++++++----------- langsmith_tracing/chatbot/activities.py | 8 ++++---- langsmith_tracing/chatbot/starter.py | 13 ++----------- pyproject.toml | 2 +- tests/langsmith_tracing/test_basic.py | 12 +----------- tests/langsmith_tracing/test_chatbot.py | 12 +----------- 6 files changed, 22 insertions(+), 49 deletions(-) diff --git a/langsmith_tracing/chatbot/README.md b/langsmith_tracing/chatbot/README.md index 6f3b6442..5515fd7b 100644 --- a/langsmith_tracing/chatbot/README.md +++ b/langsmith_tracing/chatbot/README.md @@ -16,7 +16,6 @@ python -m langsmith_tracing.chatbot.starter Commands in the CLI: - Type a message and press Enter to chat -- `notes` — display all saved notes - `exit` — end the session ## Tools @@ -28,18 +27,16 @@ The model has two tools, both implemented as `@traceable` methods on the workflo ## Trace Structure -### Client-side traces +### `add_temporal_runs=False` (default) -``` -Chatbot Session a1b2c3d4 (@traceable, client-side) -├── Turn: What's the capital of Fr.. (@traceable, client-side per-turn) -├── Turn: Save that as a note call.. (@traceable, client-side per-turn) -└── Turn: What did I save about pa.. (@traceable, client-side per-turn) -``` - -### Worker-side traces (`add_temporal_runs=False`) +The chatbot produces two traces: one from the client (starter) and one from the worker. They appear as separate root traces in LangSmith. ``` +Chatbot Session a1b2c3d4 (@traceable, client-side) +├── Turn: What's the capital of Fr.. (@traceable, client-side per-turn) +├── Turn: Save that as a note call.. (@traceable, client-side per-turn) +└── Turn: What did I save about pa.. (@traceable, client-side per-turn) + Session Apr 17 10:30 (@traceable, workflow) ├── Request: What's the capital of France? (@traceable, per-message) │ └── Call OpenAI (@traceable, activity) @@ -58,11 +55,16 @@ Session Apr 17 10:30 (@traceable, workflow) └── openai.responses.create → text response ``` -### Worker-side traces (`add_temporal_runs=True`) +### `add_temporal_runs=True` With `--add-temporal-runs`, Temporal operation spans wrap each `@traceable` span: ``` +Chatbot Session a1b2c3d4 (@traceable, client-side) +├── Turn: Save that as a note call.. (@traceable, client-side per-turn) +│ └── HandleSignal:user_message (automatic, Temporal plugin) +└── ... + RunWorkflow:ChatbotWorkflow (automatic, Temporal plugin) └── Session Apr 17 10:30 (@traceable, workflow) └── Request: Save that as a note called paris (@traceable, per-message) diff --git a/langsmith_tracing/chatbot/activities.py b/langsmith_tracing/chatbot/activities.py index 6533a836..9545e3f9 100644 --- a/langsmith_tracing/chatbot/activities.py +++ b/langsmith_tracing/chatbot/activities.py @@ -30,14 +30,14 @@ async def call_openai(request: OpenAIRequest) -> Response: # wrap_openai patches the client so each API call (e.g. responses.create) # creates its own child span with model parameters and token usage. client = wrap_openai(AsyncOpenAI(max_retries=0)) - kwargs: dict[str, Any] = { + response_args: dict[str, Any] = { "model": request.model, "instructions": request.instructions, "input": request.input, "timeout": 30, } if request.tools: - kwargs["tools"] = request.tools + response_args["tools"] = request.tools if request.previous_response_id: - kwargs["previous_response_id"] = request.previous_response_id - return await client.responses.create(**kwargs) + response_args["previous_response_id"] = request.previous_response_id + return await client.responses.create(**response_args) diff --git a/langsmith_tracing/chatbot/starter.py b/langsmith_tracing/chatbot/starter.py index c9cc183a..f94a27f6 100644 --- a/langsmith_tracing/chatbot/starter.py +++ b/langsmith_tracing/chatbot/starter.py @@ -48,10 +48,10 @@ async def run_session(): task_queue="langsmith-chatbot-task-queue", ) print(f"Started workflow: {wf_handle.id}") - print('Type a message, "notes" to see saved notes, or "exit" to quit.\n') + print('Type a message or "exit" to quit.\n') while True: - user_input = input("You: ").strip() + user_input = input("> ").strip() if not user_input: continue @@ -61,15 +61,6 @@ async def run_session(): print(f"\nWorkflow finished: {result}") return - if user_input.lower() == "notes": - notes = await wf_handle.query(ChatbotWorkflow.notes) - if notes: - for name, content in notes.items(): - print(f" [{name}]: {content}") - else: - print(" (no notes yet)") - continue - # Each turn gets its own trace span @traceable( name=f"Turn: {user_input[:40]}", diff --git a/pyproject.toml b/pyproject.toml index 0932edde..7ea9ddf5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,7 @@ langchain = [ langsmith-tracing = [ "openai>=1.4.0,<2", "langsmith>=0.7.0", - "temporalio[pydantic]", + "temporalio[pydantic,langsmith]>=1.26.0", ] nexus = ["nexus-rpc>=1.1.0,<2"] open-telemetry = [ diff --git a/tests/langsmith_tracing/test_basic.py b/tests/langsmith_tracing/test_basic.py index 6a96ec6c..53d80d58 100644 --- a/tests/langsmith_tracing/test_basic.py +++ b/tests/langsmith_tracing/test_basic.py @@ -1,26 +1,16 @@ import uuid -import pytest from openai.types.responses import Response from temporalio import activity from temporalio.client import Client +from temporalio.contrib.langsmith import LangSmithPlugin from temporalio.testing import WorkflowEnvironment from temporalio.worker import Worker -try: - from temporalio.contrib.langsmith import LangSmithPlugin -except ImportError: - LangSmithPlugin = None # type: ignore[assignment,misc] - from langsmith_tracing.basic.activities import OpenAIRequest from langsmith_tracing.basic.workflows import BasicLLMWorkflow from tests.langsmith_tracing.helpers import make_text_response -pytestmark = pytest.mark.skipif( - LangSmithPlugin is None, - reason="temporalio.contrib.langsmith not available", -) - async def test_basic_workflow(client: Client, env: WorkflowEnvironment): expected_text = "Temporal is a durable execution platform." diff --git a/tests/langsmith_tracing/test_chatbot.py b/tests/langsmith_tracing/test_chatbot.py index 4b42049d..15c03849 100644 --- a/tests/langsmith_tracing/test_chatbot.py +++ b/tests/langsmith_tracing/test_chatbot.py @@ -1,26 +1,16 @@ import json import uuid -import pytest from openai.types.responses import Response from openai.types.responses.response_function_tool_call import ( ResponseFunctionToolCall, ) from temporalio import activity from temporalio.client import Client +from temporalio.contrib.langsmith import LangSmithPlugin from temporalio.testing import WorkflowEnvironment from temporalio.worker import Worker -try: - from temporalio.contrib.langsmith import LangSmithPlugin -except ImportError: - LangSmithPlugin = None # type: ignore[assignment,misc] - -pytestmark = pytest.mark.skipif( - LangSmithPlugin is None, - reason="temporalio.contrib.langsmith not available", -) - from langsmith_tracing.chatbot.activities import OpenAIRequest from langsmith_tracing.chatbot.workflows import ChatbotWorkflow from tests.langsmith_tracing.helpers import make_text_response, poll_last_response From 3fcdbf46a515f772d453d24a7caae310ee01eec0 Mon Sep 17 00:00:00 2001 From: Maple Xu Date: Mon, 20 Apr 2026 17:25:23 -0400 Subject: [PATCH 09/14] Fix README trace trees to match actual integration test hierarchies - StartWorkflow/RunWorkflow are siblings, not parent-child - StartActivity/RunActivity are siblings under RunWorkflow - @traceable activity spans nest under RunActivity - Signal/query traces are separate roots (or under client @traceable) - Merge client-side and worker-side into unified trees - add_temporal_runs=False: only @traceable spans, all under client root Co-Authored-By: Claude Opus 4.6 (1M context) --- langsmith_tracing/basic/README.md | 19 +++++--- langsmith_tracing/chatbot/README.md | 74 +++++++++++++++-------------- 2 files changed, 51 insertions(+), 42 deletions(-) diff --git a/langsmith_tracing/basic/README.md b/langsmith_tracing/basic/README.md index 9137dd03..5bd9a55b 100644 --- a/langsmith_tracing/basic/README.md +++ b/langsmith_tracing/basic/README.md @@ -18,6 +18,8 @@ python -m langsmith_tracing.basic.starter ### `add_temporal_runs=False` (default) +Only `@traceable` and `wrap_openai` spans appear. The client-side `@traceable` is the root, and all workflow/activity traces nest under it via context propagation: + ``` Basic LLM Request (@traceable, client-side) └── Ask: What is Temporal? (@traceable, workflow) @@ -34,12 +36,15 @@ python -m langsmith_tracing.basic.worker --add-temporal-runs python -m langsmith_tracing.basic.starter --add-temporal-runs ``` +Temporal operation spans are added. `StartWorkflow` and `RunWorkflow` are siblings under the client root; `StartActivity` and `RunActivity` are siblings under the workflow: + ``` -Basic LLM Request (@traceable, client-side) -└── StartWorkflow:BasicLLMWorkflow (automatic, Temporal plugin) - └── RunWorkflow:BasicLLMWorkflow (automatic, Temporal plugin) - └── Ask: What is Temporal? (@traceable, workflow) - └── ExecuteActivity:call_openai (automatic, Temporal plugin) - └── Call OpenAI (@traceable, activity) - └── openai.responses.create (automatic via wrap_openai) +Basic LLM Request (@traceable, client-side) +├── StartWorkflow:BasicLLMWorkflow (automatic, Temporal plugin) +└── RunWorkflow:BasicLLMWorkflow (automatic, Temporal plugin) + └── Ask: What is Temporal? (@traceable, workflow) + ├── StartActivity:call_openai (automatic, Temporal plugin) + └── RunActivity:call_openai (automatic, Temporal plugin) + └── Call OpenAI (@traceable, activity) + └── openai.responses.create (automatic via wrap_openai) ``` diff --git a/langsmith_tracing/chatbot/README.md b/langsmith_tracing/chatbot/README.md index 5515fd7b..3708c024 100644 --- a/langsmith_tracing/chatbot/README.md +++ b/langsmith_tracing/chatbot/README.md @@ -29,50 +29,54 @@ The model has two tools, both implemented as `@traceable` methods on the workflo ### `add_temporal_runs=False` (default) -The chatbot produces two traces: one from the client (starter) and one from the worker. They appear as separate root traces in LangSmith. +Only `@traceable` and `wrap_openai` spans appear. The client-side `@traceable` wraps `start_workflow`, so the workflow's traces nest under it via context propagation. Signals and queries produce no traces in this mode. ``` Chatbot Session a1b2c3d4 (@traceable, client-side) -├── Turn: What's the capital of Fr.. (@traceable, client-side per-turn) -├── Turn: Save that as a note call.. (@traceable, client-side per-turn) -└── Turn: What did I save about pa.. (@traceable, client-side per-turn) - -Session Apr 17 10:30 (@traceable, workflow) -├── Request: What's the capital of France? (@traceable, per-message) -│ └── Call OpenAI (@traceable, activity) -│ └── openai.responses.create (automatic via wrap_openai) -├── Request: Save that as a note called paris (@traceable, per-message) -│ ├── Call OpenAI (@traceable, activity) -│ │ └── openai.responses.create → function_call: save_note -│ ├── Save Note (@traceable, workflow method) -│ └── Call OpenAI (@traceable, activity) -│ └── openai.responses.create → text response -└── Request: What did I save about paris? (@traceable, per-message) - ├── Call OpenAI (@traceable, activity) - │ └── openai.responses.create → function_call: read_note - ├── Read Note (@traceable, workflow method) - └── Call OpenAI (@traceable, activity) - └── openai.responses.create → text response +├── Turn: What's the capital of Fr.. (@traceable, client-side) +├── Turn: Save that as a note call.. (@traceable, client-side) +├── Turn: What did I save about pa.. (@traceable, client-side) +└── Session Apr 17 10:30 (@traceable, workflow) + ├── Request: What's the capital of France? (@traceable, per-message) + │ └── Call OpenAI (@traceable, activity) + │ └── openai.responses.create (automatic via wrap_openai) + ├── Request: Save that as a note called paris (@traceable, per-message) + │ ├── Call OpenAI (@traceable, activity) + │ │ └── openai.responses.create → function_call: save_note + │ ├── Save Note (@traceable, workflow method) + │ └── Call OpenAI (@traceable, activity) + │ └── openai.responses.create → text response + └── Request: What did I save about paris? (@traceable, per-message) + ├── Call OpenAI (@traceable, activity) + │ └── openai.responses.create → function_call: read_note + ├── Read Note (@traceable, workflow method) + └── Call OpenAI (@traceable, activity) + └── openai.responses.create → text response ``` ### `add_temporal_runs=True` -With `--add-temporal-runs`, Temporal operation spans wrap each `@traceable` span: +With `--add-temporal-runs`, Temporal operation spans are added. `StartWorkflow` and `RunWorkflow` are siblings under the client root (context propagated via headers at `start_workflow` time). Signals and queries each get their own trace. ``` Chatbot Session a1b2c3d4 (@traceable, client-side) -├── Turn: Save that as a note call.. (@traceable, client-side per-turn) -│ └── HandleSignal:user_message (automatic, Temporal plugin) +├── StartWorkflow:ChatbotWorkflow (automatic, Temporal plugin) +├── RunWorkflow:ChatbotWorkflow (automatic, Temporal plugin) +│ └── Session Apr 17 10:30 (@traceable, workflow) +│ └── Request: Save that as a note called.. (@traceable, per-message) +│ ├── StartActivity:call_openai (automatic, Temporal plugin) +│ ├── RunActivity:call_openai (automatic, Temporal plugin) +│ │ └── Call OpenAI (@traceable, activity) +│ │ └── openai.responses.create (automatic via wrap_openai) +│ ├── Save Note (@traceable, workflow method) +│ ├── StartActivity:call_openai (automatic, Temporal plugin) +│ └── RunActivity:call_openai (automatic, Temporal plugin) +│ └── Call OpenAI (@traceable, activity) +│ └── openai.responses.create (automatic via wrap_openai) +├── Turn: Save that as a note call.. (@traceable, client-side) +│ ├── SignalWorkflow:user_message (automatic, Temporal plugin) +│ │ └── HandleSignal:user_message (automatic, Temporal plugin) +│ └── QueryWorkflow:last_response (automatic, Temporal plugin) +│ └── HandleQuery:last_response (automatic, Temporal plugin) └── ... - -RunWorkflow:ChatbotWorkflow (automatic, Temporal plugin) -└── Session Apr 17 10:30 (@traceable, workflow) - └── Request: Save that as a note called paris (@traceable, per-message) - ├── ExecuteActivity:call_openai (automatic, Temporal plugin) - │ └── Call OpenAI (@traceable, activity) - │ └── openai.responses.create (automatic via wrap_openai) - ├── Save Note (@traceable, workflow method) - └── ExecuteActivity:call_openai (automatic, Temporal plugin) - └── Call OpenAI (@traceable, activity) - └── openai.responses.create (automatic via wrap_openai) ``` From f955e5b7ee40ad15b6a475847b12e8c09a5d4950 Mon Sep 17 00:00:00 2001 From: Maple Xu Date: Mon, 20 Apr 2026 17:26:28 -0400 Subject: [PATCH 10/14] Add openai-agents to conflicting groups for langsmith-tracing temporalio>=1.26.0 requires openai-agents>=0.14.0 but the openai-agents group pins ==0.3.2, causing a resolution failure. Co-Authored-By: Claude Opus 4.6 (1M context) --- pyproject.toml | 4 ++ uv.lock | 167 ++++++++++++++++++++++++++++++++++++------------- 2 files changed, 128 insertions(+), 43 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7ea9ddf5..5aa9834b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -138,6 +138,10 @@ conflicts = [ { group = "langchain" }, { group = "langsmith-tracing" }, ], + [ + { group = "openai-agents" }, + { group = "langsmith-tracing" }, + ], ] [tool.ruff] diff --git a/uv.lock b/uv.lock index 2fcd64fe..491cca7b 100644 --- a/uv.lock +++ b/uv.lock @@ -2,10 +2,10 @@ version = 1 revision = 3 requires-python = ">=3.10" resolution-markers = [ - "python_full_version >= '3.13' and extra != 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version == '3.12.*' and extra != 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version == '3.11.*' and extra != 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version < '3.11' and extra != 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version >= '3.13' and extra != 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing' and extra != 'group-18-temporalio-samples-openai-agents'", + "python_full_version == '3.12.*' and extra != 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing' and extra != 'group-18-temporalio-samples-openai-agents'", + "python_full_version == '3.11.*' and extra != 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing' and extra != 'group-18-temporalio-samples-openai-agents'", + "python_full_version < '3.11' and extra != 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing' and extra != 'group-18-temporalio-samples-openai-agents'", "python_full_version >= '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", "python_full_version >= '3.12.4' and python_full_version < '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", "python_full_version >= '3.12' and python_full_version < '3.12.4' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", @@ -19,6 +19,9 @@ resolution-markers = [ conflicts = [[ { package = "temporalio-samples", group = "langchain" }, { package = "temporalio-samples", group = "langsmith-tracing" }, +], [ + { package = "temporalio-samples", group = "langsmith-tracing" }, + { package = "temporalio-samples", group = "openai-agents" }, ]] [[package]] @@ -37,7 +40,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, { name = "aiosignal" }, - { name = "async-timeout", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "async-timeout", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, { name = "attrs" }, { name = "frozenlist" }, { name = "multidict" }, @@ -122,7 +125,7 @@ version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frozenlist" }, - { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } wheels = [ @@ -143,10 +146,10 @@ name = "anyio" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "exceptiongroup", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, { name = "sniffio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload-time = "2025-03-17T00:02:54.77Z" } wheels = [ @@ -331,7 +334,7 @@ name = "click" version = "8.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } wheels = [ @@ -406,7 +409,7 @@ name = "exceptiongroup" version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" } wheels = [ @@ -544,8 +547,8 @@ name = "gevent" version = "25.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi", marker = "(platform_python_implementation == 'CPython' and sys_platform == 'win32') or (platform_python_implementation != 'CPython' and extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (sys_platform != 'win32' and extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, - { name = "greenlet", marker = "platform_python_implementation == 'CPython' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "cffi", marker = "(platform_python_implementation == 'CPython' and sys_platform == 'win32') or (platform_python_implementation != 'CPython' and extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (platform_python_implementation != 'CPython' and extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents') or (sys_platform != 'win32' and extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (sys_platform != 'win32' and extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "greenlet", marker = "platform_python_implementation == 'CPython' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, { name = "zope-event" }, { name = "zope-interface" }, ] @@ -831,7 +834,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, { name = "fsspec" }, - { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, { name = "packaging" }, { name = "pyyaml" }, { name = "requests" }, @@ -1267,10 +1270,10 @@ dependencies = [ { name = "pydantic" }, { name = "pydantic-settings" }, { name = "python-multipart" }, - { name = "pywin32", marker = "sys_platform == 'win32' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, { name = "sse-starlette" }, { name = "starlette" }, - { name = "uvicorn", marker = "sys_platform != 'emscripten' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3a/f5/9506eb5578d5bbe9819ee8ba3198d0ad0e2fbe3bab8b257e4131ceb7dfb6/mcp-1.11.0.tar.gz", hash = "sha256:49a213df56bb9472ff83b3132a4825f5c8f5b120a90246f08b0dac6bedac44c8", size = 406907, upload-time = "2025-07-10T16:41:09.388Z" } wheels = [ @@ -1291,7 +1294,7 @@ name = "multidict" version = "6.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3d/2c/5dad12e82fbdf7470f29bff2171484bf07cb3b16ada60a6589af8f376440/multidict-6.6.3.tar.gz", hash = "sha256:798a9eb12dab0a6c2e29c1de6f3468af5cb2da6053a20dfa3344907eed0937cc", size = 101006, upload-time = "2025-06-30T15:53:46.929Z" } wheels = [ @@ -1395,7 +1398,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, { name = "pathspec" }, - { name = "tomli", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "tomli", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/81/69/92c7fa98112e4d9eb075a239caa4ef4649ad7d441545ccffbd5e34607cbb/mypy-1.16.1.tar.gz", hash = "sha256:6bd00a0a2094841c5e47e7374bb42b83d64c527a502e3334e1173a0c24437bab", size = 3324747, upload-time = "2025-06-16T16:51:35.145Z" } @@ -1440,6 +1443,17 @@ wheels = [ name = "nexus-rpc" version = "1.3.0" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version >= '3.12' and python_full_version < '3.12.4' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version == '3.11.*' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version < '3.11' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version >= '3.13' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version == '3.12.*' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version == '3.11.*' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version < '3.11' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", +] dependencies = [ { name = "typing-extensions" }, ] @@ -1448,6 +1462,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d6/74/0afd841de3199c148146c1d43b4bfb5605b2f1dc4c9a9087fe395091ea5a/nexus_rpc-1.3.0-py3-none-any.whl", hash = "sha256:aee0707b4861b22d8124ecb3f27d62dafbe8777dc50c66c91e49c006f971b92d", size = 28873, upload-time = "2025-12-08T22:59:12.024Z" }, ] +[[package]] +name = "nexus-rpc" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version == '3.12.*'", + "python_full_version == '3.11.*'", + "python_full_version < '3.11'", +] +dependencies = [ + { name = "typing-extensions", marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/d5/cd1ffb202b76ebc1b33c1332a3416e55a39929006982adc2b1eb069aaa9b/nexus_rpc-1.4.0.tar.gz", hash = "sha256:3b8b373d4865671789cc43623e3dc0bcbf192562e40e13727e17f1c149050fba", size = 82367, upload-time = "2026-02-25T22:01:34.053Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/52/6327a5f4fda01207205038a106a99848a41c83e933cd23ea2cab3d2ebc6c/nexus_rpc-1.4.0-py3-none-any.whl", hash = "sha256:14c953d3519113f8ccec533a9efdb6b10c28afef75d11cdd6d422640c40b3a49", size = 29645, upload-time = "2026-02-25T22:01:33.122Z" }, +] + [[package]] name = "nodeenv" version = "1.9.1" @@ -1797,7 +1829,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pastel" }, { name = "pyyaml" }, - { name = "tomli", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "tomli", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cf/ac/311c8a492dc887f0b7a54d0ec3324cb2f9538b7b78ea06e5f7ae1f167e52/poethepoet-0.36.0.tar.gz", hash = "sha256:2217b49cb4e4c64af0b42ff8c4814b17f02e107d38bc461542517348ede25663", size = 66854, upload-time = "2025-06-29T19:54:50.444Z" } wheels = [ @@ -2147,12 +2179,12 @@ name = "pytest" version = "7.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, - { name = "tomli", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "tomli", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/80/1f/9d8e98e4133ffb16c90f3b405c43e38d3abb715bb5d7a63a5a684f7e46a3/pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", size = 1357116, upload-time = "2023-12-31T12:00:18.035Z" } wheels = [ @@ -2297,7 +2329,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "rpds-py" }, - { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } wheels = [ @@ -2407,7 +2439,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, - { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload-time = "2025-03-30T14:15:14.23Z" } wheels = [ @@ -2689,7 +2721,7 @@ version = "0.47.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0a/69/662169fdb92fb96ec3eaee218cf540a629d629c86d7993d9651226a6789b/starlette-0.47.1.tar.gz", hash = "sha256:aef012dd2b6be325ffa16698f9dc533614fb1cebd593a906b90dc1025529a79b", size = 2583072, upload-time = "2025-06-21T04:03:17.337Z" } wheels = [ @@ -2700,10 +2732,21 @@ wheels = [ name = "temporalio" version = "1.23.0" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version >= '3.12' and python_full_version < '3.12.4' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version == '3.11.*' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version < '3.11' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version >= '3.13' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version == '3.12.*' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version == '3.11.*' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version < '3.11' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", +] dependencies = [ - { name = "nexus-rpc" }, + { name = "nexus-rpc", version = "1.3.0", source = { registry = "https://pypi.org/simple" } }, { name = "protobuf" }, - { name = "python-dateutil", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "python-dateutil", marker = "(python_full_version < '3.11' and extra == 'group-18-temporalio-samples-langchain') or (python_full_version < '3.11' and extra != 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, { name = "types-protobuf" }, { name = "typing-extensions" }, ] @@ -2722,8 +2765,43 @@ openai-agents = [ { name = "openai-agents" }, ] opentelemetry = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-sdk" }, + { name = "opentelemetry-api", marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "opentelemetry-sdk", marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, +] + +[[package]] +name = "temporalio" +version = "1.26.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version == '3.12.*'", + "python_full_version == '3.11.*'", + "python_full_version < '3.11'", +] +dependencies = [ + { name = "nexus-rpc", version = "1.4.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, + { name = "protobuf", marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, + { name = "python-dateutil", marker = "(python_full_version < '3.11' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "types-protobuf", marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, + { name = "typing-extensions", marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/d4/fa21150a225393f87732ed6fef3cc9735d9e751edc6be415fe6e375105c6/temporalio-1.26.0.tar.gz", hash = "sha256:f4bfb35125e6f5e8c7f7ed1277c7354d812c6fac7ed5f8dbd50536cf289aaaa7", size = 2388994, upload-time = "2026-04-15T23:43:00.911Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/27/8c421c622d18cc8e034247d5d72b89e6456937344b5bec1de40abef3c085/temporalio-1.26.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:5489040c0cf621edeb36984199dd9e4fbd2b3a07d61a4f2a8da1f2cb9820ef26", size = 14221070, upload-time = "2026-04-15T23:42:26.21Z" }, + { url = "https://files.pythonhosted.org/packages/49/7c/d2b691d16ec5db87198c2e08dbfba58e286c096faee15753613a581abdce/temporalio-1.26.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:b18dd85771509c19ef059a31908bcd4e6130d1f67037c4db519702f3f2ad6d4a", size = 13583991, upload-time = "2026-04-15T23:42:34.357Z" }, + { url = "https://files.pythonhosted.org/packages/05/ca/b8728451320ca9d8bb6e1680b9bd23767118f86d5b8644edf2304d533f1b/temporalio-1.26.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46187d5f82ca2ae81f35ea5916a76db0e2f067210dc6b1852c3749475721946e", size = 13808036, upload-time = "2026-04-15T23:42:42.757Z" }, + { url = "https://files.pythonhosted.org/packages/cb/54/3113f5e0ac58655790abac64656373e06191b351d74bfb94692e81bd6784/temporalio-1.26.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03300c3e5237443367ac61bb20bd726c656b3daa50310bdd436599d5bdc7cf97", size = 14336604, upload-time = "2026-04-15T23:42:49.851Z" }, + { url = "https://files.pythonhosted.org/packages/fd/9b/c50840a26af3587c0c8d9af04d9976743e22496996dc1a377efc75dcd316/temporalio-1.26.0-cp310-abi3-win_amd64.whl", hash = "sha256:1c4a0d82f0a3796cbf78864c799f8dca0b94cdaec68e7b8b224c859005686ec4", size = 14525849, upload-time = "2026-04-15T23:42:57.589Z" }, +] + +[package.optional-dependencies] +langsmith = [ + { name = "langsmith", version = "0.7.32", source = { registry = "https://pypi.org/simple" } }, +] +opentelemetry = [ + { name = "opentelemetry-api", marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, + { name = "opentelemetry-sdk", marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, ] pydantic = [ { name = "pydantic" }, @@ -2734,7 +2812,8 @@ name = "temporalio-samples" version = "0.1a1" source = { editable = "." } dependencies = [ - { name = "temporalio" }, + { name = "temporalio", version = "1.23.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "temporalio", version = "1.26.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, ] [package.dev-dependencies] @@ -2743,8 +2822,8 @@ bedrock = [ ] cloud-export-to-parquet = [ { name = "boto3" }, - { name = "numpy", marker = "python_full_version < '3.13' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, - { name = "pandas", marker = "python_full_version < '4' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "numpy", marker = "python_full_version < '3.13' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "pandas", marker = "python_full_version < '4' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, { name = "pyarrow" }, ] dev = [ @@ -2777,24 +2856,26 @@ langchain = [ { name = "langsmith", version = "0.1.147", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '4'" }, { name = "openai" }, { name = "tqdm" }, - { name = "uvicorn", extra = ["standard"], marker = "extra == 'group-18-temporalio-samples-langchain'" }, + { name = "uvicorn", extra = ["standard"], marker = "extra == 'group-18-temporalio-samples-langchain' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, ] langsmith-tracing = [ { name = "langsmith", version = "0.7.32", source = { registry = "https://pypi.org/simple" } }, { name = "openai" }, - { name = "temporalio", extra = ["pydantic"], marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, + { name = "temporalio", version = "1.26.0", source = { registry = "https://pypi.org/simple" }, extra = ["langsmith", "pydantic"], marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, ] nexus = [ - { name = "nexus-rpc" }, + { name = "nexus-rpc", version = "1.3.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "nexus-rpc", version = "1.4.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, ] open-telemetry = [ { name = "opentelemetry-exporter-otlp-proto-grpc" }, - { name = "temporalio", extra = ["opentelemetry"] }, + { name = "temporalio", version = "1.23.0", source = { registry = "https://pypi.org/simple" }, extra = ["opentelemetry"], marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "temporalio", version = "1.26.0", source = { registry = "https://pypi.org/simple" }, extra = ["opentelemetry"], marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, ] openai-agents = [ - { name = "openai-agents", extra = ["litellm"] }, + { name = "openai-agents", extra = ["litellm"], marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, { name = "requests" }, - { name = "temporalio", extra = ["openai-agents"] }, + { name = "temporalio", version = "1.23.0", source = { registry = "https://pypi.org/simple" }, extra = ["openai-agents"], marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, ] pydantic-converter = [ { name = "pydantic" }, @@ -2851,7 +2932,7 @@ langchain = [ langsmith-tracing = [ { name = "langsmith", specifier = ">=0.7.0" }, { name = "openai", specifier = ">=1.4.0,<2" }, - { name = "temporalio", extras = ["pydantic"] }, + { name = "temporalio", extras = ["pydantic", "langsmith"], specifier = ">=1.26.0" }, ] nexus = [{ name = "nexus-rpc", specifier = ">=1.1.0,<2" }] open-telemetry = [ @@ -3009,7 +3090,7 @@ name = "tqdm" version = "4.67.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } wheels = [ @@ -3022,8 +3103,8 @@ version = "0.28.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, - { name = "cffi", marker = "(implementation_name != 'pypy' and os_name == 'nt') or (implementation_name == 'pypy' and extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (os_name != 'nt' and extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "cffi", marker = "(implementation_name != 'pypy' and os_name == 'nt') or (implementation_name == 'pypy' and extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (implementation_name == 'pypy' and extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents') or (os_name != 'nt' and extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (os_name != 'nt' and extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, { name = "idna" }, { name = "outcome" }, { name = "sniffio" }, @@ -3039,7 +3120,7 @@ name = "trio-asyncio" version = "0.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "exceptiongroup", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, { name = "greenlet" }, { name = "outcome" }, { name = "sniffio" }, @@ -3168,7 +3249,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, - { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing')" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e5/84/d43ce8fe6b31a316ef0ed04ea0d58cab981bdf7f17f8423491fa8b4f50b6/uvicorn-0.24.0.post1.tar.gz", hash = "sha256:09c8e5a79dc466bdf28dead50093957db184de356fcdc48697bad3bde4c2588e", size = 40102, upload-time = "2023-11-06T06:37:42.283Z" } wheels = [ From 51d781708c4de863babb9b9f3472643e2aaf0aaa Mon Sep 17 00:00:00 2001 From: Maple Xu Date: Mon, 20 Apr 2026 17:30:34 -0400 Subject: [PATCH 11/14] Fix run commands to include --group langsmith-tracing Without the group flag, uv resolves the base temporalio dep (1.23.0) which doesn't have contrib.langsmith. Co-Authored-By: Claude Opus 4.6 (1M context) --- langsmith_tracing/basic/README.md | 8 ++++---- langsmith_tracing/chatbot/README.md | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/langsmith_tracing/basic/README.md b/langsmith_tracing/basic/README.md index 5bd9a55b..46d5d27a 100644 --- a/langsmith_tracing/basic/README.md +++ b/langsmith_tracing/basic/README.md @@ -8,10 +8,10 @@ See the [parent README](../README.md) for prerequisites. ```bash # Terminal 1 — start the worker -python -m langsmith_tracing.basic.worker +uv run --group langsmith-tracing python -m langsmith_tracing.basic.worker # Terminal 2 — run the workflow -python -m langsmith_tracing.basic.starter +uv run --group langsmith-tracing python -m langsmith_tracing.basic.starter ``` ## Trace Structure @@ -32,8 +32,8 @@ Basic LLM Request (@traceable, client-side) Pass `--add-temporal-runs` to both the worker and starter: ```bash -python -m langsmith_tracing.basic.worker --add-temporal-runs -python -m langsmith_tracing.basic.starter --add-temporal-runs +uv run --group langsmith-tracing python -m langsmith_tracing.basic.worker --add-temporal-runs +uv run --group langsmith-tracing python -m langsmith_tracing.basic.starter --add-temporal-runs ``` Temporal operation spans are added. `StartWorkflow` and `RunWorkflow` are siblings under the client root; `StartActivity` and `RunActivity` are siblings under the workflow: diff --git a/langsmith_tracing/chatbot/README.md b/langsmith_tracing/chatbot/README.md index 3708c024..332bd976 100644 --- a/langsmith_tracing/chatbot/README.md +++ b/langsmith_tracing/chatbot/README.md @@ -8,10 +8,10 @@ See the [parent README](../README.md) for prerequisites. ```bash # Terminal 1 — start the worker -python -m langsmith_tracing.chatbot.worker +uv run --group langsmith-tracing python -m langsmith_tracing.chatbot.worker # Terminal 2 — interactive CLI -python -m langsmith_tracing.chatbot.starter +uv run --group langsmith-tracing python -m langsmith_tracing.chatbot.starter ``` Commands in the CLI: From 8a57690046433f36e8ad87e809c3de41a7d11a19 Mon Sep 17 00:00:00 2001 From: Maple Xu Date: Tue, 21 Apr 2026 10:12:59 -0400 Subject: [PATCH 12/14] fix tracing project --- langsmith_tracing/basic/starter.py | 16 +- langsmith_tracing/basic/worker.py | 12 +- langsmith_tracing/chatbot/starter.py | 16 +- langsmith_tracing/chatbot/worker.py | 33 +- uv.lock | 629 ++++++++++++++++----------- 5 files changed, 414 insertions(+), 292 deletions(-) diff --git a/langsmith_tracing/basic/starter.py b/langsmith_tracing/basic/starter.py index 120bf8e3..24e392fb 100644 --- a/langsmith_tracing/basic/starter.py +++ b/langsmith_tracing/basic/starter.py @@ -11,6 +11,8 @@ from langsmith_tracing.basic.workflows import BasicLLMWorkflow +PROJECT_NAME = "langsmith-basic" + async def main(): add_temporal_runs = "--add-temporal-runs" in sys.argv @@ -19,7 +21,7 @@ async def main(): config.setdefault("target_host", "localhost:7233") plugin = LangSmithPlugin( - project_name="langsmith-basic", + project_name=PROJECT_NAME, add_temporal_runs=add_temporal_runs, ) @@ -29,9 +31,15 @@ async def main(): plugins=[plugin], ) - # Client-side @traceable wraps the entire workflow call, creating a - # root span in LangSmith that the workflow and activity traces nest under. - @traceable(name="Basic LLM Request", run_type="chain", tags=["client-side"]) + @traceable( + name="Basic LLM Request", + run_type="chain", + # CRITICAL: Client-side @traceable runs outside the LangSmithPlugin's scope. + # Make sure client-side traces use the same project_name as what is given to + # # the plugin. + project_name=PROJECT_NAME, + tags=["client-side"], + ) async def run_workflow(prompt: str) -> str: return await client.execute_workflow( BasicLLMWorkflow.run, diff --git a/langsmith_tracing/basic/worker.py b/langsmith_tracing/basic/worker.py index e3abfac7..ac6133bd 100644 --- a/langsmith_tracing/basic/worker.py +++ b/langsmith_tracing/basic/worker.py @@ -26,22 +26,22 @@ async def main(): config = ClientConfig.load_client_connect_config() config.setdefault("target_host", "localhost:7233") - client = await Client.connect( - **config, - data_converter=pydantic_data_converter, - ) - plugin = LangSmithPlugin( project_name="langsmith-basic", add_temporal_runs=add_temporal_runs, ) + client = await Client.connect( + **config, + data_converter=pydantic_data_converter, + plugins=[plugin], + ) + async with Worker( client, task_queue="langsmith-basic-task-queue", workflows=[BasicLLMWorkflow], activities=[call_openai], - plugins=[plugin], ): label = "with" if add_temporal_runs else "without" print(f"Worker started ({label} Temporal runs in traces), ctrl+c to exit") diff --git a/langsmith_tracing/chatbot/starter.py b/langsmith_tracing/chatbot/starter.py index f94a27f6..4924a383 100644 --- a/langsmith_tracing/chatbot/starter.py +++ b/langsmith_tracing/chatbot/starter.py @@ -5,7 +5,6 @@ import sys import uuid -import langsmith as ls from langsmith import traceable from temporalio.client import Client from temporalio.contrib.langsmith import LangSmithPlugin @@ -14,6 +13,8 @@ from langsmith_tracing.chatbot.workflows import ChatbotWorkflow +PROJECT_NAME = "langsmith-chatbot" + async def main(): add_temporal_runs = "--add-temporal-runs" in sys.argv @@ -22,7 +23,7 @@ async def main(): config.setdefault("target_host", "localhost:7233") plugin = LangSmithPlugin( - project_name="langsmith-chatbot", + project_name=PROJECT_NAME, add_temporal_runs=add_temporal_runs, ) @@ -34,11 +35,13 @@ async def main(): wf_id = f"langsmith-chatbot-{uuid.uuid4().hex[:8]}" - # Client-side trace wraps the full interactive session. Each turn - # (signal + query poll) nests under this root span in LangSmith. @traceable( name=f"Chatbot Session {wf_id[-8:]}", run_type="chain", + # CRITICAL: Client-side @traceable runs outside the LangSmithPlugin's scope. + # Make sure client-side traces use the same project_name as what is given to + # # the plugin. + project_name=PROJECT_NAME, tags=["client-side", "chatbot"], ) async def run_session(): @@ -83,10 +86,7 @@ async def send_and_wait(msg: str): else: print("(timed out waiting for response)") - try: - await run_session() - finally: - ls.flush() + await run_session() if __name__ == "__main__": diff --git a/langsmith_tracing/chatbot/worker.py b/langsmith_tracing/chatbot/worker.py index 2295aae0..0f43e7c9 100644 --- a/langsmith_tracing/chatbot/worker.py +++ b/langsmith_tracing/chatbot/worker.py @@ -13,8 +13,6 @@ from langsmith_tracing.chatbot.activities import call_openai from langsmith_tracing.chatbot.workflows import ChatbotWorkflow -interrupt_event = asyncio.Event() - async def main(): logging.basicConfig(level=logging.INFO) @@ -27,30 +25,25 @@ async def main(): client = await Client.connect( **config, data_converter=pydantic_data_converter, + plugins=[ + LangSmithPlugin( + project_name="langsmith-chatbot", + add_temporal_runs=add_temporal_runs, + ) + ], ) - plugin = LangSmithPlugin( - project_name="langsmith-chatbot", - add_temporal_runs=add_temporal_runs, - ) - - async with Worker( + worker = Worker( client, task_queue="langsmith-chatbot-task-queue", workflows=[ChatbotWorkflow], activities=[call_openai], - plugins=[plugin], - ): - label = "with" if add_temporal_runs else "without" - print(f"Worker started ({label} Temporal runs in traces), ctrl+c to exit") - await interrupt_event.wait() - print("Shutting down") + ) + + label = "with" if add_temporal_runs else "without" + print(f"Worker started ({label} Temporal runs in traces), ctrl+c to exit") + await worker.run() if __name__ == "__main__": - loop = asyncio.new_event_loop() - try: - loop.run_until_complete(main()) - except KeyboardInterrupt: - interrupt_event.set() - loop.run_until_complete(loop.shutdown_asyncgens()) + asyncio.run(main()) diff --git a/uv.lock b/uv.lock index 491cca7b..07b36998 100644 --- a/uv.lock +++ b/uv.lock @@ -382,19 +382,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/94/35/386550fd60316d1e37eccdda609b074113298f23cef5bddb2049823fe666/dacite-1.9.2-py3-none-any.whl", hash = "sha256:053f7c3f5128ca2e9aceb66892b1a3c8936d02c686e707bee96e19deef4bc4a0", size = 16600, upload-time = "2025-02-05T09:27:24.345Z" }, ] -[[package]] -name = "dataclasses-json" -version = "0.6.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "marshmallow" }, - { name = "typing-inspect" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/64/a4/f71d9cf3a5ac257c993b5ca3f93df5f7fb395c725e7f1e6479d2514173c3/dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0", size = 32227, upload-time = "2024-06-09T16:20:19.103Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686, upload-time = "2024-06-09T16:20:16.715Z" }, -] - [[package]] name = "distro" version = "1.9.0" @@ -430,6 +417,69 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e5/47/d63c60f59a59467fda0f93f46335c9d18526d7071f025cb5b89d5353ea42/fastapi-0.116.1-py3-none-any.whl", hash = "sha256:c46ac7c312df840f0c9e220f7964bada936781bc4e2e6eb71f1c4d7553786565", size = 95631, upload-time = "2025-07-11T16:22:30.485Z" }, ] +[[package]] +name = "fastuuid" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/7d/d9daedf0f2ebcacd20d599928f8913e9d2aea1d56d2d355a93bfa2b611d7/fastuuid-0.14.0.tar.gz", hash = "sha256:178947fc2f995b38497a74172adee64fdeb8b7ec18f2a5934d037641ba265d26", size = 18232, upload-time = "2025-10-19T22:19:22.402Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/b2/731a6696e37cd20eed353f69a09f37a984a43c9713764ee3f7ad5f57f7f9/fastuuid-0.14.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:6e6243d40f6c793c3e2ee14c13769e341b90be5ef0c23c82fa6515a96145181a", size = 516760, upload-time = "2025-10-19T22:25:21.509Z" }, + { url = "https://files.pythonhosted.org/packages/c5/79/c73c47be2a3b8734d16e628982653517f80bbe0570e27185d91af6096507/fastuuid-0.14.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:13ec4f2c3b04271f62be2e1ce7e95ad2dd1cf97e94503a3760db739afbd48f00", size = 264748, upload-time = "2025-10-19T22:41:52.873Z" }, + { url = "https://files.pythonhosted.org/packages/24/c5/84c1eea05977c8ba5173555b0133e3558dc628bcf868d6bf1689ff14aedc/fastuuid-0.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b2fdd48b5e4236df145a149d7125badb28e0a383372add3fbaac9a6b7a394470", size = 254537, upload-time = "2025-10-19T22:33:55.603Z" }, + { url = "https://files.pythonhosted.org/packages/0e/23/4e362367b7fa17dbed646922f216b9921efb486e7abe02147e4b917359f8/fastuuid-0.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f74631b8322d2780ebcf2d2d75d58045c3e9378625ec51865fe0b5620800c39d", size = 278994, upload-time = "2025-10-19T22:26:17.631Z" }, + { url = "https://files.pythonhosted.org/packages/b2/72/3985be633b5a428e9eaec4287ed4b873b7c4c53a9639a8b416637223c4cd/fastuuid-0.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83cffc144dc93eb604b87b179837f2ce2af44871a7b323f2bfed40e8acb40ba8", size = 280003, upload-time = "2025-10-19T22:23:45.415Z" }, + { url = "https://files.pythonhosted.org/packages/b3/6d/6ef192a6df34e2266d5c9deb39cd3eea986df650cbcfeaf171aa52a059c3/fastuuid-0.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a771f135ab4523eb786e95493803942a5d1fc1610915f131b363f55af53b219", size = 303583, upload-time = "2025-10-19T22:26:00.756Z" }, + { url = "https://files.pythonhosted.org/packages/9d/11/8a2ea753c68d4fece29d5d7c6f3f903948cc6e82d1823bc9f7f7c0355db3/fastuuid-0.14.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4edc56b877d960b4eda2c4232f953a61490c3134da94f3c28af129fb9c62a4f6", size = 460955, upload-time = "2025-10-19T22:36:25.196Z" }, + { url = "https://files.pythonhosted.org/packages/23/42/7a32c93b6ce12642d9a152ee4753a078f372c9ebb893bc489d838dd4afd5/fastuuid-0.14.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bcc96ee819c282e7c09b2eed2b9bd13084e3b749fdb2faf58c318d498df2efbe", size = 480763, upload-time = "2025-10-19T22:24:28.451Z" }, + { url = "https://files.pythonhosted.org/packages/b9/e9/a5f6f686b46e3ed4ed3b93770111c233baac87dd6586a411b4988018ef1d/fastuuid-0.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7a3c0bca61eacc1843ea97b288d6789fbad7400d16db24e36a66c28c268cfe3d", size = 452613, upload-time = "2025-10-19T22:25:06.827Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c9/18abc73c9c5b7fc0e476c1733b678783b2e8a35b0be9babd423571d44e98/fastuuid-0.14.0-cp310-cp310-win32.whl", hash = "sha256:7f2f3efade4937fae4e77efae1af571902263de7b78a0aee1a1653795a093b2a", size = 155045, upload-time = "2025-10-19T22:28:32.732Z" }, + { url = "https://files.pythonhosted.org/packages/5e/8a/d9e33f4eb4d4f6d9f2c5c7d7e96b5cdbb535c93f3b1ad6acce97ee9d4bf8/fastuuid-0.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:ae64ba730d179f439b0736208b4c279b8bc9c089b102aec23f86512ea458c8a4", size = 156122, upload-time = "2025-10-19T22:23:15.59Z" }, + { url = "https://files.pythonhosted.org/packages/98/f3/12481bda4e5b6d3e698fbf525df4443cc7dce746f246b86b6fcb2fba1844/fastuuid-0.14.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:73946cb950c8caf65127d4e9a325e2b6be0442a224fd51ba3b6ac44e1912ce34", size = 516386, upload-time = "2025-10-19T22:42:40.176Z" }, + { url = "https://files.pythonhosted.org/packages/59/19/2fc58a1446e4d72b655648eb0879b04e88ed6fa70d474efcf550f640f6ec/fastuuid-0.14.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:12ac85024637586a5b69645e7ed986f7535106ed3013640a393a03e461740cb7", size = 264569, upload-time = "2025-10-19T22:25:50.977Z" }, + { url = "https://files.pythonhosted.org/packages/78/29/3c74756e5b02c40cfcc8b1d8b5bac4edbd532b55917a6bcc9113550e99d1/fastuuid-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:05a8dde1f395e0c9b4be515b7a521403d1e8349443e7641761af07c7ad1624b1", size = 254366, upload-time = "2025-10-19T22:29:49.166Z" }, + { url = "https://files.pythonhosted.org/packages/52/96/d761da3fccfa84f0f353ce6e3eb8b7f76b3aa21fd25e1b00a19f9c80a063/fastuuid-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09378a05020e3e4883dfdab438926f31fea15fd17604908f3d39cbeb22a0b4dc", size = 278978, upload-time = "2025-10-19T22:35:41.306Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c2/f84c90167cc7765cb82b3ff7808057608b21c14a38531845d933a4637307/fastuuid-0.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbb0c4b15d66b435d2538f3827f05e44e2baafcc003dd7d8472dc67807ab8fd8", size = 279692, upload-time = "2025-10-19T22:25:36.997Z" }, + { url = "https://files.pythonhosted.org/packages/af/7b/4bacd03897b88c12348e7bd77943bac32ccf80ff98100598fcff74f75f2e/fastuuid-0.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cd5a7f648d4365b41dbf0e38fe8da4884e57bed4e77c83598e076ac0c93995e7", size = 303384, upload-time = "2025-10-19T22:29:46.578Z" }, + { url = "https://files.pythonhosted.org/packages/c0/a2/584f2c29641df8bd810d00c1f21d408c12e9ad0c0dafdb8b7b29e5ddf787/fastuuid-0.14.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c0a94245afae4d7af8c43b3159d5e3934c53f47140be0be624b96acd672ceb73", size = 460921, upload-time = "2025-10-19T22:36:42.006Z" }, + { url = "https://files.pythonhosted.org/packages/24/68/c6b77443bb7764c760e211002c8638c0c7cce11cb584927e723215ba1398/fastuuid-0.14.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b29e23c97e77c3a9514d70ce343571e469098ac7f5a269320a0f0b3e193ab36", size = 480575, upload-time = "2025-10-19T22:28:18.975Z" }, + { url = "https://files.pythonhosted.org/packages/5a/87/93f553111b33f9bb83145be12868c3c475bf8ea87c107063d01377cc0e8e/fastuuid-0.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1e690d48f923c253f28151b3a6b4e335f2b06bf669c68a02665bc150b7839e94", size = 452317, upload-time = "2025-10-19T22:25:32.75Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8c/a04d486ca55b5abb7eaa65b39df8d891b7b1635b22db2163734dc273579a/fastuuid-0.14.0-cp311-cp311-win32.whl", hash = "sha256:a6f46790d59ab38c6aa0e35c681c0484b50dc0acf9e2679c005d61e019313c24", size = 154804, upload-time = "2025-10-19T22:24:15.615Z" }, + { url = "https://files.pythonhosted.org/packages/9c/b2/2d40bf00820de94b9280366a122cbaa60090c8cf59e89ac3938cf5d75895/fastuuid-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:e150eab56c95dc9e3fefc234a0eedb342fac433dacc273cd4d150a5b0871e1fa", size = 156099, upload-time = "2025-10-19T22:24:31.646Z" }, + { url = "https://files.pythonhosted.org/packages/02/a2/e78fcc5df65467f0d207661b7ef86c5b7ac62eea337c0c0fcedbeee6fb13/fastuuid-0.14.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77e94728324b63660ebf8adb27055e92d2e4611645bf12ed9d88d30486471d0a", size = 510164, upload-time = "2025-10-19T22:31:45.635Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b3/c846f933f22f581f558ee63f81f29fa924acd971ce903dab1a9b6701816e/fastuuid-0.14.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:caa1f14d2102cb8d353096bc6ef6c13b2c81f347e6ab9d6fbd48b9dea41c153d", size = 261837, upload-time = "2025-10-19T22:38:38.53Z" }, + { url = "https://files.pythonhosted.org/packages/54/ea/682551030f8c4fa9a769d9825570ad28c0c71e30cf34020b85c1f7ee7382/fastuuid-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d23ef06f9e67163be38cece704170486715b177f6baae338110983f99a72c070", size = 251370, upload-time = "2025-10-19T22:40:26.07Z" }, + { url = "https://files.pythonhosted.org/packages/14/dd/5927f0a523d8e6a76b70968e6004966ee7df30322f5fc9b6cdfb0276646a/fastuuid-0.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c9ec605ace243b6dbe3bd27ebdd5d33b00d8d1d3f580b39fdd15cd96fd71796", size = 277766, upload-time = "2025-10-19T22:37:23.779Z" }, + { url = "https://files.pythonhosted.org/packages/16/6e/c0fb547eef61293153348f12e0f75a06abb322664b34a1573a7760501336/fastuuid-0.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:808527f2407f58a76c916d6aa15d58692a4a019fdf8d4c32ac7ff303b7d7af09", size = 278105, upload-time = "2025-10-19T22:26:56.821Z" }, + { url = "https://files.pythonhosted.org/packages/2d/b1/b9c75e03b768f61cf2e84ee193dc18601aeaf89a4684b20f2f0e9f52b62c/fastuuid-0.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fb3c0d7fef6674bbeacdd6dbd386924a7b60b26de849266d1ff6602937675c8", size = 301564, upload-time = "2025-10-19T22:30:31.604Z" }, + { url = "https://files.pythonhosted.org/packages/fc/fa/f7395fdac07c7a54f18f801744573707321ca0cee082e638e36452355a9d/fastuuid-0.14.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab3f5d36e4393e628a4df337c2c039069344db5f4b9d2a3c9cea48284f1dd741", size = 459659, upload-time = "2025-10-19T22:31:32.341Z" }, + { url = "https://files.pythonhosted.org/packages/66/49/c9fd06a4a0b1f0f048aacb6599e7d96e5d6bc6fa680ed0d46bf111929d1b/fastuuid-0.14.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b9a0ca4f03b7e0b01425281ffd44e99d360e15c895f1907ca105854ed85e2057", size = 478430, upload-time = "2025-10-19T22:26:22.962Z" }, + { url = "https://files.pythonhosted.org/packages/be/9c/909e8c95b494e8e140e8be6165d5fc3f61fdc46198c1554df7b3e1764471/fastuuid-0.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3acdf655684cc09e60fb7e4cf524e8f42ea760031945aa8086c7eae2eeeabeb8", size = 450894, upload-time = "2025-10-19T22:27:01.647Z" }, + { url = "https://files.pythonhosted.org/packages/90/eb/d29d17521976e673c55ef7f210d4cdd72091a9ec6755d0fd4710d9b3c871/fastuuid-0.14.0-cp312-cp312-win32.whl", hash = "sha256:9579618be6280700ae36ac42c3efd157049fe4dd40ca49b021280481c78c3176", size = 154374, upload-time = "2025-10-19T22:29:19.879Z" }, + { url = "https://files.pythonhosted.org/packages/cc/fc/f5c799a6ea6d877faec0472d0b27c079b47c86b1cdc577720a5386483b36/fastuuid-0.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:d9e4332dc4ba054434a9594cbfaf7823b57993d7d8e7267831c3e059857cf397", size = 156550, upload-time = "2025-10-19T22:27:49.658Z" }, + { url = "https://files.pythonhosted.org/packages/a5/83/ae12dd39b9a39b55d7f90abb8971f1a5f3c321fd72d5aa83f90dc67fe9ed/fastuuid-0.14.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77a09cb7427e7af74c594e409f7731a0cf887221de2f698e1ca0ebf0f3139021", size = 510720, upload-time = "2025-10-19T22:42:34.633Z" }, + { url = "https://files.pythonhosted.org/packages/53/b0/a4b03ff5d00f563cc7546b933c28cb3f2a07344b2aec5834e874f7d44143/fastuuid-0.14.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:9bd57289daf7b153bfa3e8013446aa144ce5e8c825e9e366d455155ede5ea2dc", size = 262024, upload-time = "2025-10-19T22:30:25.482Z" }, + { url = "https://files.pythonhosted.org/packages/9c/6d/64aee0a0f6a58eeabadd582e55d0d7d70258ffdd01d093b30c53d668303b/fastuuid-0.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ac60fc860cdf3c3f327374db87ab8e064c86566ca8c49d2e30df15eda1b0c2d5", size = 251679, upload-time = "2025-10-19T22:36:14.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/f5/a7e9cda8369e4f7919d36552db9b2ae21db7915083bc6336f1b0082c8b2e/fastuuid-0.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab32f74bd56565b186f036e33129da77db8be09178cd2f5206a5d4035fb2a23f", size = 277862, upload-time = "2025-10-19T22:36:23.302Z" }, + { url = "https://files.pythonhosted.org/packages/f0/d3/8ce11827c783affffd5bd4d6378b28eb6cc6d2ddf41474006b8d62e7448e/fastuuid-0.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e678459cf4addaedd9936bbb038e35b3f6b2061330fd8f2f6a1d80414c0f87", size = 278278, upload-time = "2025-10-19T22:29:43.809Z" }, + { url = "https://files.pythonhosted.org/packages/a2/51/680fb6352d0bbade04036da46264a8001f74b7484e2fd1f4da9e3db1c666/fastuuid-0.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1e3cc56742f76cd25ecb98e4b82a25f978ccffba02e4bdce8aba857b6d85d87b", size = 301788, upload-time = "2025-10-19T22:36:06.825Z" }, + { url = "https://files.pythonhosted.org/packages/fa/7c/2014b5785bd8ebdab04ec857635ebd84d5ee4950186a577db9eff0fb8ff6/fastuuid-0.14.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cb9a030f609194b679e1660f7e32733b7a0f332d519c5d5a6a0a580991290022", size = 459819, upload-time = "2025-10-19T22:35:31.623Z" }, + { url = "https://files.pythonhosted.org/packages/01/d2/524d4ceeba9160e7a9bc2ea3e8f4ccf1ad78f3bde34090ca0c51f09a5e91/fastuuid-0.14.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:09098762aad4f8da3a888eb9ae01c84430c907a297b97166b8abc07b640f2995", size = 478546, upload-time = "2025-10-19T22:26:03.023Z" }, + { url = "https://files.pythonhosted.org/packages/bc/17/354d04951ce114bf4afc78e27a18cfbd6ee319ab1829c2d5fb5e94063ac6/fastuuid-0.14.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1383fff584fa249b16329a059c68ad45d030d5a4b70fb7c73a08d98fd53bcdab", size = 450921, upload-time = "2025-10-19T22:31:02.151Z" }, + { url = "https://files.pythonhosted.org/packages/fb/be/d7be8670151d16d88f15bb121c5b66cdb5ea6a0c2a362d0dcf30276ade53/fastuuid-0.14.0-cp313-cp313-win32.whl", hash = "sha256:a0809f8cc5731c066c909047f9a314d5f536c871a7a22e815cc4967c110ac9ad", size = 154559, upload-time = "2025-10-19T22:36:36.011Z" }, + { url = "https://files.pythonhosted.org/packages/22/1d/5573ef3624ceb7abf4a46073d3554e37191c868abc3aecd5289a72f9810a/fastuuid-0.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:0df14e92e7ad3276327631c9e7cec09e32572ce82089c55cb1bb8df71cf394ed", size = 156539, upload-time = "2025-10-19T22:33:35.898Z" }, + { url = "https://files.pythonhosted.org/packages/16/c9/8c7660d1fe3862e3f8acabd9be7fc9ad71eb270f1c65cce9a2b7a31329ab/fastuuid-0.14.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:b852a870a61cfc26c884af205d502881a2e59cc07076b60ab4a951cc0c94d1ad", size = 510600, upload-time = "2025-10-19T22:43:44.17Z" }, + { url = "https://files.pythonhosted.org/packages/4c/f4/a989c82f9a90d0ad995aa957b3e572ebef163c5299823b4027986f133dfb/fastuuid-0.14.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c7502d6f54cd08024c3ea9b3514e2d6f190feb2f46e6dbcd3747882264bb5f7b", size = 262069, upload-time = "2025-10-19T22:43:38.38Z" }, + { url = "https://files.pythonhosted.org/packages/da/6c/a1a24f73574ac995482b1326cf7ab41301af0fabaa3e37eeb6b3df00e6e2/fastuuid-0.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1ca61b592120cf314cfd66e662a5b54a578c5a15b26305e1b8b618a6f22df714", size = 251543, upload-time = "2025-10-19T22:32:22.537Z" }, + { url = "https://files.pythonhosted.org/packages/1a/20/2a9b59185ba7a6c7b37808431477c2d739fcbdabbf63e00243e37bd6bf49/fastuuid-0.14.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa75b6657ec129d0abded3bec745e6f7ab642e6dba3a5272a68247e85f5f316f", size = 277798, upload-time = "2025-10-19T22:33:53.821Z" }, + { url = "https://files.pythonhosted.org/packages/ef/33/4105ca574f6ded0af6a797d39add041bcfb468a1255fbbe82fcb6f592da2/fastuuid-0.14.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8a0dfea3972200f72d4c7df02c8ac70bad1bb4c58d7e0ec1e6f341679073a7f", size = 278283, upload-time = "2025-10-19T22:29:02.812Z" }, + { url = "https://files.pythonhosted.org/packages/fe/8c/fca59f8e21c4deb013f574eae05723737ddb1d2937ce87cb2a5d20992dc3/fastuuid-0.14.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1bf539a7a95f35b419f9ad105d5a8a35036df35fdafae48fb2fd2e5f318f0d75", size = 301627, upload-time = "2025-10-19T22:35:54.985Z" }, + { url = "https://files.pythonhosted.org/packages/cb/e2/f78c271b909c034d429218f2798ca4e89eeda7983f4257d7865976ddbb6c/fastuuid-0.14.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:9a133bf9cc78fdbd1179cb58a59ad0100aa32d8675508150f3658814aeefeaa4", size = 459778, upload-time = "2025-10-19T22:28:00.999Z" }, + { url = "https://files.pythonhosted.org/packages/1e/f0/5ff209d865897667a2ff3e7a572267a9ced8f7313919f6d6043aed8b1caa/fastuuid-0.14.0-cp314-cp314-musllinux_1_1_i686.whl", hash = "sha256:f54d5b36c56a2d5e1a31e73b950b28a0d83eb0c37b91d10408875a5a29494bad", size = 478605, upload-time = "2025-10-19T22:36:21.764Z" }, + { url = "https://files.pythonhosted.org/packages/e0/c8/2ce1c78f983a2c4987ea865d9516dbdfb141a120fd3abb977ae6f02ba7ca/fastuuid-0.14.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:ec27778c6ca3393ef662e2762dba8af13f4ec1aaa32d08d77f71f2a70ae9feb8", size = 450837, upload-time = "2025-10-19T22:34:37.178Z" }, + { url = "https://files.pythonhosted.org/packages/df/60/dad662ec9a33b4a5fe44f60699258da64172c39bd041da2994422cdc40fe/fastuuid-0.14.0-cp314-cp314-win32.whl", hash = "sha256:e23fc6a83f112de4be0cc1990e5b127c27663ae43f866353166f87df58e73d06", size = 154532, upload-time = "2025-10-19T22:35:18.217Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f6/da4db31001e854025ffd26bc9ba0740a9cbba2c3259695f7c5834908b336/fastuuid-0.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:df61342889d0f5e7a32f7284e55ef95103f2110fee433c2ae7c2c0956d76ac8a", size = 156457, upload-time = "2025-10-19T22:33:44.579Z" }, +] + [[package]] name = "filelock" version = "3.18.0" @@ -658,15 +708,12 @@ wheels = [ ] [[package]] -name = "griffe" -version = "1.7.3" +name = "griffelib" +version = "2.0.2" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a9/3e/5aa9a61f7c3c47b0b52a1d930302992229d191bf4bc76447b324b731510a/griffe-1.7.3.tar.gz", hash = "sha256:52ee893c6a3a968b639ace8015bec9d36594961e156e23315c8e8e51401fa50b", size = 395137, upload-time = "2025-04-23T11:29:09.147Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/82/74f4a3310cdabfbb10da554c3a672847f1ed33c6f61dd472681ce7f1fe67/griffelib-2.0.2.tar.gz", hash = "sha256:3cf20b3bc470e83763ffbf236e0076b1211bac1bc67de13daf494640f2de707e", size = 166461, upload-time = "2026-03-27T11:34:51.091Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/c6/5c20af38c2a57c15d87f7f38bee77d63c1d2a3689f74fefaf35915dd12b2/griffe-1.7.3-py3-none-any.whl", hash = "sha256:c6b3ee30c2f0f17f30bcdef5068d6ab7a2a4f1b8bf1a3e74b56fffd21e1c5f75", size = 129303, upload-time = "2025-04-23T11:29:07.145Z" }, + { url = "https://files.pythonhosted.org/packages/11/8c/c9138d881c79aa0ea9ed83cbd58d5ca75624378b38cee225dcf5c42cc91f/griffelib-2.0.2-py3-none-any.whl", hash = "sha256:925c857658fb1ba40c0772c37acbc2ab650bd794d9c1b9726922e36ea4117ea1", size = 142357, upload-time = "2026-03-27T11:34:46.275Z" }, ] [[package]] @@ -1019,95 +1066,110 @@ wheels = [ [[package]] name = "langchain" -version = "0.1.20" +version = "1.2.15" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aiohttp" }, - { name = "async-timeout", marker = "python_full_version < '3.11'" }, - { name = "dataclasses-json" }, - { name = "langchain-community" }, { name = "langchain-core" }, - { name = "langchain-text-splitters" }, - { name = "langsmith", version = "0.1.147", source = { registry = "https://pypi.org/simple" } }, - { name = "numpy" }, + { name = "langgraph" }, + { name = "pydantic" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/3f/888a7099d2bd2917f8b0c3ffc7e347f1e664cf64267820b0b923c4f339fc/langchain-1.2.15.tar.gz", hash = "sha256:1717b6719daefae90b2728314a5e2a117ff916291e2862595b6c3d6fba33d652", size = 574732, upload-time = "2026-04-03T14:26:03.994Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/e8/a3b8cb0005553f6a876865073c81ef93bd7c5b18381bcb9ba4013af96ebc/langchain-1.2.15-py3-none-any.whl", hash = "sha256:e349db349cb3e9550c4044077cf90a1717691756cc236438404b23500e615874", size = 112714, upload-time = "2026-04-03T14:26:02.557Z" }, +] + +[[package]] +name = "langchain-core" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonpatch" }, + { name = "langsmith", version = "0.3.45", source = { registry = "https://pypi.org/simple" } }, + { name = "packaging" }, { name = "pydantic" }, { name = "pyyaml" }, - { name = "requests" }, - { name = "sqlalchemy" }, { name = "tenacity" }, + { name = "typing-extensions" }, + { name = "uuid-utils" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/88/94/8d917da143b30c3088be9f51719634827ab19207cb290a51de3859747783/langchain-0.1.20.tar.gz", hash = "sha256:f35c95eed8c8375e02dce95a34f2fd4856a4c98269d6dc34547a23dba5beab7e", size = 420688, upload-time = "2024-05-10T21:59:40.736Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/fe/20190232d9b513242899dbb0c2bb77e31b4d61e343743adbe90ebc2603d2/langchain_core-1.3.0.tar.gz", hash = "sha256:14a39f528bf459aa3aa40d0a7f7f1bae7520d435ef991ae14a4ceb74d8c49046", size = 860755, upload-time = "2026-04-17T14:51:38.298Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/28/da40a6b12e7842a0c8b443f8cc5c6f59e49d7a9071cfad064b9639c6b044/langchain-0.1.20-py3-none-any.whl", hash = "sha256:09991999fbd6c3421a12db3c7d1f52d55601fc41d9b2a3ef51aab2e0e9c38da9", size = 1014619, upload-time = "2024-05-10T21:59:36.417Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e2/dbfa347aa072a6dc4cd38d6f9ebfc730b4c14c258c47f480f4c5c546f177/langchain_core-1.3.0-py3-none-any.whl", hash = "sha256:baf16ee028475df177b9ab8869a751c79406d64a6f12125b93802991b566cced", size = 515140, upload-time = "2026-04-17T14:51:36.274Z" }, ] [[package]] -name = "langchain-community" -version = "0.0.38" +name = "langchain-openai" +version = "1.1.15" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aiohttp" }, - { name = "dataclasses-json" }, { name = "langchain-core" }, - { name = "langsmith", version = "0.1.147", source = { registry = "https://pypi.org/simple" } }, - { name = "numpy" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "sqlalchemy" }, - { name = "tenacity" }, + { name = "openai", version = "2.32.0", source = { registry = "https://pypi.org/simple" } }, + { name = "tiktoken" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/b7/c20502452183d27b8c0466febb227fae3213f77e9a13683de685e7227f39/langchain_community-0.0.38.tar.gz", hash = "sha256:127fc4b75bc67b62fe827c66c02e715a730fef8fe69bd2023d466bab06b5810d", size = 1373468, upload-time = "2024-05-08T22:44:26.295Z" } +sdist = { url = "https://files.pythonhosted.org/packages/86/1e/ed50e1c44f36be6ba97b56b09f1a6be5906098b4ba1e6f8a0f661a54a5f5/langchain_openai-1.1.15.tar.gz", hash = "sha256:16ddb7481853991fd00691dfd01bcc5cdf60cb36aa6962b38c8a4939f0538ba0", size = 1115780, upload-time = "2026-04-20T19:57:09.281Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/d3/1f4d1941ae5a627299c8ea052847b99ad6674b97b699d8a08fc4faf25d3e/langchain_community-0.0.38-py3-none-any.whl", hash = "sha256:ecb48660a70a08c90229be46b0cc5f6bc9f38f2833ee44c57dfab9bf3a2c121a", size = 2028164, upload-time = "2024-05-08T22:44:23.434Z" }, + { url = "https://files.pythonhosted.org/packages/2d/29/a357935f8d75ce4fc7c32bbc887c026295e98a9e4ded6daf434d150c5d44/langchain_openai-1.1.15-py3-none-any.whl", hash = "sha256:069022b6cba2108fac2450d3bf6c888e20a2af92bf89b493638456ef4db0d900", size = 88797, upload-time = "2026-04-20T19:57:07.683Z" }, ] [[package]] -name = "langchain-core" -version = "0.1.53" +name = "langgraph" +version = "1.1.9" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "jsonpatch" }, - { name = "langsmith", version = "0.1.147", source = { registry = "https://pypi.org/simple" } }, - { name = "packaging" }, + { name = "langchain-core" }, + { name = "langgraph-checkpoint" }, + { name = "langgraph-prebuilt" }, + { name = "langgraph-sdk" }, { name = "pydantic" }, - { name = "pyyaml" }, - { name = "tenacity" }, + { name = "xxhash" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/65/3aaff91481b9d629a31630a40000d403bff24b3c62d9abc87dc998298cce/langchain_core-0.1.53.tar.gz", hash = "sha256:df3773a553b5335eb645827b99a61a7018cea4b11dc45efa2613fde156441cec", size = 236665, upload-time = "2024-11-02T00:27:25.16Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/d5/9d9c65d5500a1ca7ea63d6d65aecfb248037018a74d7d4ef52e276bb4e4b/langgraph-1.1.9.tar.gz", hash = "sha256:bc5a49d5a5e71fda1f9c53c06c62f4caec9a95545b739d130a58b6ab3269e274", size = 560717, upload-time = "2026-04-21T13:43:06.809Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/10/285fa149ce95300d91ea0bb124eec28889e5ebbcb59434d1fe2f31098d72/langchain_core-0.1.53-py3-none-any.whl", hash = "sha256:02a88a21e3bd294441b5b741625fa4b53b1c684fd58ba6e5d9028e53cbe8542f", size = 303059, upload-time = "2024-11-02T00:27:23.144Z" }, + { url = "https://files.pythonhosted.org/packages/16/58/0380420e66619d12c992c1f8cfda0c7a04e8f0fe8a84752245b9e7b1cba7/langgraph-1.1.9-py3-none-any.whl", hash = "sha256:7db13ceecde4ea643df6c097dcc9e534895dcd9fcc6500eeff2f2cde0fab16b2", size = 173744, upload-time = "2026-04-21T13:43:05.513Z" }, ] [[package]] -name = "langchain-openai" -version = "0.0.6" +name = "langgraph-checkpoint" +version = "4.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, - { name = "numpy" }, - { name = "openai" }, - { name = "tiktoken" }, + { name = "ormsgpack" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/bd/2963a5b9f7dcf5759144bbe590984730daccfd8ced01d9de5cbf23072ac5/langchain_openai-0.0.6.tar.gz", hash = "sha256:f5c4ebe46f2c8635c8f0c26cc8df27700aacafea025410e418d5a080039974dd", size = 22653, upload-time = "2024-02-13T21:20:07.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/f2/cf8086e1f1a3358d9228805614e72602c281b18307f3fae64a5b854aad2d/langgraph_checkpoint-4.0.2.tar.gz", hash = "sha256:4f6f99cba8e272deabf81b2d8cdc96582af07a57a6ad591cdf216bb310497039", size = 160810, upload-time = "2026-04-15T21:03:00.062Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/48/84e1840c25592bb76deea48d187d9fc8f864c9c82ddf3f084da4c9b8a15b/langchain_openai-0.0.6-py3-none-any.whl", hash = "sha256:2ef040e4447a26a9d3bd45dfac9cefa00797ea58555a3d91ab4f88699eb3a005", size = 29200, upload-time = "2024-02-13T21:20:04.664Z" }, + { url = "https://files.pythonhosted.org/packages/b9/5a/6dba29dd89b0a46ae21c707da0f9d17e94f27d3e481ed15bc99d6bd20aa6/langgraph_checkpoint-4.0.2-py3-none-any.whl", hash = "sha256:59b0f29216128a629c58dd07c98aa004f82f51805d5573126ffb419b753ff253", size = 51000, upload-time = "2026-04-15T21:02:59.096Z" }, ] [[package]] -name = "langchain-text-splitters" -version = "0.0.2" +name = "langgraph-prebuilt" +version = "1.0.10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, + { name = "langgraph-checkpoint" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e8/fa/88d65b0f696d8d4f37037f1418f89bc1078cd74d20054623bb7fffcecaf1/langchain_text_splitters-0.0.2.tar.gz", hash = "sha256:ac8927dc0ba08eba702f6961c9ed7df7cead8de19a9f7101ab2b5ea34201b3c1", size = 18638, upload-time = "2024-05-16T03:16:36.815Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/c8/01471b1b5601f2e9c9a69c39fc9a2fb8611613ede0002e5a2b81c0acd850/langgraph_prebuilt-1.0.10.tar.gz", hash = "sha256:5a6fc513f8907074563b6218ff991c4ed9db19ac63101314919686e8029ddb07", size = 169769, upload-time = "2026-04-17T17:59:45.373Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/6a/804fe5ca07129046a4cedc0697222ddde6156cd874c4c4ba29e4d271828a/langchain_text_splitters-0.0.2-py3-none-any.whl", hash = "sha256:13887f32705862c1e1454213cb7834a63aae57c26fcd80346703a1d09c46168d", size = 23539, upload-time = "2024-05-16T03:16:35.727Z" }, + { url = "https://files.pythonhosted.org/packages/50/49/d073375beabdc6955df6cbe570ba7786836bd4c817ae998955d35037f2fd/langgraph_prebuilt-1.0.10-py3-none-any.whl", hash = "sha256:e3baa1977d819982e690a357ba5bb77ccc1d4d8d4a029c48e502a3b6d171185f", size = 36086, upload-time = "2026-04-17T17:59:44.395Z" }, +] + +[[package]] +name = "langgraph-sdk" +version = "0.3.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "orjson" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3e/ec/477fa8b408f948b145d90fd935c0a9f37945fa5ec1dfabfc71e7cafba6d8/langgraph_sdk-0.3.6.tar.gz", hash = "sha256:7650f607f89c1586db5bee391b1a8754cbe1fc83b721ff2f1450f8906e790bd7", size = 182666, upload-time = "2026-02-14T19:46:03.752Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/61/12508e12652edd1874327271a5a8834c728a605f53a1a1c945f13ab69664/langgraph_sdk-0.3.6-py3-none-any.whl", hash = "sha256:7df2fd552ad7262d0baf8e1f849dce1d62186e76dcdd36db9dc5bdfa5c3fc20f", size = 88277, upload-time = "2026-02-14T19:46:02.48Z" }, ] [[package]] name = "langsmith" -version = "0.1.147" +version = "0.3.45" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.13'", @@ -1119,13 +1181,15 @@ resolution-markers = [ dependencies = [ { name = "httpx" }, { name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, + { name = "packaging" }, { name = "pydantic" }, { name = "requests" }, { name = "requests-toolbelt" }, + { name = "zstandard", version = "0.23.0", source = { registry = "https://pypi.org/simple" } }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6c/56/201dd94d492ae47c1bf9b50cacc1985113dc2288d8f15857e1f4a6818376/langsmith-0.1.147.tar.gz", hash = "sha256:2e933220318a4e73034657103b3b1a3a6109cc5db3566a7e8e03be8d6d7def7a", size = 300453, upload-time = "2024-11-27T17:32:41.297Z" } +sdist = { url = "https://files.pythonhosted.org/packages/be/86/b941012013260f95af2e90a3d9415af4a76a003a28412033fc4b09f35731/langsmith-0.3.45.tar.gz", hash = "sha256:1df3c6820c73ed210b2c7bc5cdb7bfa19ddc9126cd03fdf0da54e2e171e6094d", size = 348201, upload-time = "2025-06-05T05:10:28.948Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/f0/63b06b99b730b9954f8709f6f7d9b8d076fa0a973e472efe278089bde42b/langsmith-0.1.147-py3-none-any.whl", hash = "sha256:7166fc23b965ccf839d64945a78e9f1157757add228b086141eb03a60d699a15", size = 311812, upload-time = "2024-11-27T17:32:39.569Z" }, + { url = "https://files.pythonhosted.org/packages/6a/f4/c206c0888f8a506404cb4f16ad89593bdc2f70cf00de26a1a0a7a76ad7a3/langsmith-0.3.45-py3-none-any.whl", hash = "sha256:5b55f0518601fa65f3bb6b1a3100379a96aa7b3ed5e9380581615ba9c65ed8ed", size = 363002, upload-time = "2025-06-05T05:10:27.228Z" }, ] [[package]] @@ -1147,7 +1211,7 @@ dependencies = [ { name = "requests-toolbelt" }, { name = "uuid-utils" }, { name = "xxhash" }, - { name = "zstandard" }, + { name = "zstandard", version = "0.25.0", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/2f/b4/a0b4a501bee6b8a741ce29f8c48155b132118483cddc6f9247735ddb38fa/langsmith-0.7.32.tar.gz", hash = "sha256:b59b8e106d0e4c4842e158229296086e2aa7c561e3f602acda73d3ad0062e915", size = 1184518, upload-time = "2026-04-15T23:42:41.885Z" } wheels = [ @@ -1156,24 +1220,25 @@ wheels = [ [[package]] name = "litellm" -version = "1.74.8" +version = "1.83.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, { name = "click" }, + { name = "fastuuid" }, { name = "httpx" }, { name = "importlib-metadata" }, { name = "jinja2" }, { name = "jsonschema" }, - { name = "openai" }, + { name = "openai", version = "2.32.0", source = { registry = "https://pypi.org/simple" } }, { name = "pydantic" }, { name = "python-dotenv" }, { name = "tiktoken" }, { name = "tokenizers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/16/89c5123c808cbc51e398afc2f1a56da1d75d5e8ef7be417895a3794f0416/litellm-1.74.8.tar.gz", hash = "sha256:6e0a18aecf62459d465ee6d9a2526fcb33719a595b972500519abe95fe4906e0", size = 9639701, upload-time = "2025-07-23T23:38:02.903Z" } +sdist = { url = "https://files.pythonhosted.org/packages/22/92/6ce9737554994ca8e536e5f4f6a87cc7c4774b656c9eb9add071caf7d54b/litellm-1.83.0.tar.gz", hash = "sha256:860bebc76c4bb27b4cf90b4a77acd66dba25aced37e3db98750de8a1766bfb7a", size = 17333062, upload-time = "2026-03-31T05:08:25.331Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/4a/eba1b617acb7fa597d169cdd1b5ce98502bd179138f130721a2367d2deb8/litellm-1.74.8-py3-none-any.whl", hash = "sha256:f9433207d1e12e545495e5960fe02d93e413ecac4a28225c522488e1ab1157a1", size = 8713698, upload-time = "2025-07-23T23:38:00.708Z" }, + { url = "https://files.pythonhosted.org/packages/19/2c/a670cc050fcd6f45c6199eb99e259c73aea92edba8d5c2fc1b3686d36217/litellm-1.83.0-py3-none-any.whl", hash = "sha256:88c536d339248f3987571493015784671ba3f193a328e1ea6780dbebaa2094a8", size = 15610306, upload-time = "2026-03-31T05:08:21.987Z" }, ] [[package]] @@ -1246,21 +1311,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, ] -[[package]] -name = "marshmallow" -version = "3.26.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ab/5e/5e53d26b42ab75491cda89b871dab9e97c840bf12c63ec58a1919710cd06/marshmallow-3.26.1.tar.gz", hash = "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6", size = 221825, upload-time = "2025-02-03T15:32:25.093Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/34/75/51952c7b2d3873b44a0028b1bd26a25078c18f92f256608e8d1dc61b39fd/marshmallow-3.26.1-py3-none-any.whl", hash = "sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c", size = 50878, upload-time = "2025-02-03T15:32:22.295Z" }, -] - [[package]] name = "mcp" -version = "1.11.0" +version = "1.27.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1269,15 +1322,18 @@ dependencies = [ { name = "jsonschema" }, { name = "pydantic" }, { name = "pydantic-settings" }, + { name = "pyjwt", extra = ["crypto"], marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, { name = "python-multipart" }, { name = "pywin32", marker = "sys_platform == 'win32'" }, { name = "sse-starlette" }, { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3a/f5/9506eb5578d5bbe9819ee8ba3198d0ad0e2fbe3bab8b257e4131ceb7dfb6/mcp-1.11.0.tar.gz", hash = "sha256:49a213df56bb9472ff83b3132a4825f5c8f5b120a90246f08b0dac6bedac44c8", size = 406907, upload-time = "2025-07-10T16:41:09.388Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/eb/c0cfc62075dc6e1ec1c64d352ae09ac051d9334311ed226f1f425312848a/mcp-1.27.0.tar.gz", hash = "sha256:d3dc35a7eec0d458c1da4976a48f982097ddaab87e278c5511d5a4a56e852b83", size = 607509, upload-time = "2026-04-02T14:48:08.88Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/92/9c/c9ca79f9c512e4113a5d07043013110bb3369fc7770040c61378c7fbcf70/mcp-1.11.0-py3-none-any.whl", hash = "sha256:58deac37f7483e4b338524b98bc949b7c2b7c33d978f5fafab5bde041c5e2595", size = 155880, upload-time = "2025-07-10T16:41:07.935Z" }, + { url = "https://files.pythonhosted.org/packages/9c/46/f6b4ad632c67ef35209a66127e4bddc95759649dd595f71f13fba11bdf9a/mcp-1.27.0-py3-none-any.whl", hash = "sha256:5ce1fa81614958e267b21fb2aa34e0aea8e2c6ede60d52aba45fd47246b4d741", size = 215967, upload-time = "2026-04-02T14:48:07.24Z" }, ] [[package]] @@ -1439,41 +1495,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] -[[package]] -name = "nexus-rpc" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version >= '3.12.4' and python_full_version < '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version >= '3.12' and python_full_version < '3.12.4' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version == '3.11.*' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version < '3.11' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version >= '3.13' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version == '3.12.*' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version == '3.11.*' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version < '3.11' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", -] -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2e/f2/d54f5c03d8f4672ccc0875787a385f53dcb61f98a8ae594b5620e85b9cb3/nexus_rpc-1.3.0.tar.gz", hash = "sha256:e56d3b57b60d707ce7a72f83f23f106b86eca1043aa658e44582ab5ff30ab9ad", size = 75650, upload-time = "2025-12-08T22:59:13.002Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/74/0afd841de3199c148146c1d43b4bfb5605b2f1dc4c9a9087fe395091ea5a/nexus_rpc-1.3.0-py3-none-any.whl", hash = "sha256:aee0707b4861b22d8124ecb3f27d62dafbe8777dc50c66c91e49c006f971b92d", size = 28873, upload-time = "2025-12-08T22:59:12.024Z" }, -] - [[package]] name = "nexus-rpc" version = "1.4.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.13'", - "python_full_version == '3.12.*'", - "python_full_version == '3.11.*'", - "python_full_version < '3.11'", -] dependencies = [ - { name = "typing-extensions", marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/35/d5/cd1ffb202b76ebc1b33c1332a3416e55a39929006982adc2b1eb069aaa9b/nexus_rpc-1.4.0.tar.gz", hash = "sha256:3b8b373d4865671789cc43623e3dc0bcbf192562e40e13727e17f1c149050fba", size = 82367, upload-time = "2026-02-25T22:01:34.053Z" } wheels = [ @@ -1525,6 +1552,12 @@ wheels = [ name = "openai" version = "1.108.1" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version == '3.12.*'", + "python_full_version == '3.11.*'", + "python_full_version < '3.11'", +] dependencies = [ { name = "anyio" }, { name = "distro" }, @@ -1540,22 +1573,53 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/87/6ad18ce0e7b910e3706480451df48ff9e0af3b55e5db565adafd68a0706a/openai-1.108.1-py3-none-any.whl", hash = "sha256:952fc027e300b2ac23be92b064eac136a2bc58274cec16f5d2906c361340d59b", size = 948394, upload-time = "2025-09-19T16:52:18.369Z" }, ] +[[package]] +name = "openai" +version = "2.32.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version >= '3.12.4' and python_full_version < '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version >= '3.12' and python_full_version < '3.12.4' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version == '3.11.*' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version < '3.11' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version >= '3.13' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version == '3.12.*' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version == '3.11.*' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", + "python_full_version < '3.11' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", +] +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/59/bdcc6b759b8c42dd73afaf5bf8f902c04b37987a5514dbc1c64dba390fef/openai-2.32.0.tar.gz", hash = "sha256:c54b27a9e4cb8d51f0dd94972ffd1a04437efeb259a9e60d8922b8bd26fe55e0", size = 693286, upload-time = "2026-04-15T22:28:19.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/c1/d6e64ccd0536bf616556f0cad2b6d94a8125f508d25cfd814b1d2db4e2f1/openai-2.32.0-py3-none-any.whl", hash = "sha256:4dcc9badeb4bf54ad0d187453742f290226d30150890b7890711bda4f32f192f", size = 1162570, upload-time = "2026-04-15T22:28:17.714Z" }, +] + [[package]] name = "openai-agents" -version = "0.3.2" +version = "0.14.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "griffe" }, + { name = "griffelib" }, { name = "mcp" }, - { name = "openai" }, + { name = "openai", version = "2.32.0", source = { registry = "https://pypi.org/simple" } }, { name = "pydantic" }, { name = "requests" }, { name = "types-requests" }, { name = "typing-extensions" }, + { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8c/9f/dafa9f80653778179822e1abf77c7f0d9da5a16806c96b5bb9e0e46bd747/openai_agents-0.3.2.tar.gz", hash = "sha256:b71ac04ee9f502f1bc0f4d142407df4ec69db4442db86c4da252b4558fa90cd5", size = 1727988, upload-time = "2025-09-23T20:37:20.7Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/d1/f3607ef8eb3f4ffd6c300ff835cbf64537442874186832d165d3813392e0/openai_agents-0.14.3.tar.gz", hash = "sha256:57586446adca361cb2356c537f47084e40489560beedc9537a35083dcc2b5966", size = 5296409, upload-time = "2026-04-20T22:25:05.858Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/7e/6a8437f9f40937bb473ceb120a65e1b37bc87bcee6da67be4c05b25c6a89/openai_agents-0.3.2-py3-none-any.whl", hash = "sha256:55e02c57f2aaf3170ff0aa0ab7c337c28fd06b43b3bb9edc28b77ffd8142b425", size = 194221, upload-time = "2025-09-23T20:37:19.121Z" }, + { url = "https://files.pythonhosted.org/packages/47/ed/333f01b16443dc23282466125a14aa3ba92acca22e2539c26d17ba565da5/openai_agents-0.14.3-py3-none-any.whl", hash = "sha256:c5388a291ad74a701f58f3cdc58e273b3d3a03ad9e048b8c8ca6b56f74d9f526", size = 810351, upload-time = "2026-04-20T22:25:03.332Z" }, ] [package.optional-dependencies] @@ -1726,6 +1790,62 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1a/bf/def5e25d4d8bfce296a9a7c8248109bf58622c21618b590678f945a2c59c/orjson-3.11.4-cp314-cp314-win_arm64.whl", hash = "sha256:78b999999039db3cf58f6d230f524f04f75f129ba3d1ca2ed121f8657e575d3d", size = 126151, upload-time = "2025-10-24T15:50:15.878Z" }, ] +[[package]] +name = "ormsgpack" +version = "1.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/12/0c/f1761e21486942ab9bb6feaebc610fa074f7c5e496e6962dea5873348077/ormsgpack-1.12.2.tar.gz", hash = "sha256:944a2233640273bee67521795a73cf1e959538e0dfb7ac635505010455e53b33", size = 39031, upload-time = "2026-01-18T20:55:28.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/fa/a91f70829ebccf6387c4946e0a1a109f6ba0d6a28d65f628bedfad94b890/ormsgpack-1.12.2-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:c1429217f8f4d7fcb053523bbbac6bed5e981af0b85ba616e6df7cce53c19657", size = 378262, upload-time = "2026-01-18T20:55:22.284Z" }, + { url = "https://files.pythonhosted.org/packages/5f/62/3698a9a0c487252b5c6a91926e5654e79e665708ea61f67a8bdeceb022bf/ormsgpack-1.12.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f13034dc6c84a6280c6c33db7ac420253852ea233fc3ee27c8875f8dd651163", size = 203034, upload-time = "2026-01-18T20:55:53.324Z" }, + { url = "https://files.pythonhosted.org/packages/66/3a/f716f64edc4aec2744e817660b317e2f9bb8de372338a95a96198efa1ac1/ormsgpack-1.12.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:59f5da97000c12bc2d50e988bdc8576b21f6ab4e608489879d35b2c07a8ab51a", size = 210538, upload-time = "2026-01-18T20:55:20.097Z" }, + { url = "https://files.pythonhosted.org/packages/72/30/a436be9ce27d693d4e19fa94900028067133779f09fc45776db3f689c822/ormsgpack-1.12.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e4459c3f27066beadb2b81ea48a076a417aafffff7df1d3c11c519190ed44f2", size = 212401, upload-time = "2026-01-18T20:55:46.447Z" }, + { url = "https://files.pythonhosted.org/packages/10/c5/cde98300fd33fee84ca71de4751b19aeeca675f0cf3c0ec4b043f40f3b76/ormsgpack-1.12.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a1c460655d7288407ffa09065e322a7231997c0d62ce914bf3a96ad2dc6dedd", size = 387080, upload-time = "2026-01-18T20:56:00.884Z" }, + { url = "https://files.pythonhosted.org/packages/6a/31/30bf445ef827546747c10889dd254b3d84f92b591300efe4979d792f4c41/ormsgpack-1.12.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:458e4568be13d311ef7d8877275e7ccbe06c0e01b39baaac874caaa0f46d826c", size = 482346, upload-time = "2026-01-18T20:55:39.831Z" }, + { url = "https://files.pythonhosted.org/packages/2e/f5/e1745ddf4fa246c921b5ca253636c4c700ff768d78032f79171289159f6e/ormsgpack-1.12.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8cde5eaa6c6cbc8622db71e4a23de56828e3d876aeb6460ffbcb5b8aff91093b", size = 425178, upload-time = "2026-01-18T20:55:27.106Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a2/e6532ed7716aed03dede8df2d0d0d4150710c2122647d94b474147ccd891/ormsgpack-1.12.2-cp310-cp310-win_amd64.whl", hash = "sha256:dc7a33be14c347893edbb1ceda89afbf14c467d593a5ee92c11de4f1666b4d4f", size = 117183, upload-time = "2026-01-18T20:55:55.52Z" }, + { url = "https://files.pythonhosted.org/packages/4b/08/8b68f24b18e69d92238aa8f258218e6dfeacf4381d9d07ab8df303f524a9/ormsgpack-1.12.2-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:bd5f4bf04c37888e864f08e740c5a573c4017f6fd6e99fa944c5c935fabf2dd9", size = 378266, upload-time = "2026-01-18T20:55:59.876Z" }, + { url = "https://files.pythonhosted.org/packages/0d/24/29fc13044ecb7c153523ae0a1972269fcd613650d1fa1a9cec1044c6b666/ormsgpack-1.12.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34d5b28b3570e9fed9a5a76528fc7230c3c76333bc214798958e58e9b79cc18a", size = 203035, upload-time = "2026-01-18T20:55:30.59Z" }, + { url = "https://files.pythonhosted.org/packages/ad/c2/00169fb25dd8f9213f5e8a549dfb73e4d592009ebc85fbbcd3e1dcac575b/ormsgpack-1.12.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3708693412c28f3538fb5a65da93787b6bbab3484f6bc6e935bfb77a62400ae5", size = 210539, upload-time = "2026-01-18T20:55:48.569Z" }, + { url = "https://files.pythonhosted.org/packages/1b/33/543627f323ff3c73091f51d6a20db28a1a33531af30873ea90c5ac95a9b5/ormsgpack-1.12.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43013a3f3e2e902e1d05e72c0f1aeb5bedbb8e09240b51e26792a3c89267e181", size = 212401, upload-time = "2026-01-18T20:56:10.101Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5d/f70e2c3da414f46186659d24745483757bcc9adccb481a6eb93e2b729301/ormsgpack-1.12.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7c8b1667a72cbba74f0ae7ecf3105a5e01304620ed14528b2cb4320679d2869b", size = 387082, upload-time = "2026-01-18T20:56:12.047Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d6/06e8dc920c7903e051f30934d874d4afccc9bb1c09dcaf0bc03a7de4b343/ormsgpack-1.12.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:df6961442140193e517303d0b5d7bc2e20e69a879c2d774316125350c4a76b92", size = 482346, upload-time = "2026-01-18T20:56:05.152Z" }, + { url = "https://files.pythonhosted.org/packages/66/c4/f337ac0905eed9c393ef990c54565cd33644918e0a8031fe48c098c71dbf/ormsgpack-1.12.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c6a4c34ddef109647c769d69be65fa1de7a6022b02ad45546a69b3216573eb4a", size = 425181, upload-time = "2026-01-18T20:55:37.83Z" }, + { url = "https://files.pythonhosted.org/packages/78/29/6d5758fabef3babdf4bbbc453738cc7de9cd3334e4c38dd5737e27b85653/ormsgpack-1.12.2-cp311-cp311-win_amd64.whl", hash = "sha256:73670ed0375ecc303858e3613f407628dd1fca18fe6ac57b7b7ce66cc7bb006c", size = 117182, upload-time = "2026-01-18T20:55:31.472Z" }, + { url = "https://files.pythonhosted.org/packages/c4/57/17a15549233c37e7fd054c48fe9207492e06b026dbd872b826a0b5f833b6/ormsgpack-1.12.2-cp311-cp311-win_arm64.whl", hash = "sha256:c2be829954434e33601ae5da328cccce3266b098927ca7a30246a0baec2ce7bd", size = 111464, upload-time = "2026-01-18T20:55:38.811Z" }, + { url = "https://files.pythonhosted.org/packages/4c/36/16c4b1921c308a92cef3bf6663226ae283395aa0ff6e154f925c32e91ff5/ormsgpack-1.12.2-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7a29d09b64b9694b588ff2f80e9826bdceb3a2b91523c5beae1fab27d5c940e7", size = 378618, upload-time = "2026-01-18T20:55:50.835Z" }, + { url = "https://files.pythonhosted.org/packages/c0/68/468de634079615abf66ed13bb5c34ff71da237213f29294363beeeca5306/ormsgpack-1.12.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b39e629fd2e1c5b2f46f99778450b59454d1f901bc507963168985e79f09c5d", size = 203186, upload-time = "2026-01-18T20:56:11.163Z" }, + { url = "https://files.pythonhosted.org/packages/73/a9/d756e01961442688b7939bacd87ce13bfad7d26ce24f910f6028178b2cc8/ormsgpack-1.12.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:958dcb270d30a7cb633a45ee62b9444433fa571a752d2ca484efdac07480876e", size = 210738, upload-time = "2026-01-18T20:56:09.181Z" }, + { url = "https://files.pythonhosted.org/packages/7b/ba/795b1036888542c9113269a3f5690ab53dd2258c6fb17676ac4bd44fcf94/ormsgpack-1.12.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d379d72b6c5e964851c77cfedfb386e474adee4fd39791c2c5d9efb53505cc", size = 212569, upload-time = "2026-01-18T20:56:06.135Z" }, + { url = "https://files.pythonhosted.org/packages/6c/aa/bff73c57497b9e0cba8837c7e4bcab584b1a6dbc91a5dd5526784a5030c8/ormsgpack-1.12.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8463a3fc5f09832e67bdb0e2fda6d518dc4281b133166146a67f54c08496442e", size = 387166, upload-time = "2026-01-18T20:55:36.738Z" }, + { url = "https://files.pythonhosted.org/packages/d3/cf/f8283cba44bcb7b14f97b6274d449db276b3a86589bdb363169b51bc12de/ormsgpack-1.12.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:eddffb77eff0bad4e67547d67a130604e7e2dfbb7b0cde0796045be4090f35c6", size = 482498, upload-time = "2026-01-18T20:55:29.626Z" }, + { url = "https://files.pythonhosted.org/packages/05/be/71e37b852d723dfcbe952ad04178c030df60d6b78eba26bfd14c9a40575e/ormsgpack-1.12.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fcd55e5f6ba0dbce624942adf9f152062135f991a0126064889f68eb850de0dd", size = 425518, upload-time = "2026-01-18T20:55:49.556Z" }, + { url = "https://files.pythonhosted.org/packages/7a/0c/9803aa883d18c7ef197213cd2cbf73ba76472a11fe100fb7dab2884edf48/ormsgpack-1.12.2-cp312-cp312-win_amd64.whl", hash = "sha256:d024b40828f1dde5654faebd0d824f9cc29ad46891f626272dd5bfd7af2333a4", size = 117462, upload-time = "2026-01-18T20:55:47.726Z" }, + { url = "https://files.pythonhosted.org/packages/c8/9e/029e898298b2cc662f10d7a15652a53e3b525b1e7f07e21fef8536a09bb8/ormsgpack-1.12.2-cp312-cp312-win_arm64.whl", hash = "sha256:da538c542bac7d1c8f3f2a937863dba36f013108ce63e55745941dda4b75dbb6", size = 111559, upload-time = "2026-01-18T20:55:54.273Z" }, + { url = "https://files.pythonhosted.org/packages/eb/29/bb0eba3288c0449efbb013e9c6f58aea79cf5cb9ee1921f8865f04c1a9d7/ormsgpack-1.12.2-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5ea60cb5f210b1cfbad8c002948d73447508e629ec375acb82910e3efa8ff355", size = 378661, upload-time = "2026-01-18T20:55:57.765Z" }, + { url = "https://files.pythonhosted.org/packages/6e/31/5efa31346affdac489acade2926989e019e8ca98129658a183e3add7af5e/ormsgpack-1.12.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3601f19afdbea273ed70b06495e5794606a8b690a568d6c996a90d7255e51c1", size = 203194, upload-time = "2026-01-18T20:56:08.252Z" }, + { url = "https://files.pythonhosted.org/packages/eb/56/d0087278beef833187e0167f8527235ebe6f6ffc2a143e9de12a98b1ce87/ormsgpack-1.12.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29a9f17a3dac6054c0dce7925e0f4995c727f7c41859adf9b5572180f640d172", size = 210778, upload-time = "2026-01-18T20:55:17.694Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a2/072343e1413d9443e5a252a8eb591c2d5b1bffbe5e7bfc78c069361b92eb/ormsgpack-1.12.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39c1bd2092880e413902910388be8715f70b9f15f20779d44e673033a6146f2d", size = 212592, upload-time = "2026-01-18T20:55:32.747Z" }, + { url = "https://files.pythonhosted.org/packages/a2/8b/a0da3b98a91d41187a63b02dda14267eefc2a74fcb43cc2701066cf1510e/ormsgpack-1.12.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:50b7249244382209877deedeee838aef1542f3d0fc28b8fe71ca9d7e1896a0d7", size = 387164, upload-time = "2026-01-18T20:55:40.853Z" }, + { url = "https://files.pythonhosted.org/packages/19/bb/6d226bc4cf9fc20d8eb1d976d027a3f7c3491e8f08289a2e76abe96a65f3/ormsgpack-1.12.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:5af04800d844451cf102a59c74a841324868d3f1625c296a06cc655c542a6685", size = 482516, upload-time = "2026-01-18T20:55:42.033Z" }, + { url = "https://files.pythonhosted.org/packages/fb/f1/bb2c7223398543dedb3dbf8bb93aaa737b387de61c5feaad6f908841b782/ormsgpack-1.12.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cec70477d4371cd524534cd16472d8b9cc187e0e3043a8790545a9a9b296c258", size = 425539, upload-time = "2026-01-18T20:55:24.727Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e8/0fb45f57a2ada1fed374f7494c8cd55e2f88ccd0ab0a669aa3468716bf5f/ormsgpack-1.12.2-cp313-cp313-win_amd64.whl", hash = "sha256:21f4276caca5c03a818041d637e4019bc84f9d6ca8baa5ea03e5cc8bf56140e9", size = 117459, upload-time = "2026-01-18T20:55:56.876Z" }, + { url = "https://files.pythonhosted.org/packages/7a/d4/0cfeea1e960d550a131001a7f38a5132c7ae3ebde4c82af1f364ccc5d904/ormsgpack-1.12.2-cp313-cp313-win_arm64.whl", hash = "sha256:baca4b6773d20a82e36d6fd25f341064244f9f86a13dead95dd7d7f996f51709", size = 111577, upload-time = "2026-01-18T20:55:43.605Z" }, + { url = "https://files.pythonhosted.org/packages/94/16/24d18851334be09c25e87f74307c84950f18c324a4d3c0b41dabdbf19c29/ormsgpack-1.12.2-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:bc68dd5915f4acf66ff2010ee47c8906dc1cf07399b16f4089f8c71733f6e36c", size = 378717, upload-time = "2026-01-18T20:55:26.164Z" }, + { url = "https://files.pythonhosted.org/packages/b5/a2/88b9b56f83adae8032ac6a6fa7f080c65b3baf9b6b64fd3d37bd202991d4/ormsgpack-1.12.2-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46d084427b4132553940070ad95107266656cb646ea9da4975f85cb1a6676553", size = 203183, upload-time = "2026-01-18T20:55:18.815Z" }, + { url = "https://files.pythonhosted.org/packages/a9/80/43e4555963bf602e5bdc79cbc8debd8b6d5456c00d2504df9775e74b450b/ormsgpack-1.12.2-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c010da16235806cf1d7bc4c96bf286bfa91c686853395a299b3ddb49499a3e13", size = 210814, upload-time = "2026-01-18T20:55:33.973Z" }, + { url = "https://files.pythonhosted.org/packages/78/e1/7cfbf28de8bca6efe7e525b329c31277d1b64ce08dcba723971c241a9d60/ormsgpack-1.12.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18867233df592c997154ff942a6503df274b5ac1765215bceba7a231bea2745d", size = 212634, upload-time = "2026-01-18T20:55:28.634Z" }, + { url = "https://files.pythonhosted.org/packages/95/f8/30ae5716e88d792a4e879debee195653c26ddd3964c968594ddef0a3cc7e/ormsgpack-1.12.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b009049086ddc6b8f80c76b3955df1aa22a5fbd7673c525cd63bf91f23122ede", size = 387139, upload-time = "2026-01-18T20:56:02.013Z" }, + { url = "https://files.pythonhosted.org/packages/dc/81/aee5b18a3e3a0e52f718b37ab4b8af6fae0d9d6a65103036a90c2a8ffb5d/ormsgpack-1.12.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:1dcc17d92b6390d4f18f937cf0b99054824a7815818012ddca925d6e01c2e49e", size = 482578, upload-time = "2026-01-18T20:55:35.117Z" }, + { url = "https://files.pythonhosted.org/packages/bd/17/71c9ba472d5d45f7546317f467a5fc941929cd68fb32796ca3d13dcbaec2/ormsgpack-1.12.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f04b5e896d510b07c0ad733d7fce2d44b260c5e6c402d272128f8941984e4285", size = 425539, upload-time = "2026-01-18T20:56:04.009Z" }, + { url = "https://files.pythonhosted.org/packages/2e/a6/ac99cd7fe77e822fed5250ff4b86fa66dd4238937dd178d2299f10b69816/ormsgpack-1.12.2-cp314-cp314-win_amd64.whl", hash = "sha256:ae3aba7eed4ca7cb79fd3436eddd29140f17ea254b91604aa1eb19bfcedb990f", size = 117493, upload-time = "2026-01-18T20:56:07.343Z" }, + { url = "https://files.pythonhosted.org/packages/3a/67/339872846a1ae4592535385a1c1f93614138566d7af094200c9c3b45d1e5/ormsgpack-1.12.2-cp314-cp314-win_arm64.whl", hash = "sha256:118576ea6006893aea811b17429bfc561b4778fad393f5f538c84af70b01260c", size = 111579, upload-time = "2026-01-18T20:55:21.161Z" }, + { url = "https://files.pythonhosted.org/packages/49/c2/6feb972dc87285ad381749d3882d8aecbde9f6ecf908dd717d33d66df095/ormsgpack-1.12.2-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7121b3d355d3858781dc40dafe25a32ff8a8242b9d80c692fd548a4b1f7fd3c8", size = 378721, upload-time = "2026-01-18T20:55:52.12Z" }, + { url = "https://files.pythonhosted.org/packages/a3/9a/900a6b9b413e0f8a471cf07830f9cf65939af039a362204b36bd5b581d8b/ormsgpack-1.12.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ee766d2e78251b7a63daf1cddfac36a73562d3ddef68cacfb41b2af64698033", size = 203170, upload-time = "2026-01-18T20:55:44.469Z" }, + { url = "https://files.pythonhosted.org/packages/87/4c/27a95466354606b256f24fad464d7c97ab62bce6cc529dd4673e1179b8fb/ormsgpack-1.12.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:292410a7d23de9b40444636b9b8f1e4e4b814af7f1ef476e44887e52a123f09d", size = 212816, upload-time = "2026-01-18T20:55:23.501Z" }, + { url = "https://files.pythonhosted.org/packages/73/cd/29cee6007bddf7a834e6cd6f536754c0535fcb939d384f0f37a38b1cddb8/ormsgpack-1.12.2-cp314-cp314t-win_amd64.whl", hash = "sha256:837dd316584485b72ef451d08dd3e96c4a11d12e4963aedb40e08f89685d8ec2", size = 117232, upload-time = "2026-01-18T20:55:45.448Z" }, +] + [[package]] name = "outcome" version = "1.3.0.post0" @@ -2161,6 +2281,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] +[[package]] +name = "pyjwt" +version = "2.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/27/a3b6e5bf6ff856d2509292e95c8f57f0df7017cf5394921fc4e4ef40308a/pyjwt-2.12.1.tar.gz", hash = "sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b", size = 102564, upload-time = "2026-03-13T19:27:37.25Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/7a/8dd906bd22e79e47397a61742927f6747fe93242ef86645ee9092e610244/pyjwt-2.12.1-py3-none-any.whl", hash = "sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c", size = 29726, upload-time = "2026-03-13T19:27:35.677Z" }, +] + +[package.optional-dependencies] +crypto = [ + { name = "cryptography" }, +] + [[package]] name = "pyright" version = "1.1.403" @@ -2658,51 +2795,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, ] -[[package]] -name = "sqlalchemy" -version = "2.0.41" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/63/66/45b165c595ec89aa7dcc2c1cd222ab269bc753f1fc7a1e68f8481bd957bf/sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9", size = 9689424, upload-time = "2025-05-14T17:10:32.339Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/12/d7c445b1940276a828efce7331cb0cb09d6e5f049651db22f4ebb0922b77/sqlalchemy-2.0.41-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b1f09b6821406ea1f94053f346f28f8215e293344209129a9c0fcc3578598d7b", size = 2117967, upload-time = "2025-05-14T17:48:15.841Z" }, - { url = "https://files.pythonhosted.org/packages/6f/b8/cb90f23157e28946b27eb01ef401af80a1fab7553762e87df51507eaed61/sqlalchemy-2.0.41-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1936af879e3db023601196a1684d28e12f19ccf93af01bf3280a3262c4b6b4e5", size = 2107583, upload-time = "2025-05-14T17:48:18.688Z" }, - { url = "https://files.pythonhosted.org/packages/9e/c2/eef84283a1c8164a207d898e063edf193d36a24fb6a5bb3ce0634b92a1e8/sqlalchemy-2.0.41-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2ac41acfc8d965fb0c464eb8f44995770239668956dc4cdf502d1b1ffe0d747", size = 3186025, upload-time = "2025-05-14T17:51:51.226Z" }, - { url = "https://files.pythonhosted.org/packages/bd/72/49d52bd3c5e63a1d458fd6d289a1523a8015adedbddf2c07408ff556e772/sqlalchemy-2.0.41-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81c24e0c0fde47a9723c81d5806569cddef103aebbf79dbc9fcbb617153dea30", size = 3186259, upload-time = "2025-05-14T17:55:22.526Z" }, - { url = "https://files.pythonhosted.org/packages/4f/9e/e3ffc37d29a3679a50b6bbbba94b115f90e565a2b4545abb17924b94c52d/sqlalchemy-2.0.41-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23a8825495d8b195c4aa9ff1c430c28f2c821e8c5e2d98089228af887e5d7e29", size = 3126803, upload-time = "2025-05-14T17:51:53.277Z" }, - { url = "https://files.pythonhosted.org/packages/8a/76/56b21e363f6039978ae0b72690237b38383e4657281285a09456f313dd77/sqlalchemy-2.0.41-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:60c578c45c949f909a4026b7807044e7e564adf793537fc762b2489d522f3d11", size = 3148566, upload-time = "2025-05-14T17:55:24.398Z" }, - { url = "https://files.pythonhosted.org/packages/3b/92/11b8e1b69bf191bc69e300a99badbbb5f2f1102f2b08b39d9eee2e21f565/sqlalchemy-2.0.41-cp310-cp310-win32.whl", hash = "sha256:118c16cd3f1b00c76d69343e38602006c9cfb9998fa4f798606d28d63f23beda", size = 2086696, upload-time = "2025-05-14T17:55:59.136Z" }, - { url = "https://files.pythonhosted.org/packages/5c/88/2d706c9cc4502654860f4576cd54f7db70487b66c3b619ba98e0be1a4642/sqlalchemy-2.0.41-cp310-cp310-win_amd64.whl", hash = "sha256:7492967c3386df69f80cf67efd665c0f667cee67032090fe01d7d74b0e19bb08", size = 2110200, upload-time = "2025-05-14T17:56:00.757Z" }, - { url = "https://files.pythonhosted.org/packages/37/4e/b00e3ffae32b74b5180e15d2ab4040531ee1bef4c19755fe7926622dc958/sqlalchemy-2.0.41-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6375cd674fe82d7aa9816d1cb96ec592bac1726c11e0cafbf40eeee9a4516b5f", size = 2121232, upload-time = "2025-05-14T17:48:20.444Z" }, - { url = "https://files.pythonhosted.org/packages/ef/30/6547ebb10875302074a37e1970a5dce7985240665778cfdee2323709f749/sqlalchemy-2.0.41-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f8c9fdd15a55d9465e590a402f42082705d66b05afc3ffd2d2eb3c6ba919560", size = 2110897, upload-time = "2025-05-14T17:48:21.634Z" }, - { url = "https://files.pythonhosted.org/packages/9e/21/59df2b41b0f6c62da55cd64798232d7349a9378befa7f1bb18cf1dfd510a/sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f9dc8c44acdee06c8fc6440db9eae8b4af8b01e4b1aee7bdd7241c22edff4f", size = 3273313, upload-time = "2025-05-14T17:51:56.205Z" }, - { url = "https://files.pythonhosted.org/packages/62/e4/b9a7a0e5c6f79d49bcd6efb6e90d7536dc604dab64582a9dec220dab54b6/sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c11ceb9a1f482c752a71f203a81858625d8df5746d787a4786bca4ffdf71c6", size = 3273807, upload-time = "2025-05-14T17:55:26.928Z" }, - { url = "https://files.pythonhosted.org/packages/39/d8/79f2427251b44ddee18676c04eab038d043cff0e764d2d8bb08261d6135d/sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:911cc493ebd60de5f285bcae0491a60b4f2a9f0f5c270edd1c4dbaef7a38fc04", size = 3209632, upload-time = "2025-05-14T17:51:59.384Z" }, - { url = "https://files.pythonhosted.org/packages/d4/16/730a82dda30765f63e0454918c982fb7193f6b398b31d63c7c3bd3652ae5/sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03968a349db483936c249f4d9cd14ff2c296adfa1290b660ba6516f973139582", size = 3233642, upload-time = "2025-05-14T17:55:29.901Z" }, - { url = "https://files.pythonhosted.org/packages/04/61/c0d4607f7799efa8b8ea3c49b4621e861c8f5c41fd4b5b636c534fcb7d73/sqlalchemy-2.0.41-cp311-cp311-win32.whl", hash = "sha256:293cd444d82b18da48c9f71cd7005844dbbd06ca19be1ccf6779154439eec0b8", size = 2086475, upload-time = "2025-05-14T17:56:02.095Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8e/8344f8ae1cb6a479d0741c02cd4f666925b2bf02e2468ddaf5ce44111f30/sqlalchemy-2.0.41-cp311-cp311-win_amd64.whl", hash = "sha256:3d3549fc3e40667ec7199033a4e40a2f669898a00a7b18a931d3efb4c7900504", size = 2110903, upload-time = "2025-05-14T17:56:03.499Z" }, - { url = "https://files.pythonhosted.org/packages/3e/2a/f1f4e068b371154740dd10fb81afb5240d5af4aa0087b88d8b308b5429c2/sqlalchemy-2.0.41-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:81f413674d85cfd0dfcd6512e10e0f33c19c21860342a4890c3a2b59479929f9", size = 2119645, upload-time = "2025-05-14T17:55:24.854Z" }, - { url = "https://files.pythonhosted.org/packages/9b/e8/c664a7e73d36fbfc4730f8cf2bf930444ea87270f2825efbe17bf808b998/sqlalchemy-2.0.41-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:598d9ebc1e796431bbd068e41e4de4dc34312b7aa3292571bb3674a0cb415dd1", size = 2107399, upload-time = "2025-05-14T17:55:28.097Z" }, - { url = "https://files.pythonhosted.org/packages/5c/78/8a9cf6c5e7135540cb682128d091d6afa1b9e48bd049b0d691bf54114f70/sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a104c5694dfd2d864a6f91b0956eb5d5883234119cb40010115fd45a16da5e70", size = 3293269, upload-time = "2025-05-14T17:50:38.227Z" }, - { url = "https://files.pythonhosted.org/packages/3c/35/f74add3978c20de6323fb11cb5162702670cc7a9420033befb43d8d5b7a4/sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6145afea51ff0af7f2564a05fa95eb46f542919e6523729663a5d285ecb3cf5e", size = 3303364, upload-time = "2025-05-14T17:51:49.829Z" }, - { url = "https://files.pythonhosted.org/packages/6a/d4/c990f37f52c3f7748ebe98883e2a0f7d038108c2c5a82468d1ff3eec50b7/sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b46fa6eae1cd1c20e6e6f44e19984d438b6b2d8616d21d783d150df714f44078", size = 3229072, upload-time = "2025-05-14T17:50:39.774Z" }, - { url = "https://files.pythonhosted.org/packages/15/69/cab11fecc7eb64bc561011be2bd03d065b762d87add52a4ca0aca2e12904/sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41836fe661cc98abfae476e14ba1906220f92c4e528771a8a3ae6a151242d2ae", size = 3268074, upload-time = "2025-05-14T17:51:51.736Z" }, - { url = "https://files.pythonhosted.org/packages/5c/ca/0c19ec16858585d37767b167fc9602593f98998a68a798450558239fb04a/sqlalchemy-2.0.41-cp312-cp312-win32.whl", hash = "sha256:a8808d5cf866c781150d36a3c8eb3adccfa41a8105d031bf27e92c251e3969d6", size = 2084514, upload-time = "2025-05-14T17:55:49.915Z" }, - { url = "https://files.pythonhosted.org/packages/7f/23/4c2833d78ff3010a4e17f984c734f52b531a8c9060a50429c9d4b0211be6/sqlalchemy-2.0.41-cp312-cp312-win_amd64.whl", hash = "sha256:5b14e97886199c1f52c14629c11d90c11fbb09e9334fa7bb5f6d068d9ced0ce0", size = 2111557, upload-time = "2025-05-14T17:55:51.349Z" }, - { url = "https://files.pythonhosted.org/packages/d3/ad/2e1c6d4f235a97eeef52d0200d8ddda16f6c4dd70ae5ad88c46963440480/sqlalchemy-2.0.41-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eeb195cdedaf17aab6b247894ff2734dcead6c08f748e617bfe05bd5a218443", size = 2115491, upload-time = "2025-05-14T17:55:31.177Z" }, - { url = "https://files.pythonhosted.org/packages/cf/8d/be490e5db8400dacc89056f78a52d44b04fbf75e8439569d5b879623a53b/sqlalchemy-2.0.41-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d4ae769b9c1c7757e4ccce94b0641bc203bbdf43ba7a2413ab2523d8d047d8dc", size = 2102827, upload-time = "2025-05-14T17:55:34.921Z" }, - { url = "https://files.pythonhosted.org/packages/a0/72/c97ad430f0b0e78efaf2791342e13ffeafcbb3c06242f01a3bb8fe44f65d/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a62448526dd9ed3e3beedc93df9bb6b55a436ed1474db31a2af13b313a70a7e1", size = 3225224, upload-time = "2025-05-14T17:50:41.418Z" }, - { url = "https://files.pythonhosted.org/packages/5e/51/5ba9ea3246ea068630acf35a6ba0d181e99f1af1afd17e159eac7e8bc2b8/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc56c9788617b8964ad02e8fcfeed4001c1f8ba91a9e1f31483c0dffb207002a", size = 3230045, upload-time = "2025-05-14T17:51:54.722Z" }, - { url = "https://files.pythonhosted.org/packages/78/2f/8c14443b2acea700c62f9b4a8bad9e49fc1b65cfb260edead71fd38e9f19/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c153265408d18de4cc5ded1941dcd8315894572cddd3c58df5d5b5705b3fa28d", size = 3159357, upload-time = "2025-05-14T17:50:43.483Z" }, - { url = "https://files.pythonhosted.org/packages/fc/b2/43eacbf6ccc5276d76cea18cb7c3d73e294d6fb21f9ff8b4eef9b42bbfd5/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f67766965996e63bb46cfbf2ce5355fc32d9dd3b8ad7e536a920ff9ee422e23", size = 3197511, upload-time = "2025-05-14T17:51:57.308Z" }, - { url = "https://files.pythonhosted.org/packages/fa/2e/677c17c5d6a004c3c45334ab1dbe7b7deb834430b282b8a0f75ae220c8eb/sqlalchemy-2.0.41-cp313-cp313-win32.whl", hash = "sha256:bfc9064f6658a3d1cadeaa0ba07570b83ce6801a1314985bf98ec9b95d74e15f", size = 2082420, upload-time = "2025-05-14T17:55:52.69Z" }, - { url = "https://files.pythonhosted.org/packages/e9/61/e8c1b9b6307c57157d328dd8b8348ddc4c47ffdf1279365a13b2b98b8049/sqlalchemy-2.0.41-cp313-cp313-win_amd64.whl", hash = "sha256:82ca366a844eb551daff9d2e6e7a9e5e76d2612c8564f58db6c19a726869c1df", size = 2108329, upload-time = "2025-05-14T17:55:54.495Z" }, - { url = "https://files.pythonhosted.org/packages/1c/fc/9ba22f01b5cdacc8f5ed0d22304718d2c758fce3fd49a5372b886a86f37c/sqlalchemy-2.0.41-py3-none-any.whl", hash = "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576", size = 1911224, upload-time = "2025-05-14T17:39:42.154Z" }, -] - [[package]] name = "sse-starlette" version = "2.4.1" @@ -2730,62 +2822,15 @@ wheels = [ [[package]] name = "temporalio" -version = "1.23.0" +version = "1.26.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version >= '3.12.4' and python_full_version < '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version >= '3.12' and python_full_version < '3.12.4' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version == '3.11.*' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version < '3.11' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version >= '3.13' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version == '3.12.*' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version == '3.11.*' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version < '3.11' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", -] dependencies = [ - { name = "nexus-rpc", version = "1.3.0", source = { registry = "https://pypi.org/simple" } }, + { name = "nexus-rpc" }, { name = "protobuf" }, - { name = "python-dateutil", marker = "(python_full_version < '3.11' and extra == 'group-18-temporalio-samples-langchain') or (python_full_version < '3.11' and extra != 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "python-dateutil", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, { name = "types-protobuf" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/67/48/ba7413e2fab8dcd277b9df00bafa572da24e9ca32de2f38d428dc3a2825c/temporalio-1.23.0.tar.gz", hash = "sha256:72750494b00eb73ded9db76195e3a9b53ff548780f73d878ec3f807ee3191410", size = 1933051, upload-time = "2026-02-18T17:48:22.353Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/71/26c8f21dca9092201b3b9cb7aff42460b4864b5999aa4c6a4343ac66f1fd/temporalio-1.23.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:6b69ac8d75f2d90e66f4edce4316f6a33badc4a30b22efc50e9eddaa9acdc216", size = 12311037, upload-time = "2026-02-18T17:47:47.628Z" }, - { url = "https://files.pythonhosted.org/packages/ec/47/43102816139f2d346680cb7cc1e53da5f6968355ac65b4d35d4edbfca896/temporalio-1.23.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:1bbbb2f9c3cdd09451565163f6d741e51f109694c49435d475fdfa42b597219d", size = 11821906, upload-time = "2026-02-18T17:47:55.314Z" }, - { url = "https://files.pythonhosted.org/packages/00/b0/899ff28464a0e17adf17476bdfac8faf4ea41870358ff2d14737e43f9e66/temporalio-1.23.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf6570e0ee696f99a38d855da4441a890c7187357c16505ed458ac9ef274ed70", size = 12063601, upload-time = "2026-02-18T17:48:03.994Z" }, - { url = "https://files.pythonhosted.org/packages/ed/17/b8c6d2ec3e113c6a788322513a5ff635bdd54b3791d092ed0e273467748a/temporalio-1.23.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b82d6cca54c9f376b50e941dd10d12f7fe5b692a314fb087be72cd2898646a79", size = 12394579, upload-time = "2026-02-18T17:48:11.65Z" }, - { url = "https://files.pythonhosted.org/packages/b4/b7/f9ef7fd5ee65aef7d59ab1e95cb1b45df2fe49c17e3aa4d650ae3322f015/temporalio-1.23.0-cp310-abi3-win_amd64.whl", hash = "sha256:43c3b99a46dd329761a256f3855710c4a5b322afc879785e468bdd0b94faace6", size = 12834494, upload-time = "2026-02-18T17:48:19.071Z" }, -] - -[package.optional-dependencies] -openai-agents = [ - { name = "mcp" }, - { name = "openai-agents" }, -] -opentelemetry = [ - { name = "opentelemetry-api", marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, - { name = "opentelemetry-sdk", marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, -] - -[[package]] -name = "temporalio" -version = "1.26.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.13'", - "python_full_version == '3.12.*'", - "python_full_version == '3.11.*'", - "python_full_version < '3.11'", -] -dependencies = [ - { name = "nexus-rpc", version = "1.4.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, - { name = "protobuf", marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, - { name = "python-dateutil", marker = "(python_full_version < '3.11' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, - { name = "types-protobuf", marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, - { name = "typing-extensions", marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, -] sdist = { url = "https://files.pythonhosted.org/packages/ae/d4/fa21150a225393f87732ed6fef3cc9735d9e751edc6be415fe6e375105c6/temporalio-1.26.0.tar.gz", hash = "sha256:f4bfb35125e6f5e8c7f7ed1277c7354d812c6fac7ed5f8dbd50536cf289aaaa7", size = 2388994, upload-time = "2026-04-15T23:43:00.911Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/1e/27/8c421c622d18cc8e034247d5d72b89e6456937344b5bec1de40abef3c085/temporalio-1.26.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:5489040c0cf621edeb36984199dd9e4fbd2b3a07d61a4f2a8da1f2cb9820ef26", size = 14221070, upload-time = "2026-04-15T23:42:26.21Z" }, @@ -2799,9 +2844,13 @@ wheels = [ langsmith = [ { name = "langsmith", version = "0.7.32", source = { registry = "https://pypi.org/simple" } }, ] +openai-agents = [ + { name = "mcp" }, + { name = "openai-agents" }, +] opentelemetry = [ - { name = "opentelemetry-api", marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, - { name = "opentelemetry-sdk", marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-sdk" }, ] pydantic = [ { name = "pydantic" }, @@ -2812,8 +2861,7 @@ name = "temporalio-samples" version = "0.1a1" source = { editable = "." } dependencies = [ - { name = "temporalio", version = "1.23.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, - { name = "temporalio", version = "1.26.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, + { name = "temporalio" }, ] [package.dev-dependencies] @@ -2853,29 +2901,27 @@ langchain = [ { name = "fastapi" }, { name = "langchain", marker = "python_full_version < '4'" }, { name = "langchain-openai", marker = "python_full_version < '4'" }, - { name = "langsmith", version = "0.1.147", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '4'" }, - { name = "openai" }, + { name = "langsmith", version = "0.3.45", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '4'" }, + { name = "openai", version = "2.32.0", source = { registry = "https://pypi.org/simple" } }, { name = "tqdm" }, { name = "uvicorn", extra = ["standard"], marker = "extra == 'group-18-temporalio-samples-langchain' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, ] langsmith-tracing = [ { name = "langsmith", version = "0.7.32", source = { registry = "https://pypi.org/simple" } }, - { name = "openai" }, - { name = "temporalio", version = "1.26.0", source = { registry = "https://pypi.org/simple" }, extra = ["langsmith", "pydantic"], marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, + { name = "openai", version = "1.108.1", source = { registry = "https://pypi.org/simple" } }, + { name = "temporalio", extra = ["langsmith", "pydantic"], marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, ] nexus = [ - { name = "nexus-rpc", version = "1.3.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, - { name = "nexus-rpc", version = "1.4.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, + { name = "nexus-rpc" }, ] open-telemetry = [ { name = "opentelemetry-exporter-otlp-proto-grpc" }, - { name = "temporalio", version = "1.23.0", source = { registry = "https://pypi.org/simple" }, extra = ["opentelemetry"], marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, - { name = "temporalio", version = "1.26.0", source = { registry = "https://pypi.org/simple" }, extra = ["opentelemetry"], marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, + { name = "temporalio", extra = ["opentelemetry"] }, ] openai-agents = [ { name = "openai-agents", extra = ["litellm"], marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, { name = "requests" }, - { name = "temporalio", version = "1.23.0", source = { registry = "https://pypi.org/simple" }, extra = ["openai-agents"], marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "temporalio", extra = ["openai-agents", "opentelemetry"], marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, ] pydantic-converter = [ { name = "pydantic" }, @@ -2889,7 +2935,7 @@ trio-async = [ ] [package.metadata] -requires-dist = [{ name = "temporalio", specifier = ">=1.23.0,<2" }] +requires-dist = [{ name = "temporalio", specifier = ">=1.26.0,<2" }] [package.metadata.requires-dev] bedrock = [{ name = "boto3", specifier = ">=1.34.92,<2" }] @@ -2922,12 +2968,12 @@ encryption = [ gevent = [{ name = "gevent", marker = "python_full_version >= '3.8'", specifier = ">=25.4.2" }] langchain = [ { name = "fastapi", specifier = ">=0.115.12" }, - { name = "langchain", marker = "python_full_version >= '3.9' and python_full_version < '4'", specifier = ">=0.1.7,<0.2" }, - { name = "langchain-openai", marker = "python_full_version >= '3.9' and python_full_version < '4'", specifier = ">=0.0.6,<0.0.7" }, - { name = "langsmith", marker = "python_full_version >= '3.9' and python_full_version < '4'", specifier = ">=0.1.22,<0.2" }, - { name = "openai", specifier = ">=1.4.0,<2" }, + { name = "langchain", marker = "python_full_version >= '3.9' and python_full_version < '4'", specifier = ">=1.2.15,<2" }, + { name = "langchain-openai", marker = "python_full_version >= '3.9' and python_full_version < '4'", specifier = ">=1.1.13,<2" }, + { name = "langsmith", marker = "python_full_version >= '3.9' and python_full_version < '4'", specifier = ">=0.3.45,<0.4" }, + { name = "openai", specifier = ">=2.0.0,<3" }, { name = "tqdm", specifier = ">=4.62.0,<5" }, - { name = "uvicorn", extras = ["standard"], specifier = ">=0.24.0.post1,<0.25" }, + { name = "uvicorn", extras = ["standard"], specifier = ">=0.31.0,<0.32.0" }, ] langsmith-tracing = [ { name = "langsmith", specifier = ">=0.7.0" }, @@ -2940,9 +2986,9 @@ open-telemetry = [ { name = "temporalio", extras = ["opentelemetry"] }, ] openai-agents = [ - { name = "openai-agents", extras = ["litellm"], specifier = "==0.3.2" }, + { name = "openai-agents", extras = ["litellm"], specifier = ">=0.14.1" }, { name = "requests", specifier = ">=2.32.0,<3" }, - { name = "temporalio", extras = ["openai-agents"], specifier = ">=1.18.0" }, + { name = "temporalio", extras = ["openai-agents", "opentelemetry"], specifier = ">=1.26.0" }, ] pydantic-converter = [{ name = "pydantic", specifier = ">=2.10.6,<3" }] sentry = [{ name = "sentry-sdk", specifier = ">=2.13.0" }] @@ -3170,19 +3216,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" }, ] -[[package]] -name = "typing-inspect" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mypy-extensions" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78", size = 13825, upload-time = "2023-05-24T20:25:47.612Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827, upload-time = "2023-05-24T20:25:45.287Z" }, -] - [[package]] name = "typing-inspection" version = "0.4.2" @@ -3244,16 +3277,16 @@ wheels = [ [[package]] name = "uvicorn" -version = "0.24.0.post1" +version = "0.31.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e5/84/d43ce8fe6b31a316ef0ed04ea0d58cab981bdf7f17f8423491fa8b4f50b6/uvicorn-0.24.0.post1.tar.gz", hash = "sha256:09c8e5a79dc466bdf28dead50093957db184de356fcdc48697bad3bde4c2588e", size = 40102, upload-time = "2023-11-06T06:37:42.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/76/87/a886eda9ed495a3a4506d5a125cd07c54524280718c4969bde88f075fe98/uvicorn-0.31.1.tar.gz", hash = "sha256:f5167919867b161b7bcaf32646c6a94cdbd4c3aa2eb5c17d36bb9aa5cfd8c493", size = 77368, upload-time = "2024-10-09T19:44:20.152Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/17/4b7a76fffa7babf397481040d8aef2725b2b81ae19f1a31b5ca0c17d49e6/uvicorn-0.24.0.post1-py3-none-any.whl", hash = "sha256:7c84fea70c619d4a710153482c0d230929af7bcf76c7bfa6de151f0a3a80121e", size = 59687, upload-time = "2023-11-06T06:37:37.726Z" }, + { url = "https://files.pythonhosted.org/packages/3c/55/37407280931038a3f21fa0245d60edeaa76f18419581aa3f4397761c78df/uvicorn-0.31.1-py3-none-any.whl", hash = "sha256:adc42d9cac80cf3e51af97c1851648066841e7cfb6993a4ca8de29ac1548ed41", size = 63666, upload-time = "2024-10-09T19:44:18.734Z" }, ] [package.optional-dependencies] @@ -3731,10 +3764,98 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0a/2f/1bccc6f4cc882662162a1158cda1a7f616add2ffe322b28c99cb031b4ffc/zope.interface-7.2-cp313-cp313-win_amd64.whl", hash = "sha256:4893395d5dd2ba655c38ceb13014fd65667740f09fa5bb01caa1e6284e48c0cd", size = 212472, upload-time = "2024-11-28T08:49:56.587Z" }, ] +[[package]] +name = "zstandard" +version = "0.23.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version >= '3.12.4' and python_full_version < '3.13'", + "python_full_version >= '3.12' and python_full_version < '3.12.4'", + "python_full_version == '3.11.*'", + "python_full_version < '3.11'", +] +dependencies = [ + { name = "cffi", marker = "platform_python_implementation == 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/2ac0287b442160a89d726b17a9184a4c615bb5237db763791a7fd16d9df1/zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", size = 681701, upload-time = "2024-07-15T00:18:06.141Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/55/bd0487e86679db1823fc9ee0d8c9c78ae2413d34c0b461193b5f4c31d22f/zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9", size = 788701, upload-time = "2024-07-15T00:13:27.351Z" }, + { url = "https://files.pythonhosted.org/packages/e1/8a/ccb516b684f3ad987dfee27570d635822e3038645b1a950c5e8022df1145/zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880", size = 633678, upload-time = "2024-07-15T00:13:30.24Z" }, + { url = "https://files.pythonhosted.org/packages/12/89/75e633d0611c028e0d9af6df199423bf43f54bea5007e6718ab7132e234c/zstandard-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc", size = 4941098, upload-time = "2024-07-15T00:13:32.526Z" }, + { url = "https://files.pythonhosted.org/packages/4a/7a/bd7f6a21802de358b63f1ee636ab823711c25ce043a3e9f043b4fcb5ba32/zstandard-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573", size = 5308798, upload-time = "2024-07-15T00:13:34.925Z" }, + { url = "https://files.pythonhosted.org/packages/79/3b/775f851a4a65013e88ca559c8ae42ac1352db6fcd96b028d0df4d7d1d7b4/zstandard-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391", size = 5341840, upload-time = "2024-07-15T00:13:37.376Z" }, + { url = "https://files.pythonhosted.org/packages/09/4f/0cc49570141dd72d4d95dd6fcf09328d1b702c47a6ec12fbed3b8aed18a5/zstandard-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e", size = 5440337, upload-time = "2024-07-15T00:13:39.772Z" }, + { url = "https://files.pythonhosted.org/packages/e7/7c/aaa7cd27148bae2dc095191529c0570d16058c54c4597a7d118de4b21676/zstandard-0.23.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd", size = 4861182, upload-time = "2024-07-15T00:13:42.495Z" }, + { url = "https://files.pythonhosted.org/packages/ac/eb/4b58b5c071d177f7dc027129d20bd2a44161faca6592a67f8fcb0b88b3ae/zstandard-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4", size = 4932936, upload-time = "2024-07-15T00:13:44.234Z" }, + { url = "https://files.pythonhosted.org/packages/44/f9/21a5fb9bb7c9a274b05ad700a82ad22ce82f7ef0f485980a1e98ed6e8c5f/zstandard-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea", size = 5464705, upload-time = "2024-07-15T00:13:46.822Z" }, + { url = "https://files.pythonhosted.org/packages/49/74/b7b3e61db3f88632776b78b1db597af3f44c91ce17d533e14a25ce6a2816/zstandard-0.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2", size = 4857882, upload-time = "2024-07-15T00:13:49.297Z" }, + { url = "https://files.pythonhosted.org/packages/4a/7f/d8eb1cb123d8e4c541d4465167080bec88481ab54cd0b31eb4013ba04b95/zstandard-0.23.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9", size = 4697672, upload-time = "2024-07-15T00:13:51.447Z" }, + { url = "https://files.pythonhosted.org/packages/5e/05/f7dccdf3d121309b60342da454d3e706453a31073e2c4dac8e1581861e44/zstandard-0.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a", size = 5206043, upload-time = "2024-07-15T00:13:53.587Z" }, + { url = "https://files.pythonhosted.org/packages/86/9d/3677a02e172dccd8dd3a941307621c0cbd7691d77cb435ac3c75ab6a3105/zstandard-0.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0", size = 5667390, upload-time = "2024-07-15T00:13:56.137Z" }, + { url = "https://files.pythonhosted.org/packages/41/7e/0012a02458e74a7ba122cd9cafe491facc602c9a17f590367da369929498/zstandard-0.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c", size = 5198901, upload-time = "2024-07-15T00:13:58.584Z" }, + { url = "https://files.pythonhosted.org/packages/65/3a/8f715b97bd7bcfc7342d8adcd99a026cb2fb550e44866a3b6c348e1b0f02/zstandard-0.23.0-cp310-cp310-win32.whl", hash = "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813", size = 430596, upload-time = "2024-07-15T00:14:00.693Z" }, + { url = "https://files.pythonhosted.org/packages/19/b7/b2b9eca5e5a01111e4fe8a8ffb56bdcdf56b12448a24effe6cfe4a252034/zstandard-0.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4", size = 495498, upload-time = "2024-07-15T00:14:02.741Z" }, + { url = "https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e", size = 788699, upload-time = "2024-07-15T00:14:04.909Z" }, + { url = "https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23", size = 633681, upload-time = "2024-07-15T00:14:13.99Z" }, + { url = "https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a", size = 4944328, upload-time = "2024-07-15T00:14:16.588Z" }, + { url = "https://files.pythonhosted.org/packages/59/cc/e76acb4c42afa05a9d20827116d1f9287e9c32b7ad58cc3af0721ce2b481/zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db", size = 5311955, upload-time = "2024-07-15T00:14:19.389Z" }, + { url = "https://files.pythonhosted.org/packages/78/e4/644b8075f18fc7f632130c32e8f36f6dc1b93065bf2dd87f03223b187f26/zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2", size = 5344944, upload-time = "2024-07-15T00:14:22.173Z" }, + { url = "https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca", size = 5442927, upload-time = "2024-07-15T00:14:24.825Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c3/d24a01a19b6733b9f218e94d1a87c477d523237e07f94899e1c10f6fd06c/zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c", size = 4864910, upload-time = "2024-07-15T00:14:26.982Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a9/cf8f78ead4597264f7618d0875be01f9bc23c9d1d11afb6d225b867cb423/zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e", size = 4935544, upload-time = "2024-07-15T00:14:29.582Z" }, + { url = "https://files.pythonhosted.org/packages/2c/96/8af1e3731b67965fb995a940c04a2c20997a7b3b14826b9d1301cf160879/zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5", size = 5467094, upload-time = "2024-07-15T00:14:40.126Z" }, + { url = "https://files.pythonhosted.org/packages/ff/57/43ea9df642c636cb79f88a13ab07d92d88d3bfe3e550b55a25a07a26d878/zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48", size = 4860440, upload-time = "2024-07-15T00:14:42.786Z" }, + { url = "https://files.pythonhosted.org/packages/46/37/edb78f33c7f44f806525f27baa300341918fd4c4af9472fbc2c3094be2e8/zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c", size = 4700091, upload-time = "2024-07-15T00:14:45.184Z" }, + { url = "https://files.pythonhosted.org/packages/c1/f1/454ac3962671a754f3cb49242472df5c2cced4eb959ae203a377b45b1a3c/zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003", size = 5208682, upload-time = "2024-07-15T00:14:47.407Z" }, + { url = "https://files.pythonhosted.org/packages/85/b2/1734b0fff1634390b1b887202d557d2dd542de84a4c155c258cf75da4773/zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78", size = 5669707, upload-time = "2024-07-15T00:15:03.529Z" }, + { url = "https://files.pythonhosted.org/packages/52/5a/87d6971f0997c4b9b09c495bf92189fb63de86a83cadc4977dc19735f652/zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473", size = 5201792, upload-time = "2024-07-15T00:15:28.372Z" }, + { url = "https://files.pythonhosted.org/packages/79/02/6f6a42cc84459d399bd1a4e1adfc78d4dfe45e56d05b072008d10040e13b/zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160", size = 430586, upload-time = "2024-07-15T00:15:32.26Z" }, + { url = "https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0", size = 495420, upload-time = "2024-07-15T00:15:34.004Z" }, + { url = "https://files.pythonhosted.org/packages/7b/83/f23338c963bd9de687d47bf32efe9fd30164e722ba27fb59df33e6b1719b/zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094", size = 788713, upload-time = "2024-07-15T00:15:35.815Z" }, + { url = "https://files.pythonhosted.org/packages/5b/b3/1a028f6750fd9227ee0b937a278a434ab7f7fdc3066c3173f64366fe2466/zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8", size = 633459, upload-time = "2024-07-15T00:15:37.995Z" }, + { url = "https://files.pythonhosted.org/packages/26/af/36d89aae0c1f95a0a98e50711bc5d92c144939efc1f81a2fcd3e78d7f4c1/zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1", size = 4945707, upload-time = "2024-07-15T00:15:39.872Z" }, + { url = "https://files.pythonhosted.org/packages/cd/2e/2051f5c772f4dfc0aae3741d5fc72c3dcfe3aaeb461cc231668a4db1ce14/zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072", size = 5306545, upload-time = "2024-07-15T00:15:41.75Z" }, + { url = "https://files.pythonhosted.org/packages/0a/9e/a11c97b087f89cab030fa71206963090d2fecd8eb83e67bb8f3ffb84c024/zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20", size = 5337533, upload-time = "2024-07-15T00:15:44.114Z" }, + { url = "https://files.pythonhosted.org/packages/fc/79/edeb217c57fe1bf16d890aa91a1c2c96b28c07b46afed54a5dcf310c3f6f/zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373", size = 5436510, upload-time = "2024-07-15T00:15:46.509Z" }, + { url = "https://files.pythonhosted.org/packages/81/4f/c21383d97cb7a422ddf1ae824b53ce4b51063d0eeb2afa757eb40804a8ef/zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db", size = 4859973, upload-time = "2024-07-15T00:15:49.939Z" }, + { url = "https://files.pythonhosted.org/packages/ab/15/08d22e87753304405ccac8be2493a495f529edd81d39a0870621462276ef/zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772", size = 4936968, upload-time = "2024-07-15T00:15:52.025Z" }, + { url = "https://files.pythonhosted.org/packages/eb/fa/f3670a597949fe7dcf38119a39f7da49a8a84a6f0b1a2e46b2f71a0ab83f/zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105", size = 5467179, upload-time = "2024-07-15T00:15:54.971Z" }, + { url = "https://files.pythonhosted.org/packages/4e/a9/dad2ab22020211e380adc477a1dbf9f109b1f8d94c614944843e20dc2a99/zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba", size = 4848577, upload-time = "2024-07-15T00:15:57.634Z" }, + { url = "https://files.pythonhosted.org/packages/08/03/dd28b4484b0770f1e23478413e01bee476ae8227bbc81561f9c329e12564/zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd", size = 4693899, upload-time = "2024-07-15T00:16:00.811Z" }, + { url = "https://files.pythonhosted.org/packages/2b/64/3da7497eb635d025841e958bcd66a86117ae320c3b14b0ae86e9e8627518/zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a", size = 5199964, upload-time = "2024-07-15T00:16:03.669Z" }, + { url = "https://files.pythonhosted.org/packages/43/a4/d82decbab158a0e8a6ebb7fc98bc4d903266bce85b6e9aaedea1d288338c/zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90", size = 5655398, upload-time = "2024-07-15T00:16:06.694Z" }, + { url = "https://files.pythonhosted.org/packages/f2/61/ac78a1263bc83a5cf29e7458b77a568eda5a8f81980691bbc6eb6a0d45cc/zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35", size = 5191313, upload-time = "2024-07-15T00:16:09.758Z" }, + { url = "https://files.pythonhosted.org/packages/e7/54/967c478314e16af5baf849b6ee9d6ea724ae5b100eb506011f045d3d4e16/zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d", size = 430877, upload-time = "2024-07-15T00:16:11.758Z" }, + { url = "https://files.pythonhosted.org/packages/75/37/872d74bd7739639c4553bf94c84af7d54d8211b626b352bc57f0fd8d1e3f/zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b", size = 495595, upload-time = "2024-07-15T00:16:13.731Z" }, + { url = "https://files.pythonhosted.org/packages/80/f1/8386f3f7c10261fe85fbc2c012fdb3d4db793b921c9abcc995d8da1b7a80/zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9", size = 788975, upload-time = "2024-07-15T00:16:16.005Z" }, + { url = "https://files.pythonhosted.org/packages/16/e8/cbf01077550b3e5dc86089035ff8f6fbbb312bc0983757c2d1117ebba242/zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a", size = 633448, upload-time = "2024-07-15T00:16:17.897Z" }, + { url = "https://files.pythonhosted.org/packages/06/27/4a1b4c267c29a464a161aeb2589aff212b4db653a1d96bffe3598f3f0d22/zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2", size = 4945269, upload-time = "2024-07-15T00:16:20.136Z" }, + { url = "https://files.pythonhosted.org/packages/7c/64/d99261cc57afd9ae65b707e38045ed8269fbdae73544fd2e4a4d50d0ed83/zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5", size = 5306228, upload-time = "2024-07-15T00:16:23.398Z" }, + { url = "https://files.pythonhosted.org/packages/7a/cf/27b74c6f22541f0263016a0fd6369b1b7818941de639215c84e4e94b2a1c/zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f", size = 5336891, upload-time = "2024-07-15T00:16:26.391Z" }, + { url = "https://files.pythonhosted.org/packages/fa/18/89ac62eac46b69948bf35fcd90d37103f38722968e2981f752d69081ec4d/zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed", size = 5436310, upload-time = "2024-07-15T00:16:29.018Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a8/5ca5328ee568a873f5118d5b5f70d1f36c6387716efe2e369010289a5738/zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea", size = 4859912, upload-time = "2024-07-15T00:16:31.871Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ca/3781059c95fd0868658b1cf0440edd832b942f84ae60685d0cfdb808bca1/zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847", size = 4936946, upload-time = "2024-07-15T00:16:34.593Z" }, + { url = "https://files.pythonhosted.org/packages/ce/11/41a58986f809532742c2b832c53b74ba0e0a5dae7e8ab4642bf5876f35de/zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171", size = 5466994, upload-time = "2024-07-15T00:16:36.887Z" }, + { url = "https://files.pythonhosted.org/packages/83/e3/97d84fe95edd38d7053af05159465d298c8b20cebe9ccb3d26783faa9094/zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840", size = 4848681, upload-time = "2024-07-15T00:16:39.709Z" }, + { url = "https://files.pythonhosted.org/packages/6e/99/cb1e63e931de15c88af26085e3f2d9af9ce53ccafac73b6e48418fd5a6e6/zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690", size = 4694239, upload-time = "2024-07-15T00:16:41.83Z" }, + { url = "https://files.pythonhosted.org/packages/ab/50/b1e703016eebbc6501fc92f34db7b1c68e54e567ef39e6e59cf5fb6f2ec0/zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b", size = 5200149, upload-time = "2024-07-15T00:16:44.287Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e0/932388630aaba70197c78bdb10cce2c91fae01a7e553b76ce85471aec690/zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057", size = 5655392, upload-time = "2024-07-15T00:16:46.423Z" }, + { url = "https://files.pythonhosted.org/packages/02/90/2633473864f67a15526324b007a9f96c96f56d5f32ef2a56cc12f9548723/zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33", size = 5191299, upload-time = "2024-07-15T00:16:49.053Z" }, + { url = "https://files.pythonhosted.org/packages/b0/4c/315ca5c32da7e2dc3455f3b2caee5c8c2246074a61aac6ec3378a97b7136/zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd", size = 430862, upload-time = "2024-07-15T00:16:51.003Z" }, + { url = "https://files.pythonhosted.org/packages/a2/bf/c6aaba098e2d04781e8f4f7c0ba3c7aa73d00e4c436bcc0cf059a66691d1/zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b", size = 495578, upload-time = "2024-07-15T00:16:53.135Z" }, +] + [[package]] name = "zstandard" version = "0.25.0" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version == '3.12.*'", + "python_full_version == '3.11.*'", + "python_full_version < '3.11'", +] sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513, upload-time = "2025-09-14T22:15:54.002Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/56/7a/28efd1d371f1acd037ac64ed1c5e2b41514a6cc937dd6ab6a13ab9f0702f/zstandard-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e59fdc271772f6686e01e1b3b74537259800f57e24280be3f29c8a0deb1904dd", size = 795256, upload-time = "2025-09-14T22:15:56.415Z" }, From 5d7612fd70885d7645f2f728231e0c59379ca7c3 Mon Sep 17 00:00:00 2001 From: Maple Xu Date: Tue, 21 Apr 2026 23:44:59 -0400 Subject: [PATCH 13/14] Address PR review comments and refine chatbot architecture - Simplify basic/worker.py to use asyncio.run(main()) pattern - Basic activity now returns str instead of Response (drops pydantic dep) - Remove pydantic_data_converter from basic worker/starter - Replace chatbot signal+poll with update handler (message_from_user) - Wrap update handler body in @traceable for input/output capture - Inline RetryPolicy in chatbot workflow (no separate RETRY constant) - Add comment about alternative traceable() function-call style - Make PROJECT_NAME a shared constant in starters, pass to client-side @traceable so traces go to the right LangSmith project - Update READMEs with correct trace hierarchies based on real output - Fix wrap_openai span name (ChatOpenAI, not openai.responses.create) - Simplify tests (mocks match new str return type, use execute_update) - Remove poll_last_response helper Co-Authored-By: Claude Opus 4.7 (1M context) --- langsmith_tracing/README.md | 2 +- langsmith_tracing/basic/README.md | 8 ++-- langsmith_tracing/basic/activities.py | 6 +-- langsmith_tracing/basic/starter.py | 2 - langsmith_tracing/basic/worker.py | 23 +++------ langsmith_tracing/basic/workflows.py | 3 +- langsmith_tracing/chatbot/README.md | 63 ++++++++++++------------- langsmith_tracing/chatbot/starter.py | 25 ++-------- langsmith_tracing/chatbot/workflows.py | 49 ++++++++++++------- tests/langsmith_tracing/helpers.py | 23 --------- tests/langsmith_tracing/test_basic.py | 7 +-- tests/langsmith_tracing/test_chatbot.py | 19 ++++---- 12 files changed, 94 insertions(+), 136 deletions(-) diff --git a/langsmith_tracing/README.md b/langsmith_tracing/README.md index ec9e0588..127a8059 100644 --- a/langsmith_tracing/README.md +++ b/langsmith_tracing/README.md @@ -5,7 +5,7 @@ This sample demonstrates [LangSmith](https://smith.langchain.com/) tracing integ Two examples are included: - **[basic/](basic/)** — A one-shot LLM workflow that sends a prompt to OpenAI and returns the response. -- **[chatbot/](chatbot/)** — A long-running conversational workflow with tool calls (save/read notes), signals, and queries. +- **[chatbot/](chatbot/)** — A long-running conversational workflow with tool calls (save/read notes) and update handlers. ## Prerequisites diff --git a/langsmith_tracing/basic/README.md b/langsmith_tracing/basic/README.md index 46d5d27a..839312e8 100644 --- a/langsmith_tracing/basic/README.md +++ b/langsmith_tracing/basic/README.md @@ -18,13 +18,13 @@ uv run --group langsmith-tracing python -m langsmith_tracing.basic.starter ### `add_temporal_runs=False` (default) -Only `@traceable` and `wrap_openai` spans appear. The client-side `@traceable` is the root, and all workflow/activity traces nest under it via context propagation: +Only `@traceable` and `wrap_openai` spans appear. The client-side `@traceable` is the root, and workflow/activity traces nest under it via context propagation. ``` Basic LLM Request (@traceable, client-side) └── Ask: What is Temporal? (@traceable, workflow) └── Call OpenAI (@traceable, activity) - └── openai.responses.create (automatic via wrap_openai) + └── ChatOpenAI (automatic via wrap_openai) ``` ### `add_temporal_runs=True` @@ -36,7 +36,7 @@ uv run --group langsmith-tracing python -m langsmith_tracing.basic.worker --add- uv run --group langsmith-tracing python -m langsmith_tracing.basic.starter --add-temporal-runs ``` -Temporal operation spans are added. `StartWorkflow` and `RunWorkflow` are siblings under the client root; `StartActivity` and `RunActivity` are siblings under the workflow: +Temporal operation spans are added. `StartWorkflow`/`RunWorkflow` and `StartActivity`/`RunActivity` appear as sibling pairs: ``` Basic LLM Request (@traceable, client-side) @@ -46,5 +46,5 @@ Basic LLM Request (@traceable, client-side) ├── StartActivity:call_openai (automatic, Temporal plugin) └── RunActivity:call_openai (automatic, Temporal plugin) └── Call OpenAI (@traceable, activity) - └── openai.responses.create (automatic via wrap_openai) + └── ChatOpenAI (automatic via wrap_openai) ``` diff --git a/langsmith_tracing/basic/activities.py b/langsmith_tracing/basic/activities.py index 231f4078..ab2d70cd 100644 --- a/langsmith_tracing/basic/activities.py +++ b/langsmith_tracing/basic/activities.py @@ -5,7 +5,6 @@ from langsmith import traceable from langsmith.wrappers import wrap_openai from openai import AsyncOpenAI -from openai.types.responses import Response from temporalio import activity @@ -18,14 +17,15 @@ class OpenAIRequest: @traceable(name="Call OpenAI", run_type="llm") @activity.defn -async def call_openai(request: OpenAIRequest) -> Response: +async def call_openai(request: OpenAIRequest) -> str: """Call OpenAI Responses API. Retries handled by Temporal, not the OpenAI client.""" # wrap_openai patches the client so each API call (e.g. responses.create) # creates its own child span with model parameters and token usage. client = wrap_openai(AsyncOpenAI(max_retries=0)) - return await client.responses.create( + response = await client.responses.create( model=request.model, instructions=request.instructions, input=request.input, timeout=30, ) + return response.output_text diff --git a/langsmith_tracing/basic/starter.py b/langsmith_tracing/basic/starter.py index 24e392fb..901ae9b5 100644 --- a/langsmith_tracing/basic/starter.py +++ b/langsmith_tracing/basic/starter.py @@ -6,7 +6,6 @@ from langsmith import traceable from temporalio.client import Client from temporalio.contrib.langsmith import LangSmithPlugin -from temporalio.contrib.pydantic import pydantic_data_converter from temporalio.envconfig import ClientConfig from langsmith_tracing.basic.workflows import BasicLLMWorkflow @@ -27,7 +26,6 @@ async def main(): client = await Client.connect( **config, - data_converter=pydantic_data_converter, plugins=[plugin], ) diff --git a/langsmith_tracing/basic/worker.py b/langsmith_tracing/basic/worker.py index ac6133bd..140c87da 100644 --- a/langsmith_tracing/basic/worker.py +++ b/langsmith_tracing/basic/worker.py @@ -6,15 +6,12 @@ from temporalio.client import Client from temporalio.contrib.langsmith import LangSmithPlugin -from temporalio.contrib.pydantic import pydantic_data_converter from temporalio.envconfig import ClientConfig from temporalio.worker import Worker from langsmith_tracing.basic.activities import call_openai from langsmith_tracing.basic.workflows import BasicLLMWorkflow -interrupt_event = asyncio.Event() - async def main(): logging.basicConfig(level=logging.INFO) @@ -33,26 +30,20 @@ async def main(): client = await Client.connect( **config, - data_converter=pydantic_data_converter, plugins=[plugin], ) - async with Worker( + worker = Worker( client, task_queue="langsmith-basic-task-queue", workflows=[BasicLLMWorkflow], activities=[call_openai], - ): - label = "with" if add_temporal_runs else "without" - print(f"Worker started ({label} Temporal runs in traces), ctrl+c to exit") - await interrupt_event.wait() - print("Shutting down") + ) + + label = "with" if add_temporal_runs else "without" + print(f"Worker started ({label} Temporal runs in traces), ctrl+c to exit") + await worker.run() if __name__ == "__main__": - loop = asyncio.new_event_loop() - try: - loop.run_until_complete(main()) - except KeyboardInterrupt: - interrupt_event.set() - loop.run_until_complete(loop.shutdown_asyncgens()) + asyncio.run(main()) diff --git a/langsmith_tracing/basic/workflows.py b/langsmith_tracing/basic/workflows.py index 1421636e..c6cc14b2 100644 --- a/langsmith_tracing/basic/workflows.py +++ b/langsmith_tracing/basic/workflows.py @@ -24,11 +24,10 @@ async def run(self, prompt: str) -> str: tags=["basic-llm"], ) async def _run() -> str: - response = await workflow.execute_activity( + return await workflow.execute_activity( call_openai, OpenAIRequest(model="gpt-4o-mini", input=prompt), start_to_close_timeout=timedelta(seconds=60), ) - return response.output_text return await _run() diff --git a/langsmith_tracing/chatbot/README.md b/langsmith_tracing/chatbot/README.md index 332bd976..b9784989 100644 --- a/langsmith_tracing/chatbot/README.md +++ b/langsmith_tracing/chatbot/README.md @@ -1,6 +1,6 @@ # Chatbot with Tool Calls -A long-running conversational workflow with tool calls, signals, and queries. Demonstrates how LangSmith traces an agentic loop where the model calls tools across multiple turns. +A long-running conversational workflow with tool calls and update handlers. Demonstrates how LangSmith traces an agentic loop where the model calls tools across multiple turns. See the [parent README](../README.md) for prerequisites. @@ -25,58 +25,57 @@ The model has two tools, both implemented as `@traceable` methods on the workflo - **`save_note(name, content)`** — Stores a note in the workflow's in-memory dict. The note is durable because workflow state survives crashes and restarts via Temporal's event history. - **`read_note(name)`** — Reads a note from the workflow's in-memory dict. +## Architecture + +The main `@workflow.run` method runs a loop that processes user messages (calls `_query_openai`, which handles the tool-call loop). The `message_from_user` update handler coordinates: it hands the message to the main loop via a shared `_pending_message` field, then waits for the response. + +This means: +- Activity calls and the tool loop happen inside the main workflow run +- The update handler's trace just shows the input/output of the coordination step + ## Trace Structure ### `add_temporal_runs=False` (default) -Only `@traceable` and `wrap_openai` spans appear. The client-side `@traceable` wraps `start_workflow`, so the workflow's traces nest under it via context propagation. Signals and queries produce no traces in this mode. +Only `@traceable` and `wrap_openai` spans appear. The client-side `@traceable` wraps `start_workflow` and each `execute_update`, so both workflow and update traces nest under it via context propagation. ``` -Chatbot Session a1b2c3d4 (@traceable, client-side) -├── Turn: What's the capital of Fr.. (@traceable, client-side) -├── Turn: Save that as a note call.. (@traceable, client-side) -├── Turn: What did I save about pa.. (@traceable, client-side) -└── Session Apr 17 10:30 (@traceable, workflow) - ├── Request: What's the capital of France? (@traceable, per-message) - │ └── Call OpenAI (@traceable, activity) - │ └── openai.responses.create (automatic via wrap_openai) - ├── Request: Save that as a note called paris (@traceable, per-message) - │ ├── Call OpenAI (@traceable, activity) - │ │ └── openai.responses.create → function_call: save_note - │ ├── Save Note (@traceable, workflow method) - │ └── Call OpenAI (@traceable, activity) - │ └── openai.responses.create → text response - └── Request: What did I save about paris? (@traceable, per-message) - ├── Call OpenAI (@traceable, activity) - │ └── openai.responses.create → function_call: read_note - ├── Read Note (@traceable, workflow method) - └── Call OpenAI (@traceable, activity) - └── openai.responses.create → text response +Chatbot Session a1b2c3d4 (@traceable, client-side) +├── Session Apr 17 10:30 (@traceable, workflow main loop) +│ ├── Request: hello (@traceable, per-message in main loop) +│ │ └── Call OpenAI (@traceable, activity) +│ │ └── ChatOpenAI (automatic via wrap_openai) +│ └── Request: save that as note 15 (@traceable, per-message in main loop) +│ ├── Call OpenAI → function_call: save_note +│ ├── Save Note (@traceable, workflow method) +│ └── Call OpenAI → text response +├── Update: hello (@traceable, update handler) +└── Update: save that as note 15 (@traceable, update handler) ``` ### `add_temporal_runs=True` -With `--add-temporal-runs`, Temporal operation spans are added. `StartWorkflow` and `RunWorkflow` are siblings under the client root (context propagated via headers at `start_workflow` time). Signals and queries each get their own trace. +With `--add-temporal-runs`, Temporal operation spans are added. `StartWorkflow`/`RunWorkflow` and `StartActivity`/`RunActivity` appear as sibling pairs. ``` Chatbot Session a1b2c3d4 (@traceable, client-side) ├── StartWorkflow:ChatbotWorkflow (automatic, Temporal plugin) ├── RunWorkflow:ChatbotWorkflow (automatic, Temporal plugin) -│ └── Session Apr 17 10:30 (@traceable, workflow) -│ └── Request: Save that as a note called.. (@traceable, per-message) +│ └── Session Apr 17 10:30 (@traceable, workflow main loop) +│ └── Request: save that as note 15 (@traceable, per-message) │ ├── StartActivity:call_openai (automatic, Temporal plugin) │ ├── RunActivity:call_openai (automatic, Temporal plugin) │ │ └── Call OpenAI (@traceable, activity) -│ │ └── openai.responses.create (automatic via wrap_openai) +│ │ └── ChatOpenAI (automatic via wrap_openai) │ ├── Save Note (@traceable, workflow method) │ ├── StartActivity:call_openai (automatic, Temporal plugin) │ └── RunActivity:call_openai (automatic, Temporal plugin) │ └── Call OpenAI (@traceable, activity) -│ └── openai.responses.create (automatic via wrap_openai) -├── Turn: Save that as a note call.. (@traceable, client-side) -│ ├── SignalWorkflow:user_message (automatic, Temporal plugin) -│ │ └── HandleSignal:user_message (automatic, Temporal plugin) -│ └── QueryWorkflow:last_response (automatic, Temporal plugin) -│ └── HandleQuery:last_response (automatic, Temporal plugin) +│ └── ChatOpenAI (automatic via wrap_openai) +├── StartWorkflowUpdate:message_from_user (automatic, Temporal plugin) +│ └── HandleUpdate:message_from_user (automatic, Temporal plugin) +│ └── Update: save that as note 15 (@traceable, update handler) └── ... ``` + +Note that the `Request:` chain (with activity calls) lives under `RunWorkflow` (the main loop), while the `Update:` span lives under `HandleUpdate` (the update handler). They're connected by the shared workflow state but appear as separate subtrees. diff --git a/langsmith_tracing/chatbot/starter.py b/langsmith_tracing/chatbot/starter.py index 4924a383..4d67e794 100644 --- a/langsmith_tracing/chatbot/starter.py +++ b/langsmith_tracing/chatbot/starter.py @@ -40,7 +40,7 @@ async def main(): run_type="chain", # CRITICAL: Client-side @traceable runs outside the LangSmithPlugin's scope. # Make sure client-side traces use the same project_name as what is given to - # # the plugin. + # the plugin. project_name=PROJECT_NAME, tags=["client-side", "chatbot"], ) @@ -64,27 +64,10 @@ async def run_session(): print(f"\nWorkflow finished: {result}") return - # Each turn gets its own trace span - @traceable( - name=f"Turn: {user_input[:40]}", - run_type="chain", - tags=["client-turn"], + response = await wf_handle.execute_update( + ChatbotWorkflow.message_from_user, user_input ) - async def send_and_wait(msg: str): - prev_response = await wf_handle.query(ChatbotWorkflow.last_response) - await wf_handle.signal(ChatbotWorkflow.user_message, msg) - for _ in range(60): - await asyncio.sleep(0.5) - response = await wf_handle.query(ChatbotWorkflow.last_response) - if response != prev_response: - return response - return None - - response = await send_and_wait(user_input) - if response: - print(f"Bot: {response}\n") - else: - print("(timed out waiting for response)") + print(f"Bot: {response}\n") await run_session() diff --git a/langsmith_tracing/chatbot/workflows.py b/langsmith_tracing/chatbot/workflows.py index 14b30207..4b25df50 100644 --- a/langsmith_tracing/chatbot/workflows.py +++ b/langsmith_tracing/chatbot/workflows.py @@ -11,8 +11,6 @@ from langsmith_tracing.chatbot.activities import OpenAIRequest, call_openai -RETRY = RetryPolicy(initial_interval=timedelta(seconds=2), maximum_attempts=3) - TOOLS = [ { "type": "function", @@ -57,45 +55,58 @@ def __init__(self): self._notes: dict[str, str] = {} self._done = False - @workflow.signal - async def user_message(self, message: str) -> None: - self._pending_message = message - @workflow.signal async def exit(self) -> None: self._done = True - @workflow.query - def last_response(self) -> str: - return self._last_response - @workflow.query def notes(self) -> dict[str, str]: return dict(self._notes) + @workflow.update + async def message_from_user(self, message: str) -> str: + """Hand the message to the main loop and wait for its response.""" + + # Inner @traceable captures the message as input and response as output. + @traceable(name=f"Update: {message[:60]}", run_type="chain") + async def _traced(msg: str) -> str: + # Wait until any previous message has finished processing + await workflow.wait_condition(lambda: self._pending_message is None) + self._pending_message = msg + # Main loop sets _last_response, then clears _pending_message to signal done + await workflow.wait_condition(lambda: self._pending_message is None) + return self._last_response + + return await _traced(message) + # Do not decorate @workflow.run with @traceable — it would violate # replay safety and produce duplicate or orphaned traces. Instead, - # wrap an inner function. + # wrap an inner function, eg. self._run_inner() in this case. @workflow.run async def run(self) -> str: + # Alternative to @traceable decorator: call traceable() as a function + # for dynamic trace names that depend on runtime values. now = workflow.now().strftime("%b %d %H:%M") return await traceable( name=f"Session {now}", run_type="chain", metadata={"workflow_id": workflow.info().workflow_id}, tags=["chatbot-session"], - )(self._session)() + )(self._run_inner)() - async def _session(self) -> str: + async def _run_inner(self) -> str: while not self._done: await workflow.wait_condition( lambda: self._pending_message is not None or self._done ) if self._done: break + assert self._pending_message is not None message = self._pending_message - self._pending_message = None self._last_response = await self._query_openai(message) + # Clear pending_message AFTER setting the response so the update + # handler reads the correct response when its wait_condition fires. + self._pending_message = None return "Session ended." @@ -111,14 +122,14 @@ def _save_note(self, name: str, content: str) -> str: def _read_note(self, name: str) -> str: return self._notes.get(name, "Note not found.") - async def _query_openai(self, message: str | None) -> str: + async def _query_openai(self, message: str) -> str: @traceable( - name=f"Request: {(message or '')[:60]}", + name=f"Request: {message[:60]}", run_type="chain", tags=["user-message"], ) async def _traced(): - input_for_next: str | list = message or "" + input_for_next: str | list = message while True: response = await workflow.execute_activity( call_openai, @@ -129,7 +140,9 @@ async def _traced(): previous_response_id=self._previous_response_id, ), start_to_close_timeout=timedelta(seconds=60), - retry_policy=RETRY, + retry_policy=RetryPolicy( + initial_interval=timedelta(seconds=2), maximum_attempts=3 + ), ) self._previous_response_id = response.id diff --git a/tests/langsmith_tracing/helpers.py b/tests/langsmith_tracing/helpers.py index 5dff3807..6742a60f 100644 --- a/tests/langsmith_tracing/helpers.py +++ b/tests/langsmith_tracing/helpers.py @@ -1,12 +1,8 @@ """Shared test helpers for LangSmith tracing tests.""" -import asyncio -from typing import Any - from openai.types.responses import Response from openai.types.responses.response_output_message import ResponseOutputMessage from openai.types.responses.response_output_text import ResponseOutputText -from temporalio.client import WorkflowHandle def make_text_response(text: str) -> Response: @@ -35,22 +31,3 @@ def make_text_response(text: str) -> Response: tool_choice="auto", tools=[], ) - - -async def poll_last_response( - wf_handle: WorkflowHandle[Any, Any], - query: Any, - prev_response: str = "", - timeout_seconds: float = 4.0, - interval: float = 0.2, -) -> str: - """Poll a workflow query until the response changes from prev_response.""" - iterations = int(timeout_seconds / interval) - for _ in range(iterations): - await asyncio.sleep(interval) - response = await wf_handle.query(query) - if response and response != prev_response: - return response # type: ignore[return-value] - raise TimeoutError( - f"Timed out after {timeout_seconds}s waiting for workflow response" - ) diff --git a/tests/langsmith_tracing/test_basic.py b/tests/langsmith_tracing/test_basic.py index 53d80d58..b5be2f35 100644 --- a/tests/langsmith_tracing/test_basic.py +++ b/tests/langsmith_tracing/test_basic.py @@ -1,6 +1,5 @@ import uuid -from openai.types.responses import Response from temporalio import activity from temporalio.client import Client from temporalio.contrib.langsmith import LangSmithPlugin @@ -9,16 +8,14 @@ from langsmith_tracing.basic.activities import OpenAIRequest from langsmith_tracing.basic.workflows import BasicLLMWorkflow -from tests.langsmith_tracing.helpers import make_text_response async def test_basic_workflow(client: Client, env: WorkflowEnvironment): expected_text = "Temporal is a durable execution platform." - mock_response = make_text_response(expected_text) @activity.defn(name="call_openai") - async def mock_call_openai(request: OpenAIRequest) -> Response: - return mock_response + async def mock_call_openai(request: OpenAIRequest) -> str: + return expected_text async with Worker( client, diff --git a/tests/langsmith_tracing/test_chatbot.py b/tests/langsmith_tracing/test_chatbot.py index 15c03849..f7845217 100644 --- a/tests/langsmith_tracing/test_chatbot.py +++ b/tests/langsmith_tracing/test_chatbot.py @@ -13,7 +13,7 @@ from langsmith_tracing.chatbot.activities import OpenAIRequest from langsmith_tracing.chatbot.workflows import ChatbotWorkflow -from tests.langsmith_tracing.helpers import make_text_response, poll_last_response +from tests.langsmith_tracing.helpers import make_text_response def _make_function_call_response( @@ -68,8 +68,9 @@ async def mock_call_openai(request: OpenAIRequest) -> Response: task_queue="test-langsmith-chatbot", ) - await wf_handle.signal(ChatbotWorkflow.user_message, "Save a note") - response = await poll_last_response(wf_handle, ChatbotWorkflow.last_response) + response = await wf_handle.execute_update( + ChatbotWorkflow.message_from_user, "Save a note" + ) assert response == "Note saved successfully!" notes = await wf_handle.query(ChatbotWorkflow.notes) @@ -117,15 +118,15 @@ async def mock_call_openai(request: OpenAIRequest) -> Response: task_queue="test-langsmith-chatbot-read", ) - await wf_handle.signal(ChatbotWorkflow.user_message, "Save my todo") - response = await poll_last_response(wf_handle, ChatbotWorkflow.last_response) + response = await wf_handle.execute_update( + ChatbotWorkflow.message_from_user, "Save my todo" + ) assert response == "Saved your todo!" - await wf_handle.signal(ChatbotWorkflow.user_message, "Read my todo") - new_response = await poll_last_response( - wf_handle, ChatbotWorkflow.last_response, prev_response=response + response = await wf_handle.execute_update( + ChatbotWorkflow.message_from_user, "Read my todo" ) - assert new_response == "Your todo says: Buy milk" + assert response == "Your todo says: Buy milk" await wf_handle.signal(ChatbotWorkflow.exit) await wf_handle.result() From b47fc6aedf8f276486512a0dc1aeca6720c7d9df Mon Sep 17 00:00:00 2001 From: Maple Xu Date: Wed, 22 Apr 2026 01:00:57 -0400 Subject: [PATCH 14/14] Remove langchain sample, fix CI by relaxing openai version pin The langchain sample's langsmith<0.4 pin conflicts with langsmith-tracing's langsmith>=0.7.0. The langchain sample uses an older custom-interceptor approach that's superseded by the new LangSmithPlugin demonstrated in langsmith_tracing/. Removing it eliminates the dep conflict and the related [tool.uv] conflicts declaration. Also relax openai pin from <2 to no upper bound so it resolves alongside the openai-agents group (which now requires openai>=2.26.0). Add inline comment on max_retries=0 explaining Temporal handles retries. Co-Authored-By: Claude Opus 4.7 (1M context) --- langchain/README.md | 30 -- langchain/activities.py | 34 -- langchain/langchain_interceptor.py | 181 ------- langchain/starter.py | 47 -- langchain/worker.py | 44 -- langchain/workflow.py | 53 -- langsmith_tracing/basic/activities.py | 2 + langsmith_tracing/chatbot/activities.py | 2 + pyproject.toml | 24 +- uv.lock | 639 ++---------------------- 10 files changed, 39 insertions(+), 1017 deletions(-) delete mode 100644 langchain/README.md delete mode 100644 langchain/activities.py delete mode 100644 langchain/langchain_interceptor.py delete mode 100644 langchain/starter.py delete mode 100644 langchain/worker.py delete mode 100644 langchain/workflow.py diff --git a/langchain/README.md b/langchain/README.md deleted file mode 100644 index 506a379d..00000000 --- a/langchain/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# LangChain Sample - -This sample shows you how you can use Temporal to orchestrate workflows for [LangChain](https://www.langchain.com). It includes an interceptor that makes LangSmith traces work seamlessly across Temporal clients, workflows and activities. - -For this sample, the optional `langchain` dependency group must be included. To include, run: - - uv sync --group langchain - -Export your [OpenAI API key](https://platform.openai.com/api-keys) as an environment variable. Replace `YOUR_API_KEY` with your actual OpenAI API key. - - export OPENAI_API_KEY='...' - -To run, first see [README.md](../README.md) for prerequisites. Then, run the following from the root directory to start the -worker: - - uv run langchain/worker.py - -This will start the worker. Then, in another terminal, run the following to execute a workflow: - - uv run langchain/starter.py - -Then, in another terminal, run the following command to translate a phrase: - - curl -X POST "http://localhost:8000/translate?phrase=hello%20world&language1=Spanish&language2=French&language3=Russian" - -Which should produce some output like: - - {"translations":{"French":"Bonjour tout le monde","Russian":"Привет, мир","Spanish":"Hola mundo"}} - -Check [LangSmith](https://smith.langchain.com/) for the corresponding trace. \ No newline at end of file diff --git a/langchain/activities.py b/langchain/activities.py deleted file mode 100644 index a9dec70c..00000000 --- a/langchain/activities.py +++ /dev/null @@ -1,34 +0,0 @@ -from dataclasses import dataclass - -from langchain_openai import ChatOpenAI -from temporalio import activity - -from langchain.prompts import ChatPromptTemplate - - -@dataclass -class TranslateParams: - phrase: str - language: str - - -@activity.defn -async def translate_phrase(params: TranslateParams) -> str: - # LangChain setup - template = """You are a helpful assistant who translates between languages. - Translate the following phrase into the specified language: {phrase} - Language: {language}""" - chat_prompt = ChatPromptTemplate.from_messages( - [ - ("system", template), - ("human", "Translate"), - ] - ) - chain = chat_prompt | ChatOpenAI() - # Use the asynchronous invoke method - return ( - dict( - await chain.ainvoke({"phrase": params.phrase, "language": params.language}) - ).get("content") - or "" - ) diff --git a/langchain/langchain_interceptor.py b/langchain/langchain_interceptor.py deleted file mode 100644 index bb230b6b..00000000 --- a/langchain/langchain_interceptor.py +++ /dev/null @@ -1,181 +0,0 @@ -from __future__ import annotations - -from typing import Any, Mapping, Protocol, Type - -from temporalio import activity, api, client, converter, worker, workflow - -with workflow.unsafe.imports_passed_through(): - from contextlib import contextmanager - - from langsmith import trace, tracing_context - from langsmith.run_helpers import get_current_run_tree - -# Header key for LangChain context -LANGCHAIN_CONTEXT_KEY = "langchain-context" - - -class _InputWithHeaders(Protocol): - headers: Mapping[str, api.common.v1.Payload] - - -def set_header_from_context( - input: _InputWithHeaders, payload_converter: converter.PayloadConverter -) -> None: - # Get current LangChain run tree - run_tree = get_current_run_tree() - if run_tree: - headers = run_tree.to_headers() - input.headers = { - **input.headers, - LANGCHAIN_CONTEXT_KEY: payload_converter.to_payload(headers), - } - - -@contextmanager -def context_from_header( - input: _InputWithHeaders, payload_converter: converter.PayloadConverter -): - payload = input.headers.get(LANGCHAIN_CONTEXT_KEY) - if payload: - run_tree = payload_converter.from_payload(payload, dict) - # Set the run tree in the current context - with tracing_context(parent=run_tree): - yield - else: - yield - - -class LangChainContextPropagationInterceptor(client.Interceptor, worker.Interceptor): - """Interceptor that propagates LangChain context through Temporal.""" - - def __init__( - self, - payload_converter: converter.PayloadConverter = converter.default().payload_converter, - ) -> None: - self._payload_converter = payload_converter - - def intercept_client( - self, next: client.OutboundInterceptor - ) -> client.OutboundInterceptor: - return _LangChainContextPropagationClientOutboundInterceptor( - next, self._payload_converter - ) - - def intercept_activity( - self, next: worker.ActivityInboundInterceptor - ) -> worker.ActivityInboundInterceptor: - return _LangChainContextPropagationActivityInboundInterceptor(next) - - def workflow_interceptor_class( - self, input: worker.WorkflowInterceptorClassInput - ) -> Type[_LangChainContextPropagationWorkflowInboundInterceptor]: - return _LangChainContextPropagationWorkflowInboundInterceptor - - -class _LangChainContextPropagationClientOutboundInterceptor(client.OutboundInterceptor): - def __init__( - self, - next: client.OutboundInterceptor, - payload_converter: converter.PayloadConverter, - ) -> None: - super().__init__(next) - self._payload_converter = payload_converter - - async def start_workflow( - self, input: client.StartWorkflowInput - ) -> client.WorkflowHandle[Any, Any]: - with trace(name=f"start_workflow:{input.workflow}"): - set_header_from_context(input, self._payload_converter) - return await super().start_workflow(input) - - -class _LangChainContextPropagationActivityInboundInterceptor( - worker.ActivityInboundInterceptor -): - async def execute_activity(self, input: worker.ExecuteActivityInput) -> Any: - if isinstance(input.fn, str): - name = input.fn - elif callable(input.fn): - defn = activity._Definition.from_callable(input.fn) - name = ( - defn.name if defn is not None and defn.name is not None else "unknown" - ) - else: - name = "unknown" - - with context_from_header(input, activity.payload_converter()): - with trace(name=f"execute_activity:{name}"): - return await self.next.execute_activity(input) - - -class _LangChainContextPropagationWorkflowInboundInterceptor( - worker.WorkflowInboundInterceptor -): - def init(self, outbound: worker.WorkflowOutboundInterceptor) -> None: - self.next.init( - _LangChainContextPropagationWorkflowOutboundInterceptor(outbound) - ) - - async def execute_workflow(self, input: worker.ExecuteWorkflowInput) -> Any: - if isinstance(input.run_fn, str): - name = input.run_fn - elif callable(input.run_fn): - defn = workflow._Definition.from_run_fn(input.run_fn) - name = ( - defn.name if defn is not None and defn.name is not None else "unknown" - ) - else: - name = "unknown" - - with context_from_header(input, workflow.payload_converter()): - # This is a sandbox friendly way to write - # with trace(...): - # return await self.next.execute_workflow(input) - with workflow.unsafe.sandbox_unrestricted(): - t = trace( - name=f"execute_workflow:{name}", run_id=workflow.info().run_id - ) - with workflow.unsafe.imports_passed_through(): - t.__enter__() - try: - return await self.next.execute_workflow(input) - finally: - with workflow.unsafe.sandbox_unrestricted(): - # Cannot use __aexit__ because it's internally uses - # loop.run_in_executor which is not available in the sandbox - t.__exit__() - - -class _LangChainContextPropagationWorkflowOutboundInterceptor( - worker.WorkflowOutboundInterceptor -): - def start_activity( - self, input: worker.StartActivityInput - ) -> workflow.ActivityHandle: - with workflow.unsafe.sandbox_unrestricted(): - t = trace(name=f"start_activity:{input.activity}", run_id=workflow.uuid4()) - with workflow.unsafe.imports_passed_through(): - t.__enter__() - try: - set_header_from_context(input, workflow.payload_converter()) - return self.next.start_activity(input) - finally: - with workflow.unsafe.sandbox_unrestricted(): - t.__exit__() - - async def start_child_workflow( - self, input: worker.StartChildWorkflowInput - ) -> workflow.ChildWorkflowHandle: - with workflow.unsafe.sandbox_unrestricted(): - t = trace( - name=f"start_child_workflow:{input.workflow}", run_id=workflow.uuid4() - ) - with workflow.unsafe.imports_passed_through(): - t.__enter__() - - try: - set_header_from_context(input, workflow.payload_converter()) - return await self.next.start_child_workflow(input) - finally: - with workflow.unsafe.sandbox_unrestricted(): - t.__exit__() diff --git a/langchain/starter.py b/langchain/starter.py deleted file mode 100644 index 6d9e00c2..00000000 --- a/langchain/starter.py +++ /dev/null @@ -1,47 +0,0 @@ -from contextlib import asynccontextmanager -from typing import List -from uuid import uuid4 - -import uvicorn -from activities import TranslateParams -from fastapi import FastAPI, HTTPException -from langchain_interceptor import LangChainContextPropagationInterceptor -from temporalio.client import Client -from temporalio.envconfig import ClientConfig -from workflow import LangChainWorkflow, TranslateWorkflowParams - - -@asynccontextmanager -async def lifespan(app: FastAPI): - config = ClientConfig.load_client_connect_config() - config.setdefault("target_host", "localhost:7233") - - client = await Client.connect( - **config, - interceptors=[LangChainContextPropagationInterceptor()], - ) - yield - - -app = FastAPI(lifespan=lifespan) - - -@app.post("/translate") -async def translate(phrase: str, language1: str, language2: str, language3: str): - languages = [language1, language2, language3] - client = app.state.temporal_client - try: - result = await client.execute_workflow( - LangChainWorkflow.run, - TranslateWorkflowParams(phrase, languages), - id=f"langchain-translation-{uuid4()}", - task_queue="langchain-task-queue", - ) - except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) - - return {"translations": result} - - -if __name__ == "__main__": - uvicorn.run(app, host="localhost", port=8000) diff --git a/langchain/worker.py b/langchain/worker.py deleted file mode 100644 index b7fb7741..00000000 --- a/langchain/worker.py +++ /dev/null @@ -1,44 +0,0 @@ -import asyncio - -from activities import translate_phrase -from langchain_interceptor import LangChainContextPropagationInterceptor -from temporalio.client import Client -from temporalio.envconfig import ClientConfig -from temporalio.worker import Worker -from workflow import LangChainChildWorkflow, LangChainWorkflow - -interrupt_event = asyncio.Event() - - -async def main(): - config = ClientConfig.load_client_connect_config() - config.setdefault("target_host", "localhost:7233") - client = await Client.connect(**config) - - worker = Worker( - client, - task_queue="langchain-task-queue", - workflows=[LangChainWorkflow, LangChainChildWorkflow], - activities=[translate_phrase], - interceptors=[LangChainContextPropagationInterceptor()], - ) - - print("\nWorker started, ctrl+c to exit\n") - await worker.run() - try: - # Wait indefinitely until the interrupt event is set - await interrupt_event.wait() - finally: - # The worker will be shutdown gracefully due to the async context manager - print("\nShutting down the worker\n") - - -if __name__ == "__main__": - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - try: - loop.run_until_complete(main()) - except KeyboardInterrupt: - print("\nInterrupt received, shutting down...\n") - interrupt_event.set() - loop.run_until_complete(loop.shutdown_asyncgens()) diff --git a/langchain/workflow.py b/langchain/workflow.py deleted file mode 100644 index 31861c07..00000000 --- a/langchain/workflow.py +++ /dev/null @@ -1,53 +0,0 @@ -import asyncio -from dataclasses import dataclass -from datetime import timedelta -from typing import List - -from temporalio import workflow - -with workflow.unsafe.imports_passed_through(): - from activities import TranslateParams, translate_phrase - - -@workflow.defn -class LangChainChildWorkflow: - @workflow.run - async def run(self, params: TranslateParams) -> str: - return await workflow.execute_activity( - translate_phrase, - params, - schedule_to_close_timeout=timedelta(seconds=30), - ) - - -@dataclass -class TranslateWorkflowParams: - phrase: str - languages: List[str] - - -@workflow.defn -class LangChainWorkflow: - @workflow.run - async def run(self, params: TranslateWorkflowParams) -> dict: - result1, result2, result3 = await asyncio.gather( - workflow.execute_activity( - translate_phrase, - TranslateParams(params.phrase, params.languages[0]), - schedule_to_close_timeout=timedelta(seconds=30), - ), - workflow.execute_activity( - translate_phrase, - TranslateParams(params.phrase, params.languages[1]), - schedule_to_close_timeout=timedelta(seconds=30), - ), - workflow.execute_child_workflow( - LangChainChildWorkflow.run, - TranslateParams(params.phrase, params.languages[2]), - ), - ) - return { - params.languages[0]: result1, - params.languages[1]: result2, - params.languages[2]: result3, - } diff --git a/langsmith_tracing/basic/activities.py b/langsmith_tracing/basic/activities.py index ab2d70cd..e04e1711 100644 --- a/langsmith_tracing/basic/activities.py +++ b/langsmith_tracing/basic/activities.py @@ -21,6 +21,8 @@ async def call_openai(request: OpenAIRequest) -> str: """Call OpenAI Responses API. Retries handled by Temporal, not the OpenAI client.""" # wrap_openai patches the client so each API call (e.g. responses.create) # creates its own child span with model parameters and token usage. + # max_retries=0 disables OpenAI's built-in retries — Temporal's activity + # retry policy handles retries instead, with full visibility in the UI. client = wrap_openai(AsyncOpenAI(max_retries=0)) response = await client.responses.create( model=request.model, diff --git a/langsmith_tracing/chatbot/activities.py b/langsmith_tracing/chatbot/activities.py index 9545e3f9..1994f792 100644 --- a/langsmith_tracing/chatbot/activities.py +++ b/langsmith_tracing/chatbot/activities.py @@ -29,6 +29,8 @@ async def call_openai(request: OpenAIRequest) -> Response: """Call OpenAI Responses API. Retries handled by Temporal, not the OpenAI client.""" # wrap_openai patches the client so each API call (e.g. responses.create) # creates its own child span with model parameters and token usage. + # max_retries=0 disables OpenAI's built-in retries — Temporal's activity + # retry policy handles retries instead, with full visibility in the UI. client = wrap_openai(AsyncOpenAI(max_retries=0)) response_args: dict[str, Any] = { "model": request.model, diff --git a/pyproject.toml b/pyproject.toml index 5aa9834b..0927eea3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,17 +30,8 @@ bedrock = ["boto3>=1.34.92,<2"] dsl = ["pyyaml>=6.0.1,<7", "types-pyyaml>=6.0.12,<7", "dacite>=1.8.1,<2"] encryption = ["cryptography>=38.0.1,<39", "aiohttp>=3.8.1,<4"] gevent = ["gevent>=25.4.2 ; python_version >= '3.8'"] -langchain = [ - "langchain>=1.2.15,<2 ; python_version >= '3.8.1' and python_version < '4.0'", - "langchain-openai>=1.1.13,<2 ; python_version >= '3.8.1' and python_version < '4.0'", - "langsmith>=0.3.45,<0.4 ; python_version >= '3.8.1' and python_version < '4.0'", - "openai>=2.0.0,<3", - "fastapi>=0.115.12", - "tqdm>=4.62.0,<5", - "uvicorn[standard]>=0.31.0,<0.32.0", -] langsmith-tracing = [ - "openai>=1.4.0,<2", + "openai>=1.4.0", "langsmith>=0.7.0", "temporalio[pydantic,langsmith]>=1.26.0", ] @@ -84,7 +75,6 @@ packages = [ "encryption", "gevent_async", "hello", - "langchain", "langsmith_tracing", "message_passing", "nexus", @@ -132,18 +122,6 @@ log_cli = true log_cli_level = "INFO" log_cli_format = "%(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)" -[tool.uv] -conflicts = [ - [ - { group = "langchain" }, - { group = "langsmith-tracing" }, - ], - [ - { group = "openai-agents" }, - { group = "langsmith-tracing" }, - ], -] - [tool.ruff] target-version = "py310" diff --git a/uv.lock b/uv.lock index 07b36998..3c9990eb 100644 --- a/uv.lock +++ b/uv.lock @@ -2,27 +2,11 @@ version = 1 revision = 3 requires-python = ">=3.10" resolution-markers = [ - "python_full_version >= '3.13' and extra != 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing' and extra != 'group-18-temporalio-samples-openai-agents'", - "python_full_version == '3.12.*' and extra != 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing' and extra != 'group-18-temporalio-samples-openai-agents'", - "python_full_version == '3.11.*' and extra != 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing' and extra != 'group-18-temporalio-samples-openai-agents'", - "python_full_version < '3.11' and extra != 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing' and extra != 'group-18-temporalio-samples-openai-agents'", - "python_full_version >= '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version >= '3.12.4' and python_full_version < '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version >= '3.12' and python_full_version < '3.12.4' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version == '3.11.*' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version < '3.11' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version >= '3.13' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version == '3.12.*' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version == '3.11.*' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version < '3.11' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", -] -conflicts = [[ - { package = "temporalio-samples", group = "langchain" }, - { package = "temporalio-samples", group = "langsmith-tracing" }, -], [ - { package = "temporalio-samples", group = "langsmith-tracing" }, - { package = "temporalio-samples", group = "openai-agents" }, -]] + "python_full_version >= '3.13'", + "python_full_version == '3.12.*'", + "python_full_version == '3.11.*'", + "python_full_version < '3.11'", +] [[package]] name = "aiohappyeyeballs" @@ -40,7 +24,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, { name = "aiosignal" }, - { name = "async-timeout", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "async-timeout", marker = "python_full_version < '3.11'" }, { name = "attrs" }, { name = "frozenlist" }, { name = "multidict" }, @@ -125,7 +109,7 @@ version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frozenlist" }, - { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } wheels = [ @@ -396,27 +380,13 @@ name = "exceptiongroup" version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" }, ] -[[package]] -name = "fastapi" -version = "0.116.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, - { name = "starlette" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/78/d7/6c8b3bfe33eeffa208183ec037fee0cce9f7f024089ab1c5d12ef04bd27c/fastapi-0.116.1.tar.gz", hash = "sha256:ed52cbf946abfd70c5a0dccb24673f0670deeb517a88b3544d03c2a6bf283143", size = 296485, upload-time = "2025-07-11T16:22:32.057Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/47/d63c60f59a59467fda0f93f46335c9d18526d7071f025cb5b89d5353ea42/fastapi-0.116.1-py3-none-any.whl", hash = "sha256:c46ac7c312df840f0c9e220f7964bada936781bc4e2e6eb71f1c4d7553786565", size = 95631, upload-time = "2025-07-11T16:22:30.485Z" }, -] - [[package]] name = "fastuuid" version = "0.14.0" @@ -597,8 +567,8 @@ name = "gevent" version = "25.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi", marker = "(platform_python_implementation == 'CPython' and sys_platform == 'win32') or (platform_python_implementation != 'CPython' and extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (platform_python_implementation != 'CPython' and extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents') or (sys_platform != 'win32' and extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (sys_platform != 'win32' and extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, - { name = "greenlet", marker = "platform_python_implementation == 'CPython' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "cffi", marker = "platform_python_implementation == 'CPython' and sys_platform == 'win32'" }, + { name = "greenlet", marker = "platform_python_implementation == 'CPython'" }, { name = "zope-event" }, { name = "zope-interface" }, ] @@ -814,42 +784,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, ] -[[package]] -name = "httptools" -version = "0.6.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639, upload-time = "2024-10-16T19:45:08.902Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/6f/972f8eb0ea7d98a1c6be436e2142d51ad2a64ee18e02b0e7ff1f62171ab1/httptools-0.6.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3c73ce323711a6ffb0d247dcd5a550b8babf0f757e86a52558fe5b86d6fefcc0", size = 198780, upload-time = "2024-10-16T19:44:06.882Z" }, - { url = "https://files.pythonhosted.org/packages/6a/b0/17c672b4bc5c7ba7f201eada4e96c71d0a59fbc185e60e42580093a86f21/httptools-0.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345c288418f0944a6fe67be8e6afa9262b18c7626c3ef3c28adc5eabc06a68da", size = 103297, upload-time = "2024-10-16T19:44:08.129Z" }, - { url = "https://files.pythonhosted.org/packages/92/5e/b4a826fe91971a0b68e8c2bd4e7db3e7519882f5a8ccdb1194be2b3ab98f/httptools-0.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deee0e3343f98ee8047e9f4c5bc7cedbf69f5734454a94c38ee829fb2d5fa3c1", size = 443130, upload-time = "2024-10-16T19:44:09.45Z" }, - { url = "https://files.pythonhosted.org/packages/b0/51/ce61e531e40289a681a463e1258fa1e05e0be54540e40d91d065a264cd8f/httptools-0.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca80b7485c76f768a3bc83ea58373f8db7b015551117375e4918e2aa77ea9b50", size = 442148, upload-time = "2024-10-16T19:44:11.539Z" }, - { url = "https://files.pythonhosted.org/packages/ea/9e/270b7d767849b0c96f275c695d27ca76c30671f8eb8cc1bab6ced5c5e1d0/httptools-0.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:90d96a385fa941283ebd231464045187a31ad932ebfa541be8edf5b3c2328959", size = 415949, upload-time = "2024-10-16T19:44:13.388Z" }, - { url = "https://files.pythonhosted.org/packages/81/86/ced96e3179c48c6f656354e106934e65c8963d48b69be78f355797f0e1b3/httptools-0.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:59e724f8b332319e2875efd360e61ac07f33b492889284a3e05e6d13746876f4", size = 417591, upload-time = "2024-10-16T19:44:15.258Z" }, - { url = "https://files.pythonhosted.org/packages/75/73/187a3f620ed3175364ddb56847d7a608a6fc42d551e133197098c0143eca/httptools-0.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:c26f313951f6e26147833fc923f78f95604bbec812a43e5ee37f26dc9e5a686c", size = 88344, upload-time = "2024-10-16T19:44:16.54Z" }, - { url = "https://files.pythonhosted.org/packages/7b/26/bb526d4d14c2774fe07113ca1db7255737ffbb119315839af2065abfdac3/httptools-0.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069", size = 199029, upload-time = "2024-10-16T19:44:18.427Z" }, - { url = "https://files.pythonhosted.org/packages/a6/17/3e0d3e9b901c732987a45f4f94d4e2c62b89a041d93db89eafb262afd8d5/httptools-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a", size = 103492, upload-time = "2024-10-16T19:44:19.515Z" }, - { url = "https://files.pythonhosted.org/packages/b7/24/0fe235d7b69c42423c7698d086d4db96475f9b50b6ad26a718ef27a0bce6/httptools-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975", size = 462891, upload-time = "2024-10-16T19:44:21.067Z" }, - { url = "https://files.pythonhosted.org/packages/b1/2f/205d1f2a190b72da6ffb5f41a3736c26d6fa7871101212b15e9b5cd8f61d/httptools-0.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636", size = 459788, upload-time = "2024-10-16T19:44:22.958Z" }, - { url = "https://files.pythonhosted.org/packages/6e/4c/d09ce0eff09057a206a74575ae8f1e1e2f0364d20e2442224f9e6612c8b9/httptools-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721", size = 433214, upload-time = "2024-10-16T19:44:24.513Z" }, - { url = "https://files.pythonhosted.org/packages/3e/d2/84c9e23edbccc4a4c6f96a1b8d99dfd2350289e94f00e9ccc7aadde26fb5/httptools-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988", size = 434120, upload-time = "2024-10-16T19:44:26.295Z" }, - { url = "https://files.pythonhosted.org/packages/d0/46/4d8e7ba9581416de1c425b8264e2cadd201eb709ec1584c381f3e98f51c1/httptools-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17", size = 88565, upload-time = "2024-10-16T19:44:29.188Z" }, - { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683, upload-time = "2024-10-16T19:44:30.175Z" }, - { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337, upload-time = "2024-10-16T19:44:31.786Z" }, - { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796, upload-time = "2024-10-16T19:44:32.825Z" }, - { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837, upload-time = "2024-10-16T19:44:33.974Z" }, - { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289, upload-time = "2024-10-16T19:44:35.111Z" }, - { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779, upload-time = "2024-10-16T19:44:36.253Z" }, - { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634, upload-time = "2024-10-16T19:44:37.357Z" }, - { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214, upload-time = "2024-10-16T19:44:38.738Z" }, - { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431, upload-time = "2024-10-16T19:44:39.818Z" }, - { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121, upload-time = "2024-10-16T19:44:41.189Z" }, - { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805, upload-time = "2024-10-16T19:44:42.384Z" }, - { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858, upload-time = "2024-10-16T19:44:43.959Z" }, - { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042, upload-time = "2024-10-16T19:44:45.071Z" }, - { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682, upload-time = "2024-10-16T19:44:46.46Z" }, -] - [[package]] name = "httpx" version = "0.28.1" @@ -1016,27 +950,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256, upload-time = "2022-06-17T18:00:10.251Z" }, ] -[[package]] -name = "jsonpatch" -version = "1.33" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jsonpointer" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699, upload-time = "2023-06-26T12:07:29.144Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade", size = 12898, upload-time = "2023-06-16T21:01:28.466Z" }, -] - -[[package]] -name = "jsonpointer" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114, upload-time = "2024-06-10T19:24:42.462Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595, upload-time = "2024-06-10T19:24:40.698Z" }, -] - [[package]] name = "jsonschema" version = "4.24.0" @@ -1064,144 +977,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload-time = "2025-04-23T12:34:05.422Z" }, ] -[[package]] -name = "langchain" -version = "1.2.15" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "langchain-core" }, - { name = "langgraph" }, - { name = "pydantic" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/98/3f/888a7099d2bd2917f8b0c3ffc7e347f1e664cf64267820b0b923c4f339fc/langchain-1.2.15.tar.gz", hash = "sha256:1717b6719daefae90b2728314a5e2a117ff916291e2862595b6c3d6fba33d652", size = 574732, upload-time = "2026-04-03T14:26:03.994Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/e8/a3b8cb0005553f6a876865073c81ef93bd7c5b18381bcb9ba4013af96ebc/langchain-1.2.15-py3-none-any.whl", hash = "sha256:e349db349cb3e9550c4044077cf90a1717691756cc236438404b23500e615874", size = 112714, upload-time = "2026-04-03T14:26:02.557Z" }, -] - -[[package]] -name = "langchain-core" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jsonpatch" }, - { name = "langsmith", version = "0.3.45", source = { registry = "https://pypi.org/simple" } }, - { name = "packaging" }, - { name = "pydantic" }, - { name = "pyyaml" }, - { name = "tenacity" }, - { name = "typing-extensions" }, - { name = "uuid-utils" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/92/fe/20190232d9b513242899dbb0c2bb77e31b4d61e343743adbe90ebc2603d2/langchain_core-1.3.0.tar.gz", hash = "sha256:14a39f528bf459aa3aa40d0a7f7f1bae7520d435ef991ae14a4ceb74d8c49046", size = 860755, upload-time = "2026-04-17T14:51:38.298Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/e2/dbfa347aa072a6dc4cd38d6f9ebfc730b4c14c258c47f480f4c5c546f177/langchain_core-1.3.0-py3-none-any.whl", hash = "sha256:baf16ee028475df177b9ab8869a751c79406d64a6f12125b93802991b566cced", size = 515140, upload-time = "2026-04-17T14:51:36.274Z" }, -] - -[[package]] -name = "langchain-openai" -version = "1.1.15" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "langchain-core" }, - { name = "openai", version = "2.32.0", source = { registry = "https://pypi.org/simple" } }, - { name = "tiktoken" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/86/1e/ed50e1c44f36be6ba97b56b09f1a6be5906098b4ba1e6f8a0f661a54a5f5/langchain_openai-1.1.15.tar.gz", hash = "sha256:16ddb7481853991fd00691dfd01bcc5cdf60cb36aa6962b38c8a4939f0538ba0", size = 1115780, upload-time = "2026-04-20T19:57:09.281Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/29/a357935f8d75ce4fc7c32bbc887c026295e98a9e4ded6daf434d150c5d44/langchain_openai-1.1.15-py3-none-any.whl", hash = "sha256:069022b6cba2108fac2450d3bf6c888e20a2af92bf89b493638456ef4db0d900", size = 88797, upload-time = "2026-04-20T19:57:07.683Z" }, -] - -[[package]] -name = "langgraph" -version = "1.1.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "langchain-core" }, - { name = "langgraph-checkpoint" }, - { name = "langgraph-prebuilt" }, - { name = "langgraph-sdk" }, - { name = "pydantic" }, - { name = "xxhash" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8c/d5/9d9c65d5500a1ca7ea63d6d65aecfb248037018a74d7d4ef52e276bb4e4b/langgraph-1.1.9.tar.gz", hash = "sha256:bc5a49d5a5e71fda1f9c53c06c62f4caec9a95545b739d130a58b6ab3269e274", size = 560717, upload-time = "2026-04-21T13:43:06.809Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/16/58/0380420e66619d12c992c1f8cfda0c7a04e8f0fe8a84752245b9e7b1cba7/langgraph-1.1.9-py3-none-any.whl", hash = "sha256:7db13ceecde4ea643df6c097dcc9e534895dcd9fcc6500eeff2f2cde0fab16b2", size = 173744, upload-time = "2026-04-21T13:43:05.513Z" }, -] - -[[package]] -name = "langgraph-checkpoint" -version = "4.0.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "langchain-core" }, - { name = "ormsgpack" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2e/f2/cf8086e1f1a3358d9228805614e72602c281b18307f3fae64a5b854aad2d/langgraph_checkpoint-4.0.2.tar.gz", hash = "sha256:4f6f99cba8e272deabf81b2d8cdc96582af07a57a6ad591cdf216bb310497039", size = 160810, upload-time = "2026-04-15T21:03:00.062Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/5a/6dba29dd89b0a46ae21c707da0f9d17e94f27d3e481ed15bc99d6bd20aa6/langgraph_checkpoint-4.0.2-py3-none-any.whl", hash = "sha256:59b0f29216128a629c58dd07c98aa004f82f51805d5573126ffb419b753ff253", size = 51000, upload-time = "2026-04-15T21:02:59.096Z" }, -] - -[[package]] -name = "langgraph-prebuilt" -version = "1.0.10" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "langchain-core" }, - { name = "langgraph-checkpoint" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fe/c8/01471b1b5601f2e9c9a69c39fc9a2fb8611613ede0002e5a2b81c0acd850/langgraph_prebuilt-1.0.10.tar.gz", hash = "sha256:5a6fc513f8907074563b6218ff991c4ed9db19ac63101314919686e8029ddb07", size = 169769, upload-time = "2026-04-17T17:59:45.373Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/50/49/d073375beabdc6955df6cbe570ba7786836bd4c817ae998955d35037f2fd/langgraph_prebuilt-1.0.10-py3-none-any.whl", hash = "sha256:e3baa1977d819982e690a357ba5bb77ccc1d4d8d4a029c48e502a3b6d171185f", size = 36086, upload-time = "2026-04-17T17:59:44.395Z" }, -] - -[[package]] -name = "langgraph-sdk" -version = "0.3.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "httpx" }, - { name = "orjson" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3e/ec/477fa8b408f948b145d90fd935c0a9f37945fa5ec1dfabfc71e7cafba6d8/langgraph_sdk-0.3.6.tar.gz", hash = "sha256:7650f607f89c1586db5bee391b1a8754cbe1fc83b721ff2f1450f8906e790bd7", size = 182666, upload-time = "2026-02-14T19:46:03.752Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/61/12508e12652edd1874327271a5a8834c728a605f53a1a1c945f13ab69664/langgraph_sdk-0.3.6-py3-none-any.whl", hash = "sha256:7df2fd552ad7262d0baf8e1f849dce1d62186e76dcdd36db9dc5bdfa5c3fc20f", size = 88277, upload-time = "2026-02-14T19:46:02.48Z" }, -] - -[[package]] -name = "langsmith" -version = "0.3.45" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.13'", - "python_full_version >= '3.12.4' and python_full_version < '3.13'", - "python_full_version >= '3.12' and python_full_version < '3.12.4'", - "python_full_version == '3.11.*'", - "python_full_version < '3.11'", -] -dependencies = [ - { name = "httpx" }, - { name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, - { name = "packaging" }, - { name = "pydantic" }, - { name = "requests" }, - { name = "requests-toolbelt" }, - { name = "zstandard", version = "0.23.0", source = { registry = "https://pypi.org/simple" } }, -] -sdist = { url = "https://files.pythonhosted.org/packages/be/86/b941012013260f95af2e90a3d9415af4a76a003a28412033fc4b09f35731/langsmith-0.3.45.tar.gz", hash = "sha256:1df3c6820c73ed210b2c7bc5cdb7bfa19ddc9126cd03fdf0da54e2e171e6094d", size = 348201, upload-time = "2025-06-05T05:10:28.948Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/f4/c206c0888f8a506404cb4f16ad89593bdc2f70cf00de26a1a0a7a76ad7a3/langsmith-0.3.45-py3-none-any.whl", hash = "sha256:5b55f0518601fa65f3bb6b1a3100379a96aa7b3ed5e9380581615ba9c65ed8ed", size = 363002, upload-time = "2025-06-05T05:10:27.228Z" }, -] - [[package]] name = "langsmith" version = "0.7.32" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.13'", - "python_full_version == '3.12.*'", - "python_full_version == '3.11.*'", - "python_full_version < '3.11'", -] dependencies = [ { name = "httpx" }, { name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, @@ -1211,7 +990,7 @@ dependencies = [ { name = "requests-toolbelt" }, { name = "uuid-utils" }, { name = "xxhash" }, - { name = "zstandard", version = "0.25.0", source = { registry = "https://pypi.org/simple" } }, + { name = "zstandard" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2f/b4/a0b4a501bee6b8a741ce29f8c48155b132118483cddc6f9247735ddb38fa/langsmith-0.7.32.tar.gz", hash = "sha256:b59b8e106d0e4c4842e158229296086e2aa7c561e3f602acda73d3ad0062e915", size = 1184518, upload-time = "2026-04-15T23:42:41.885Z" } wheels = [ @@ -1230,7 +1009,7 @@ dependencies = [ { name = "importlib-metadata" }, { name = "jinja2" }, { name = "jsonschema" }, - { name = "openai", version = "2.32.0", source = { registry = "https://pypi.org/simple" } }, + { name = "openai" }, { name = "pydantic" }, { name = "python-dotenv" }, { name = "tiktoken" }, @@ -1322,7 +1101,7 @@ dependencies = [ { name = "jsonschema" }, { name = "pydantic" }, { name = "pydantic-settings" }, - { name = "pyjwt", extra = ["crypto"], marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "pyjwt", extra = ["crypto"] }, { name = "python-multipart" }, { name = "pywin32", marker = "sys_platform == 'win32'" }, { name = "sse-starlette" }, @@ -1350,7 +1129,7 @@ name = "multidict" version = "6.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3d/2c/5dad12e82fbdf7470f29bff2171484bf07cb3b16ada60a6589af8f376440/multidict-6.6.3.tar.gz", hash = "sha256:798a9eb12dab0a6c2e29c1de6f3468af5cb2da6053a20dfa3344907eed0937cc", size = 101006, upload-time = "2025-06-30T15:53:46.929Z" } wheels = [ @@ -1454,7 +1233,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, { name = "pathspec" }, - { name = "tomli", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/81/69/92c7fa98112e4d9eb075a239caa4ef4649ad7d441545ccffbd5e34607cbb/mypy-1.16.1.tar.gz", hash = "sha256:6bd00a0a2094841c5e47e7374bb42b83d64c527a502e3334e1173a0c24437bab", size = 3324747, upload-time = "2025-06-16T16:51:35.145Z" } @@ -1548,46 +1327,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload-time = "2024-02-05T23:58:36.364Z" }, ] -[[package]] -name = "openai" -version = "1.108.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.13'", - "python_full_version == '3.12.*'", - "python_full_version == '3.11.*'", - "python_full_version < '3.11'", -] -dependencies = [ - { name = "anyio" }, - { name = "distro" }, - { name = "httpx" }, - { name = "jiter" }, - { name = "pydantic" }, - { name = "sniffio" }, - { name = "tqdm" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/25/7a/3f2fbdf82a22d48405c1872f7c3176a705eee80ff2d2715d29472089171f/openai-1.108.1.tar.gz", hash = "sha256:6648468c1aec4eacfa554001e933a9fa075f57bacfc27588c2e34456cee9fef9", size = 563735, upload-time = "2025-09-19T16:52:20.399Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/87/6ad18ce0e7b910e3706480451df48ff9e0af3b55e5db565adafd68a0706a/openai-1.108.1-py3-none-any.whl", hash = "sha256:952fc027e300b2ac23be92b064eac136a2bc58274cec16f5d2906c361340d59b", size = 948394, upload-time = "2025-09-19T16:52:18.369Z" }, -] - [[package]] name = "openai" version = "2.32.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version >= '3.12.4' and python_full_version < '3.13' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version >= '3.12' and python_full_version < '3.12.4' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version == '3.11.*' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version < '3.11' and extra == 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version >= '3.13' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version == '3.12.*' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version == '3.11.*' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", - "python_full_version < '3.11' and extra != 'group-18-temporalio-samples-langchain' and extra != 'group-18-temporalio-samples-langsmith-tracing'", -] dependencies = [ { name = "anyio" }, { name = "distro" }, @@ -1610,7 +1353,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "griffelib" }, { name = "mcp" }, - { name = "openai", version = "2.32.0", source = { registry = "https://pypi.org/simple" } }, + { name = "openai" }, { name = "pydantic" }, { name = "requests" }, { name = "types-requests" }, @@ -1790,62 +1533,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1a/bf/def5e25d4d8bfce296a9a7c8248109bf58622c21618b590678f945a2c59c/orjson-3.11.4-cp314-cp314-win_arm64.whl", hash = "sha256:78b999999039db3cf58f6d230f524f04f75f129ba3d1ca2ed121f8657e575d3d", size = 126151, upload-time = "2025-10-24T15:50:15.878Z" }, ] -[[package]] -name = "ormsgpack" -version = "1.12.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/12/0c/f1761e21486942ab9bb6feaebc610fa074f7c5e496e6962dea5873348077/ormsgpack-1.12.2.tar.gz", hash = "sha256:944a2233640273bee67521795a73cf1e959538e0dfb7ac635505010455e53b33", size = 39031, upload-time = "2026-01-18T20:55:28.023Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/93/fa/a91f70829ebccf6387c4946e0a1a109f6ba0d6a28d65f628bedfad94b890/ormsgpack-1.12.2-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:c1429217f8f4d7fcb053523bbbac6bed5e981af0b85ba616e6df7cce53c19657", size = 378262, upload-time = "2026-01-18T20:55:22.284Z" }, - { url = "https://files.pythonhosted.org/packages/5f/62/3698a9a0c487252b5c6a91926e5654e79e665708ea61f67a8bdeceb022bf/ormsgpack-1.12.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f13034dc6c84a6280c6c33db7ac420253852ea233fc3ee27c8875f8dd651163", size = 203034, upload-time = "2026-01-18T20:55:53.324Z" }, - { url = "https://files.pythonhosted.org/packages/66/3a/f716f64edc4aec2744e817660b317e2f9bb8de372338a95a96198efa1ac1/ormsgpack-1.12.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:59f5da97000c12bc2d50e988bdc8576b21f6ab4e608489879d35b2c07a8ab51a", size = 210538, upload-time = "2026-01-18T20:55:20.097Z" }, - { url = "https://files.pythonhosted.org/packages/72/30/a436be9ce27d693d4e19fa94900028067133779f09fc45776db3f689c822/ormsgpack-1.12.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e4459c3f27066beadb2b81ea48a076a417aafffff7df1d3c11c519190ed44f2", size = 212401, upload-time = "2026-01-18T20:55:46.447Z" }, - { url = "https://files.pythonhosted.org/packages/10/c5/cde98300fd33fee84ca71de4751b19aeeca675f0cf3c0ec4b043f40f3b76/ormsgpack-1.12.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a1c460655d7288407ffa09065e322a7231997c0d62ce914bf3a96ad2dc6dedd", size = 387080, upload-time = "2026-01-18T20:56:00.884Z" }, - { url = "https://files.pythonhosted.org/packages/6a/31/30bf445ef827546747c10889dd254b3d84f92b591300efe4979d792f4c41/ormsgpack-1.12.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:458e4568be13d311ef7d8877275e7ccbe06c0e01b39baaac874caaa0f46d826c", size = 482346, upload-time = "2026-01-18T20:55:39.831Z" }, - { url = "https://files.pythonhosted.org/packages/2e/f5/e1745ddf4fa246c921b5ca253636c4c700ff768d78032f79171289159f6e/ormsgpack-1.12.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8cde5eaa6c6cbc8622db71e4a23de56828e3d876aeb6460ffbcb5b8aff91093b", size = 425178, upload-time = "2026-01-18T20:55:27.106Z" }, - { url = "https://files.pythonhosted.org/packages/8d/a2/e6532ed7716aed03dede8df2d0d0d4150710c2122647d94b474147ccd891/ormsgpack-1.12.2-cp310-cp310-win_amd64.whl", hash = "sha256:dc7a33be14c347893edbb1ceda89afbf14c467d593a5ee92c11de4f1666b4d4f", size = 117183, upload-time = "2026-01-18T20:55:55.52Z" }, - { url = "https://files.pythonhosted.org/packages/4b/08/8b68f24b18e69d92238aa8f258218e6dfeacf4381d9d07ab8df303f524a9/ormsgpack-1.12.2-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:bd5f4bf04c37888e864f08e740c5a573c4017f6fd6e99fa944c5c935fabf2dd9", size = 378266, upload-time = "2026-01-18T20:55:59.876Z" }, - { url = "https://files.pythonhosted.org/packages/0d/24/29fc13044ecb7c153523ae0a1972269fcd613650d1fa1a9cec1044c6b666/ormsgpack-1.12.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34d5b28b3570e9fed9a5a76528fc7230c3c76333bc214798958e58e9b79cc18a", size = 203035, upload-time = "2026-01-18T20:55:30.59Z" }, - { url = "https://files.pythonhosted.org/packages/ad/c2/00169fb25dd8f9213f5e8a549dfb73e4d592009ebc85fbbcd3e1dcac575b/ormsgpack-1.12.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3708693412c28f3538fb5a65da93787b6bbab3484f6bc6e935bfb77a62400ae5", size = 210539, upload-time = "2026-01-18T20:55:48.569Z" }, - { url = "https://files.pythonhosted.org/packages/1b/33/543627f323ff3c73091f51d6a20db28a1a33531af30873ea90c5ac95a9b5/ormsgpack-1.12.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43013a3f3e2e902e1d05e72c0f1aeb5bedbb8e09240b51e26792a3c89267e181", size = 212401, upload-time = "2026-01-18T20:56:10.101Z" }, - { url = "https://files.pythonhosted.org/packages/e8/5d/f70e2c3da414f46186659d24745483757bcc9adccb481a6eb93e2b729301/ormsgpack-1.12.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7c8b1667a72cbba74f0ae7ecf3105a5e01304620ed14528b2cb4320679d2869b", size = 387082, upload-time = "2026-01-18T20:56:12.047Z" }, - { url = "https://files.pythonhosted.org/packages/c0/d6/06e8dc920c7903e051f30934d874d4afccc9bb1c09dcaf0bc03a7de4b343/ormsgpack-1.12.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:df6961442140193e517303d0b5d7bc2e20e69a879c2d774316125350c4a76b92", size = 482346, upload-time = "2026-01-18T20:56:05.152Z" }, - { url = "https://files.pythonhosted.org/packages/66/c4/f337ac0905eed9c393ef990c54565cd33644918e0a8031fe48c098c71dbf/ormsgpack-1.12.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c6a4c34ddef109647c769d69be65fa1de7a6022b02ad45546a69b3216573eb4a", size = 425181, upload-time = "2026-01-18T20:55:37.83Z" }, - { url = "https://files.pythonhosted.org/packages/78/29/6d5758fabef3babdf4bbbc453738cc7de9cd3334e4c38dd5737e27b85653/ormsgpack-1.12.2-cp311-cp311-win_amd64.whl", hash = "sha256:73670ed0375ecc303858e3613f407628dd1fca18fe6ac57b7b7ce66cc7bb006c", size = 117182, upload-time = "2026-01-18T20:55:31.472Z" }, - { url = "https://files.pythonhosted.org/packages/c4/57/17a15549233c37e7fd054c48fe9207492e06b026dbd872b826a0b5f833b6/ormsgpack-1.12.2-cp311-cp311-win_arm64.whl", hash = "sha256:c2be829954434e33601ae5da328cccce3266b098927ca7a30246a0baec2ce7bd", size = 111464, upload-time = "2026-01-18T20:55:38.811Z" }, - { url = "https://files.pythonhosted.org/packages/4c/36/16c4b1921c308a92cef3bf6663226ae283395aa0ff6e154f925c32e91ff5/ormsgpack-1.12.2-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7a29d09b64b9694b588ff2f80e9826bdceb3a2b91523c5beae1fab27d5c940e7", size = 378618, upload-time = "2026-01-18T20:55:50.835Z" }, - { url = "https://files.pythonhosted.org/packages/c0/68/468de634079615abf66ed13bb5c34ff71da237213f29294363beeeca5306/ormsgpack-1.12.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b39e629fd2e1c5b2f46f99778450b59454d1f901bc507963168985e79f09c5d", size = 203186, upload-time = "2026-01-18T20:56:11.163Z" }, - { url = "https://files.pythonhosted.org/packages/73/a9/d756e01961442688b7939bacd87ce13bfad7d26ce24f910f6028178b2cc8/ormsgpack-1.12.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:958dcb270d30a7cb633a45ee62b9444433fa571a752d2ca484efdac07480876e", size = 210738, upload-time = "2026-01-18T20:56:09.181Z" }, - { url = "https://files.pythonhosted.org/packages/7b/ba/795b1036888542c9113269a3f5690ab53dd2258c6fb17676ac4bd44fcf94/ormsgpack-1.12.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d379d72b6c5e964851c77cfedfb386e474adee4fd39791c2c5d9efb53505cc", size = 212569, upload-time = "2026-01-18T20:56:06.135Z" }, - { url = "https://files.pythonhosted.org/packages/6c/aa/bff73c57497b9e0cba8837c7e4bcab584b1a6dbc91a5dd5526784a5030c8/ormsgpack-1.12.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8463a3fc5f09832e67bdb0e2fda6d518dc4281b133166146a67f54c08496442e", size = 387166, upload-time = "2026-01-18T20:55:36.738Z" }, - { url = "https://files.pythonhosted.org/packages/d3/cf/f8283cba44bcb7b14f97b6274d449db276b3a86589bdb363169b51bc12de/ormsgpack-1.12.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:eddffb77eff0bad4e67547d67a130604e7e2dfbb7b0cde0796045be4090f35c6", size = 482498, upload-time = "2026-01-18T20:55:29.626Z" }, - { url = "https://files.pythonhosted.org/packages/05/be/71e37b852d723dfcbe952ad04178c030df60d6b78eba26bfd14c9a40575e/ormsgpack-1.12.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fcd55e5f6ba0dbce624942adf9f152062135f991a0126064889f68eb850de0dd", size = 425518, upload-time = "2026-01-18T20:55:49.556Z" }, - { url = "https://files.pythonhosted.org/packages/7a/0c/9803aa883d18c7ef197213cd2cbf73ba76472a11fe100fb7dab2884edf48/ormsgpack-1.12.2-cp312-cp312-win_amd64.whl", hash = "sha256:d024b40828f1dde5654faebd0d824f9cc29ad46891f626272dd5bfd7af2333a4", size = 117462, upload-time = "2026-01-18T20:55:47.726Z" }, - { url = "https://files.pythonhosted.org/packages/c8/9e/029e898298b2cc662f10d7a15652a53e3b525b1e7f07e21fef8536a09bb8/ormsgpack-1.12.2-cp312-cp312-win_arm64.whl", hash = "sha256:da538c542bac7d1c8f3f2a937863dba36f013108ce63e55745941dda4b75dbb6", size = 111559, upload-time = "2026-01-18T20:55:54.273Z" }, - { url = "https://files.pythonhosted.org/packages/eb/29/bb0eba3288c0449efbb013e9c6f58aea79cf5cb9ee1921f8865f04c1a9d7/ormsgpack-1.12.2-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5ea60cb5f210b1cfbad8c002948d73447508e629ec375acb82910e3efa8ff355", size = 378661, upload-time = "2026-01-18T20:55:57.765Z" }, - { url = "https://files.pythonhosted.org/packages/6e/31/5efa31346affdac489acade2926989e019e8ca98129658a183e3add7af5e/ormsgpack-1.12.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3601f19afdbea273ed70b06495e5794606a8b690a568d6c996a90d7255e51c1", size = 203194, upload-time = "2026-01-18T20:56:08.252Z" }, - { url = "https://files.pythonhosted.org/packages/eb/56/d0087278beef833187e0167f8527235ebe6f6ffc2a143e9de12a98b1ce87/ormsgpack-1.12.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29a9f17a3dac6054c0dce7925e0f4995c727f7c41859adf9b5572180f640d172", size = 210778, upload-time = "2026-01-18T20:55:17.694Z" }, - { url = "https://files.pythonhosted.org/packages/1c/a2/072343e1413d9443e5a252a8eb591c2d5b1bffbe5e7bfc78c069361b92eb/ormsgpack-1.12.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39c1bd2092880e413902910388be8715f70b9f15f20779d44e673033a6146f2d", size = 212592, upload-time = "2026-01-18T20:55:32.747Z" }, - { url = "https://files.pythonhosted.org/packages/a2/8b/a0da3b98a91d41187a63b02dda14267eefc2a74fcb43cc2701066cf1510e/ormsgpack-1.12.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:50b7249244382209877deedeee838aef1542f3d0fc28b8fe71ca9d7e1896a0d7", size = 387164, upload-time = "2026-01-18T20:55:40.853Z" }, - { url = "https://files.pythonhosted.org/packages/19/bb/6d226bc4cf9fc20d8eb1d976d027a3f7c3491e8f08289a2e76abe96a65f3/ormsgpack-1.12.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:5af04800d844451cf102a59c74a841324868d3f1625c296a06cc655c542a6685", size = 482516, upload-time = "2026-01-18T20:55:42.033Z" }, - { url = "https://files.pythonhosted.org/packages/fb/f1/bb2c7223398543dedb3dbf8bb93aaa737b387de61c5feaad6f908841b782/ormsgpack-1.12.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cec70477d4371cd524534cd16472d8b9cc187e0e3043a8790545a9a9b296c258", size = 425539, upload-time = "2026-01-18T20:55:24.727Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e8/0fb45f57a2ada1fed374f7494c8cd55e2f88ccd0ab0a669aa3468716bf5f/ormsgpack-1.12.2-cp313-cp313-win_amd64.whl", hash = "sha256:21f4276caca5c03a818041d637e4019bc84f9d6ca8baa5ea03e5cc8bf56140e9", size = 117459, upload-time = "2026-01-18T20:55:56.876Z" }, - { url = "https://files.pythonhosted.org/packages/7a/d4/0cfeea1e960d550a131001a7f38a5132c7ae3ebde4c82af1f364ccc5d904/ormsgpack-1.12.2-cp313-cp313-win_arm64.whl", hash = "sha256:baca4b6773d20a82e36d6fd25f341064244f9f86a13dead95dd7d7f996f51709", size = 111577, upload-time = "2026-01-18T20:55:43.605Z" }, - { url = "https://files.pythonhosted.org/packages/94/16/24d18851334be09c25e87f74307c84950f18c324a4d3c0b41dabdbf19c29/ormsgpack-1.12.2-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:bc68dd5915f4acf66ff2010ee47c8906dc1cf07399b16f4089f8c71733f6e36c", size = 378717, upload-time = "2026-01-18T20:55:26.164Z" }, - { url = "https://files.pythonhosted.org/packages/b5/a2/88b9b56f83adae8032ac6a6fa7f080c65b3baf9b6b64fd3d37bd202991d4/ormsgpack-1.12.2-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46d084427b4132553940070ad95107266656cb646ea9da4975f85cb1a6676553", size = 203183, upload-time = "2026-01-18T20:55:18.815Z" }, - { url = "https://files.pythonhosted.org/packages/a9/80/43e4555963bf602e5bdc79cbc8debd8b6d5456c00d2504df9775e74b450b/ormsgpack-1.12.2-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c010da16235806cf1d7bc4c96bf286bfa91c686853395a299b3ddb49499a3e13", size = 210814, upload-time = "2026-01-18T20:55:33.973Z" }, - { url = "https://files.pythonhosted.org/packages/78/e1/7cfbf28de8bca6efe7e525b329c31277d1b64ce08dcba723971c241a9d60/ormsgpack-1.12.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18867233df592c997154ff942a6503df274b5ac1765215bceba7a231bea2745d", size = 212634, upload-time = "2026-01-18T20:55:28.634Z" }, - { url = "https://files.pythonhosted.org/packages/95/f8/30ae5716e88d792a4e879debee195653c26ddd3964c968594ddef0a3cc7e/ormsgpack-1.12.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b009049086ddc6b8f80c76b3955df1aa22a5fbd7673c525cd63bf91f23122ede", size = 387139, upload-time = "2026-01-18T20:56:02.013Z" }, - { url = "https://files.pythonhosted.org/packages/dc/81/aee5b18a3e3a0e52f718b37ab4b8af6fae0d9d6a65103036a90c2a8ffb5d/ormsgpack-1.12.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:1dcc17d92b6390d4f18f937cf0b99054824a7815818012ddca925d6e01c2e49e", size = 482578, upload-time = "2026-01-18T20:55:35.117Z" }, - { url = "https://files.pythonhosted.org/packages/bd/17/71c9ba472d5d45f7546317f467a5fc941929cd68fb32796ca3d13dcbaec2/ormsgpack-1.12.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f04b5e896d510b07c0ad733d7fce2d44b260c5e6c402d272128f8941984e4285", size = 425539, upload-time = "2026-01-18T20:56:04.009Z" }, - { url = "https://files.pythonhosted.org/packages/2e/a6/ac99cd7fe77e822fed5250ff4b86fa66dd4238937dd178d2299f10b69816/ormsgpack-1.12.2-cp314-cp314-win_amd64.whl", hash = "sha256:ae3aba7eed4ca7cb79fd3436eddd29140f17ea254b91604aa1eb19bfcedb990f", size = 117493, upload-time = "2026-01-18T20:56:07.343Z" }, - { url = "https://files.pythonhosted.org/packages/3a/67/339872846a1ae4592535385a1c1f93614138566d7af094200c9c3b45d1e5/ormsgpack-1.12.2-cp314-cp314-win_arm64.whl", hash = "sha256:118576ea6006893aea811b17429bfc561b4778fad393f5f538c84af70b01260c", size = 111579, upload-time = "2026-01-18T20:55:21.161Z" }, - { url = "https://files.pythonhosted.org/packages/49/c2/6feb972dc87285ad381749d3882d8aecbde9f6ecf908dd717d33d66df095/ormsgpack-1.12.2-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7121b3d355d3858781dc40dafe25a32ff8a8242b9d80c692fd548a4b1f7fd3c8", size = 378721, upload-time = "2026-01-18T20:55:52.12Z" }, - { url = "https://files.pythonhosted.org/packages/a3/9a/900a6b9b413e0f8a471cf07830f9cf65939af039a362204b36bd5b581d8b/ormsgpack-1.12.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ee766d2e78251b7a63daf1cddfac36a73562d3ddef68cacfb41b2af64698033", size = 203170, upload-time = "2026-01-18T20:55:44.469Z" }, - { url = "https://files.pythonhosted.org/packages/87/4c/27a95466354606b256f24fad464d7c97ab62bce6cc529dd4673e1179b8fb/ormsgpack-1.12.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:292410a7d23de9b40444636b9b8f1e4e4b814af7f1ef476e44887e52a123f09d", size = 212816, upload-time = "2026-01-18T20:55:23.501Z" }, - { url = "https://files.pythonhosted.org/packages/73/cd/29cee6007bddf7a834e6cd6f536754c0535fcb939d384f0f37a38b1cddb8/ormsgpack-1.12.2-cp314-cp314t-win_amd64.whl", hash = "sha256:837dd316584485b72ef451d08dd3e96c4a11d12e4963aedb40e08f89685d8ec2", size = 117232, upload-time = "2026-01-18T20:55:45.448Z" }, -] - [[package]] name = "outcome" version = "1.3.0.post0" @@ -1949,7 +1636,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pastel" }, { name = "pyyaml" }, - { name = "tomli", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cf/ac/311c8a492dc887f0b7a54d0ec3324cb2f9538b7b78ea06e5f7ae1f167e52/poethepoet-0.36.0.tar.gz", hash = "sha256:2217b49cb4e4c64af0b42ff8c4814b17f02e107d38bc461542517348ede25663", size = 66854, upload-time = "2025-06-29T19:54:50.444Z" } wheels = [ @@ -2316,12 +2003,12 @@ name = "pytest" version = "7.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, - { name = "tomli", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/80/1f/9d8e98e4133ffb16c90f3b405c43e38d3abb715bb5d7a63a5a684f7e46a3/pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", size = 1357116, upload-time = "2023-12-31T12:00:18.035Z" } wheels = [ @@ -2576,7 +2263,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, - { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload-time = "2025-03-30T14:15:14.23Z" } wheels = [ @@ -2827,7 +2514,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "nexus-rpc" }, { name = "protobuf" }, - { name = "python-dateutil", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "python-dateutil", marker = "python_full_version < '3.11'" }, { name = "types-protobuf" }, { name = "typing-extensions" }, ] @@ -2842,7 +2529,7 @@ wheels = [ [package.optional-dependencies] langsmith = [ - { name = "langsmith", version = "0.7.32", source = { registry = "https://pypi.org/simple" } }, + { name = "langsmith" }, ] openai-agents = [ { name = "mcp" }, @@ -2870,8 +2557,8 @@ bedrock = [ ] cloud-export-to-parquet = [ { name = "boto3" }, - { name = "numpy", marker = "python_full_version < '3.13' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, - { name = "pandas", marker = "python_full_version < '4' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "numpy", marker = "python_full_version < '3.13'" }, + { name = "pandas", marker = "python_full_version < '4'" }, { name = "pyarrow" }, ] dev = [ @@ -2897,19 +2584,10 @@ encryption = [ gevent = [ { name = "gevent" }, ] -langchain = [ - { name = "fastapi" }, - { name = "langchain", marker = "python_full_version < '4'" }, - { name = "langchain-openai", marker = "python_full_version < '4'" }, - { name = "langsmith", version = "0.3.45", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '4'" }, - { name = "openai", version = "2.32.0", source = { registry = "https://pypi.org/simple" } }, - { name = "tqdm" }, - { name = "uvicorn", extra = ["standard"], marker = "extra == 'group-18-temporalio-samples-langchain' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, -] langsmith-tracing = [ - { name = "langsmith", version = "0.7.32", source = { registry = "https://pypi.org/simple" } }, - { name = "openai", version = "1.108.1", source = { registry = "https://pypi.org/simple" } }, - { name = "temporalio", extra = ["langsmith", "pydantic"], marker = "extra == 'group-18-temporalio-samples-langsmith-tracing'" }, + { name = "langsmith" }, + { name = "openai" }, + { name = "temporalio", extra = ["langsmith", "pydantic"] }, ] nexus = [ { name = "nexus-rpc" }, @@ -2919,9 +2597,9 @@ open-telemetry = [ { name = "temporalio", extra = ["opentelemetry"] }, ] openai-agents = [ - { name = "openai-agents", extra = ["litellm"], marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "openai-agents", extra = ["litellm"] }, { name = "requests" }, - { name = "temporalio", extra = ["openai-agents", "opentelemetry"], marker = "extra == 'group-18-temporalio-samples-langchain' or extra != 'group-18-temporalio-samples-langsmith-tracing' or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "temporalio", extra = ["openai-agents", "opentelemetry"] }, ] pydantic-converter = [ { name = "pydantic" }, @@ -2966,18 +2644,9 @@ encryption = [ { name = "cryptography", specifier = ">=38.0.1,<39" }, ] gevent = [{ name = "gevent", marker = "python_full_version >= '3.8'", specifier = ">=25.4.2" }] -langchain = [ - { name = "fastapi", specifier = ">=0.115.12" }, - { name = "langchain", marker = "python_full_version >= '3.9' and python_full_version < '4'", specifier = ">=1.2.15,<2" }, - { name = "langchain-openai", marker = "python_full_version >= '3.9' and python_full_version < '4'", specifier = ">=1.1.13,<2" }, - { name = "langsmith", marker = "python_full_version >= '3.9' and python_full_version < '4'", specifier = ">=0.3.45,<0.4" }, - { name = "openai", specifier = ">=2.0.0,<3" }, - { name = "tqdm", specifier = ">=4.62.0,<5" }, - { name = "uvicorn", extras = ["standard"], specifier = ">=0.31.0,<0.32.0" }, -] langsmith-tracing = [ { name = "langsmith", specifier = ">=0.7.0" }, - { name = "openai", specifier = ">=1.4.0,<2" }, + { name = "openai", specifier = ">=1.4.0" }, { name = "temporalio", extras = ["pydantic", "langsmith"], specifier = ">=1.26.0" }, ] nexus = [{ name = "nexus-rpc", specifier = ">=1.1.0,<2" }] @@ -2997,15 +2666,6 @@ trio-async = [ { name = "trio-asyncio", specifier = ">=0.15.0,<0.16" }, ] -[[package]] -name = "tenacity" -version = "8.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a3/4d/6a19536c50b849338fcbe9290d562b52cbdcf30d8963d3588a68a4107df1/tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78", size = 47309, upload-time = "2024-07-05T07:25:31.836Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/3f/8ba87d9e287b9d385a02a7114ddcef61b26f86411e121c9003eb509a1773/tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687", size = 28165, upload-time = "2024-07-05T07:25:29.591Z" }, -] - [[package]] name = "tiktoken" version = "0.12.0" @@ -3149,8 +2809,8 @@ version = "0.28.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, - { name = "cffi", marker = "(implementation_name != 'pypy' and os_name == 'nt') or (implementation_name == 'pypy' and extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (implementation_name == 'pypy' and extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents') or (os_name != 'nt' and extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (os_name != 'nt' and extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "cffi", marker = "implementation_name != 'pypy' and os_name == 'nt'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, { name = "outcome" }, { name = "sniffio" }, @@ -3166,7 +2826,7 @@ name = "trio-asyncio" version = "0.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "exceptiongroup", marker = "python_full_version < '3.11' or (extra == 'group-18-temporalio-samples-langchain' and extra == 'group-18-temporalio-samples-langsmith-tracing') or (extra == 'group-18-temporalio-samples-langsmith-tracing' and extra == 'group-18-temporalio-samples-openai-agents')" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "greenlet" }, { name = "outcome" }, { name = "sniffio" }, @@ -3289,149 +2949,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3c/55/37407280931038a3f21fa0245d60edeaa76f18419581aa3f4397761c78df/uvicorn-0.31.1-py3-none-any.whl", hash = "sha256:adc42d9cac80cf3e51af97c1851648066841e7cfb6993a4ca8de29ac1548ed41", size = 63666, upload-time = "2024-10-09T19:44:18.734Z" }, ] -[package.optional-dependencies] -standard = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "httptools" }, - { name = "python-dotenv" }, - { name = "pyyaml" }, - { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, - { name = "watchfiles" }, - { name = "websockets" }, -] - -[[package]] -name = "uvloop" -version = "0.21.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741, upload-time = "2024-10-14T23:38:35.489Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/76/44a55515e8c9505aa1420aebacf4dd82552e5e15691654894e90d0bd051a/uvloop-0.21.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ec7e6b09a6fdded42403182ab6b832b71f4edaf7f37a9a0e371a01db5f0cb45f", size = 1442019, upload-time = "2024-10-14T23:37:20.068Z" }, - { url = "https://files.pythonhosted.org/packages/35/5a/62d5800358a78cc25c8a6c72ef8b10851bdb8cca22e14d9c74167b7f86da/uvloop-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:196274f2adb9689a289ad7d65700d37df0c0930fd8e4e743fa4834e850d7719d", size = 801898, upload-time = "2024-10-14T23:37:22.663Z" }, - { url = "https://files.pythonhosted.org/packages/f3/96/63695e0ebd7da6c741ccd4489b5947394435e198a1382349c17b1146bb97/uvloop-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f38b2e090258d051d68a5b14d1da7203a3c3677321cf32a95a6f4db4dd8b6f26", size = 3827735, upload-time = "2024-10-14T23:37:25.129Z" }, - { url = "https://files.pythonhosted.org/packages/61/e0/f0f8ec84979068ffae132c58c79af1de9cceeb664076beea86d941af1a30/uvloop-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c43e0f13022b998eb9b973b5e97200c8b90823454d4bc06ab33829e09fb9bb", size = 3825126, upload-time = "2024-10-14T23:37:27.59Z" }, - { url = "https://files.pythonhosted.org/packages/bf/fe/5e94a977d058a54a19df95f12f7161ab6e323ad49f4dabc28822eb2df7ea/uvloop-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:10d66943def5fcb6e7b37310eb6b5639fd2ccbc38df1177262b0640c3ca68c1f", size = 3705789, upload-time = "2024-10-14T23:37:29.385Z" }, - { url = "https://files.pythonhosted.org/packages/26/dd/c7179618e46092a77e036650c1f056041a028a35c4d76945089fcfc38af8/uvloop-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:67dd654b8ca23aed0a8e99010b4c34aca62f4b7fce88f39d452ed7622c94845c", size = 3800523, upload-time = "2024-10-14T23:37:32.048Z" }, - { url = "https://files.pythonhosted.org/packages/57/a7/4cf0334105c1160dd6819f3297f8700fda7fc30ab4f61fbf3e725acbc7cc/uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8", size = 1447410, upload-time = "2024-10-14T23:37:33.612Z" }, - { url = "https://files.pythonhosted.org/packages/8c/7c/1517b0bbc2dbe784b563d6ab54f2ef88c890fdad77232c98ed490aa07132/uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0", size = 805476, upload-time = "2024-10-14T23:37:36.11Z" }, - { url = "https://files.pythonhosted.org/packages/ee/ea/0bfae1aceb82a503f358d8d2fa126ca9dbdb2ba9c7866974faec1cb5875c/uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e", size = 3960855, upload-time = "2024-10-14T23:37:37.683Z" }, - { url = "https://files.pythonhosted.org/packages/8a/ca/0864176a649838b838f36d44bf31c451597ab363b60dc9e09c9630619d41/uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb", size = 3973185, upload-time = "2024-10-14T23:37:40.226Z" }, - { url = "https://files.pythonhosted.org/packages/30/bf/08ad29979a936d63787ba47a540de2132169f140d54aa25bc8c3df3e67f4/uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6", size = 3820256, upload-time = "2024-10-14T23:37:42.839Z" }, - { url = "https://files.pythonhosted.org/packages/da/e2/5cf6ef37e3daf2f06e651aae5ea108ad30df3cb269102678b61ebf1fdf42/uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d", size = 3937323, upload-time = "2024-10-14T23:37:45.337Z" }, - { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284, upload-time = "2024-10-14T23:37:47.833Z" }, - { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349, upload-time = "2024-10-14T23:37:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089, upload-time = "2024-10-14T23:37:51.703Z" }, - { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770, upload-time = "2024-10-14T23:37:54.122Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321, upload-time = "2024-10-14T23:37:55.766Z" }, - { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022, upload-time = "2024-10-14T23:37:58.195Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123, upload-time = "2024-10-14T23:38:00.688Z" }, - { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325, upload-time = "2024-10-14T23:38:02.309Z" }, - { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806, upload-time = "2024-10-14T23:38:04.711Z" }, - { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068, upload-time = "2024-10-14T23:38:06.385Z" }, - { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428, upload-time = "2024-10-14T23:38:08.416Z" }, - { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018, upload-time = "2024-10-14T23:38:10.888Z" }, -] - -[[package]] -name = "watchfiles" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2a/9a/d451fcc97d029f5812e898fd30a53fd8c15c7bbd058fd75cfc6beb9bd761/watchfiles-1.1.0.tar.gz", hash = "sha256:693ed7ec72cbfcee399e92c895362b6e66d63dac6b91e2c11ae03d10d503e575", size = 94406, upload-time = "2025-06-15T19:06:59.42Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/dd/579d1dc57f0f895426a1211c4ef3b0cb37eb9e642bb04bdcd962b5df206a/watchfiles-1.1.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:27f30e14aa1c1e91cb653f03a63445739919aef84c8d2517997a83155e7a2fcc", size = 405757, upload-time = "2025-06-15T19:04:51.058Z" }, - { url = "https://files.pythonhosted.org/packages/1c/a0/7a0318cd874393344d48c34d53b3dd419466adf59a29ba5b51c88dd18b86/watchfiles-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3366f56c272232860ab45c77c3ca7b74ee819c8e1f6f35a7125556b198bbc6df", size = 397511, upload-time = "2025-06-15T19:04:52.79Z" }, - { url = "https://files.pythonhosted.org/packages/06/be/503514656d0555ec2195f60d810eca29b938772e9bfb112d5cd5ad6f6a9e/watchfiles-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8412eacef34cae2836d891836a7fff7b754d6bcac61f6c12ba5ca9bc7e427b68", size = 450739, upload-time = "2025-06-15T19:04:54.203Z" }, - { url = "https://files.pythonhosted.org/packages/4e/0d/a05dd9e5f136cdc29751816d0890d084ab99f8c17b86f25697288ca09bc7/watchfiles-1.1.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df670918eb7dd719642e05979fc84704af913d563fd17ed636f7c4783003fdcc", size = 458106, upload-time = "2025-06-15T19:04:55.607Z" }, - { url = "https://files.pythonhosted.org/packages/f1/fa/9cd16e4dfdb831072b7ac39e7bea986e52128526251038eb481effe9f48e/watchfiles-1.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7642b9bc4827b5518ebdb3b82698ada8c14c7661ddec5fe719f3e56ccd13c97", size = 484264, upload-time = "2025-06-15T19:04:57.009Z" }, - { url = "https://files.pythonhosted.org/packages/32/04/1da8a637c7e2b70e750a0308e9c8e662ada0cca46211fa9ef24a23937e0b/watchfiles-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:199207b2d3eeaeb80ef4411875a6243d9ad8bc35b07fc42daa6b801cc39cc41c", size = 597612, upload-time = "2025-06-15T19:04:58.409Z" }, - { url = "https://files.pythonhosted.org/packages/30/01/109f2762e968d3e58c95731a206e5d7d2a7abaed4299dd8a94597250153c/watchfiles-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a479466da6db5c1e8754caee6c262cd373e6e6c363172d74394f4bff3d84d7b5", size = 477242, upload-time = "2025-06-15T19:04:59.786Z" }, - { url = "https://files.pythonhosted.org/packages/b5/b8/46f58cf4969d3b7bc3ca35a98e739fa4085b0657a1540ccc29a1a0bc016f/watchfiles-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:935f9edd022ec13e447e5723a7d14456c8af254544cefbc533f6dd276c9aa0d9", size = 453148, upload-time = "2025-06-15T19:05:01.103Z" }, - { url = "https://files.pythonhosted.org/packages/a5/cd/8267594263b1770f1eb76914940d7b2d03ee55eca212302329608208e061/watchfiles-1.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8076a5769d6bdf5f673a19d51da05fc79e2bbf25e9fe755c47595785c06a8c72", size = 626574, upload-time = "2025-06-15T19:05:02.582Z" }, - { url = "https://files.pythonhosted.org/packages/a1/2f/7f2722e85899bed337cba715723e19185e288ef361360718973f891805be/watchfiles-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86b1e28d4c37e89220e924305cd9f82866bb0ace666943a6e4196c5df4d58dcc", size = 624378, upload-time = "2025-06-15T19:05:03.719Z" }, - { url = "https://files.pythonhosted.org/packages/bf/20/64c88ec43d90a568234d021ab4b2a6f42a5230d772b987c3f9c00cc27b8b/watchfiles-1.1.0-cp310-cp310-win32.whl", hash = "sha256:d1caf40c1c657b27858f9774d5c0e232089bca9cb8ee17ce7478c6e9264d2587", size = 279829, upload-time = "2025-06-15T19:05:04.822Z" }, - { url = "https://files.pythonhosted.org/packages/39/5c/a9c1ed33de7af80935e4eac09570de679c6e21c07070aa99f74b4431f4d6/watchfiles-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:a89c75a5b9bc329131115a409d0acc16e8da8dfd5867ba59f1dd66ae7ea8fa82", size = 292192, upload-time = "2025-06-15T19:05:06.348Z" }, - { url = "https://files.pythonhosted.org/packages/8b/78/7401154b78ab484ccaaeef970dc2af0cb88b5ba8a1b415383da444cdd8d3/watchfiles-1.1.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c9649dfc57cc1f9835551deb17689e8d44666315f2e82d337b9f07bd76ae3aa2", size = 405751, upload-time = "2025-06-15T19:05:07.679Z" }, - { url = "https://files.pythonhosted.org/packages/76/63/e6c3dbc1f78d001589b75e56a288c47723de28c580ad715eb116639152b5/watchfiles-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:406520216186b99374cdb58bc48e34bb74535adec160c8459894884c983a149c", size = 397313, upload-time = "2025-06-15T19:05:08.764Z" }, - { url = "https://files.pythonhosted.org/packages/6c/a2/8afa359ff52e99af1632f90cbf359da46184207e893a5f179301b0c8d6df/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb45350fd1dc75cd68d3d72c47f5b513cb0578da716df5fba02fff31c69d5f2d", size = 450792, upload-time = "2025-06-15T19:05:09.869Z" }, - { url = "https://files.pythonhosted.org/packages/1d/bf/7446b401667f5c64972a57a0233be1104157fc3abf72c4ef2666c1bd09b2/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:11ee4444250fcbeb47459a877e5e80ed994ce8e8d20283857fc128be1715dac7", size = 458196, upload-time = "2025-06-15T19:05:11.91Z" }, - { url = "https://files.pythonhosted.org/packages/58/2f/501ddbdfa3fa874ea5597c77eeea3d413579c29af26c1091b08d0c792280/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bda8136e6a80bdea23e5e74e09df0362744d24ffb8cd59c4a95a6ce3d142f79c", size = 484788, upload-time = "2025-06-15T19:05:13.373Z" }, - { url = "https://files.pythonhosted.org/packages/61/1e/9c18eb2eb5c953c96bc0e5f626f0e53cfef4bd19bd50d71d1a049c63a575/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b915daeb2d8c1f5cee4b970f2e2c988ce6514aace3c9296e58dd64dc9aa5d575", size = 597879, upload-time = "2025-06-15T19:05:14.725Z" }, - { url = "https://files.pythonhosted.org/packages/8b/6c/1467402e5185d89388b4486745af1e0325007af0017c3384cc786fff0542/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed8fc66786de8d0376f9f913c09e963c66e90ced9aa11997f93bdb30f7c872a8", size = 477447, upload-time = "2025-06-15T19:05:15.775Z" }, - { url = "https://files.pythonhosted.org/packages/2b/a1/ec0a606bde4853d6c4a578f9391eeb3684a9aea736a8eb217e3e00aa89a1/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe4371595edf78c41ef8ac8df20df3943e13defd0efcb732b2e393b5a8a7a71f", size = 453145, upload-time = "2025-06-15T19:05:17.17Z" }, - { url = "https://files.pythonhosted.org/packages/90/b9/ef6f0c247a6a35d689fc970dc7f6734f9257451aefb30def5d100d6246a5/watchfiles-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b7c5f6fe273291f4d414d55b2c80d33c457b8a42677ad14b4b47ff025d0893e4", size = 626539, upload-time = "2025-06-15T19:05:18.557Z" }, - { url = "https://files.pythonhosted.org/packages/34/44/6ffda5537085106ff5aaa762b0d130ac6c75a08015dd1621376f708c94de/watchfiles-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7738027989881e70e3723c75921f1efa45225084228788fc59ea8c6d732eb30d", size = 624472, upload-time = "2025-06-15T19:05:19.588Z" }, - { url = "https://files.pythonhosted.org/packages/c3/e3/71170985c48028fa3f0a50946916a14055e741db11c2e7bc2f3b61f4d0e3/watchfiles-1.1.0-cp311-cp311-win32.whl", hash = "sha256:622d6b2c06be19f6e89b1d951485a232e3b59618def88dbeda575ed8f0d8dbf2", size = 279348, upload-time = "2025-06-15T19:05:20.856Z" }, - { url = "https://files.pythonhosted.org/packages/89/1b/3e39c68b68a7a171070f81fc2561d23ce8d6859659406842a0e4bebf3bba/watchfiles-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:48aa25e5992b61debc908a61ab4d3f216b64f44fdaa71eb082d8b2de846b7d12", size = 292607, upload-time = "2025-06-15T19:05:21.937Z" }, - { url = "https://files.pythonhosted.org/packages/61/9f/2973b7539f2bdb6ea86d2c87f70f615a71a1fc2dba2911795cea25968aea/watchfiles-1.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:00645eb79a3faa70d9cb15c8d4187bb72970b2470e938670240c7998dad9f13a", size = 285056, upload-time = "2025-06-15T19:05:23.12Z" }, - { url = "https://files.pythonhosted.org/packages/f6/b8/858957045a38a4079203a33aaa7d23ea9269ca7761c8a074af3524fbb240/watchfiles-1.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9dc001c3e10de4725c749d4c2f2bdc6ae24de5a88a339c4bce32300a31ede179", size = 402339, upload-time = "2025-06-15T19:05:24.516Z" }, - { url = "https://files.pythonhosted.org/packages/80/28/98b222cca751ba68e88521fabd79a4fab64005fc5976ea49b53fa205d1fa/watchfiles-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d9ba68ec283153dead62cbe81872d28e053745f12335d037de9cbd14bd1877f5", size = 394409, upload-time = "2025-06-15T19:05:25.469Z" }, - { url = "https://files.pythonhosted.org/packages/86/50/dee79968566c03190677c26f7f47960aff738d32087087bdf63a5473e7df/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130fc497b8ee68dce163e4254d9b0356411d1490e868bd8790028bc46c5cc297", size = 450939, upload-time = "2025-06-15T19:05:26.494Z" }, - { url = "https://files.pythonhosted.org/packages/40/45/a7b56fb129700f3cfe2594a01aa38d033b92a33dddce86c8dfdfc1247b72/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:50a51a90610d0845a5931a780d8e51d7bd7f309ebc25132ba975aca016b576a0", size = 457270, upload-time = "2025-06-15T19:05:27.466Z" }, - { url = "https://files.pythonhosted.org/packages/b5/c8/fa5ef9476b1d02dc6b5e258f515fcaaecf559037edf8b6feffcbc097c4b8/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc44678a72ac0910bac46fa6a0de6af9ba1355669b3dfaf1ce5f05ca7a74364e", size = 483370, upload-time = "2025-06-15T19:05:28.548Z" }, - { url = "https://files.pythonhosted.org/packages/98/68/42cfcdd6533ec94f0a7aab83f759ec11280f70b11bfba0b0f885e298f9bd/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a543492513a93b001975ae283a51f4b67973662a375a403ae82f420d2c7205ee", size = 598654, upload-time = "2025-06-15T19:05:29.997Z" }, - { url = "https://files.pythonhosted.org/packages/d3/74/b2a1544224118cc28df7e59008a929e711f9c68ce7d554e171b2dc531352/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ac164e20d17cc285f2b94dc31c384bc3aa3dd5e7490473b3db043dd70fbccfd", size = 478667, upload-time = "2025-06-15T19:05:31.172Z" }, - { url = "https://files.pythonhosted.org/packages/8c/77/e3362fe308358dc9f8588102481e599c83e1b91c2ae843780a7ded939a35/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7590d5a455321e53857892ab8879dce62d1f4b04748769f5adf2e707afb9d4f", size = 452213, upload-time = "2025-06-15T19:05:32.299Z" }, - { url = "https://files.pythonhosted.org/packages/6e/17/c8f1a36540c9a1558d4faf08e909399e8133599fa359bf52ec8fcee5be6f/watchfiles-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:37d3d3f7defb13f62ece99e9be912afe9dd8a0077b7c45ee5a57c74811d581a4", size = 626718, upload-time = "2025-06-15T19:05:33.415Z" }, - { url = "https://files.pythonhosted.org/packages/26/45/fb599be38b4bd38032643783d7496a26a6f9ae05dea1a42e58229a20ac13/watchfiles-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7080c4bb3efd70a07b1cc2df99a7aa51d98685be56be6038c3169199d0a1c69f", size = 623098, upload-time = "2025-06-15T19:05:34.534Z" }, - { url = "https://files.pythonhosted.org/packages/a1/e7/fdf40e038475498e160cd167333c946e45d8563ae4dd65caf757e9ffe6b4/watchfiles-1.1.0-cp312-cp312-win32.whl", hash = "sha256:cbcf8630ef4afb05dc30107bfa17f16c0896bb30ee48fc24bf64c1f970f3b1fd", size = 279209, upload-time = "2025-06-15T19:05:35.577Z" }, - { url = "https://files.pythonhosted.org/packages/3f/d3/3ae9d5124ec75143bdf088d436cba39812122edc47709cd2caafeac3266f/watchfiles-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:cbd949bdd87567b0ad183d7676feb98136cde5bb9025403794a4c0db28ed3a47", size = 292786, upload-time = "2025-06-15T19:05:36.559Z" }, - { url = "https://files.pythonhosted.org/packages/26/2f/7dd4fc8b5f2b34b545e19629b4a018bfb1de23b3a496766a2c1165ca890d/watchfiles-1.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:0a7d40b77f07be87c6faa93d0951a0fcd8cbca1ddff60a1b65d741bac6f3a9f6", size = 284343, upload-time = "2025-06-15T19:05:37.5Z" }, - { url = "https://files.pythonhosted.org/packages/d3/42/fae874df96595556a9089ade83be34a2e04f0f11eb53a8dbf8a8a5e562b4/watchfiles-1.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5007f860c7f1f8df471e4e04aaa8c43673429047d63205d1630880f7637bca30", size = 402004, upload-time = "2025-06-15T19:05:38.499Z" }, - { url = "https://files.pythonhosted.org/packages/fa/55/a77e533e59c3003d9803c09c44c3651224067cbe7fb5d574ddbaa31e11ca/watchfiles-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:20ecc8abbd957046f1fe9562757903f5eaf57c3bce70929fda6c7711bb58074a", size = 393671, upload-time = "2025-06-15T19:05:39.52Z" }, - { url = "https://files.pythonhosted.org/packages/05/68/b0afb3f79c8e832e6571022611adbdc36e35a44e14f129ba09709aa4bb7a/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2f0498b7d2a3c072766dba3274fe22a183dbea1f99d188f1c6c72209a1063dc", size = 449772, upload-time = "2025-06-15T19:05:40.897Z" }, - { url = "https://files.pythonhosted.org/packages/ff/05/46dd1f6879bc40e1e74c6c39a1b9ab9e790bf1f5a2fe6c08b463d9a807f4/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:239736577e848678e13b201bba14e89718f5c2133dfd6b1f7846fa1b58a8532b", size = 456789, upload-time = "2025-06-15T19:05:42.045Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ca/0eeb2c06227ca7f12e50a47a3679df0cd1ba487ea19cf844a905920f8e95/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eff4b8d89f444f7e49136dc695599a591ff769300734446c0a86cba2eb2f9895", size = 482551, upload-time = "2025-06-15T19:05:43.781Z" }, - { url = "https://files.pythonhosted.org/packages/31/47/2cecbd8694095647406645f822781008cc524320466ea393f55fe70eed3b/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12b0a02a91762c08f7264e2e79542f76870c3040bbc847fb67410ab81474932a", size = 597420, upload-time = "2025-06-15T19:05:45.244Z" }, - { url = "https://files.pythonhosted.org/packages/d9/7e/82abc4240e0806846548559d70f0b1a6dfdca75c1b4f9fa62b504ae9b083/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29e7bc2eee15cbb339c68445959108803dc14ee0c7b4eea556400131a8de462b", size = 477950, upload-time = "2025-06-15T19:05:46.332Z" }, - { url = "https://files.pythonhosted.org/packages/25/0d/4d564798a49bf5482a4fa9416dea6b6c0733a3b5700cb8a5a503c4b15853/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9481174d3ed982e269c090f780122fb59cee6c3796f74efe74e70f7780ed94c", size = 451706, upload-time = "2025-06-15T19:05:47.459Z" }, - { url = "https://files.pythonhosted.org/packages/81/b5/5516cf46b033192d544102ea07c65b6f770f10ed1d0a6d388f5d3874f6e4/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:80f811146831c8c86ab17b640801c25dc0a88c630e855e2bef3568f30434d52b", size = 625814, upload-time = "2025-06-15T19:05:48.654Z" }, - { url = "https://files.pythonhosted.org/packages/0c/dd/7c1331f902f30669ac3e754680b6edb9a0dd06dea5438e61128111fadd2c/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:60022527e71d1d1fda67a33150ee42869042bce3d0fcc9cc49be009a9cded3fb", size = 622820, upload-time = "2025-06-15T19:05:50.088Z" }, - { url = "https://files.pythonhosted.org/packages/1b/14/36d7a8e27cd128d7b1009e7715a7c02f6c131be9d4ce1e5c3b73d0e342d8/watchfiles-1.1.0-cp313-cp313-win32.whl", hash = "sha256:32d6d4e583593cb8576e129879ea0991660b935177c0f93c6681359b3654bfa9", size = 279194, upload-time = "2025-06-15T19:05:51.186Z" }, - { url = "https://files.pythonhosted.org/packages/25/41/2dd88054b849aa546dbeef5696019c58f8e0774f4d1c42123273304cdb2e/watchfiles-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:f21af781a4a6fbad54f03c598ab620e3a77032c5878f3d780448421a6e1818c7", size = 292349, upload-time = "2025-06-15T19:05:52.201Z" }, - { url = "https://files.pythonhosted.org/packages/c8/cf/421d659de88285eb13941cf11a81f875c176f76a6d99342599be88e08d03/watchfiles-1.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:5366164391873ed76bfdf618818c82084c9db7fac82b64a20c44d335eec9ced5", size = 283836, upload-time = "2025-06-15T19:05:53.265Z" }, - { url = "https://files.pythonhosted.org/packages/45/10/6faf6858d527e3599cc50ec9fcae73590fbddc1420bd4fdccfebffeedbc6/watchfiles-1.1.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:17ab167cca6339c2b830b744eaf10803d2a5b6683be4d79d8475d88b4a8a4be1", size = 400343, upload-time = "2025-06-15T19:05:54.252Z" }, - { url = "https://files.pythonhosted.org/packages/03/20/5cb7d3966f5e8c718006d0e97dfe379a82f16fecd3caa7810f634412047a/watchfiles-1.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:328dbc9bff7205c215a7807da7c18dce37da7da718e798356212d22696404339", size = 392916, upload-time = "2025-06-15T19:05:55.264Z" }, - { url = "https://files.pythonhosted.org/packages/8c/07/d8f1176328fa9e9581b6f120b017e286d2a2d22ae3f554efd9515c8e1b49/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7208ab6e009c627b7557ce55c465c98967e8caa8b11833531fdf95799372633", size = 449582, upload-time = "2025-06-15T19:05:56.317Z" }, - { url = "https://files.pythonhosted.org/packages/66/e8/80a14a453cf6038e81d072a86c05276692a1826471fef91df7537dba8b46/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a8f6f72974a19efead54195bc9bed4d850fc047bb7aa971268fd9a8387c89011", size = 456752, upload-time = "2025-06-15T19:05:57.359Z" }, - { url = "https://files.pythonhosted.org/packages/5a/25/0853b3fe0e3c2f5af9ea60eb2e781eade939760239a72c2d38fc4cc335f6/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d181ef50923c29cf0450c3cd47e2f0557b62218c50b2ab8ce2ecaa02bd97e670", size = 481436, upload-time = "2025-06-15T19:05:58.447Z" }, - { url = "https://files.pythonhosted.org/packages/fe/9e/4af0056c258b861fbb29dcb36258de1e2b857be4a9509e6298abcf31e5c9/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adb4167043d3a78280d5d05ce0ba22055c266cf8655ce942f2fb881262ff3cdf", size = 596016, upload-time = "2025-06-15T19:05:59.59Z" }, - { url = "https://files.pythonhosted.org/packages/c5/fa/95d604b58aa375e781daf350897aaaa089cff59d84147e9ccff2447c8294/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5701dc474b041e2934a26d31d39f90fac8a3dee2322b39f7729867f932b1d4", size = 476727, upload-time = "2025-06-15T19:06:01.086Z" }, - { url = "https://files.pythonhosted.org/packages/65/95/fe479b2664f19be4cf5ceeb21be05afd491d95f142e72d26a42f41b7c4f8/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b067915e3c3936966a8607f6fe5487df0c9c4afb85226613b520890049deea20", size = 451864, upload-time = "2025-06-15T19:06:02.144Z" }, - { url = "https://files.pythonhosted.org/packages/d3/8a/3c4af14b93a15ce55901cd7a92e1a4701910f1768c78fb30f61d2b79785b/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:9c733cda03b6d636b4219625a4acb5c6ffb10803338e437fb614fef9516825ef", size = 625626, upload-time = "2025-06-15T19:06:03.578Z" }, - { url = "https://files.pythonhosted.org/packages/da/f5/cf6aa047d4d9e128f4b7cde615236a915673775ef171ff85971d698f3c2c/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:cc08ef8b90d78bfac66f0def80240b0197008e4852c9f285907377b2947ffdcb", size = 622744, upload-time = "2025-06-15T19:06:05.066Z" }, - { url = "https://files.pythonhosted.org/packages/2c/00/70f75c47f05dea6fd30df90f047765f6fc2d6eb8b5a3921379b0b04defa2/watchfiles-1.1.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:9974d2f7dc561cce3bb88dfa8eb309dab64c729de85fba32e98d75cf24b66297", size = 402114, upload-time = "2025-06-15T19:06:06.186Z" }, - { url = "https://files.pythonhosted.org/packages/53/03/acd69c48db4a1ed1de26b349d94077cca2238ff98fd64393f3e97484cae6/watchfiles-1.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c68e9f1fcb4d43798ad8814c4c1b61547b014b667216cb754e606bfade587018", size = 393879, upload-time = "2025-06-15T19:06:07.369Z" }, - { url = "https://files.pythonhosted.org/packages/2f/c8/a9a2a6f9c8baa4eceae5887fecd421e1b7ce86802bcfc8b6a942e2add834/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95ab1594377effac17110e1352989bdd7bdfca9ff0e5eeccd8c69c5389b826d0", size = 450026, upload-time = "2025-06-15T19:06:08.476Z" }, - { url = "https://files.pythonhosted.org/packages/fe/51/d572260d98388e6e2b967425c985e07d47ee6f62e6455cefb46a6e06eda5/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fba9b62da882c1be1280a7584ec4515d0a6006a94d6e5819730ec2eab60ffe12", size = 457917, upload-time = "2025-06-15T19:06:09.988Z" }, - { url = "https://files.pythonhosted.org/packages/c6/2d/4258e52917bf9f12909b6ec314ff9636276f3542f9d3807d143f27309104/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3434e401f3ce0ed6b42569128b3d1e3af773d7ec18751b918b89cd49c14eaafb", size = 483602, upload-time = "2025-06-15T19:06:11.088Z" }, - { url = "https://files.pythonhosted.org/packages/84/99/bee17a5f341a4345fe7b7972a475809af9e528deba056f8963d61ea49f75/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa257a4d0d21fcbca5b5fcba9dca5a78011cb93c0323fb8855c6d2dfbc76eb77", size = 596758, upload-time = "2025-06-15T19:06:12.197Z" }, - { url = "https://files.pythonhosted.org/packages/40/76/e4bec1d59b25b89d2b0716b41b461ed655a9a53c60dc78ad5771fda5b3e6/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fd1b3879a578a8ec2076c7961076df540b9af317123f84569f5a9ddee64ce92", size = 477601, upload-time = "2025-06-15T19:06:13.391Z" }, - { url = "https://files.pythonhosted.org/packages/1f/fa/a514292956f4a9ce3c567ec0c13cce427c158e9f272062685a8a727d08fc/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62cc7a30eeb0e20ecc5f4bd113cd69dcdb745a07c68c0370cea919f373f65d9e", size = 451936, upload-time = "2025-06-15T19:06:14.656Z" }, - { url = "https://files.pythonhosted.org/packages/32/5d/c3bf927ec3bbeb4566984eba8dd7a8eb69569400f5509904545576741f88/watchfiles-1.1.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:891c69e027748b4a73847335d208e374ce54ca3c335907d381fde4e41661b13b", size = 626243, upload-time = "2025-06-15T19:06:16.232Z" }, - { url = "https://files.pythonhosted.org/packages/e6/65/6e12c042f1a68c556802a84d54bb06d35577c81e29fba14019562479159c/watchfiles-1.1.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:12fe8eaffaf0faa7906895b4f8bb88264035b3f0243275e0bf24af0436b27259", size = 623073, upload-time = "2025-06-15T19:06:17.457Z" }, - { url = "https://files.pythonhosted.org/packages/89/ab/7f79d9bf57329e7cbb0a6fd4c7bd7d0cee1e4a8ef0041459f5409da3506c/watchfiles-1.1.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:bfe3c517c283e484843cb2e357dd57ba009cff351edf45fb455b5fbd1f45b15f", size = 400872, upload-time = "2025-06-15T19:06:18.57Z" }, - { url = "https://files.pythonhosted.org/packages/df/d5/3f7bf9912798e9e6c516094db6b8932df53b223660c781ee37607030b6d3/watchfiles-1.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a9ccbf1f129480ed3044f540c0fdbc4ee556f7175e5ab40fe077ff6baf286d4e", size = 392877, upload-time = "2025-06-15T19:06:19.55Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c5/54ec7601a2798604e01c75294770dbee8150e81c6e471445d7601610b495/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba0e3255b0396cac3cc7bbace76404dd72b5438bf0d8e7cefa2f79a7f3649caa", size = 449645, upload-time = "2025-06-15T19:06:20.66Z" }, - { url = "https://files.pythonhosted.org/packages/0a/04/c2f44afc3b2fce21ca0b7802cbd37ed90a29874f96069ed30a36dfe57c2b/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4281cd9fce9fc0a9dbf0fc1217f39bf9cf2b4d315d9626ef1d4e87b84699e7e8", size = 457424, upload-time = "2025-06-15T19:06:21.712Z" }, - { url = "https://files.pythonhosted.org/packages/9f/b0/eec32cb6c14d248095261a04f290636da3df3119d4040ef91a4a50b29fa5/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d2404af8db1329f9a3c9b79ff63e0ae7131986446901582067d9304ae8aaf7f", size = 481584, upload-time = "2025-06-15T19:06:22.777Z" }, - { url = "https://files.pythonhosted.org/packages/d1/e2/ca4bb71c68a937d7145aa25709e4f5d68eb7698a25ce266e84b55d591bbd/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e78b6ed8165996013165eeabd875c5dfc19d41b54f94b40e9fff0eb3193e5e8e", size = 596675, upload-time = "2025-06-15T19:06:24.226Z" }, - { url = "https://files.pythonhosted.org/packages/a1/dd/b0e4b7fb5acf783816bc950180a6cd7c6c1d2cf7e9372c0ea634e722712b/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:249590eb75ccc117f488e2fabd1bfa33c580e24b96f00658ad88e38844a040bb", size = 477363, upload-time = "2025-06-15T19:06:25.42Z" }, - { url = "https://files.pythonhosted.org/packages/69/c4/088825b75489cb5b6a761a4542645718893d395d8c530b38734f19da44d2/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d05686b5487cfa2e2c28ff1aa370ea3e6c5accfe6435944ddea1e10d93872147", size = 452240, upload-time = "2025-06-15T19:06:26.552Z" }, - { url = "https://files.pythonhosted.org/packages/10/8c/22b074814970eeef43b7c44df98c3e9667c1f7bf5b83e0ff0201b0bd43f9/watchfiles-1.1.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d0e10e6f8f6dc5762adee7dece33b722282e1f59aa6a55da5d493a97282fedd8", size = 625607, upload-time = "2025-06-15T19:06:27.606Z" }, - { url = "https://files.pythonhosted.org/packages/32/fa/a4f5c2046385492b2273213ef815bf71a0d4c1943b784fb904e184e30201/watchfiles-1.1.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:af06c863f152005c7592df1d6a7009c836a247c9d8adb78fef8575a5a98699db", size = 623315, upload-time = "2025-06-15T19:06:29.076Z" }, - { url = "https://files.pythonhosted.org/packages/be/7c/a3d7c55cfa377c2f62c4ae3c6502b997186bc5e38156bafcb9b653de9a6d/watchfiles-1.1.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a6fd40bbb50d24976eb275ccb55cd1951dfb63dbc27cae3066a6ca5f4beabd5", size = 406748, upload-time = "2025-06-15T19:06:44.2Z" }, - { url = "https://files.pythonhosted.org/packages/38/d0/c46f1b2c0ca47f3667b144de6f0515f6d1c670d72f2ca29861cac78abaa1/watchfiles-1.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9f811079d2f9795b5d48b55a37aa7773680a5659afe34b54cc1d86590a51507d", size = 398801, upload-time = "2025-06-15T19:06:45.774Z" }, - { url = "https://files.pythonhosted.org/packages/70/9c/9a6a42e97f92eeed77c3485a43ea96723900aefa3ac739a8c73f4bff2cd7/watchfiles-1.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2726d7bfd9f76158c84c10a409b77a320426540df8c35be172444394b17f7ea", size = 451528, upload-time = "2025-06-15T19:06:46.791Z" }, - { url = "https://files.pythonhosted.org/packages/51/7b/98c7f4f7ce7ff03023cf971cd84a3ee3b790021ae7584ffffa0eb2554b96/watchfiles-1.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df32d59cb9780f66d165a9a7a26f19df2c7d24e3bd58713108b41d0ff4f929c6", size = 454095, upload-time = "2025-06-15T19:06:48.211Z" }, - { url = "https://files.pythonhosted.org/packages/8c/6b/686dcf5d3525ad17b384fd94708e95193529b460a1b7bf40851f1328ec6e/watchfiles-1.1.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0ece16b563b17ab26eaa2d52230c9a7ae46cf01759621f4fbbca280e438267b3", size = 406910, upload-time = "2025-06-15T19:06:49.335Z" }, - { url = "https://files.pythonhosted.org/packages/f3/d3/71c2dcf81dc1edcf8af9f4d8d63b1316fb0a2dd90cbfd427e8d9dd584a90/watchfiles-1.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:51b81e55d40c4b4aa8658427a3ee7ea847c591ae9e8b81ef94a90b668999353c", size = 398816, upload-time = "2025-06-15T19:06:50.433Z" }, - { url = "https://files.pythonhosted.org/packages/b8/fa/12269467b2fc006f8fce4cd6c3acfa77491dd0777d2a747415f28ccc8c60/watchfiles-1.1.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2bcdc54ea267fe72bfc7d83c041e4eb58d7d8dc6f578dfddb52f037ce62f432", size = 451584, upload-time = "2025-06-15T19:06:51.834Z" }, - { url = "https://files.pythonhosted.org/packages/bd/d3/254cea30f918f489db09d6a8435a7de7047f8cb68584477a515f160541d6/watchfiles-1.1.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:923fec6e5461c42bd7e3fd5ec37492c6f3468be0499bc0707b4bbbc16ac21792", size = 454009, upload-time = "2025-06-15T19:06:52.896Z" }, -] - [[package]] name = "websockets" version = "15.0.1" @@ -3764,98 +3281,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0a/2f/1bccc6f4cc882662162a1158cda1a7f616add2ffe322b28c99cb031b4ffc/zope.interface-7.2-cp313-cp313-win_amd64.whl", hash = "sha256:4893395d5dd2ba655c38ceb13014fd65667740f09fa5bb01caa1e6284e48c0cd", size = 212472, upload-time = "2024-11-28T08:49:56.587Z" }, ] -[[package]] -name = "zstandard" -version = "0.23.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.13'", - "python_full_version >= '3.12.4' and python_full_version < '3.13'", - "python_full_version >= '3.12' and python_full_version < '3.12.4'", - "python_full_version == '3.11.*'", - "python_full_version < '3.11'", -] -dependencies = [ - { name = "cffi", marker = "platform_python_implementation == 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/2ac0287b442160a89d726b17a9184a4c615bb5237db763791a7fd16d9df1/zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", size = 681701, upload-time = "2024-07-15T00:18:06.141Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/55/bd0487e86679db1823fc9ee0d8c9c78ae2413d34c0b461193b5f4c31d22f/zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9", size = 788701, upload-time = "2024-07-15T00:13:27.351Z" }, - { url = "https://files.pythonhosted.org/packages/e1/8a/ccb516b684f3ad987dfee27570d635822e3038645b1a950c5e8022df1145/zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880", size = 633678, upload-time = "2024-07-15T00:13:30.24Z" }, - { url = "https://files.pythonhosted.org/packages/12/89/75e633d0611c028e0d9af6df199423bf43f54bea5007e6718ab7132e234c/zstandard-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc", size = 4941098, upload-time = "2024-07-15T00:13:32.526Z" }, - { url = "https://files.pythonhosted.org/packages/4a/7a/bd7f6a21802de358b63f1ee636ab823711c25ce043a3e9f043b4fcb5ba32/zstandard-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573", size = 5308798, upload-time = "2024-07-15T00:13:34.925Z" }, - { url = "https://files.pythonhosted.org/packages/79/3b/775f851a4a65013e88ca559c8ae42ac1352db6fcd96b028d0df4d7d1d7b4/zstandard-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391", size = 5341840, upload-time = "2024-07-15T00:13:37.376Z" }, - { url = "https://files.pythonhosted.org/packages/09/4f/0cc49570141dd72d4d95dd6fcf09328d1b702c47a6ec12fbed3b8aed18a5/zstandard-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e", size = 5440337, upload-time = "2024-07-15T00:13:39.772Z" }, - { url = "https://files.pythonhosted.org/packages/e7/7c/aaa7cd27148bae2dc095191529c0570d16058c54c4597a7d118de4b21676/zstandard-0.23.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd", size = 4861182, upload-time = "2024-07-15T00:13:42.495Z" }, - { url = "https://files.pythonhosted.org/packages/ac/eb/4b58b5c071d177f7dc027129d20bd2a44161faca6592a67f8fcb0b88b3ae/zstandard-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4", size = 4932936, upload-time = "2024-07-15T00:13:44.234Z" }, - { url = "https://files.pythonhosted.org/packages/44/f9/21a5fb9bb7c9a274b05ad700a82ad22ce82f7ef0f485980a1e98ed6e8c5f/zstandard-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea", size = 5464705, upload-time = "2024-07-15T00:13:46.822Z" }, - { url = "https://files.pythonhosted.org/packages/49/74/b7b3e61db3f88632776b78b1db597af3f44c91ce17d533e14a25ce6a2816/zstandard-0.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2", size = 4857882, upload-time = "2024-07-15T00:13:49.297Z" }, - { url = "https://files.pythonhosted.org/packages/4a/7f/d8eb1cb123d8e4c541d4465167080bec88481ab54cd0b31eb4013ba04b95/zstandard-0.23.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9", size = 4697672, upload-time = "2024-07-15T00:13:51.447Z" }, - { url = "https://files.pythonhosted.org/packages/5e/05/f7dccdf3d121309b60342da454d3e706453a31073e2c4dac8e1581861e44/zstandard-0.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a", size = 5206043, upload-time = "2024-07-15T00:13:53.587Z" }, - { url = "https://files.pythonhosted.org/packages/86/9d/3677a02e172dccd8dd3a941307621c0cbd7691d77cb435ac3c75ab6a3105/zstandard-0.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0", size = 5667390, upload-time = "2024-07-15T00:13:56.137Z" }, - { url = "https://files.pythonhosted.org/packages/41/7e/0012a02458e74a7ba122cd9cafe491facc602c9a17f590367da369929498/zstandard-0.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c", size = 5198901, upload-time = "2024-07-15T00:13:58.584Z" }, - { url = "https://files.pythonhosted.org/packages/65/3a/8f715b97bd7bcfc7342d8adcd99a026cb2fb550e44866a3b6c348e1b0f02/zstandard-0.23.0-cp310-cp310-win32.whl", hash = "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813", size = 430596, upload-time = "2024-07-15T00:14:00.693Z" }, - { url = "https://files.pythonhosted.org/packages/19/b7/b2b9eca5e5a01111e4fe8a8ffb56bdcdf56b12448a24effe6cfe4a252034/zstandard-0.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4", size = 495498, upload-time = "2024-07-15T00:14:02.741Z" }, - { url = "https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e", size = 788699, upload-time = "2024-07-15T00:14:04.909Z" }, - { url = "https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23", size = 633681, upload-time = "2024-07-15T00:14:13.99Z" }, - { url = "https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a", size = 4944328, upload-time = "2024-07-15T00:14:16.588Z" }, - { url = "https://files.pythonhosted.org/packages/59/cc/e76acb4c42afa05a9d20827116d1f9287e9c32b7ad58cc3af0721ce2b481/zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db", size = 5311955, upload-time = "2024-07-15T00:14:19.389Z" }, - { url = "https://files.pythonhosted.org/packages/78/e4/644b8075f18fc7f632130c32e8f36f6dc1b93065bf2dd87f03223b187f26/zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2", size = 5344944, upload-time = "2024-07-15T00:14:22.173Z" }, - { url = "https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca", size = 5442927, upload-time = "2024-07-15T00:14:24.825Z" }, - { url = "https://files.pythonhosted.org/packages/0c/c3/d24a01a19b6733b9f218e94d1a87c477d523237e07f94899e1c10f6fd06c/zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c", size = 4864910, upload-time = "2024-07-15T00:14:26.982Z" }, - { url = "https://files.pythonhosted.org/packages/1c/a9/cf8f78ead4597264f7618d0875be01f9bc23c9d1d11afb6d225b867cb423/zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e", size = 4935544, upload-time = "2024-07-15T00:14:29.582Z" }, - { url = "https://files.pythonhosted.org/packages/2c/96/8af1e3731b67965fb995a940c04a2c20997a7b3b14826b9d1301cf160879/zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5", size = 5467094, upload-time = "2024-07-15T00:14:40.126Z" }, - { url = "https://files.pythonhosted.org/packages/ff/57/43ea9df642c636cb79f88a13ab07d92d88d3bfe3e550b55a25a07a26d878/zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48", size = 4860440, upload-time = "2024-07-15T00:14:42.786Z" }, - { url = "https://files.pythonhosted.org/packages/46/37/edb78f33c7f44f806525f27baa300341918fd4c4af9472fbc2c3094be2e8/zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c", size = 4700091, upload-time = "2024-07-15T00:14:45.184Z" }, - { url = "https://files.pythonhosted.org/packages/c1/f1/454ac3962671a754f3cb49242472df5c2cced4eb959ae203a377b45b1a3c/zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003", size = 5208682, upload-time = "2024-07-15T00:14:47.407Z" }, - { url = "https://files.pythonhosted.org/packages/85/b2/1734b0fff1634390b1b887202d557d2dd542de84a4c155c258cf75da4773/zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78", size = 5669707, upload-time = "2024-07-15T00:15:03.529Z" }, - { url = "https://files.pythonhosted.org/packages/52/5a/87d6971f0997c4b9b09c495bf92189fb63de86a83cadc4977dc19735f652/zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473", size = 5201792, upload-time = "2024-07-15T00:15:28.372Z" }, - { url = "https://files.pythonhosted.org/packages/79/02/6f6a42cc84459d399bd1a4e1adfc78d4dfe45e56d05b072008d10040e13b/zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160", size = 430586, upload-time = "2024-07-15T00:15:32.26Z" }, - { url = "https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0", size = 495420, upload-time = "2024-07-15T00:15:34.004Z" }, - { url = "https://files.pythonhosted.org/packages/7b/83/f23338c963bd9de687d47bf32efe9fd30164e722ba27fb59df33e6b1719b/zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094", size = 788713, upload-time = "2024-07-15T00:15:35.815Z" }, - { url = "https://files.pythonhosted.org/packages/5b/b3/1a028f6750fd9227ee0b937a278a434ab7f7fdc3066c3173f64366fe2466/zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8", size = 633459, upload-time = "2024-07-15T00:15:37.995Z" }, - { url = "https://files.pythonhosted.org/packages/26/af/36d89aae0c1f95a0a98e50711bc5d92c144939efc1f81a2fcd3e78d7f4c1/zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1", size = 4945707, upload-time = "2024-07-15T00:15:39.872Z" }, - { url = "https://files.pythonhosted.org/packages/cd/2e/2051f5c772f4dfc0aae3741d5fc72c3dcfe3aaeb461cc231668a4db1ce14/zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072", size = 5306545, upload-time = "2024-07-15T00:15:41.75Z" }, - { url = "https://files.pythonhosted.org/packages/0a/9e/a11c97b087f89cab030fa71206963090d2fecd8eb83e67bb8f3ffb84c024/zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20", size = 5337533, upload-time = "2024-07-15T00:15:44.114Z" }, - { url = "https://files.pythonhosted.org/packages/fc/79/edeb217c57fe1bf16d890aa91a1c2c96b28c07b46afed54a5dcf310c3f6f/zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373", size = 5436510, upload-time = "2024-07-15T00:15:46.509Z" }, - { url = "https://files.pythonhosted.org/packages/81/4f/c21383d97cb7a422ddf1ae824b53ce4b51063d0eeb2afa757eb40804a8ef/zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db", size = 4859973, upload-time = "2024-07-15T00:15:49.939Z" }, - { url = "https://files.pythonhosted.org/packages/ab/15/08d22e87753304405ccac8be2493a495f529edd81d39a0870621462276ef/zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772", size = 4936968, upload-time = "2024-07-15T00:15:52.025Z" }, - { url = "https://files.pythonhosted.org/packages/eb/fa/f3670a597949fe7dcf38119a39f7da49a8a84a6f0b1a2e46b2f71a0ab83f/zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105", size = 5467179, upload-time = "2024-07-15T00:15:54.971Z" }, - { url = "https://files.pythonhosted.org/packages/4e/a9/dad2ab22020211e380adc477a1dbf9f109b1f8d94c614944843e20dc2a99/zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba", size = 4848577, upload-time = "2024-07-15T00:15:57.634Z" }, - { url = "https://files.pythonhosted.org/packages/08/03/dd28b4484b0770f1e23478413e01bee476ae8227bbc81561f9c329e12564/zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd", size = 4693899, upload-time = "2024-07-15T00:16:00.811Z" }, - { url = "https://files.pythonhosted.org/packages/2b/64/3da7497eb635d025841e958bcd66a86117ae320c3b14b0ae86e9e8627518/zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a", size = 5199964, upload-time = "2024-07-15T00:16:03.669Z" }, - { url = "https://files.pythonhosted.org/packages/43/a4/d82decbab158a0e8a6ebb7fc98bc4d903266bce85b6e9aaedea1d288338c/zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90", size = 5655398, upload-time = "2024-07-15T00:16:06.694Z" }, - { url = "https://files.pythonhosted.org/packages/f2/61/ac78a1263bc83a5cf29e7458b77a568eda5a8f81980691bbc6eb6a0d45cc/zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35", size = 5191313, upload-time = "2024-07-15T00:16:09.758Z" }, - { url = "https://files.pythonhosted.org/packages/e7/54/967c478314e16af5baf849b6ee9d6ea724ae5b100eb506011f045d3d4e16/zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d", size = 430877, upload-time = "2024-07-15T00:16:11.758Z" }, - { url = "https://files.pythonhosted.org/packages/75/37/872d74bd7739639c4553bf94c84af7d54d8211b626b352bc57f0fd8d1e3f/zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b", size = 495595, upload-time = "2024-07-15T00:16:13.731Z" }, - { url = "https://files.pythonhosted.org/packages/80/f1/8386f3f7c10261fe85fbc2c012fdb3d4db793b921c9abcc995d8da1b7a80/zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9", size = 788975, upload-time = "2024-07-15T00:16:16.005Z" }, - { url = "https://files.pythonhosted.org/packages/16/e8/cbf01077550b3e5dc86089035ff8f6fbbb312bc0983757c2d1117ebba242/zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a", size = 633448, upload-time = "2024-07-15T00:16:17.897Z" }, - { url = "https://files.pythonhosted.org/packages/06/27/4a1b4c267c29a464a161aeb2589aff212b4db653a1d96bffe3598f3f0d22/zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2", size = 4945269, upload-time = "2024-07-15T00:16:20.136Z" }, - { url = "https://files.pythonhosted.org/packages/7c/64/d99261cc57afd9ae65b707e38045ed8269fbdae73544fd2e4a4d50d0ed83/zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5", size = 5306228, upload-time = "2024-07-15T00:16:23.398Z" }, - { url = "https://files.pythonhosted.org/packages/7a/cf/27b74c6f22541f0263016a0fd6369b1b7818941de639215c84e4e94b2a1c/zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f", size = 5336891, upload-time = "2024-07-15T00:16:26.391Z" }, - { url = "https://files.pythonhosted.org/packages/fa/18/89ac62eac46b69948bf35fcd90d37103f38722968e2981f752d69081ec4d/zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed", size = 5436310, upload-time = "2024-07-15T00:16:29.018Z" }, - { url = "https://files.pythonhosted.org/packages/a8/a8/5ca5328ee568a873f5118d5b5f70d1f36c6387716efe2e369010289a5738/zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea", size = 4859912, upload-time = "2024-07-15T00:16:31.871Z" }, - { url = "https://files.pythonhosted.org/packages/ea/ca/3781059c95fd0868658b1cf0440edd832b942f84ae60685d0cfdb808bca1/zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847", size = 4936946, upload-time = "2024-07-15T00:16:34.593Z" }, - { url = "https://files.pythonhosted.org/packages/ce/11/41a58986f809532742c2b832c53b74ba0e0a5dae7e8ab4642bf5876f35de/zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171", size = 5466994, upload-time = "2024-07-15T00:16:36.887Z" }, - { url = "https://files.pythonhosted.org/packages/83/e3/97d84fe95edd38d7053af05159465d298c8b20cebe9ccb3d26783faa9094/zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840", size = 4848681, upload-time = "2024-07-15T00:16:39.709Z" }, - { url = "https://files.pythonhosted.org/packages/6e/99/cb1e63e931de15c88af26085e3f2d9af9ce53ccafac73b6e48418fd5a6e6/zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690", size = 4694239, upload-time = "2024-07-15T00:16:41.83Z" }, - { url = "https://files.pythonhosted.org/packages/ab/50/b1e703016eebbc6501fc92f34db7b1c68e54e567ef39e6e59cf5fb6f2ec0/zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b", size = 5200149, upload-time = "2024-07-15T00:16:44.287Z" }, - { url = "https://files.pythonhosted.org/packages/aa/e0/932388630aaba70197c78bdb10cce2c91fae01a7e553b76ce85471aec690/zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057", size = 5655392, upload-time = "2024-07-15T00:16:46.423Z" }, - { url = "https://files.pythonhosted.org/packages/02/90/2633473864f67a15526324b007a9f96c96f56d5f32ef2a56cc12f9548723/zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33", size = 5191299, upload-time = "2024-07-15T00:16:49.053Z" }, - { url = "https://files.pythonhosted.org/packages/b0/4c/315ca5c32da7e2dc3455f3b2caee5c8c2246074a61aac6ec3378a97b7136/zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd", size = 430862, upload-time = "2024-07-15T00:16:51.003Z" }, - { url = "https://files.pythonhosted.org/packages/a2/bf/c6aaba098e2d04781e8f4f7c0ba3c7aa73d00e4c436bcc0cf059a66691d1/zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b", size = 495578, upload-time = "2024-07-15T00:16:53.135Z" }, -] - [[package]] name = "zstandard" version = "0.25.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.13'", - "python_full_version == '3.12.*'", - "python_full_version == '3.11.*'", - "python_full_version < '3.11'", -] sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513, upload-time = "2025-09-14T22:15:54.002Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/56/7a/28efd1d371f1acd037ac64ed1c5e2b41514a6cc937dd6ab6a13ab9f0702f/zstandard-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e59fdc271772f6686e01e1b3b74537259800f57e24280be3f29c8a0deb1904dd", size = 795256, upload-time = "2025-09-14T22:15:56.415Z" },