upgrade to deepagents-0_5_2

This commit is contained in:
朱潮 2026-04-11 11:40:43 +08:00
parent b6976cc8bf
commit 788bb0089f
6 changed files with 1122 additions and 1108 deletions

View File

@ -4,7 +4,9 @@
""" """
from pathlib import Path from pathlib import Path
from typing import Annotated, Literal, cast from typing import Annotated, cast
import mimetypes
import warnings
from langchain.tools import ToolRuntime from langchain.tools import ToolRuntime
from langchain_core.messages import ToolMessage from langchain_core.messages import ToolMessage
@ -15,19 +17,24 @@ from deepagents.backends import StateBackend
from deepagents.backends.composite import CompositeBackend from deepagents.backends.composite import CompositeBackend
from deepagents.backends.protocol import ( from deepagents.backends.protocol import (
BACKEND_TYPES, BACKEND_TYPES,
ReadResult,
) )
from deepagents.backends.utils import _get_file_type, validate_path
from langchain_core.messages.content import ContentBlock
from deepagents.middleware.filesystem import ( from deepagents.middleware.filesystem import (
DEFAULT_READ_OFFSET, DEFAULT_READ_OFFSET,
DEFAULT_READ_LIMIT, DEFAULT_READ_LIMIT,
IMAGE_EXTENSIONS,
IMAGE_MEDIA_TYPES,
FilesystemMiddleware, FilesystemMiddleware,
FilesystemState, FilesystemState,
READ_FILE_TOOL_DESCRIPTION,
READ_FILE_TRUNCATION_MSG,
NUM_CHARS_PER_TOKEN,
ReadFileSchema,
check_empty_content,
format_content_with_line_numbers,
) )
from langgraph.types import Command from langgraph.types import Command
import base64
from langchain_core.messages.content import create_image_block
# SKILL.md 文件的行数限制(设置为较大的值以完整读取) # SKILL.md 文件的行数限制(设置为较大的值以完整读取)
@ -44,10 +51,62 @@ class CustomFilesystemMiddleware(FilesystemMiddleware):
@override @override
def _create_read_file_tool(self) -> BaseTool: def _create_read_file_tool(self) -> BaseTool:
"""创建自定义的 read_file 工具,支持 SKILL.md 完整读取。""" """创建自定义的 read_file 工具,支持 SKILL.md 完整读取。"""
# 从父类获取工具描述 tool_description = self._custom_tool_descriptions.get("read_file") or READ_FILE_TOOL_DESCRIPTION
tool_description = self._custom_tool_descriptions.get("read_file") or self._get_read_file_description()
token_limit = self._tool_token_limit_before_evict token_limit = self._tool_token_limit_before_evict
def _truncate(content: str, file_path: str, limit: int) -> str:
lines = content.splitlines(keepends=True)
if len(lines) > limit:
lines = lines[:limit]
content = "".join(lines)
if token_limit and len(content) >= NUM_CHARS_PER_TOKEN * token_limit:
truncation_msg = READ_FILE_TRUNCATION_MSG.format(file_path=file_path)
max_content_length = NUM_CHARS_PER_TOKEN * token_limit - len(truncation_msg)
content = content[:max_content_length] + truncation_msg
return content
def _handle_read_result(
read_result: ReadResult | str,
validated_path: str,
tool_call_id: str | None,
offset: int,
limit: int,
) -> ToolMessage | str:
if isinstance(read_result, str):
warnings.warn(
"Returning a plain `str` from `backend.read()` is deprecated. ",
DeprecationWarning,
stacklevel=2,
)
return _truncate(read_result, validated_path, limit)
if read_result.error:
return f"Error: {read_result.error}"
if read_result.file_data is None:
return f"Error: no data returned for '{validated_path}'"
file_type = _get_file_type(validated_path)
content = read_result.file_data["content"]
if file_type != "text":
mime_type = mimetypes.guess_type("file" + Path(validated_path).suffix)[0] or "application/octet-stream"
return ToolMessage(
content_blocks=cast("list[ContentBlock]", [{"type": file_type, "base64": content, "mime_type": mime_type}]),
name="read_file",
tool_call_id=tool_call_id,
additional_kwargs={"read_file_path": validated_path, "read_file_media_type": mime_type},
)
empty_msg = check_empty_content(content)
if empty_msg:
return empty_msg
content = format_content_with_line_numbers(content, start_line=offset + 1)
return _truncate(content, validated_path, limit)
def sync_read_file( def sync_read_file(
file_path: Annotated[str, "Absolute path to the file to read. Must be absolute, not relative."], file_path: Annotated[str, "Absolute path to the file to read. Must be absolute, not relative."],
runtime: ToolRuntime[None, FilesystemState], runtime: ToolRuntime[None, FilesystemState],
@ -55,57 +114,18 @@ class CustomFilesystemMiddleware(FilesystemMiddleware):
limit: Annotated[int, "Maximum number of lines to read. Use for pagination of large files."] = DEFAULT_READ_LIMIT, limit: Annotated[int, "Maximum number of lines to read. Use for pagination of large files."] = DEFAULT_READ_LIMIT,
) -> ToolMessage | str: ) -> ToolMessage | str:
"""Synchronous wrapper for read_file tool with SKILL.md special handling.""" """Synchronous wrapper for read_file tool with SKILL.md special handling."""
from deepagents.backends.utils import validate_path
from deepagents.middleware.filesystem import READ_FILE_TRUNCATION_MSG, NUM_CHARS_PER_TOKEN
resolved_backend = self._get_backend(runtime) resolved_backend = self._get_backend(runtime)
try: try:
validated_path = validate_path(file_path) validated_path = validate_path(file_path)
except ValueError as e: except ValueError as e:
return f"Error: {e}" return f"Error: {e}"
ext = Path(validated_path).suffix.lower()
# 处理图片文件
if ext in IMAGE_EXTENSIONS:
responses = resolved_backend.download_files([validated_path])
if responses and responses[0].content is not None:
media_type = IMAGE_MEDIA_TYPES.get(ext, "image/png")
image_b64 = base64.standard_b64encode(responses[0].content).decode("utf-8")
return ToolMessage(
content_blocks=[create_image_block(base64=image_b64, mime_type=media_type)],
name="read_file",
tool_call_id=runtime.tool_call_id,
additional_kwargs={
"read_file_path": validated_path,
"read_file_media_type": media_type,
},
)
if responses and responses[0].error:
return f"Error reading image: {responses[0].error}"
return "Error reading image: unknown error"
# 如果是 SKILL.md 文件,使用大限制读取完整内容 # 如果是 SKILL.md 文件,使用大限制读取完整内容
if validated_path.endswith("SKILL.md") or validated_path.endswith("/SKILL.md"): if validated_path.endswith("SKILL.md") or validated_path.endswith("/SKILL.md"):
actual_limit = SKILL_MD_READ_LIMIT limit = SKILL_MD_READ_LIMIT
else:
actual_limit = limit
result = resolved_backend.read(validated_path, offset=offset, limit=actual_limit) read_result = resolved_backend.read(validated_path, offset=offset, limit=limit)
return _handle_read_result(read_result, validated_path, runtime.tool_call_id, offset, limit)
lines = result.splitlines(keepends=True)
if len(lines) > actual_limit:
lines = lines[:actual_limit]
result = "".join(lines)
# Check if result exceeds token threshold and truncate if necessary
if token_limit and len(result) >= NUM_CHARS_PER_TOKEN * token_limit:
# Calculate truncation message length to ensure final result stays under threshold
truncation_msg = READ_FILE_TRUNCATION_MSG.format(file_path=validated_path)
max_content_length = NUM_CHARS_PER_TOKEN * token_limit - len(truncation_msg)
result = result[:max_content_length]
result += truncation_msg
return result
async def async_read_file( async def async_read_file(
file_path: Annotated[str, "Absolute path to the file to read. Must be absolute, not relative."], file_path: Annotated[str, "Absolute path to the file to read. Must be absolute, not relative."],
@ -114,66 +134,28 @@ class CustomFilesystemMiddleware(FilesystemMiddleware):
limit: Annotated[int, "Maximum number of lines to read. Use for pagination of large files."] = DEFAULT_READ_LIMIT, limit: Annotated[int, "Maximum number of lines to read. Use for pagination of large files."] = DEFAULT_READ_LIMIT,
) -> ToolMessage | str: ) -> ToolMessage | str:
"""Asynchronous wrapper for read_file tool with SKILL.md special handling.""" """Asynchronous wrapper for read_file tool with SKILL.md special handling."""
from deepagents.backends.utils import validate_path
from deepagents.middleware.filesystem import READ_FILE_TRUNCATION_MSG, NUM_CHARS_PER_TOKEN
resolved_backend = self._get_backend(runtime) resolved_backend = self._get_backend(runtime)
try: try:
validated_path = validate_path(file_path) validated_path = validate_path(file_path)
except ValueError as e: except ValueError as e:
return f"Error: {e}" return f"Error: {e}"
ext = Path(validated_path).suffix.lower()
# 处理图片文件
if ext in IMAGE_EXTENSIONS:
responses = await resolved_backend.adownload_files([validated_path])
if responses and responses[0].content is not None:
media_type = IMAGE_MEDIA_TYPES.get(ext, "image/png")
image_b64 = base64.standard_b64encode(responses[0].content).decode("utf-8")
return ToolMessage(
content_blocks=[create_image_block(base64=image_b64, mime_type=media_type)],
name="read_file",
tool_call_id=runtime.tool_call_id,
additional_kwargs={
"read_file_path": validated_path,
"read_file_media_type": media_type,
},
)
if responses and responses[0].error:
return f"Error reading image: {responses[0].error}"
return "Error reading image: unknown error"
# 如果是 SKILL.md 文件,使用大限制读取完整内容 # 如果是 SKILL.md 文件,使用大限制读取完整内容
if validated_path.endswith("SKILL.md") or validated_path.endswith("/SKILL.md"): if validated_path.endswith("SKILL.md") or validated_path.endswith("/SKILL.md"):
actual_limit = SKILL_MD_READ_LIMIT limit = SKILL_MD_READ_LIMIT
else:
actual_limit = limit
result = await resolved_backend.aread(validated_path, offset=offset, limit=actual_limit) read_result = await resolved_backend.aread(validated_path, offset=offset, limit=limit)
return _handle_read_result(read_result, validated_path, runtime.tool_call_id, offset, limit)
lines = result.splitlines(keepends=True)
if len(lines) > actual_limit:
lines = lines[:actual_limit]
result = "".join(lines)
# Check if result exceeds token threshold and truncate if necessary
if token_limit and len(result) >= NUM_CHARS_PER_TOKEN * token_limit:
# Calculate truncation message length to ensure final result stays under threshold
truncation_msg = READ_FILE_TRUNCATION_MSG.format(file_path=validated_path)
max_content_length = NUM_CHARS_PER_TOKEN * token_limit - len(truncation_msg)
result = result[:max_content_length]
result += truncation_msg
return result
return StructuredTool.from_function( return StructuredTool.from_function(
name="read_file", name="read_file",
description=tool_description, description=tool_description,
func=sync_read_file, func=sync_read_file,
coroutine=async_read_file, coroutine=async_read_file,
infer_schema=False,
args_schema=ReadFileSchema,
) )
def _get_read_file_description(self) -> str: def _get_read_file_description(self) -> str:
"""获取 read_file 工具的描述,添加 SKILL.md 完整读取的说明。""" """获取 read_file 工具的描述,添加 SKILL.md 完整读取的说明。"""
from deepagents.middleware.filesystem import READ_FILE_TOOL_DESCRIPTION
return READ_FILE_TOOL_DESCRIPTION return READ_FILE_TOOL_DESCRIPTION

