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 typing import Annotated, Literal, cast
from typing import Annotated, cast
import mimetypes
import warnings
from langchain.tools import ToolRuntime
from langchain_core.messages import ToolMessage
@ -15,19 +17,24 @@ from deepagents.backends import StateBackend
from deepagents.backends.composite import CompositeBackend
from deepagents.backends.protocol import (
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 (
DEFAULT_READ_OFFSET,
DEFAULT_READ_LIMIT,
IMAGE_EXTENSIONS,
IMAGE_MEDIA_TYPES,
FilesystemMiddleware,
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
import base64
from langchain_core.messages.content import create_image_block
# SKILL.md 文件的行数限制(设置为较大的值以完整读取)
@ -44,10 +51,62 @@ class CustomFilesystemMiddleware(FilesystemMiddleware):
@override
def _create_read_file_tool(self) -> BaseTool:
"""创建自定义的 read_file 工具,支持 SKILL.md 完整读取。"""
# 从父类获取工具描述
tool_description = self._custom_tool_descriptions.get("read_file") or self._get_read_file_description()
tool_description = self._custom_tool_descriptions.get("read_file") or READ_FILE_TOOL_DESCRIPTION
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(
file_path: Annotated[str, "Absolute path to the file to read. Must be absolute, not relative."],
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,
) -> ToolMessage | str:
"""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)
try:
validated_path = validate_path(file_path)
except ValueError as 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 文件,使用大限制读取完整内容
if validated_path.endswith("SKILL.md") or validated_path.endswith("/SKILL.md"):
actual_limit = SKILL_MD_READ_LIMIT
else:
actual_limit = limit
limit = SKILL_MD_READ_LIMIT
result = resolved_backend.read(validated_path, offset=offset, limit=actual_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
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)
async def async_read_file(
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,
) -> ToolMessage | str:
"""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)
try:
validated_path = validate_path(file_path)
except ValueError as 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 文件,使用大限制读取完整内容
if validated_path.endswith("SKILL.md") or validated_path.endswith("/SKILL.md"):
actual_limit = SKILL_MD_READ_LIMIT
else:
actual_limit = limit
limit = SKILL_MD_READ_LIMIT
result = await resolved_backend.aread(validated_path, offset=offset, limit=actual_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
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)
return StructuredTool.from_function(
name="read_file",
description=tool_description,
func=sync_read_file,
coroutine=async_read_file,
infer_schema=False,
args_schema=ReadFileSchema,
)
def _get_read_file_description(self) -> str:
"""获取 read_file 工具的描述,添加 SKILL.md 完整读取的说明。"""
from deepagents.middleware.filesystem import 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
backend = LocalShellBackend(
root_dir=workspace_root,
virtual_mode=False,
inherit_env=True,
env=final_shell_env,
)
else:
# 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 (参考新版本实现)
large_results_backend = FilesystemBackend(
root_dir=tempfile.mkdtemp(prefix="deepagents_large_results_"),
virtual_mode=True,
)
conversation_history_backend = FilesystemBackend(
root_dir=tempfile.mkdtemp(prefix="deepagents_conversation_history_"),
virtual_mode=True,
)
composite_backend = CompositeBackend(
default=backend,
@ -433,7 +436,7 @@ def create_custom_cli_agent(
agent_middleware.append(
CustomSkillsMiddleware(
backend=FilesystemBackend(root_dir=workspace_root),
backend=FilesystemBackend(root_dir=workspace_root, virtual_mode=True),
sources=skills_sources,
)
)

View File

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