View File

@ -405,19 +405,22 @@ def create_custom_cli_agent(
# Use LocalShellBackend for filesystem + shell execution # Use LocalShellBackend for filesystem + shell execution
backend = LocalShellBackend( backend = LocalShellBackend(
root_dir=workspace_root, root_dir=workspace_root,
virtual_mode=False,
inherit_env=True, inherit_env=True,
env=final_shell_env, env=final_shell_env,
) )
else: else:
# No shell access - use plain FilesystemBackend # No shell access - use plain FilesystemBackend
backend = FilesystemBackend(root_dir=workspace_root) backend = FilesystemBackend(root_dir=workspace_root, virtual_mode=True)
# Set up composite backend with routing (参考新版本实现) # Set up composite backend with routing (参考新版本实现)
large_results_backend = FilesystemBackend( large_results_backend = FilesystemBackend(
root_dir=tempfile.mkdtemp(prefix="deepagents_large_results_"), root_dir=tempfile.mkdtemp(prefix="deepagents_large_results_"),
virtual_mode=True,
) )
conversation_history_backend = FilesystemBackend( conversation_history_backend = FilesystemBackend(
root_dir=tempfile.mkdtemp(prefix="deepagents_conversation_history_"), root_dir=tempfile.mkdtemp(prefix="deepagents_conversation_history_"),
virtual_mode=True,
) )
composite_backend = CompositeBackend( composite_backend = CompositeBackend(
default=backend, default=backend,
@ -433,7 +436,7 @@ def create_custom_cli_agent(
agent_middleware.append( agent_middleware.append(
CustomSkillsMiddleware( CustomSkillsMiddleware(
backend=FilesystemBackend(root_dir=workspace_root), backend=FilesystemBackend(root_dir=workspace_root, virtual_mode=True),
sources=skills_sources, sources=skills_sources,
) )
) )

View File

@ -1,4 +1,3 @@
from ast import Str
from langchain.agents.middleware import AgentState, AgentMiddleware, ModelRequest, ModelResponse from langchain.agents.middleware import AgentState, AgentMiddleware, ModelRequest, ModelResponse
from langchain_core.messages import convert_to_openai_messages from langchain_core.messages import convert_to_openai_messages
from agent.prompt_loader import load_guideline_prompt from agent.prompt_loader import load_guideline_prompt

1653
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -6,7 +6,7 @@ authors = [
{name = "朱潮",email = "zhuchaowe@users.noreply.github.com"} {name = "朱潮",email = "zhuchaowe@users.noreply.github.com"}
] ]
readme = "README.md" readme = "README.md"
requires-python = ">=3.12,<4.0" requires-python = ">=3.12,<3.15"
dependencies = [ dependencies = [
"fastapi==0.116.1", "fastapi==0.116.1",
"uvicorn==0.35.0", "uvicorn==0.35.0",
@ -26,12 +26,12 @@ dependencies = [
"chardet>=5.0.0", "chardet>=5.0.0",
"psutil (>=7.1.3,<8.0.0)", "psutil (>=7.1.3,<8.0.0)",
"uvloop (>=0.22.1,<0.23.0)", "uvloop (>=0.22.1,<0.23.0)",
"deepagents (>=0.4.3,<0.5.0)", "deepagents (>=0.5.2,<0.6.0)",
"langchain-mcp-adapters (>=0.2.1,<0.3.0)", "langchain-mcp-adapters (>=0.2.1,<0.3.0)",
"langchain-openai (>=1.1.1,<2.0.0)", "langchain-openai (>=1.1.1,<2.0.0)",
"cachetools (>=6.2.4,<7.0.0)", "cachetools (>=6.2.4,<7.0.0)",
"langgraph-checkpoint-postgres (>=3.0.0,<4.0.0)", "langgraph-checkpoint-postgres (>=3.0.0,<4.0.0)",
"deepagents-cli (>=0.0.25,<0.0.26)", "deepagents-cli (>=0.0.37,<0.1.0)",
"mem0ai (>=0.1.50,<0.3.0)", "mem0ai (>=0.1.50,<0.3.0)",
"psycopg2-binary (>=2.9.11,<3.0.0)", "psycopg2-binary (>=2.9.11,<3.0.0)",
"json-repair (>=0.29.0,<0.30.0)", "json-repair (>=0.29.0,<0.30.0)",

View File

@ -1,199 +1,202 @@
aiofiles==24.1.0 ; python_version >= "3.12" and python_version < "4.0" agent-client-protocol==0.9.0 ; python_version >= "3.12" and python_version < "3.15"
aiohappyeyeballs==2.6.1 ; python_version >= "3.12" and python_version < "4.0" aiofiles==24.1.0 ; python_version >= "3.12" and python_version < "3.15"
aiohttp-retry==2.9.1 ; python_version >= "3.12" and python_version < "4.0" aiohappyeyeballs==2.6.1 ; python_version >= "3.12" and python_version < "3.15"
aiohttp==3.13.1 ; python_version >= "3.12" and python_version < "4.0" aiohttp==3.13.1 ; python_version >= "3.12" and python_version < "3.15"
aiosignal==1.4.0 ; python_version >= "3.12" and python_version < "4.0" aiosignal==1.4.0 ; python_version >= "3.12" and python_version < "3.15"
aiosqlite==0.22.1 ; python_version >= "3.12" and python_version < "4.0" aiosqlite==0.22.1 ; python_version >= "3.12" and python_version < "3.15"
annotated-types==0.7.0 ; python_version >= "3.12" and python_version < "4.0" annotated-types==0.7.0 ; python_version >= "3.12" and python_version < "3.15"
anthropic==0.84.0 ; python_version >= "3.12" and python_version < "4.0" anthropic==0.94.0 ; python_version >= "3.12" and python_version < "3.15"
anyio==4.11.0 ; python_version >= "3.12" and python_version < "4.0" anyio==4.11.0 ; python_version >= "3.12" and python_version < "3.15"
attrs==25.4.0 ; python_version >= "3.12" and python_version < "4.0" attrs==25.4.0 ; python_version >= "3.12" and python_version < "3.15"
backoff==2.2.1 ; python_version >= "3.12" and python_version < "4.0" backoff==2.2.1 ; python_version >= "3.12" and python_version < "3.15"
beautifulsoup4==4.14.3 ; python_version >= "3.12" and python_version < "4.0" beautifulsoup4==4.14.3 ; python_version >= "3.12" and python_version < "3.15"
bracex==2.6 ; python_version >= "3.12" and python_version < "4.0" blockbuster==1.5.26 ; python_version >= "3.12" and python_version < "3.15"
cachetools==6.2.4 ; python_version >= "3.12" and python_version < "4.0" bracex==2.6 ; python_version >= "3.12" and python_version < "3.15"
cbor2==5.7.1 ; python_version >= "3.12" and python_version < "4.0" cachetools==6.2.4 ; python_version >= "3.12" and python_version < "3.15"
certifi==2025.10.5 ; python_version >= "3.12" and python_version < "4.0" certifi==2025.10.5 ; python_version >= "3.12" and python_version < "3.15"
cffi==2.0.0 ; python_version >= "3.12" and python_version < "4.0" and platform_python_implementation != "PyPy" cffi==2.0.0 ; python_version >= "3.12" and python_version < "3.15" and platform_python_implementation != "PyPy"
chardet==5.2.0 ; python_version >= "3.12" and python_version < "4.0" chardet==5.2.0 ; python_version >= "3.12" and python_version < "3.15"
charset-normalizer==3.4.4 ; python_version >= "3.12" and python_version < "4.0" charset-normalizer==3.4.4 ; python_version >= "3.12" and python_version < "3.15"
click==8.3.0 ; python_version >= "3.12" and python_version < "4.0" click==8.3.0 ; python_version >= "3.12" and python_version < "3.15"
colorama==0.4.6 ; python_version >= "3.12" and python_version < "4.0" and platform_system == "Windows" cloudpickle==3.1.2 ; python_version >= "3.12" and python_version < "3.15"
croniter==3.0.4 ; python_version >= "3.12" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.12" and python_version < "3.15" and platform_system == "Windows"
cryptography==46.0.5 ; python_version >= "3.12" and python_version < "4.0" croniter==3.0.4 ; python_version >= "3.12" and python_version < "3.15"
daytona-api-client-async==0.127.0 ; python_version >= "3.12" and python_version < "4.0" cryptography==46.0.5 ; python_version >= "3.12" and python_version < "3.15"
daytona-api-client==0.127.0 ; python_version >= "3.12" and python_version < "4.0" deepagents-acp==0.0.5 ; python_version >= "3.12" and python_version < "3.15"
daytona-toolbox-api-client-async==0.127.0 ; python_version >= "3.12" and python_version < "4.0" deepagents-cli==0.0.37 ; python_version >= "3.12" and python_version < "3.15"
daytona-toolbox-api-client==0.127.0 ; python_version >= "3.12" and python_version < "4.0" deepagents==0.5.2 ; python_version >= "3.12" and python_version < "3.15"
daytona==0.127.0 ; python_version >= "3.12" and python_version < "4.0" defusedxml==0.7.1 ; python_version >= "3.12" and python_version < "3.15"
deepagents-cli==0.0.25 ; python_version >= "3.12" and python_version < "4.0" distro==1.9.0 ; python_version >= "3.12" and python_version < "3.15"
deepagents==0.4.3 ; python_version >= "3.12" and python_version < "4.0" docstring-parser==0.17.0 ; python_version >= "3.12" and python_version < "3.15"
defusedxml==0.7.1 ; python_version >= "3.12" and python_version < "4.0" et-xmlfile==2.0.0 ; python_version >= "3.12" and python_version < "3.15"
deprecated==1.3.1 ; python_version >= "3.12" and python_version < "4.0" fastapi==0.116.1 ; python_version >= "3.12" and python_version < "3.15"
distro==1.9.0 ; python_version >= "3.12" and python_version < "4.0" filelock==3.20.0 ; python_version >= "3.12" and python_version < "3.15"
docstring-parser==0.17.0 ; python_version >= "3.12" and python_version < "4.0" filetype==1.2.0 ; python_version >= "3.12" and python_version < "3.15"
environs==14.5.0 ; python_version >= "3.12" and python_version < "4.0" forbiddenfruit==0.1.4 ; python_version >= "3.12" and python_version < "3.15" and implementation_name == "cpython"
et-xmlfile==2.0.0 ; python_version >= "3.12" and python_version < "4.0" frozenlist==1.8.0 ; python_version >= "3.12" and python_version < "3.15"
fastapi==0.116.1 ; python_version >= "3.12" and python_version < "4.0" fsspec==2025.9.0 ; python_version >= "3.12" and python_version < "3.15"
filelock==3.20.0 ; python_version >= "3.12" and python_version < "4.0" google-auth==2.48.0 ; python_version >= "3.12" and python_version < "3.15"
filetype==1.2.0 ; python_version >= "3.12" and python_version < "4.0" google-genai==1.65.0 ; python_version >= "3.12" and python_version < "3.15"
frozenlist==1.8.0 ; python_version >= "3.12" and python_version < "4.0" googleapis-common-protos==1.74.0 ; python_version >= "3.12" and python_version < "3.15"
fsspec==2025.9.0 ; python_version >= "3.12" and python_version < "4.0" greenlet==3.3.0 ; python_version >= "3.12" and python_version < "3.15" and (platform_machine == "aarch64" or platform_machine == "ppc64le" or platform_machine == "x86_64" or platform_machine == "amd64" or platform_machine == "AMD64" or platform_machine == "win32" or platform_machine == "WIN32")
google-auth==2.48.0 ; python_version >= "3.12" and python_version < "4.0" grpcio-health-checking==1.78.0 ; python_version >= "3.12" and python_version < "3.15"
google-genai==1.65.0 ; python_version >= "3.12" and python_version < "4.0" grpcio-tools==1.78.0 ; python_version >= "3.12" and python_version < "3.15"
greenlet==3.3.0 ; python_version >= "3.12" and python_version < "4.0" and (platform_machine == "aarch64" or platform_machine == "ppc64le" or platform_machine == "x86_64" or platform_machine == "amd64" or platform_machine == "AMD64" or platform_machine == "win32" or platform_machine == "WIN32") grpcio==1.78.0 ; python_version >= "3.12" and python_version < "3.15"
grpcio-tools==1.71.2 ; python_version >= "3.13" and python_version < "4.0" h11==0.16.0 ; python_version >= "3.12" and python_version < "3.15"
grpcio==1.76.0 ; python_version >= "3.12" and python_version < "4.0" h2==4.3.0 ; python_version >= "3.12" and python_version < "3.15"
grpclib==0.4.8 ; python_version >= "3.12" and python_version < "4.0" hf-xet==1.1.10 ; python_version >= "3.12" and python_version < "3.15" and (platform_machine == "x86_64" or platform_machine == "amd64" or platform_machine == "arm64" or platform_machine == "aarch64")
h11==0.16.0 ; python_version >= "3.12" and python_version < "4.0" hpack==4.1.0 ; python_version >= "3.12" and python_version < "3.15"
h2==4.3.0 ; python_version >= "3.12" and python_version < "4.0" httpcore==1.0.9 ; python_version >= "3.12" and python_version < "3.15"
hf-xet==1.1.10 ; python_version >= "3.12" and python_version < "4.0" and (platform_machine == "x86_64" or platform_machine == "amd64" or platform_machine == "arm64" or platform_machine == "aarch64") httptools==0.7.1 ; python_version >= "3.12" and python_version < "3.15" and platform_system != "Windows"
hpack==4.1.0 ; python_version >= "3.12" and python_version < "4.0" httpx-sse==0.4.3 ; python_version >= "3.12" and python_version < "3.15"
httpcore==1.0.9 ; python_version >= "3.12" and python_version < "4.0" httpx==0.28.1 ; python_version >= "3.12" and python_version < "3.15"
httpx-sse==0.4.3 ; python_version >= "3.12" and python_version < "4.0" huey==2.5.3 ; python_version >= "3.12" and python_version < "3.15"
httpx==0.28.1 ; python_version >= "3.12" and python_version < "4.0" huggingface-hub==0.35.3 ; python_version >= "3.12" and python_version < "3.15"
huey==2.5.3 ; python_version >= "3.12" and python_version < "4.0" hyperframe==6.1.0 ; python_version >= "3.12" and python_version < "3.15"
huggingface-hub==0.35.3 ; python_version >= "3.12" and python_version < "4.0" idna==3.11 ; python_version >= "3.12" and python_version < "3.15"
hyperframe==6.1.0 ; python_version >= "3.12" and python_version < "4.0" importlib-metadata==8.7.1 ; python_version >= "3.12" and python_version < "3.15"
idna==3.11 ; python_version >= "3.12" and python_version < "4.0" jinja2==3.1.6 ; python_version >= "3.12" and python_version < "3.15"
jinja2==3.1.6 ; python_version >= "3.12" and python_version < "4.0" jiter==0.11.1 ; python_version >= "3.12" and python_version < "3.15"
jiter==0.11.1 ; python_version >= "3.12" and python_version < "4.0" joblib==1.5.2 ; python_version >= "3.12" and python_version < "3.15"
joblib==1.5.2 ; python_version >= "3.12" and python_version < "4.0" json-repair==0.29.10 ; python_version >= "3.12" and python_version < "3.15"
json-repair==0.29.10 ; python_version >= "3.12" and python_version < "4.0" json5==0.13.0 ; python_version >= "3.12" and python_version < "3.15"
json5==0.13.0 ; python_version >= "3.12" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.12" and python_version < "3.15"
jsonpatch==1.33 ; python_version >= "3.12" and python_version < "4.0" jsonpointer==3.0.0 ; python_version >= "3.12" and python_version < "3.15"
jsonpointer==3.0.0 ; python_version >= "3.12" and python_version < "4.0" jsonschema-rs==0.44.1 ; python_version >= "3.12" and python_version < "3.15"
jsonschema-specifications==2025.9.1 ; python_version >= "3.12" and python_version < "4.0" jsonschema-specifications==2025.9.1 ; python_version >= "3.12" and python_version < "3.15"
jsonschema==4.25.1 ; python_version >= "3.12" and python_version < "4.0" jsonschema==4.25.1 ; python_version >= "3.12" and python_version < "3.15"
langchain-anthropic==1.3.4 ; python_version >= "3.12" and python_version < "4.0" langchain-anthropic==1.4.0 ; python_version >= "3.12" and python_version < "3.15"
langchain-core==1.2.16 ; python_version >= "3.12" and python_version < "4.0" langchain-core==1.2.28 ; python_version >= "3.12" and python_version < "3.15"
langchain-google-genai==4.2.1 ; python_version >= "3.12" and python_version < "4.0" langchain-google-genai==4.2.1 ; python_version >= "3.12" and python_version < "3.15"
langchain-mcp-adapters==0.2.1 ; python_version >= "3.12" and python_version < "4.0" langchain-mcp-adapters==0.2.1 ; python_version >= "3.12" and python_version < "3.15"
langchain-openai==1.1.9 ; python_version >= "3.12" and python_version < "4.0" langchain-openai==1.1.12 ; python_version >= "3.12" and python_version < "3.15"
langchain==1.2.10 ; python_version >= "3.12" and python_version < "4.0" langchain==1.2.15 ; python_version >= "3.12" and python_version < "3.15"
langgraph-checkpoint-postgres==3.0.4 ; python_version >= "3.12" and python_version < "4.0" langgraph-api==0.7.100 ; python_version >= "3.12" and python_version < "3.15"
langgraph-checkpoint-sqlite==3.0.3 ; python_version >= "3.12" and python_version < "4.0" langgraph-checkpoint-postgres==3.0.4 ; python_version >= "3.12" and python_version < "3.15"
langgraph-checkpoint==4.0.1 ; python_version >= "3.12" and python_version < "4.0" langgraph-checkpoint-sqlite==3.0.3 ; python_version >= "3.12" and python_version < "3.15"
langgraph-prebuilt==1.0.8 ; python_version >= "3.12" and python_version < "4.0" langgraph-checkpoint==4.0.1 ; python_version >= "3.12" and python_version < "3.15"
langgraph-sdk==0.3.3 ; python_version >= "3.12" and python_version < "4.0" langgraph-cli==0.4.21 ; python_version >= "3.12" and python_version < "3.15"
langgraph==1.0.10 ; python_version >= "3.12" and python_version < "4.0" langgraph-prebuilt==1.0.9 ; python_version >= "3.12" and python_version < "3.15"
langsmith==0.7.9 ; python_version >= "3.12" and python_version < "4.0" langgraph-runtime-inmem==0.27.3 ; python_version >= "3.12" and python_version < "3.15"
linkify-it-py==2.1.0 ; python_version >= "3.12" and python_version < "4.0" langgraph-sdk==0.3.13 ; python_version >= "3.12" and python_version < "3.15"
markdown-it-py==4.0.0 ; python_version >= "3.12" and python_version < "4.0" langgraph==1.1.6 ; python_version >= "3.12" and python_version < "3.15"
markdownify==1.2.2 ; python_version >= "3.12" and python_version < "4.0" langsmith==0.7.9 ; python_version >= "3.12" and python_version < "3.15"
markupsafe==3.0.3 ; python_version >= "3.12" and python_version < "4.0" linkify-it-py==2.1.0 ; python_version >= "3.12" and python_version < "3.15"
marshmallow==4.1.1 ; python_version >= "3.12" and python_version < "4.0" markdown-it-py==4.0.0 ; python_version >= "3.12" and python_version < "3.15"
mcp==1.12.4 ; python_version >= "3.12" and python_version < "4.0" markdownify==1.2.2 ; python_version >= "3.12" and python_version < "3.15"
mdit-py-plugins==0.5.0 ; python_version >= "3.12" and python_version < "4.0" markupsafe==3.0.3 ; python_version >= "3.12" and python_version < "3.15"
mdurl==0.1.2 ; python_version >= "3.12" and python_version < "4.0" mcp==1.12.4 ; python_version >= "3.12" and python_version < "3.15"
mem0ai==0.1.116 ; python_version >= "3.12" and python_version < "4.0" mdit-py-plugins==0.5.0 ; python_version >= "3.12" and python_version < "3.15"
modal==1.2.1 ; python_version >= "3.12" and python_version < "4.0" mdurl==0.1.2 ; python_version >= "3.12" and python_version < "3.15"
mpmath==1.3.0 ; python_version >= "3.12" and python_version < "4.0" mem0ai==0.1.115 ; python_version >= "3.12" and python_version < "3.15"
multidict==6.7.0 ; python_version >= "3.12" and python_version < "4.0" mpmath==1.3.0 ; python_version >= "3.12" and python_version < "3.15"
multipart==1.3.0 ; python_version >= "3.12" and python_version < "4.0" multidict==6.7.0 ; python_version >= "3.12" and python_version < "3.15"
networkx==3.5 ; python_version >= "3.12" and python_version < "4.0" networkx==3.5 ; python_version >= "3.12" and python_version < "3.15"
numpy==1.26.4 ; python_version >= "3.12" and python_version < "4.0" numpy==1.26.4 ; python_version >= "3.12" and python_version < "3.15"
nvidia-cublas-cu12==12.1.3.1 ; python_version >= "3.12" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" nvidia-cublas-cu12==12.1.3.1 ; python_version >= "3.12" and python_version < "3.15" and platform_system == "Linux" and platform_machine == "x86_64"
nvidia-cuda-cupti-cu12==12.1.105 ; python_version >= "3.12" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" nvidia-cuda-cupti-cu12==12.1.105 ; python_version >= "3.12" and python_version < "3.15" and platform_system == "Linux" and platform_machine == "x86_64"
nvidia-cuda-nvrtc-cu12==12.1.105 ; python_version >= "3.12" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" nvidia-cuda-nvrtc-cu12==12.1.105 ; python_version >= "3.12" and python_version < "3.15" and platform_system == "Linux" and platform_machine == "x86_64"
nvidia-cuda-runtime-cu12==12.1.105 ; python_version >= "3.12" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" nvidia-cuda-runtime-cu12==12.1.105 ; python_version >= "3.12" and python_version < "3.15" and platform_system == "Linux" and platform_machine == "x86_64"
nvidia-cudnn-cu12==8.9.2.26 ; python_version >= "3.12" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" nvidia-cudnn-cu12==8.9.2.26 ; python_version >= "3.12" and python_version < "3.15" and platform_system == "Linux" and platform_machine == "x86_64"
nvidia-cufft-cu12==11.0.2.54 ; python_version >= "3.12" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" nvidia-cufft-cu12==11.0.2.54 ; python_version >= "3.12" and python_version < "3.15" and platform_system == "Linux" and platform_machine == "x86_64"
nvidia-curand-cu12==10.3.2.106 ; python_version >= "3.12" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" nvidia-curand-cu12==10.3.2.106 ; python_version >= "3.12" and python_version < "3.15" and platform_system == "Linux" and platform_machine == "x86_64"
nvidia-cusolver-cu12==11.4.5.107 ; python_version >= "3.12" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" nvidia-cusolver-cu12==11.4.5.107 ; python_version >= "3.12" and python_version < "3.15" and platform_system == "Linux" and platform_machine == "x86_64"
nvidia-cusparse-cu12==12.1.0.106 ; python_version >= "3.12" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" nvidia-cusparse-cu12==12.1.0.106 ; python_version >= "3.12" and python_version < "3.15" and platform_system == "Linux" and platform_machine == "x86_64"
nvidia-nccl-cu12==2.19.3 ; python_version >= "3.12" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" nvidia-nccl-cu12==2.19.3 ; python_version >= "3.12" and python_version < "3.15" and platform_system == "Linux" and platform_machine == "x86_64"
nvidia-nvjitlink-cu12==12.9.86 ; python_version >= "3.12" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" nvidia-nvjitlink-cu12==12.9.86 ; python_version >= "3.12" and python_version < "3.15" and platform_system == "Linux" and platform_machine == "x86_64"
nvidia-nvtx-cu12==12.1.105 ; python_version >= "3.12" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" nvidia-nvtx-cu12==12.1.105 ; python_version >= "3.12" and python_version < "3.15" and platform_system == "Linux" and platform_machine == "x86_64"
obstore==0.7.3 ; python_version >= "3.12" and python_version < "4.0" openai==2.31.0 ; python_version >= "3.12" and python_version < "3.15"
openai==2.5.0 ; python_version >= "3.12" and python_version < "4.0" openpyxl==3.1.5 ; python_version >= "3.12" and python_version < "3.15"
openpyxl==3.1.5 ; python_version >= "3.12" and python_version < "4.0" opentelemetry-api==1.41.0 ; python_version >= "3.12" and python_version < "3.15"
orjson==3.11.5 ; python_version >= "3.12" and python_version < "4.0" opentelemetry-exporter-otlp-proto-common==1.41.0 ; python_version >= "3.12" and python_version < "3.15"
ormsgpack==1.12.0 ; python_version >= "3.12" and python_version < "4.0" opentelemetry-exporter-otlp-proto-http==1.41.0 ; python_version >= "3.12" and python_version < "3.15"
packaging==25.0 ; python_version >= "3.12" and python_version < "4.0" opentelemetry-proto==1.41.0 ; python_version >= "3.12" and python_version < "3.15"
pandas==2.3.3 ; python_version >= "3.12" and python_version < "4.0" opentelemetry-sdk==1.41.0 ; python_version >= "3.12" and python_version < "3.15"
pillow==12.0.0 ; python_version >= "3.12" and python_version < "4.0" opentelemetry-semantic-conventions==0.62b0 ; python_version >= "3.12" and python_version < "3.15"
platformdirs==4.9.2 ; python_version >= "3.12" and python_version < "4.0" orjson==3.11.5 ; python_version >= "3.12" and python_version < "3.15"
portalocker==2.10.1 ; python_version >= "3.13" and python_version < "4.0" ormsgpack==1.12.0 ; python_version >= "3.12" and python_version < "3.15"
packaging==25.0 ; python_version >= "3.12" and python_version < "3.15"
pandas==2.3.3 ; python_version >= "3.12" and python_version < "3.15"
pathspec==1.0.4 ; python_version >= "3.12" and python_version < "3.15"
pillow==12.0.0 ; python_version >= "3.12" and python_version < "3.15"
platformdirs==4.9.2 ; python_version >= "3.12" and python_version < "3.15"
portalocker==2.10.1 ; python_version >= "3.13" and python_version < "3.15"
portalocker==3.2.0 ; python_version == "3.12" portalocker==3.2.0 ; python_version == "3.12"
posthog==7.6.0 ; python_version >= "3.12" and python_version < "4.0" posthog==7.6.0 ; python_version >= "3.12" and python_version < "3.15"
prompt-toolkit==3.0.52 ; python_version >= "3.12" and python_version < "4.0" prompt-toolkit==3.0.52 ; python_version >= "3.12" and python_version < "3.15"
propcache==0.4.1 ; python_version >= "3.12" and python_version < "4.0" propcache==0.4.1 ; python_version >= "3.12" and python_version < "3.15"
protobuf==5.29.5 ; python_version >= "3.12" and python_version < "4.0" protobuf==6.33.6 ; python_version >= "3.12" and python_version < "3.15"
psutil==7.1.3 ; python_version >= "3.12" and python_version < "4.0" psutil==7.1.3 ; python_version >= "3.12" and python_version < "3.15"
psycopg-pool==3.3.0 ; python_version >= "3.12" and python_version < "4.0" psycopg-pool==3.3.0 ; python_version >= "3.12" and python_version < "3.15"
psycopg2-binary==2.9.11 ; python_version >= "3.12" and python_version < "4.0" psycopg2-binary==2.9.11 ; python_version >= "3.12" and python_version < "3.15"
psycopg==3.3.2 ; python_version >= "3.12" and python_version < "4.0" psycopg==3.3.2 ; python_version >= "3.12" and python_version < "3.15"
pyasn1-modules==0.4.2 ; python_version >= "3.12" and python_version < "4.0" pyasn1-modules==0.4.2 ; python_version >= "3.12" and python_version < "3.15"
pyasn1==0.6.2 ; python_version >= "3.12" and python_version < "4.0" pyasn1==0.6.2 ; python_version >= "3.12" and python_version < "3.15"
pycparser==3.0 ; python_version >= "3.12" and python_version < "4.0" and platform_python_implementation != "PyPy" and implementation_name != "PyPy" pycparser==3.0 ; python_version >= "3.12" and python_version < "3.15" and platform_python_implementation != "PyPy" and implementation_name != "PyPy"
pydantic-core==2.27.2 ; python_version >= "3.12" and python_version < "4.0" pydantic-core==2.27.2 ; python_version >= "3.12" and python_version < "3.15"
pydantic-settings==2.11.0 ; python_version >= "3.12" and python_version < "4.0" pydantic-settings==2.11.0 ; python_version >= "3.12" and python_version < "3.15"
pydantic==2.10.5 ; python_version >= "3.12" and python_version < "4.0" pydantic==2.10.5 ; python_version >= "3.12" and python_version < "3.15"
pygments==2.19.2 ; python_version >= "3.12" and python_version < "4.0" pygments==2.19.2 ; python_version >= "3.12" and python_version < "3.15"
pyperclip==1.11.0 ; python_version >= "3.12" and python_version < "4.0" pyjwt==2.12.1 ; python_version >= "3.12" and python_version < "3.15"
python-dateutil==2.8.2 ; python_version >= "3.12" and python_version < "4.0" pyperclip==1.11.0 ; python_version >= "3.12" and python_version < "3.15"
python-dotenv==1.1.1 ; python_version >= "3.12" and python_version < "4.0" python-dateutil==2.8.2 ; python_version >= "3.12" and python_version < "3.15"
python-multipart==0.0.20 ; python_version >= "3.12" and python_version < "4.0" python-dotenv==1.2.2 ; python_version >= "3.12" and python_version < "3.15"
pytz==2025.2 ; python_version >= "3.12" and python_version < "4.0" python-multipart==0.0.20 ; python_version >= "3.12" and python_version < "3.15"
pywin32==311 ; python_version >= "3.12" and python_version < "4.0" and (sys_platform == "win32" or platform_system == "Windows") pytz==2025.2 ; python_version >= "3.12" and python_version < "3.15"
pyyaml==6.0.3 ; python_version >= "3.12" and python_version < "4.0" pywin32==311 ; python_version >= "3.12" and python_version < "3.15" and (sys_platform == "win32" or platform_system == "Windows")
qdrant-client==1.12.1 ; python_version >= "3.13" and python_version < "4.0" pyyaml==6.0.3 ; python_version >= "3.12" and python_version < "3.15"
qdrant-client==1.12.1 ; python_version >= "3.13" and python_version < "3.15"
qdrant-client==1.16.2 ; python_version == "3.12" qdrant-client==1.16.2 ; python_version == "3.12"
referencing==0.37.0 ; python_version >= "3.12" and python_version < "4.0" referencing==0.37.0 ; python_version >= "3.12" and python_version < "3.15"
regex==2025.9.18 ; python_version >= "3.12" and python_version < "4.0" regex==2025.9.18 ; python_version >= "3.12" and python_version < "3.15"
requests-toolbelt==1.0.0 ; python_version >= "3.12" and python_version < "4.0" requests-toolbelt==1.0.0 ; python_version >= "3.12" and python_version < "3.15"
requests==2.32.5 ; python_version >= "3.12" and python_version < "4.0" requests==2.32.5 ; python_version >= "3.12" and python_version < "3.15"
rich==14.2.0 ; python_version >= "3.12" and python_version < "4.0" rich==14.2.0 ; python_version >= "3.12" and python_version < "3.15"
rpds-py==0.27.1 ; python_version >= "3.12" and python_version < "4.0" rpds-py==0.27.1 ; python_version >= "3.12" and python_version < "3.15"
rsa==4.9.1 ; python_version >= "3.12" and python_version < "4.0" rsa==4.9.1 ; python_version >= "3.12" and python_version < "3.15"
runloop-api-client==1.2.0 ; python_version >= "3.12" and python_version < "4.0" safetensors==0.6.2 ; python_version >= "3.12" and python_version < "3.15"
safetensors==0.6.2 ; python_version >= "3.12" and python_version < "4.0" scikit-learn==1.7.2 ; python_version >= "3.12" and python_version < "3.15"
scikit-learn==1.7.2 ; python_version >= "3.12" and python_version < "4.0" scipy==1.16.2 ; python_version >= "3.12" and python_version < "3.15"
scipy==1.16.2 ; python_version >= "3.12" and python_version < "4.0" sentence-transformers==5.1.1 ; python_version >= "3.12" and python_version < "3.15"
sentence-transformers==5.1.1 ; python_version >= "3.12" and python_version < "4.0" setuptools==80.9.0 ; python_version >= "3.12" and python_version < "3.15"
setuptools==80.9.0 ; python_version >= "3.13" and python_version < "4.0" six==1.17.0 ; python_version >= "3.12" and python_version < "3.15"
shellingham==1.5.4 ; python_version >= "3.12" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.12" and python_version < "3.15"
six==1.17.0 ; python_version >= "3.12" and python_version < "4.0" soupsieve==2.8.1 ; python_version >= "3.12" and python_version < "3.15"
sniffio==1.3.1 ; python_version >= "3.12" and python_version < "4.0" sqlalchemy==2.0.45 ; python_version >= "3.12" and python_version < "3.15"
soupsieve==2.8.1 ; python_version >= "3.12" and python_version < "4.0" sqlite-vec==0.1.6 ; python_version >= "3.12" and python_version < "3.15"
sqlalchemy==2.0.45 ; python_version >= "3.12" and python_version < "4.0" sse-starlette==3.0.2 ; python_version >= "3.12" and python_version < "3.15"
sqlite-vec==0.1.6 ; python_version >= "3.12" and python_version < "4.0" starlette==0.47.3 ; python_version >= "3.12" and python_version < "3.15"
sse-starlette==3.0.2 ; python_version >= "3.12" and python_version < "4.0" structlog==25.5.0 ; python_version >= "3.12" and python_version < "3.15"
starlette==0.47.3 ; python_version >= "3.12" and python_version < "4.0" sympy==1.14.0 ; python_version >= "3.12" and python_version < "3.15"
sympy==1.14.0 ; python_version >= "3.12" and python_version < "4.0" tavily-python==0.7.22 ; python_version >= "3.12" and python_version < "3.15"
synchronicity==0.10.5 ; python_version >= "3.12" and python_version < "4.0" tenacity==9.1.2 ; python_version >= "3.12" and python_version < "3.15"
tavily-python==0.7.22 ; python_version >= "3.12" and python_version < "4.0" textual-autocomplete==4.0.6 ; python_version >= "3.12" and python_version < "3.15"
tenacity==9.1.2 ; python_version >= "3.12" and python_version < "4.0" textual-speedups==0.2.1 ; python_version >= "3.12" and python_version < "3.15"
textual-autocomplete==4.0.6 ; python_version >= "3.12" and python_version < "4.0" textual==8.0.0 ; python_version >= "3.12" and python_version < "3.15"
textual==8.0.0 ; python_version >= "3.12" and python_version < "4.0" threadpoolctl==3.6.0 ; python_version >= "3.12" and python_version < "3.15"
threadpoolctl==3.6.0 ; python_version >= "3.12" and python_version < "4.0" tiktoken==0.12.0 ; python_version >= "3.12" and python_version < "3.15"
tiktoken==0.12.0 ; python_version >= "3.12" and python_version < "4.0" tokenizers==0.22.1 ; python_version >= "3.12" and python_version < "3.15"
tokenizers==0.22.1 ; python_version >= "3.12" and python_version < "4.0" tomli-w==1.2.0 ; python_version >= "3.12" and python_version < "3.15"
toml==0.10.2 ; python_version >= "3.12" and python_version < "4.0" torch==2.2.0 ; python_version >= "3.12" and python_version < "3.15"
tomli-w==1.2.0 ; python_version >= "3.12" and python_version < "4.0" tqdm==4.67.1 ; python_version >= "3.12" and python_version < "3.15"
torch==2.2.0 ; python_version >= "3.12" and python_version < "4.0" transformers==4.57.1 ; python_version >= "3.12" and python_version < "3.15"
tqdm==4.67.1 ; python_version >= "3.12" and python_version < "4.0" triton==2.2.0 ; python_version >= "3.12" and python_version < "3.15" and platform_system == "Linux" and platform_machine == "x86_64"
transformers==4.57.1 ; python_version >= "3.12" and python_version < "4.0" truststore==0.10.4 ; python_version >= "3.12" and python_version < "3.15"
triton==2.2.0 ; python_version >= "3.12" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" typing-extensions==4.15.0 ; python_version >= "3.12" and python_version < "3.15"
typer==0.20.1 ; python_version >= "3.12" and python_version < "4.0" typing-inspection==0.4.2 ; python_version >= "3.12" and python_version < "3.15"
types-certifi==2021.10.8.3 ; python_version >= "3.12" and python_version < "4.0" tzdata==2025.2 ; python_version >= "3.12" and python_version < "3.15"
types-toml==0.10.8.20240310 ; python_version >= "3.12" and python_version < "4.0" uc-micro-py==2.0.0 ; python_version >= "3.12" and python_version < "3.15"
typing-extensions==4.15.0 ; python_version >= "3.12" and python_version < "4.0" urllib3==2.5.0 ; python_version >= "3.12" and python_version < "3.15"
typing-inspection==0.4.2 ; python_version >= "3.12" and python_version < "4.0" uuid-utils==0.12.0 ; python_version >= "3.12" and python_version < "3.15"
tzdata==2025.2 ; python_version >= "3.12" and python_version < "4.0" uvicorn==0.35.0 ; python_version >= "3.12" and python_version < "3.15"
uc-micro-py==2.0.0 ; python_version >= "3.12" and python_version < "4.0" uvloop==0.22.1 ; python_version >= "3.12" and python_version < "3.15"
urllib3==2.5.0 ; python_version >= "3.12" and python_version < "4.0" watchfiles==1.1.1 ; python_version >= "3.12" and python_version < "3.15"
uuid-utils==0.12.0 ; python_version >= "3.12" and python_version < "4.0" wcmatch==10.1 ; python_version >= "3.12" and python_version < "3.15"
uvicorn==0.35.0 ; python_version >= "3.12" and python_version < "4.0" wcwidth==0.2.14 ; python_version >= "3.12" and python_version < "3.15"
uvloop==0.22.1 ; python_version >= "3.12" and python_version < "4.0" websockets==15.0.1 ; python_version >= "3.12" and python_version < "3.15"
watchfiles==1.1.1 ; python_version >= "3.12" and python_version < "4.0" wsgidav==4.3.3 ; python_version >= "3.12" and python_version < "3.15"
wcmatch==10.1 ; python_version >= "3.12" and python_version < "4.0" xlrd==2.0.2 ; python_version >= "3.12" and python_version < "3.15"
wcwidth==0.2.14 ; python_version >= "3.12" and python_version < "4.0" xxhash==3.6.0 ; python_version >= "3.12" and python_version < "3.15"
websockets==15.0.1 ; python_version >= "3.12" and python_version < "4.0" yarl==1.22.0 ; python_version >= "3.12" and python_version < "3.15"
wrapt==2.0.1 ; python_version >= "3.12" and python_version < "4.0" zipp==3.23.0 ; python_version >= "3.12" and python_version < "3.15"
wsgidav==4.3.3 ; python_version >= "3.12" and python_version < "4.0" zstandard==0.25.0 ; python_version >= "3.12" and python_version < "3.15"
xlrd==2.0.2 ; python_version >= "3.12" and python_version < "4.0"
xxhash==3.6.0 ; python_version >= "3.12" and python_version < "4.0"
yarl==1.22.0 ; python_version >= "3.12" and python_version < "4.0"
zstandard==0.25.0 ; python_version >= "3.12" and python_version < "4.0"