upgrade/deepagents-0.4.4

This commit is contained in:
朱潮 2026-03-02 02:30:23 +08:00
commit 965c5f99ae
5 changed files with 1123 additions and 197 deletions

View File

@ -3,11 +3,12 @@ import logging
import time import time
import copy import copy
import os import os
import tempfile
from pathlib import Path from pathlib import Path
from typing import Any, Dict from typing import Any, Dict
from langchain.chat_models import init_chat_model from langchain.chat_models import init_chat_model
from deepagents import create_deep_agent from deepagents import create_deep_agent
from deepagents.backends import CompositeBackend from deepagents.backends import CompositeBackend, LocalShellBackend
from deepagents.backends.filesystem import FilesystemBackend from deepagents.backends.filesystem import FilesystemBackend
from deepagents.backends.sandbox import SandboxBackendProtocol from deepagents.backends.sandbox import SandboxBackendProtocol
from deepagents_cli.agent import create_cli_agent from deepagents_cli.agent import create_cli_agent
@ -42,17 +43,18 @@ from langgraph.checkpoint.memory import InMemorySaver
from langchain.tools import BaseTool from langchain.tools import BaseTool
from langchain_core.language_models import BaseChatModel from langchain_core.language_models import BaseChatModel
from langgraph.pregel import Pregel from langgraph.pregel import Pregel
from deepagents_cli.shell import ShellMiddleware # 新版本导入MemoryMiddleware 和 SkillsMiddleware 已迁移到 deepagents.middleware
from deepagents_cli.agent_memory import AgentMemoryMiddleware from deepagents.middleware import MemoryMiddleware, SkillsMiddleware
from langchain.agents.middleware import AgentMiddleware from langchain.agents.middleware import AgentMiddleware
from langgraph.types import Checkpointer from langgraph.types import Checkpointer
from deepagents_cli.skills import SkillsMiddleware
from deepagents_cli.config import settings, get_default_coding_instructions from deepagents_cli.config import settings, get_default_coding_instructions
from langchain.agents.middleware import HumanInTheLoopMiddleware, InterruptOnConfig, TodoListMiddleware from langchain.agents.middleware import HumanInTheLoopMiddleware, InterruptOnConfig, TodoListMiddleware
from deepagents.middleware.filesystem import FilesystemMiddleware from deepagents.middleware.filesystem import FilesystemMiddleware
from deepagents.middleware.patch_tool_calls import PatchToolCallsMiddleware from deepagents.middleware.patch_tool_calls import PatchToolCallsMiddleware
from langchain_anthropic.middleware import AnthropicPromptCachingMiddleware from langchain_anthropic.middleware import AnthropicPromptCachingMiddleware
from deepagents.graph import BASE_AGENT_PROMPT from deepagents.graph import BASE_AGENT_PROMPT
# 新增LocalContextMiddleware
from deepagents_cli.local_context import LocalContextMiddleware
# 全局 MemorySaver 实例 # 全局 MemorySaver 实例
# from langgraph.checkpoint.memory import MemorySaver # from langgraph.checkpoint.memory import MemorySaver
@ -261,77 +263,36 @@ async def init_agent(config: AgentConfig):
logger.info(f"create agent elapsed: {time.time() - create_start:.3f}s") logger.info(f"create agent elapsed: {time.time() - create_start:.3f}s")
return agent, checkpointer return agent, checkpointer
class CustomAgentMemoryMiddleware(AgentMemoryMiddleware): class CustomAgentMemoryMiddleware(MemoryMiddleware):
"""自定义的 AgentMemoryMiddleware修改路径显示为当前目录"""
def __init__( def __init__(
self, self,
*, *,
settings, backend: FilesystemBackend,
assistant_id: str, sources: list[str],
system_prompt_template: str | None = None,
) -> None:
super().__init__(
settings=settings,
assistant_id=assistant_id,
system_prompt_template=system_prompt_template
)
self.agent_dir_display = f"."
class CustomSkillsMiddleware(SkillsMiddleware):
def __init__(
self,
*,
skills_dir: str | Path,
assistant_id: str,
project_skills_dir: str | Path | None = None,
) -> None: ) -> None:
super().__init__( super().__init__(
skills_dir=skills_dir, backend=backend,
assistant_id=assistant_id, sources=sources,
project_skills_dir=project_skills_dir
) )
self.skills_dir = None self.agent_dir_display = f"."
self.project_skills_display = f"./skills"
def _format_skills_locations(self) -> str: def _format_memory_content(self, memories: list[dict]) -> str:
"""Format skills locations for display in system prompt.""" """Format memory content for display in system prompt.
return "**Project Skills**: `{self.project_skills_dir}`"
def _format_skills_list(self, skills) -> str: Override to use relative path display.
"""Format skills metadata for display in system prompt.""" """
if not skills: # 使用父类的默认实现,但路径显示已经是相对路径
locations = [f"{self.user_skills_display}/"] return super()._format_memory_content(memories) if hasattr(super(), '_format_memory_content') else ""
if self.project_skills_dir:
locations.append(f"{self.project_skills_display}/")
return f"(No skills available yet. You can create skills in {' or '.join(locations)})"
# Group skills by source class CustomSkillsMiddleware(SkillsMiddleware):
user_skills = [s for s in skills if s["source"] == "user"] """自定义的 SkillsMiddleware使用新的签名格式"""
project_skills = [s for s in skills if s["source"] == "project"]
lines = [] def before_agent(self, state, runtime, config):
# Show user skills
if user_skills:
lines.append("**User Skills:**")
for skill in user_skills:
lines.append(f"- **{skill['name']}**: {skill['description']}")
lines.append(f" → Read `{skill['path']}` for full instructions")
lines.append("")
# Show project skills
if project_skills:
lines.append("**Project Skills:**")
for skill in project_skills:
lines.append(f"- **{skill['name']}**: {skill['description']}")
lines.append(f" → Read `{skill['path']}` for full instructions")
return "\n".join(lines)
def before_agent(self, state, runtime):
"""Load skills metadata before agent execution. """Load skills metadata before agent execution.
This runs once at session start to discover available skills from both 修改路径显示为相对路径
user-level and project-level directories.
Args: Args:
state: Current agent state. state: Current agent state.
@ -340,12 +301,26 @@ class CustomSkillsMiddleware(SkillsMiddleware):
Returns: Returns:
Updated state with skills_metadata populated. Updated state with skills_metadata populated.
""" """
state = super().before_agent(state, runtime) if "skills_metadata" in state and len(state["skills_metadata"]) ==0 :
for item in state["skills_metadata"]: del state["skills_metadata"]
if item["source"] == "project": state = super().before_agent(state, runtime, config)
item["path"] = self.project_skills_display + item["path"].replace(str(self.project_skills_dir), "") return state
else:
item["path"] = self.user_skills_display + item["path"].replace(str(self.skills_dir), "") async def abefore_agent(self, state, runtime, config):
"""Load skills metadata before agent execution.
修改路径显示为相对路径
Args:
state: Current agent state.
runtime: Runtime context.
Returns:
Updated state with skills_metadata populated.
"""
if "skills_metadata" in state and len(state["skills_metadata"]) ==0 :
del state["skills_metadata"]
state = await super().abefore_agent(state, runtime, config)
return state return state
def create_custom_cli_agent( def create_custom_cli_agent(
@ -403,55 +378,85 @@ def create_custom_cli_agent(
# Setup agent directory for persistent memory (if enabled) # Setup agent directory for persistent memory (if enabled)
if enable_memory or enable_skills: if enable_memory or enable_skills:
agent_dir = settings.ensure_agent_dir(assistant_id) agent_dir = settings.ensure_agent_dir(assistant_id)
agent_md = agent_dir / "agent.md" agent_md = agent_dir / "AGENTS.md" # 新版本使用 AGENTS.md
if not agent_md.exists(): if not agent_md.exists():
source_content = get_default_coding_instructions() # Create empty file for user customizations
agent_md.write_text(source_content) agent_md.touch()
# Build middleware stack based on enabled features # Build middleware stack based on enabled features
agent_middleware = middleware agent_middleware = middleware
# Prepare workspace root
if workspace_root is None:
workspace_root = str(Path.cwd())
# CONDITIONAL SETUP: Local vs Remote Sandbox # CONDITIONAL SETUP: Local vs Remote Sandbox
if sandbox is None: if sandbox is None:
# ========== LOCAL MODE ========== # ========== LOCAL MODE ==========
composite_backend = CompositeBackend(
default=FilesystemBackend(root_dir=workspace_root, virtual_mode=True), # Current working directory
routes={}, # No virtualization - use real paths
)
# Add memory middleware
if enable_memory:
agent_middleware.append(
CustomAgentMemoryMiddleware(settings=settings, assistant_id=assistant_id)
)
# Add skills middleware
if enable_skills:
agent_middleware.append(
CustomSkillsMiddleware(
skills_dir=workspace_root,
project_skills_dir=workspace_root+"/skills",
assistant_id=assistant_id
)
)
# Add shell middleware (only in local mode)
if enable_shell: if enable_shell:
# Create environment for shell commands # Create environment for shell commands
# Start with a copy of current environment
final_shell_env = os.environ.copy() final_shell_env = os.environ.copy()
# Merge custom environment variables if provided (custom vars take precedence)
if shell_env: if shell_env:
final_shell_env.update(shell_env) final_shell_env.update(shell_env)
# Use custom workspace_root if provided, otherwise use current directory
shell_workspace = workspace_root if workspace_root is not None else str(Path.cwd()) # Use LocalShellBackend for filesystem + shell execution
backend = LocalShellBackend(
root_dir=workspace_root,
virtual_mode=True,
inherit_env=True,
env=final_shell_env,
)
else:
# No shell access - use plain FilesystemBackend
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,
routes={
"/large_tool_results/": large_results_backend,
"/conversation_history/": conversation_history_backend,
},
)
# Add memory middleware (using new signature)
if enable_memory:
memory_sources = [str(settings.get_user_agent_md_path(assistant_id))]
memory_sources.extend(str(p) for p in settings.get_project_agent_md_path())
agent_middleware.append( agent_middleware.append(
ShellMiddleware( CustomAgentMemoryMiddleware(
workspace_root=shell_workspace, backend=FilesystemBackend(root_dir=workspace_root, virtual_mode=True),
env=final_shell_env, sources=memory_sources,
) )
) )
# Add skills middleware (using new signature)
if enable_skills:
skills_sources = ["./skills"]
agent_middleware.append(
CustomSkillsMiddleware(
backend=FilesystemBackend(root_dir=workspace_root, virtual_mode=True),
sources=skills_sources,
)
)
# Add LocalContextMiddleware (new in latest version)
# Check if backend supports execute (is _ExecutableBackend)
if enable_shell:
from deepagents_cli.local_context import LocalContextMiddleware, _ExecutableBackend
if isinstance(backend, _ExecutableBackend):
agent_middleware.append(LocalContextMiddleware(backend=backend))
else: else:
# ========== REMOTE SANDBOX MODE ========== # ========== REMOTE SANDBOX MODE ==========
composite_backend = CompositeBackend( composite_backend = CompositeBackend(
@ -461,17 +466,24 @@ def create_custom_cli_agent(
# Add memory middleware # Add memory middleware
if enable_memory: if enable_memory:
memory_sources = [str(settings.get_user_agent_md_path(assistant_id))]
memory_sources.extend(str(p) for p in settings.get_project_agent_md_path())
agent_middleware.append( agent_middleware.append(
CustomAgentMemoryMiddleware(settings=settings, assistant_id=assistant_id) CustomAgentMemoryMiddleware(
backend=sandbox,
sources=memory_sources,
)
) )
# Add skills middleware # Add skills middleware
if enable_skills: if enable_skills:
skills_sources = ["/skills"]
agent_middleware.append( agent_middleware.append(
CustomSkillsMiddleware( CustomSkillsMiddleware(
skills_dir=workspace_root, backend=sandbox,
project_skills_dir=workspace_root+"/skills", sources=skills_sources,
assistant_id=assistant_id
) )
) )
@ -480,19 +492,15 @@ def create_custom_cli_agent(
# Get or use custom system prompt # Get or use custom system prompt
if system_prompt is None: if system_prompt is None:
# Import get_system_prompt from deepagents_cli.agent
from deepagents_cli.agent import get_system_prompt as _get_system_prompt from deepagents_cli.agent import get_system_prompt as _get_system_prompt
system_prompt = _get_system_prompt(assistant_id=assistant_id, sandbox_type=sandbox_type) system_prompt = _get_system_prompt(assistant_id=assistant_id, sandbox_type=sandbox_type)
# Import InterruptOnConfig
from langchain.agents.middleware import InterruptOnConfig
# Configure interrupt_on based on auto_approve setting # Configure interrupt_on based on auto_approve setting
if auto_approve: if auto_approve:
# No interrupts - all tools run automatically # No interrupts - all tools run automatically
interrupt_on = {} interrupt_on = {}
else: else:
# Full HITL for destructive operations - import from deepagents_cli.agent # Full HITL for destructive operations
from deepagents_cli.agent import _add_interrupt_on from deepagents_cli.agent import _add_interrupt_on
interrupt_on = _add_interrupt_on() interrupt_on = _add_interrupt_on()
@ -502,8 +510,8 @@ def create_custom_cli_agent(
AnthropicPromptCachingMiddleware(unsupported_model_behavior="ignore"), AnthropicPromptCachingMiddleware(unsupported_model_behavior="ignore"),
PatchToolCallsMiddleware(), PatchToolCallsMiddleware(),
] ]
if middleware: if agent_middleware:
deepagent_middleware.extend(middleware) deepagent_middleware.extend(agent_middleware)
if interrupt_on is not None: if interrupt_on is not None:
deepagent_middleware.append(HumanInTheLoopMiddleware(interrupt_on=interrupt_on)) deepagent_middleware.append(HumanInTheLoopMiddleware(interrupt_on=interrupt_on))

372
plans/deepagents-upgrade.md Normal file
View File

@ -0,0 +1,372 @@
# DeepAgents 依赖升级计划
## 概述
将 qwen-agent 项目中的 deepagents 和 deepagents-cli 依赖升级到最新版本同时保留自定义功能workspace_root、shell_env、自定义中间件等
## 问题背景
### 当前版本
| 包名 | 当前版本 | 最新版本 |
|------|---------|---------|
| deepagents | 0.2.8 | 0.4.4 |
| deepagents-cli | 0.0.11 | 0.0.25 |
### 自定义改造
项目中 `agent/deep_assistant.py:351-518``create_custom_cli_agent` 函数基于 deepagents-cli 的 `create_cli_agent` 进行了以下改造:
1. **workspace_root 参数** - 自定义工作目录为 `projects/robot/{bot_id}`
2. **shell_env 参数** - 传递上下文环境变量ASSISTANT_ID, USER_IDENTIFIER, TRACE_ID
3. **middleware 参数** - 支持外部传入自定义中间件列表
4. **checkpointer 参数** - 支持外部传入 PostgreSQL checkpointer
5. **store 参数** - 支持外部传入 store
6. **CustomAgentMemoryMiddleware** - 修改路径显示为 `./`
7. **CustomSkillsMiddleware** - 修改技能路径显示
### API 变更对比
| 参数 | 0.0.11 (当前) | 0.0.25 (最新) | 影响 |
|------|--------------|--------------|------|
| workspace_root | 支持(自定义添加) | 不支持 | Critical |
| shell_env | 支持(自定义添加) | 不支持 | Critical |
| middleware | 支持(自定义添加) | 不支持 | Critical |
| checkpointer | 支持外部传入 | 内部创建 InMemorySaver | Critical |
| store | 支持 | 不支持 | Important |
| enable_shell | 支持 | 支持 | 兼容 |
| sandbox_type | 支持 | 支持 | 兼容 |
## 模块迁移对照表(重要变更)
> ⚠️ **关键发现**:多个模块已从 `deepagents_cli` 迁移到 `deepagents`
| 模块/类名 | 旧位置 (0.0.11) | 新位置 (0.0.25) | 变更说明 |
|-----------|----------------|----------------|---------|
| `ShellMiddleware` | `deepagents_cli.shell` | **已删除** | 被 `LocalShellBackend` 替代 |
| `AgentMemoryMiddleware` | `deepagents_cli.agent_memory` | `deepagents.middleware.memory.MemoryMiddleware` | 改名为 `MemoryMiddleware` |
| `SkillsMiddleware` | `deepagents_cli.skills` | `deepagents.middleware.skills` | 迁移到 SDK |
| `settings` | `deepagents_cli.config` | `deepagents_cli.config` | 无变化 |
| `get_default_coding_instructions` | `deepagents_cli.config` | `deepagents_cli.config` | 无变化 |
| `create_cli_agent` | `deepagents_cli.agent` | `deepagents_cli.agent` | 无变化 |
### LocalShellBackend 替代 ShellMiddleware
`ShellMiddleware` 已被 `LocalShellBackend` 替代。新版本的 `LocalShellBackend` 同时提供文件系统操作和 shell 执行功能:
```python
from deepagents.backends import LocalShellBackend
# 创建 backend支持自定义环境变量
backend = LocalShellBackend(
root_dir=workspace_root,
virtual_mode=True,
env={"ASSISTANT_ID": "xxx", "USER_IDENTIFIER": "yyy"}, # 自定义环境变量
inherit_env=True, # 继承父进程环境变量
)
```
**参数说明**
- `root_dir`: 工作目录
- `virtual_mode`: 虚拟路径模式
- `env`: 自定义环境变量字典
- `inherit_env`: 是否继承 `os.environ`
## 推荐方案Fork 并修改
复制最新版本的 `create_cli_agent` 源代码,在其基础上添加缺失的参数支持。
### 原因
1. **保持控制力** - 完全控制 agent 创建过程,不受上游 API 变更影响
2. **复用新功能** - 基于新版本代码,获得 bug 修复和性能改进
3. **维护成本适中** - 只需在版本升级时同步上游变更
4. **风险可控** - 可以逐步验证每个功能
## 技术考虑
### 1. FilesystemBackend 的 root_dir 支持
**最新版本确认**`FilesystemBackend` 仍然支持 `root_dir` 参数
```python
# 当前实现
composite_backend = CompositeBackend(
default=FilesystemBackend(root_dir=workspace_root, virtual_mode=True),
routes={},
)
```
**结论**:可以直接复用,无需修改。
### 2. Shell 环境变量支持(重大变更)
**原实现**(使用 ShellMiddleware
```python
from deepagents_cli.shell import ShellMiddleware
agent_middleware.append(
ShellMiddleware(
workspace_root=workspace_root,
env=final_shell_env,
)
)
```
**新实现**(使用 LocalShellBackend
```python
from deepagents.backends import LocalShellBackend
# 创建带自定义环境变量的 backend
shell_backend = LocalShellBackend(
root_dir=workspace_root,
virtual_mode=True,
env=shell_env,
inherit_env=True,
)
# 或使用 CompositeBackend 路由
composite_backend = CompositeBackend(
default=FilesystemBackend(root_dir=workspace_root, virtual_mode=True),
routes={
"/shell/": shell_backend, # shell 命令路由
},
)
```
**结论**:需要修改 shell 环境变量的传递方式。
### 3. checkpointer 管理
**问题**:最新版本在 `create_deep_agent` 中硬编码 `InMemorySaver`
**解决方案**:在自定义的 `create_custom_cli_agent` 中保留外部传入 checkpointer 的能力。
### 4. 中间件兼容性
需要验证以下自定义中间件与最新版本的兼容性:
- `CustomAgentMemoryMiddleware` - 父类已从 `AgentMemoryMiddleware` 改名为 `MemoryMiddleware`
- `CustomSkillsMiddleware` - 父类 `SkillsMiddleware` 已迁移到 `deepagents.middleware.skills`
## 实施步骤
### Phase 1: 准备工作
- [ ] 创建升级分支 `git checkout -b upgrade/deepagents-0.4.4`
- [ ] 备份当前 `agent/deep_assistant.py`
- [ ] 更新 pyproject.toml 中的依赖版本
```
deepagents = ">=0.4.4,<0.5.0"
deepagents-cli = ">=0.0.25,<0.0.26"
```
- [ ] 执行 `poetry install` 安装新版本
- [ ] 执行 `poetry export -f requirements.txt -o requirements.txt --without-hashes`
### Phase 2: 更新导入语句
根据模块迁移对照表,更新 `agent/deep_assistant.py` 中的导入:
```python
# === 需要修改的导入 ===
# 旧from deepagents_cli.shell import ShellMiddleware
# 新:不再使用 ShellMiddleware改用 LocalShellBackend
from deepagents.backends import LocalShellBackend
# 旧from deepagents_cli.agent_memory import AgentMemoryMiddleware
# 新from deepagents.middleware import MemoryMiddleware
from deepagents.middleware import MemoryMiddleware
# 旧from deepagents_cli.skills import SkillsMiddleware
# 新:
from deepagents.middleware import SkillsMiddleware
# === 无需修改的导入 ===
from deepagents_cli.config import settings, get_default_coding_instructions
from deepagents_cli.agent import create_cli_agent
```
### Phase 3: 适配 LocalShellBackend
修改 shell 环境变量的传递方式:
```python
# 原代码(使用 ShellMiddleware
if enable_shell:
final_shell_env = os.environ.copy()
if shell_env:
final_shell_env.update(shell_env)
agent_middleware.append(
ShellMiddleware(
workspace_root=workspace_root,
env=final_shell_env,
)
)
# 新代码(使用 LocalShellBackend
if enable_shell:
final_shell_env = shell_env or {}
shell_backend = LocalShellBackend(
root_dir=workspace_root,
virtual_mode=True,
env=final_shell_env,
inherit_env=True, # 继承 os.environ
)
# 将 shell_backend 传入 CompositeBackend 或作为 sandbox 参数
```
### Phase 4: 适配自定义中间件
更新 `CustomAgentMemoryMiddleware``CustomSkillsMiddleware` 的父类:
```python
# 旧代码
from deepagents_cli.agent_memory import AgentMemoryMiddleware
from deepagents_cli.skills import SkillsMiddleware
class CustomAgentMemoryMiddleware(AgentMemoryMiddleware):
...
class CustomSkillsMiddleware(SkillsMiddleware):
...
# 新代码
from deepagents.middleware import MemoryMiddleware, SkillsMiddleware
class CustomAgentMemoryMiddleware(MemoryMiddleware):
...
class CustomSkillsMiddleware(SkillsMiddleware):
...
```
**注意**:需要检查新版本的 `MemoryMiddleware``SkillsMiddleware` 的构造函数签名是否有变化。
### Phase 5: 测试
- [ ] 单元测试
```bash
poetry run pytest tests/test_deep_assistant.py -v
```
- [ ] 集成测试
```bash
# 启动服务
poetry run uvicorn fastapi_app:app --host 0.0.0.0 --port 8001
# 执行测试请求
curl --request POST \
--url http://localhost:8001/api/v2/chat/completions \
--header 'authorization: Bearer test' \
--header 'content-type: application/json' \
--data '{
"messages": [{"role": "user", "content": "你好"}],
"stream": true,
"model": "whatever",
"bot_id": "test-bot",
"session_id": "test-session"
}'
```
- [ ] 功能验证
- [ ] 文件隔离:验证不同 bot_id 的文件不互相干扰
- [ ] 环境变量:验证 shell 命令中可以访问 ASSISTANT_ID 等
- [ ] 中间件:验证自定义中间件正常执行
- [ ] 会话持久化:验证 session_id 恢复对话正常
## 风险分析
### 高风险
| 风险 | 影响 | 缓解措施 |
|------|------|---------|
| API 不兼容 | 编译失败 | 逐步升级,逐个验证 |
| 功能丢失 | 业务中断 | 保留旧版本代码,快速回滚 |
| checkpointer 不兼容 | 会话丢失 | 先在测试环境验证 |
| LocalShellBackend 行为差异 | shell 执行异常 | 详细测试 shell 功能 |
### 中风险
| 风险 | 影响 | 缓解措施 |
|------|------|---------|
| 中间件不兼容 | 功能异常 | 单独测试每个中间件 |
| 性能下降 | 响应变慢 | 压力测试对比 |
| 路径显示异常 | 用户困惑 | 视觉验证 |
| MemoryMiddleware 签名变更 | 编译失败 | 检查新签名并适配 |
## 回滚策略
### 快速回滚5分钟
```bash
# 1. 切换回主分支
git checkout master
# 2. 恢复依赖
poetry install
# 3. 重启服务
pkill -f "uvicorn fastapi_app:app"
poetry run uvicorn fastapi_app:app --host 0.0.0.0 --port 8001
```
### 数据回滚
如果 checkpointer 数据不兼容:
```bash
# 恢复到升级前的数据库备份
pg_restore -d qwen_agent backup_before_upgrade.dump
```
## 成功<E68890><E58A9F>
- [ ] 所有现有功能正常工作
- [ ] 性能无明显下降(响应时间 < 2s
- [ ] 错误率 < 0.1%
- [ ] 用户无感知升级
## 参考资源
### 内部文件
- `agent/deep_assistant.py:351-518` - 当前 create_custom_cli_agent 实现
- `agent/deep_assistant.py:242-259` - workspace_root 使用
- `agent/deep_assistant.py:45-50` - 当前导入语句
- `pyproject.toml:29` - deepagents 版本约束
- `pyproject.toml:34` - deepagents-cli 版本约束
### 外部资源
- [deepagents GitHub](https://github.com/langchain-ai/deepagents)
- [deepagents 官方文档](https://docs.langchain.com/oss/python/deepagents)
- 本地克隆仓库:`/Users/moshui/Documents/felo/deepagents`
### 关键源文件(本地克隆)
| 文件 | 用途 |
|------|------|
| `libs/cli/deepagents_cli/agent.py` | 最新 create_cli_agent |
| `libs/deepagents/deepagents/backends/local_shell.py` | LocalShellBackend替代 ShellMiddleware |
| `libs/deepagents/deepagents/middleware/memory.py` | MemoryMiddleware原 AgentMemoryMiddleware |
| `libs/deepagents/deepagents/middleware/skills.py` | SkillsMiddleware |
| `libs/deepagents/deepagents/middleware/__init__.py` | 中间件导出 |
| `libs/deepagents/deepagents/backends/__init__.py` | Backend 导出 |
| `libs/cli/deepagents_cli/config.py` | settings, get_default_coding_instructions |
## 变更检查清单
升级前需要确认的关键变更:
- [ ] `ShellMiddleware``LocalShellBackend` 替代方案
- [ ] `AgentMemoryMiddleware``MemoryMiddleware` 命名变更
- [ ] `SkillsMiddleware` 导入路径变更
- [ ] `LocalShellBackend``env``inherit_env` 参数使用
- [ ] `MemoryMiddleware` 新签名适配
- [ ] `SkillsMiddleware` 新签名适配
---
**创建时间**: 2026-03-02
**状态**: 已完成

663
poetry.lock generated
View File

@ -197,6 +197,22 @@ files = [
frozenlist = ">=1.1.0" frozenlist = ">=1.1.0"
typing-extensions = {version = ">=4.2", markers = "python_version < \"3.13\""} typing-extensions = {version = ">=4.2", markers = "python_version < \"3.13\""}
[[package]]
name = "aiosqlite"
version = "0.22.1"
description = "asyncio bridge to the standard sqlite3 module"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
{file = "aiosqlite-0.22.1-py3-none-any.whl", hash = "sha256:21c002eb13823fad740196c5a2e9d8e62f6243bd9e7e4a1f87fb5e44ecb4fceb"},
{file = "aiosqlite-0.22.1.tar.gz", hash = "sha256:043e0bd78d32888c0a9ca90fc788b38796843360c855a7262a532813133a0650"},
]
[package.extras]
dev = ["attribution (==1.8.0)", "black (==25.11.0)", "build (>=1.2)", "coverage[toml] (==7.10.7)", "flake8 (==7.3.0)", "flake8-bugbear (==24.12.12)", "flit (==3.12.0)", "mypy (==1.19.0)", "ufmt (==2.8.0)", "usort (==1.0.8.post1)"]
docs = ["sphinx (==8.1.3)", "sphinx-mdinclude (==0.6.2)"]
[[package]] [[package]]
name = "annotated-types" name = "annotated-types"
version = "0.7.0" version = "0.7.0"
@ -211,14 +227,14 @@ files = [
[[package]] [[package]]
name = "anthropic" name = "anthropic"
version = "0.75.0" version = "0.84.0"
description = "The official Python library for the anthropic API" description = "The official Python library for the anthropic API"
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "anthropic-0.75.0-py3-none-any.whl", hash = "sha256:ea8317271b6c15d80225a9f3c670152746e88805a7a61e14d4a374577164965b"}, {file = "anthropic-0.84.0-py3-none-any.whl", hash = "sha256:861c4c50f91ca45f942e091d83b60530ad6d4f98733bfe648065364da05d29e7"},
{file = "anthropic-0.75.0.tar.gz", hash = "sha256:e8607422f4ab616db2ea5baacc215dd5f028da99ce2f022e33c7c535b29f3dfb"}, {file = "anthropic-0.84.0.tar.gz", hash = "sha256:72f5f90e5aebe62dca316cb013629cfa24996b0f5a4593b8c3d712bc03c43c37"},
] ]
[package.dependencies] [package.dependencies]
@ -234,6 +250,7 @@ typing-extensions = ">=4.10,<5"
[package.extras] [package.extras]
aiohttp = ["aiohttp", "httpx-aiohttp (>=0.1.9)"] aiohttp = ["aiohttp", "httpx-aiohttp (>=0.1.9)"]
bedrock = ["boto3 (>=1.28.57)", "botocore (>=1.31.57)"] bedrock = ["boto3 (>=1.28.57)", "botocore (>=1.31.57)"]
mcp = ["mcp (>=1.0) ; python_version >= \"3.10\""]
vertex = ["google-auth[requests] (>=2,<3)"] vertex = ["google-auth[requests] (>=2,<3)"]
[[package]] [[package]]
@ -419,6 +436,104 @@ files = [
{file = "certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43"}, {file = "certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43"},
] ]
[[package]]
name = "cffi"
version = "2.0.0"
description = "Foreign Function Interface for Python calling C code."
optional = false
python-versions = ">=3.9"
groups = ["main"]
markers = "platform_python_implementation != \"PyPy\""
files = [
{file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"},
{file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"},
{file = "cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c"},
{file = "cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb"},
{file = "cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0"},
{file = "cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4"},
{file = "cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453"},
{file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495"},
{file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5"},
{file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb"},
{file = "cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a"},
{file = "cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739"},
{file = "cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe"},
{file = "cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c"},
{file = "cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92"},
{file = "cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93"},
{file = "cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5"},
{file = "cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664"},
{file = "cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26"},
{file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9"},
{file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414"},
{file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743"},
{file = "cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5"},
{file = "cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5"},
{file = "cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d"},
{file = "cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d"},
{file = "cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c"},
{file = "cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe"},
{file = "cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062"},
{file = "cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e"},
{file = "cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037"},
{file = "cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba"},
{file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94"},
{file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187"},
{file = "cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18"},
{file = "cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5"},
{file = "cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6"},
{file = "cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb"},
{file = "cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca"},
{file = "cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b"},
{file = "cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b"},
{file = "cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2"},
{file = "cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3"},
{file = "cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26"},
{file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c"},
{file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b"},
{file = "cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27"},
{file = "cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75"},
{file = "cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91"},
{file = "cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5"},
{file = "cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13"},
{file = "cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b"},
{file = "cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c"},
{file = "cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef"},
{file = "cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775"},
{file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205"},
{file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1"},
{file = "cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f"},
{file = "cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25"},
{file = "cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad"},
{file = "cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9"},
{file = "cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d"},
{file = "cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c"},
{file = "cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8"},
{file = "cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc"},
{file = "cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592"},
{file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512"},
{file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4"},
{file = "cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e"},
{file = "cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6"},
{file = "cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9"},
{file = "cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf"},
{file = "cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7"},
{file = "cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c"},
{file = "cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165"},
{file = "cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534"},
{file = "cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f"},
{file = "cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63"},
{file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2"},
{file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65"},
{file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322"},
{file = "cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a"},
{file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"},
{file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"},
]
[package.dependencies]
pycparser = {version = "*", markers = "implementation_name != \"PyPy\""}
[[package]] [[package]]
name = "chardet" name = "chardet"
version = "5.2.0" version = "5.2.0"
@ -582,6 +697,78 @@ files = [
] ]
markers = {main = "platform_system == \"Windows\"", dev = "sys_platform == \"win32\""} markers = {main = "platform_system == \"Windows\"", dev = "sys_platform == \"win32\""}
[[package]]
name = "cryptography"
version = "46.0.5"
description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
optional = false
python-versions = "!=3.9.0,!=3.9.1,>=3.8"
groups = ["main"]
files = [
{file = "cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad"},
{file = "cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b"},
{file = "cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b"},
{file = "cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263"},
{file = "cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d"},
{file = "cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed"},
{file = "cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2"},
{file = "cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2"},
{file = "cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0"},
{file = "cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731"},
{file = "cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82"},
{file = "cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1"},
{file = "cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48"},
{file = "cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4"},
{file = "cryptography-46.0.5-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:94a76daa32eb78d61339aff7952ea819b1734b46f73646a07decb40e5b3448e2"},
{file = "cryptography-46.0.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5be7bf2fb40769e05739dd0046e7b26f9d4670badc7b032d6ce4db64dddc0678"},
{file = "cryptography-46.0.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe346b143ff9685e40192a4960938545c699054ba11d4f9029f94751e3f71d87"},
{file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c69fd885df7d089548a42d5ec05be26050ebcd2283d89b3d30676eb32ff87dee"},
{file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:8293f3dea7fc929ef7240796ba231413afa7b68ce38fd21da2995549f5961981"},
{file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:1abfdb89b41c3be0365328a410baa9df3ff8a9110fb75e7b52e66803ddabc9a9"},
{file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d66e421495fdb797610a08f43b05269e0a5ea7f5e652a89bfd5a7d3c1dee3648"},
{file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:4e817a8920bfbcff8940ecfd60f23d01836408242b30f1a708d93198393a80b4"},
{file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:68f68d13f2e1cb95163fa3b4db4bf9a159a418f5f6e7242564fc75fcae667fd0"},
{file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a3d1fae9863299076f05cb8a778c467578262fae09f9dc0ee9b12eb4268ce663"},
{file = "cryptography-46.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4143987a42a2397f2fc3b4d7e3a7d313fbe684f67ff443999e803dd75a76826"},
{file = "cryptography-46.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7d731d4b107030987fd61a7f8ab512b25b53cef8f233a97379ede116f30eb67d"},
{file = "cryptography-46.0.5-cp314-cp314t-win32.whl", hash = "sha256:c3bcce8521d785d510b2aad26ae2c966092b7daa8f45dd8f44734a104dc0bc1a"},
{file = "cryptography-46.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:4d8ae8659ab18c65ced284993c2265910f6c9e650189d4e3f68445ef82a810e4"},
{file = "cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31"},
{file = "cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18"},
{file = "cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235"},
{file = "cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a"},
{file = "cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76"},
{file = "cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614"},
{file = "cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229"},
{file = "cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1"},
{file = "cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d"},
{file = "cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c"},
{file = "cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4"},
{file = "cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9"},
{file = "cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72"},
{file = "cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595"},
{file = "cryptography-46.0.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:3b4995dc971c9fb83c25aa44cf45f02ba86f71ee600d81091c2f0cbae116b06c"},
{file = "cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bc84e875994c3b445871ea7181d424588171efec3e185dced958dad9e001950a"},
{file = "cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2ae6971afd6246710480e3f15824ed3029a60fc16991db250034efd0b9fb4356"},
{file = "cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d861ee9e76ace6cf36a6a89b959ec08e7bc2493ee39d07ffe5acb23ef46d27da"},
{file = "cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:2b7a67c9cd56372f3249b39699f2ad479f6991e62ea15800973b956f4b73e257"},
{file = "cryptography-46.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8456928655f856c6e1533ff59d5be76578a7157224dbd9ce6872f25055ab9ab7"},
{file = "cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d"},
]
[package.dependencies]
cffi = {version = ">=2.0.0", markers = "python_full_version >= \"3.9.0\" and platform_python_implementation != \"PyPy\""}
[package.extras]
docs = ["sphinx (>=5.3.0)", "sphinx-inline-tabs", "sphinx-rtd-theme (>=3.0.0)"]
docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"]
nox = ["nox[uv] (>=2024.4.15)"]
pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.14)", "ruff (>=0.11.11)"]
sdist = ["build (>=1.0.0)"]
ssh = ["bcrypt (>=3.1.5)"]
test = ["certifi (>=2024)", "cryptography-vectors (==46.0.5)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"]
test-randomorder = ["pytest-randomly"]
[[package]] [[package]]
name = "daytona" name = "daytona"
version = "0.127.0" version = "0.127.0"
@ -687,48 +874,77 @@ urllib3 = ">=2.1.0,<3.0.0"
[[package]] [[package]]
name = "deepagents" name = "deepagents"
version = "0.2.8" version = "0.4.3"
description = "General purpose 'deep agent' with sub-agent spawning, todo list capabilities, and mock file system. Built on LangGraph." description = "General purpose 'deep agent' with sub-agent spawning, todo list capabilities, and mock file system. Built on LangGraph."
optional = false optional = false
python-versions = "<4.0,>=3.11" python-versions = "<4.0,>=3.11"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "deepagents-0.2.8-py3-none-any.whl", hash = "sha256:d4c3d0df074be5e10f3a17005e68db3df18b3d51f48aca3e299d87c254fda797"}, {file = "deepagents-0.4.3-py3-none-any.whl", hash = "sha256:298d19c5c0b4c6fc6a74b68049a7bfea0ba481aece7201ab21e7172b71ee61b9"},
{file = "deepagents-0.2.8.tar.gz", hash = "sha256:5fbf7f0db06b923409b79a6598784e0e9925958efabd4b702eed9238b459ae09"}, {file = "deepagents-0.4.3.tar.gz", hash = "sha256:88033c616c5ea481f2620dbb2d05533bc8fdcd48f376d713f9dba49a8157b6f8"},
] ]
[package.dependencies] [package.dependencies]
langchain = ">=1.0.2,<2.0.0" langchain = ">=1.2.10,<2.0.0"
langchain-anthropic = ">=1.0.0,<2.0.0" langchain-anthropic = ">=1.3.3,<2.0.0"
langchain-core = ">=1.0.0,<2.0.0" langchain-core = ">=1.2.10,<2.0.0"
langchain-google-genai = ">=4.2.0,<5.0.0"
wcmatch = "*" wcmatch = "*"
[[package]] [[package]]
name = "deepagents-cli" name = "deepagents-cli"
version = "0.0.11" version = "0.0.25"
description = "Deepagents CLI" description = "Terminal interface for Deep Agents - interactive AI agent with file operations, shell access, and sub-agent capabilities."
optional = false optional = false
python-versions = "<4.0,>=3.11" python-versions = "<4.0,>=3.11"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "deepagents_cli-0.0.11-py3-none-any.whl", hash = "sha256:40f6ab9727a31130d4313344a3fa4680ab75cb1c68aba400bddd5cf8a9fe891d"}, {file = "deepagents_cli-0.0.25-py3-none-any.whl", hash = "sha256:2dafc1c051ddf5fec841fa69c4300c75b89a1d3923dad108186dcddb2f02f2f5"},
{file = "deepagents_cli-0.0.11.tar.gz", hash = "sha256:1429f25000575b8af3baed247d79340199b94a07b1fb5f1290aa33f1ed302902"}, {file = "deepagents_cli-0.0.25.tar.gz", hash = "sha256:480e3396d23c2c8bf925ce1060729f76f62b5aea820dee995095017d56ce9793"},
] ]
[package.dependencies] [package.dependencies]
daytona = ">=0.113.0" aiosqlite = ">=0.19.0,<1.0.0"
deepagents = "0.2.8" daytona = ">=0.113.0,<1.0.0"
langchain = ">=1.0.7" deepagents = "0.4.3"
langchain-openai = ">=0.1.0" langchain = ">=1.2.10,<2.0.0"
markdownify = ">=0.13.0" langchain-openai = ">=1.1.8,<2.0.0"
modal = ">=0.65.0" langgraph-checkpoint-sqlite = ">=3.0.0,<4.0.0"
pillow = ">=10.0.0" langsmith = ">=0.6.6"
prompt-toolkit = ">=3.0.52" markdownify = ">=0.13.0,<2.0.0"
python-dotenv = "*" modal = ">=0.65.0,<2.0.0"
requests = "*" pillow = ">=10.0.0,<13.0.0"
rich = ">=13.0.0" prompt-toolkit = ">=3.0.52,<4.0.0"
pyperclip = ">=1.11.0,<2.0.0"
python-dotenv = ">=1.0.0,<2.0.0"
pyyaml = ">=6.0.0"
requests = ">=2.0.0,<3.0.0"
rich = ">=14.0.0,<15.0.0"
runloop-api-client = ">=0.69.0" runloop-api-client = ">=0.69.0"
tavily-python = "*" tavily-python = ">=0.7.21,<1.0.0"
textual = ">=8.0.0,<9.0.0"
textual-autocomplete = ">=3.0.0,<5.0.0"
tomli-w = ">=1.0.0,<2.0.0"
[package.extras]
all-providers = ["langchain-anthropic (>=1.0.0,<2.0.0)", "langchain-aws (>=1.0.0,<2.0.0)", "langchain-cohere (>=0.5.0,<1.0.0)", "langchain-deepseek (>=1.0.0,<2.0.0)", "langchain-fireworks (>=1.0.0,<2.0.0)", "langchain-google-genai (>=4.0.0,<5.0.0)", "langchain-google-vertexai (>=3.0.0,<4.0.0)", "langchain-groq (>=1.0.0,<2.0.0)", "langchain-huggingface (>=1.0.0,<2.0.0)", "langchain-ibm (>=1.0.0,<2.0.0)", "langchain-mistralai (>=1.0.0,<2.0.0)", "langchain-nvidia-ai-endpoints (>=1.0.0,<2.0.0)", "langchain-ollama (>=1.0.0,<2.0.0)", "langchain-openai (>=1.1.8,<2.0.0)", "langchain-openrouter (>=0.0.1,<2.0.0)", "langchain-perplexity (>=1.0.0,<2.0.0)", "langchain-xai (>=1.0.0,<2.0.0)"]
anthropic = ["langchain-anthropic (>=1.0.0,<2.0.0)"]
bedrock = ["langchain-aws (>=1.0.0,<2.0.0)"]
cohere = ["langchain-cohere (>=0.5.0,<1.0.0)"]
deepseek = ["langchain-deepseek (>=1.0.0,<2.0.0)"]
fireworks = ["langchain-fireworks (>=1.0.0,<2.0.0)"]
google-genai = ["langchain-google-genai (>=4.0.0,<5.0.0)"]
groq = ["langchain-groq (>=1.0.0,<2.0.0)"]
huggingface = ["langchain-huggingface (>=1.0.0,<2.0.0)"]
ibm = ["langchain-ibm (>=1.0.0,<2.0.0)"]
mistralai = ["langchain-mistralai (>=1.0.0,<2.0.0)"]
nvidia = ["langchain-nvidia-ai-endpoints (>=1.0.0,<2.0.0)"]
ollama = ["langchain-ollama (>=1.0.0,<2.0.0)"]
openai = ["langchain-openai (>=1.1.8,<2.0.0)"]
openrouter = ["langchain-openrouter (>=0.0.1,<2.0.0)"]
perplexity = ["langchain-perplexity (>=1.0.0,<2.0.0)"]
vertexai = ["langchain-google-vertexai (>=3.0.0,<4.0.0)"]
xai = ["langchain-xai (>=1.0.0,<2.0.0)"]
[[package]] [[package]]
name = "deprecated" name = "deprecated"
@ -844,6 +1060,18 @@ files = [
{file = "filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4"}, {file = "filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4"},
] ]
[[package]]
name = "filetype"
version = "1.2.0"
description = "Infer file type and MIME type of any file/buffer. No external dependencies."
optional = false
python-versions = "*"
groups = ["main"]
files = [
{file = "filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25"},
{file = "filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb"},
]
[[package]] [[package]]
name = "frozenlist" name = "frozenlist"
version = "1.8.0" version = "1.8.0"
@ -1024,6 +1252,63 @@ test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask[dataframe,test]", "moto
test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard ; python_version < \"3.14\""] test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard ; python_version < \"3.14\""]
tqdm = ["tqdm"] tqdm = ["tqdm"]
[[package]]
name = "google-auth"
version = "2.48.0"
description = "Google Authentication Library"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "google_auth-2.48.0-py3-none-any.whl", hash = "sha256:2e2a537873d449434252a9632c28bfc268b0adb1e53f9fb62afc5333a975903f"},
{file = "google_auth-2.48.0.tar.gz", hash = "sha256:4f7e706b0cd3208a3d940a19a822c37a476ddba5450156c3e6624a71f7c841ce"},
]
[package.dependencies]
cryptography = ">=38.0.3"
pyasn1-modules = ">=0.2.1"
requests = {version = ">=2.20.0,<3.0.0", optional = true, markers = "extra == \"requests\""}
rsa = ">=3.1.4,<5"
[package.extras]
aiohttp = ["aiohttp (>=3.6.2,<4.0.0)", "requests (>=2.20.0,<3.0.0)"]
cryptography = ["cryptography (>=38.0.3)"]
enterprise-cert = ["pyopenssl"]
pyjwt = ["pyjwt (>=2.0)"]
pyopenssl = ["pyopenssl (>=20.0.0)"]
reauth = ["pyu2f (>=0.1.5)"]
requests = ["requests (>=2.20.0,<3.0.0)"]
testing = ["aiohttp (<3.10.0)", "aiohttp (>=3.6.2,<4.0.0)", "aioresponses", "flask", "freezegun", "grpcio", "oauth2client", "packaging", "pyjwt (>=2.0)", "pyopenssl (<24.3.0)", "pyopenssl (>=20.0.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-localserver", "pyu2f (>=0.1.5)", "requests (>=2.20.0,<3.0.0)", "responses", "urllib3"]
urllib3 = ["packaging", "urllib3"]
[[package]]
name = "google-genai"
version = "1.65.0"
description = "GenAI Python SDK"
optional = false
python-versions = ">=3.10"
groups = ["main"]
files = [
{file = "google_genai-1.65.0-py3-none-any.whl", hash = "sha256:68c025205856919bc03edb0155c11b4b833810b7ce17ad4b7a9eeba5158f6c44"},
{file = "google_genai-1.65.0.tar.gz", hash = "sha256:d470eb600af802d58a79c7f13342d9ea0d05d965007cae8f76c7adff3d7a4750"},
]
[package.dependencies]
anyio = ">=4.8.0,<5.0.0"
distro = ">=1.7.0,<2"
google-auth = {version = ">=2.47.0,<3.0.0", extras = ["requests"]}
httpx = ">=0.28.1,<1.0.0"
pydantic = ">=2.9.0,<3.0.0"
requests = ">=2.28.1,<3.0.0"
sniffio = "*"
tenacity = ">=8.2.3,<9.2.0"
typing-extensions = ">=4.11.0,<5.0.0"
websockets = ">=13.0.0,<17.0"
[package.extras]
aiohttp = ["aiohttp (>=3.10.11,<4.0.0)"]
local-tokenizer = ["protobuf", "sentencepiece (>=0.2.0)"]
[[package]] [[package]]
name = "greenlet" name = "greenlet"
version = "3.3.0" version = "3.3.0"
@ -1685,19 +1970,19 @@ referencing = ">=0.31.0"
[[package]] [[package]]
name = "langchain" name = "langchain"
version = "1.1.3" version = "1.2.10"
description = "Building applications with LLMs through composability" description = "Building applications with LLMs through composability"
optional = false optional = false
python-versions = "<4.0.0,>=3.10.0" python-versions = "<4.0.0,>=3.10.0"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "langchain-1.1.3-py3-none-any.whl", hash = "sha256:e5b208ed93e553df4087117a40bd0d450f9095030a843cad35c53ff2814bf731"}, {file = "langchain-1.2.10-py3-none-any.whl", hash = "sha256:e07a377204451fffaed88276b8193e894893b1003e25c5bca6539288ccca3698"},
{file = "langchain-1.1.3.tar.gz", hash = "sha256:8c641a750a4277d948c3836529f31de496e7ed4ea9f1c77f66f1845cb586987d"}, {file = "langchain-1.2.10.tar.gz", hash = "sha256:bdcd7218d9c79a413cf15e106e4eb94408ac0963df9333ccd095b9ed43bf3be7"},
] ]
[package.dependencies] [package.dependencies]
langchain-core = ">=1.1.2,<2.0.0" langchain-core = ">=1.2.10,<2.0.0"
langgraph = ">=1.0.2,<1.1.0" langgraph = ">=1.0.8,<1.1.0"
pydantic = ">=2.7.4,<3.0.0" pydantic = ">=2.7.4,<3.0.0"
[package.extras] [package.extras]
@ -1720,43 +2005,61 @@ xai = ["langchain-xai"]
[[package]] [[package]]
name = "langchain-anthropic" name = "langchain-anthropic"
version = "1.2.0" version = "1.3.4"
description = "Integration package connecting Claude (Anthropic) APIs and LangChain" description = "Integration package connecting Claude (Anthropic) APIs and LangChain"
optional = false optional = false
python-versions = "<4.0.0,>=3.10.0" python-versions = "<4.0.0,>=3.10.0"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "langchain_anthropic-1.2.0-py3-none-any.whl", hash = "sha256:f489df97833e12ca0360a098eb9d04e410752840416be87ab60b0a3e120a99fe"}, {file = "langchain_anthropic-1.3.4-py3-none-any.whl", hash = "sha256:cd112dcc8049aef09f58b3c4338b2c9db5ee98105e08664954a4e40d8bf120b9"},
{file = "langchain_anthropic-1.2.0.tar.gz", hash = "sha256:3f3cfad8c519ead2deb21c30dc538b18f4c094704c7874784320cbed7a199453"}, {file = "langchain_anthropic-1.3.4.tar.gz", hash = "sha256:000ed4c2d6fb8842b4ffeed22a74a3e84f9e9bcb63638e4abbb4a1d8ffa07211"},
] ]
[package.dependencies] [package.dependencies]
anthropic = ">=0.73.0,<1.0.0" anthropic = ">=0.78.0,<1.0.0"
langchain-core = ">=1.1.0,<2.0.0" langchain-core = ">=1.2.15,<2.0.0"
pydantic = ">=2.7.4,<3.0.0" pydantic = ">=2.7.4,<3.0.0"
[[package]] [[package]]
name = "langchain-core" name = "langchain-core"
version = "1.1.3" version = "1.2.16"
description = "Building applications with LLMs through composability" description = "Building applications with LLMs through composability"
optional = false optional = false
python-versions = "<4.0.0,>=3.10.0" python-versions = "<4.0.0,>=3.10.0"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "langchain_core-1.1.3-py3-none-any.whl", hash = "sha256:e06efbf55bf7c7e4fcffc2f5b0a39a855176df16b02077add063534d7dabb740"}, {file = "langchain_core-1.2.16-py3-none-any.whl", hash = "sha256:2768add9aa97232a7712580f678e0ba045ee1036c71fe471355be0434fcb6e30"},
{file = "langchain_core-1.1.3.tar.gz", hash = "sha256:ff0bc5e6e701c4d6fe00c73c4feae5c993a7a8e0b91f0a1d07015277d4634275"}, {file = "langchain_core-1.2.16.tar.gz", hash = "sha256:055a4bfe7d62f4ac45ed49fd759ee2e6bdd15abf998fbeea695fda5da2de6413"},
] ]
[package.dependencies] [package.dependencies]
jsonpatch = ">=1.33.0,<2.0.0" jsonpatch = ">=1.33.0,<2.0.0"
langsmith = ">=0.3.45,<1.0.0" langsmith = ">=0.3.45,<1.0.0"
packaging = ">=23.2.0,<26.0.0" packaging = ">=23.2.0"
pydantic = ">=2.7.4,<3.0.0" pydantic = ">=2.7.4,<3.0.0"
pyyaml = ">=5.3.0,<7.0.0" pyyaml = ">=5.3.0,<7.0.0"
tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10.0.0" tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10.0.0"
typing-extensions = ">=4.7.0,<5.0.0" typing-extensions = ">=4.7.0,<5.0.0"
uuid-utils = ">=0.12.0,<1.0" uuid-utils = ">=0.12.0,<1.0"
[[package]]
name = "langchain-google-genai"
version = "4.2.1"
description = "An integration package connecting Google's genai package and LangChain"
optional = false
python-versions = "<4.0.0,>=3.10.0"
groups = ["main"]
files = [
{file = "langchain_google_genai-4.2.1-py3-none-any.whl", hash = "sha256:a7735289cf94ca3a684d830e09196aac8f6e75e647e3a0a1c3c9dc534ceb985e"},
{file = "langchain_google_genai-4.2.1.tar.gz", hash = "sha256:7f44487a0337535897e3bba9a1d6605d722629e034f757ffa8755af0aa85daa8"},
]
[package.dependencies]
filetype = ">=1.2.0,<2.0.0"
google-genai = ">=1.56.0,<2.0.0"
langchain-core = ">=1.2.5,<2.0.0"
pydantic = ">=2.0.0,<3.0.0"
[[package]] [[package]]
name = "langchain-mcp-adapters" name = "langchain-mcp-adapters"
version = "0.2.1" version = "0.2.1"
@ -1776,90 +2079,107 @@ typing-extensions = ">=4.14.0"
[[package]] [[package]]
name = "langchain-openai" name = "langchain-openai"
version = "1.1.1" version = "1.1.9"
description = "An integration package connecting OpenAI and LangChain" description = "An integration package connecting OpenAI and LangChain"
optional = false optional = false
python-versions = "<4.0.0,>=3.10.0" python-versions = "<4.0.0,>=3.10.0"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "langchain_openai-1.1.1-py3-none-any.whl", hash = "sha256:69b9be37e6ae3372b4d937cb9365cf55c0c59b5f7870e7507cb7d802a8b98b30"}, {file = "langchain_openai-1.1.9-py3-none-any.whl", hash = "sha256:ca2482b136c45fb67c0db84a9817de675e0eb8fb2203a33914c1b7a96f273940"},
{file = "langchain_openai-1.1.1.tar.gz", hash = "sha256:72aa7262854104e0b2794522a90c49353c79d0132caa1be27ef253852685d5e7"}, {file = "langchain_openai-1.1.9.tar.gz", hash = "sha256:fdee25dcf4b0685d8e2f59856f4d5405431ef9e04ab53afe19e2e8360fed8234"},
] ]
[package.dependencies] [package.dependencies]
langchain-core = ">=1.1.1,<2.0.0" langchain-core = ">=1.2.11,<2.0.0"
openai = ">=1.109.1,<3.0.0" openai = ">=1.109.1,<3.0.0"
tiktoken = ">=0.7.0,<1.0.0" tiktoken = ">=0.7.0,<1.0.0"
[[package]] [[package]]
name = "langgraph" name = "langgraph"
version = "1.0.6" version = "1.0.10"
description = "Building stateful, multi-actor applications with LLMs" description = "Building stateful, multi-actor applications with LLMs"
optional = false optional = false
python-versions = ">=3.10" python-versions = ">=3.10"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "langgraph-1.0.6-py3-none-any.whl", hash = "sha256:bcfce190974519c72e29f6e5b17f0023914fd6f936bfab8894083215b271eb89"}, {file = "langgraph-1.0.10-py3-none-any.whl", hash = "sha256:7c298bef4f6ea292fcf9824d6088fe41a6727e2904ad6066f240c4095af12247"},
{file = "langgraph-1.0.6.tar.gz", hash = "sha256:dd8e754c76d34a07485308d7117221acf63990e7de8f46ddf5fe256b0a22e6c5"}, {file = "langgraph-1.0.10.tar.gz", hash = "sha256:73bd10ee14a8020f31ef07e9cd4c1a70c35cc07b9c2b9cd637509a10d9d51e29"},
] ]
[package.dependencies] [package.dependencies]
langchain-core = ">=0.1" langchain-core = ">=0.1"
langgraph-checkpoint = ">=2.1.0,<5.0.0" langgraph-checkpoint = ">=2.1.0,<5.0.0"
langgraph-prebuilt = ">=1.0.2,<1.1.0" langgraph-prebuilt = ">=1.0.8,<1.1.0"
langgraph-sdk = ">=0.3.0,<0.4.0" langgraph-sdk = ">=0.3.0,<0.4.0"
pydantic = ">=2.7.4" pydantic = ">=2.7.4"
xxhash = ">=3.5.0" xxhash = ">=3.5.0"
[[package]] [[package]]
name = "langgraph-checkpoint" name = "langgraph-checkpoint"
version = "2.1.2" version = "4.0.1"
description = "Library with base interfaces for LangGraph checkpoint savers." description = "Library with base interfaces for LangGraph checkpoint savers."
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.10"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "langgraph_checkpoint-2.1.2-py3-none-any.whl", hash = "sha256:911ebffb069fd01775d4b5184c04aaafc2962fcdf50cf49d524cd4367c4d0c60"}, {file = "langgraph_checkpoint-4.0.1-py3-none-any.whl", hash = "sha256:e3adcd7a0e0166f3b48b8cf508ce0ea366e7420b5a73aa81289888727769b034"},
{file = "langgraph_checkpoint-2.1.2.tar.gz", hash = "sha256:112e9d067a6eff8937caf198421b1ffba8d9207193f14ac6f89930c1260c06f9"}, {file = "langgraph_checkpoint-4.0.1.tar.gz", hash = "sha256:b433123735df11ade28829e40ce25b9be614930cd50245ff2af60629234befd9"},
] ]
[package.dependencies] [package.dependencies]
langchain-core = ">=0.2.38" langchain-core = ">=0.2.38"
ormsgpack = ">=1.10.0" ormsgpack = ">=1.12.0"
[[package]] [[package]]
name = "langgraph-checkpoint-postgres" name = "langgraph-checkpoint-postgres"
version = "2.0.25" version = "3.0.4"
description = "Library with a Postgres implementation of LangGraph checkpoint saver." description = "Library with a Postgres implementation of LangGraph checkpoint saver."
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.10"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "langgraph_checkpoint_postgres-2.0.25-py3-none-any.whl", hash = "sha256:cf1248a58fe828c9cfc36ee57ff118d7799ce214d4b35718e57ec98407130fb5"}, {file = "langgraph_checkpoint_postgres-3.0.4-py3-none-any.whl", hash = "sha256:12cd5661da2a374882770deb9008a4eb16641c3fd38d7595e312030080390c6e"},
{file = "langgraph_checkpoint_postgres-2.0.25.tar.gz", hash = "sha256:916b80f73a641a589301f6c54414974768b6d646d82db7b301ff8d47105c3613"}, {file = "langgraph_checkpoint_postgres-3.0.4.tar.gz", hash = "sha256:83e6a1097563369173442de2a66e6d712d60a1a6de07c98c5130d476bb2b76ae"},
] ]
[package.dependencies] [package.dependencies]
langgraph-checkpoint = ">=2.1.2,<3.0.0" langgraph-checkpoint = ">=2.1.2,<5.0.0"
orjson = ">=3.10.1" orjson = ">=3.10.1"
psycopg = ">=3.2.0" psycopg = ">=3.2.0"
psycopg-pool = ">=3.2.0" psycopg-pool = ">=3.2.0"
[[package]]
name = "langgraph-checkpoint-sqlite"
version = "3.0.3"
description = "Library with a SQLite implementation of LangGraph checkpoint saver."
optional = false
python-versions = ">=3.10"
groups = ["main"]
files = [
{file = "langgraph_checkpoint_sqlite-3.0.3-py3-none-any.whl", hash = "sha256:02eb683a79aa6fcda7cd4de43861062a5d160dbbb990ef8a9fd76c979998a952"},
{file = "langgraph_checkpoint_sqlite-3.0.3.tar.gz", hash = "sha256:438c234d37dabda979218954c9c6eb1db73bee6492c2f1d3a00552fe23fa34ed"},
]
[package.dependencies]
aiosqlite = ">=0.20"
langgraph-checkpoint = ">=3,<5.0.0"
sqlite-vec = ">=0.1.6"
[[package]] [[package]]
name = "langgraph-prebuilt" name = "langgraph-prebuilt"
version = "1.0.5" version = "1.0.8"
description = "Library with high-level APIs for creating and executing LangGraph agents and tools." description = "Library with high-level APIs for creating and executing LangGraph agents and tools."
optional = false optional = false
python-versions = ">=3.10" python-versions = ">=3.10"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "langgraph_prebuilt-1.0.5-py3-none-any.whl", hash = "sha256:22369563e1848862ace53fbc11b027c28dd04a9ac39314633bb95f2a7e258496"}, {file = "langgraph_prebuilt-1.0.8-py3-none-any.whl", hash = "sha256:d16a731e591ba4470f3e313a319c7eee7dbc40895bcf15c821f985a3522a7ce0"},
{file = "langgraph_prebuilt-1.0.5.tar.gz", hash = "sha256:85802675ad778cc7240fd02d47db1e0b59c0c86d8369447d77ce47623845db2d"}, {file = "langgraph_prebuilt-1.0.8.tar.gz", hash = "sha256:0cd3cf5473ced8a6cd687cc5294e08d3de57529d8dd14fdc6ae4899549efcf69"},
] ]
[package.dependencies] [package.dependencies]
langchain-core = ">=1.0.0" langchain-core = ">=1.0.0"
langgraph-checkpoint = ">=2.1.0,<4.0.0" langgraph-checkpoint = ">=2.1.0,<5.0.0"
[[package]] [[package]]
name = "langgraph-sdk" name = "langgraph-sdk"
@ -1879,34 +2199,58 @@ orjson = ">=3.10.1"
[[package]] [[package]]
name = "langsmith" name = "langsmith"
version = "0.4.59" version = "0.7.9"
description = "Client library to connect to the LangSmith Observability and Evaluation Platform." description = "Client library to connect to the LangSmith Observability and Evaluation Platform."
optional = false optional = false
python-versions = ">=3.10" python-versions = ">=3.10"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "langsmith-0.4.59-py3-none-any.whl", hash = "sha256:97c26399286441a7b7b06b912e2801420fbbf3a049787e609d49dc975ab10bc5"}, {file = "langsmith-0.7.9-py3-none-any.whl", hash = "sha256:e73478f4c4ae9b7407e0fcdced181f9f8b0e024c62a1552dbf0667ef6b19e82d"},
{file = "langsmith-0.4.59.tar.gz", hash = "sha256:6b143214c2303dafb29ab12dcd05ac50bdfc60dac01c6e0450e50cee1d2415e0"}, {file = "langsmith-0.7.9.tar.gz", hash = "sha256:c6dfcc4cb8fea249714ac60a1963faa84cc59ded9cd1882794ffce8a8d1d1588"},
] ]
[package.dependencies] [package.dependencies]
httpx = ">=0.23.0,<1" httpx = ">=0.23.0,<1"
orjson = {version = ">=3.9.14", markers = "platform_python_implementation != \"PyPy\""} orjson = {version = ">=3.9.14", markers = "platform_python_implementation != \"PyPy\""}
packaging = ">=23.2" packaging = ">=23.2"
pydantic = ">=1,<3" pydantic = ">=2,<3"
requests = ">=2.0.0" requests = ">=2.0.0"
requests-toolbelt = ">=1.0.0" requests-toolbelt = ">=1.0.0"
uuid-utils = ">=0.12.0,<1.0" uuid-utils = ">=0.12.0,<1.0"
xxhash = ">=3.0.0"
zstandard = ">=0.23.0" zstandard = ">=0.23.0"
[package.extras] [package.extras]
claude-agent-sdk = ["claude-agent-sdk (>=0.1.0) ; python_version >= \"3.10\""] claude-agent-sdk = ["claude-agent-sdk (>=0.1.0) ; python_version >= \"3.10\""]
google-adk = ["google-adk (>=1.0.0)", "wrapt (>=1.16.0)"]
langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2)"] langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2)"]
openai-agents = ["openai-agents (>=0.0.3)"] openai-agents = ["openai-agents (>=0.0.3)"]
otel = ["opentelemetry-api (>=1.30.0)", "opentelemetry-exporter-otlp-proto-http (>=1.30.0)", "opentelemetry-sdk (>=1.30.0)"] otel = ["opentelemetry-api (>=1.30.0)", "opentelemetry-exporter-otlp-proto-http (>=1.30.0)", "opentelemetry-sdk (>=1.30.0)"]
pytest = ["pytest (>=7.0.0)", "rich (>=13.9.4)", "vcrpy (>=7.0.0)"] pytest = ["pytest (>=7.0.0)", "rich (>=13.9.4)", "vcrpy (>=7.0.0)"]
sandbox = ["websockets (>=15.0)"]
vcr = ["vcrpy (>=7.0.0)"] vcr = ["vcrpy (>=7.0.0)"]
[[package]]
name = "linkify-it-py"
version = "2.1.0"
description = "Links recognition library with FULL unicode support."
optional = false
python-versions = ">=3.10"
groups = ["main"]
files = [
{file = "linkify_it_py-2.1.0-py3-none-any.whl", hash = "sha256:0d252c1594ecba2ecedc444053db5d3a9b7ec1b0dd929c8f1d74dce89f86c05e"},
{file = "linkify_it_py-2.1.0.tar.gz", hash = "sha256:43360231720999c10e9328dc3691160e27a718e280673d444c38d7d3aaa3b98b"},
]
[package.dependencies]
uc-micro-py = "*"
[package.extras]
benchmark = ["pytest", "pytest-benchmark"]
dev = ["black", "flake8", "isort", "pre-commit", "pyproject-flake8"]
doc = ["myst-parser", "sphinx", "sphinx_book_theme"]
test = ["coverage", "pytest", "pytest-cov"]
[[package]] [[package]]
name = "markdown-it-py" name = "markdown-it-py"
version = "4.0.0" version = "4.0.0"
@ -1920,6 +2264,7 @@ files = [
] ]
[package.dependencies] [package.dependencies]
linkify-it-py = {version = ">=1,<3", optional = true, markers = "extra == \"linkify\""}
mdurl = ">=0.1,<1.0" mdurl = ">=0.1,<1.0"
[package.extras] [package.extras]
@ -2093,6 +2438,26 @@ cli = ["python-dotenv (>=1.0.0)", "typer (>=0.16.0)"]
rich = ["rich (>=13.9.4)"] rich = ["rich (>=13.9.4)"]
ws = ["websockets (>=15.0.1)"] ws = ["websockets (>=15.0.1)"]
[[package]]
name = "mdit-py-plugins"
version = "0.5.0"
description = "Collection of plugins for markdown-it-py"
optional = false
python-versions = ">=3.10"
groups = ["main"]
files = [
{file = "mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f"},
{file = "mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6"},
]
[package.dependencies]
markdown-it-py = ">=2.0.0,<5.0.0"
[package.extras]
code-style = ["pre-commit"]
rtd = ["myst-parser", "sphinx-book-theme"]
testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
[[package]] [[package]]
name = "mdurl" name = "mdurl"
version = "0.1.2" version = "0.1.2"
@ -3090,6 +3455,18 @@ test-arrow = ["arro3-compute", "arro3-core", "nanoarrow", "pyarrow"]
tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma (>=5)", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma (>=5)", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"]
xmp = ["defusedxml"] xmp = ["defusedxml"]
[[package]]
name = "platformdirs"
version = "4.9.2"
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
optional = false
python-versions = ">=3.10"
groups = ["main"]
files = [
{file = "platformdirs-4.9.2-py3-none-any.whl", hash = "sha256:9170634f126f8efdae22fb58ae8a0eaa86f38365bc57897a6c4f781d1f5875bd"},
{file = "platformdirs-4.9.2.tar.gz", hash = "sha256:9a33809944b9db043ad67ca0db94b14bf452cc6aeaac46a88ea55b26e2e9d291"},
]
[[package]] [[package]]
name = "pluggy" name = "pluggy"
version = "1.6.0" version = "1.6.0"
@ -3493,6 +3870,46 @@ files = [
{file = "psycopg2_binary-2.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:875039274f8a2361e5207857899706da840768e2a775bf8c65e82f60b197df02"}, {file = "psycopg2_binary-2.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:875039274f8a2361e5207857899706da840768e2a775bf8c65e82f60b197df02"},
] ]
[[package]]
name = "pyasn1"
version = "0.6.2"
description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "pyasn1-0.6.2-py3-none-any.whl", hash = "sha256:1eb26d860996a18e9b6ed05e7aae0e9fc21619fcee6af91cca9bad4fbea224bf"},
{file = "pyasn1-0.6.2.tar.gz", hash = "sha256:9b59a2b25ba7e4f8197db7686c09fb33e658b98339fadb826e9512629017833b"},
]
[[package]]
name = "pyasn1-modules"
version = "0.4.2"
description = "A collection of ASN.1-based protocols modules"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a"},
{file = "pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6"},
]
[package.dependencies]
pyasn1 = ">=0.6.1,<0.7.0"
[[package]]
name = "pycparser"
version = "3.0"
description = "C parser in Python"
optional = false
python-versions = ">=3.10"
groups = ["main"]
markers = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\""
files = [
{file = "pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"},
{file = "pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29"},
]
[[package]] [[package]]
name = "pydantic" name = "pydantic"
version = "2.10.5" version = "2.10.5"
@ -3666,6 +4083,18 @@ files = [
[package.extras] [package.extras]
windows-terminal = ["colorama (>=0.4.6)"] windows-terminal = ["colorama (>=0.4.6)"]
[[package]]
name = "pyperclip"
version = "1.11.0"
description = "A cross-platform clipboard module for Python. (Only handles plain text for now.)"
optional = false
python-versions = "*"
groups = ["main"]
files = [
{file = "pyperclip-1.11.0-py3-none-any.whl", hash = "sha256:299403e9ff44581cb9ba2ffeed69c7aa96a008622ad0c46cb575ca75b5b84273"},
{file = "pyperclip-1.11.0.tar.gz", hash = "sha256:244035963e4428530d9e3a6101a1ef97209c6825edab1567beac148ccc1db1b6"},
]
[[package]] [[package]]
name = "pytest" name = "pytest"
version = "9.0.2" version = "9.0.2"
@ -4287,6 +4716,21 @@ files = [
{file = "rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8"}, {file = "rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8"},
] ]
[[package]]
name = "rsa"
version = "4.9.1"
description = "Pure-Python RSA implementation"
optional = false
python-versions = "<4,>=3.6"
groups = ["main"]
files = [
{file = "rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762"},
{file = "rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75"},
]
[package.dependencies]
pyasn1 = ">=0.1.3"
[[package]] [[package]]
name = "runloop-api-client" name = "runloop-api-client"
version = "1.2.0" version = "1.2.0"
@ -4675,6 +5119,21 @@ postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"]
pymysql = ["pymysql"] pymysql = ["pymysql"]
sqlcipher = ["sqlcipher3_binary"] sqlcipher = ["sqlcipher3_binary"]
[[package]]
name = "sqlite-vec"
version = "0.1.6"
description = ""
optional = false
python-versions = "*"
groups = ["main"]
files = [
{file = "sqlite_vec-0.1.6-py3-none-macosx_10_6_x86_64.whl", hash = "sha256:77491bcaa6d496f2acb5cc0d0ff0b8964434f141523c121e313f9a7d8088dee3"},
{file = "sqlite_vec-0.1.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fdca35f7ee3243668a055255d4dee4dea7eed5a06da8cad409f89facf4595361"},
{file = "sqlite_vec-0.1.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b0519d9cd96164cd2e08e8eed225197f9cd2f0be82cb04567692a0a4be02da3"},
{file = "sqlite_vec-0.1.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux1_x86_64.whl", hash = "sha256:823b0493add80d7fe82ab0fe25df7c0703f4752941aee1c7b2b02cec9656cb24"},
{file = "sqlite_vec-0.1.6-py3-none-win_amd64.whl", hash = "sha256:c65bcfd90fa2f41f9000052bcb8bb75d38240b2dae49225389eca6c3136d3f0c"},
]
[[package]] [[package]]
name = "sse-starlette" name = "sse-starlette"
version = "3.0.2" version = "3.0.2"
@ -4753,14 +5212,14 @@ compile = ["sigtools (>=4.0.1)"]
[[package]] [[package]]
name = "tavily-python" name = "tavily-python"
version = "0.7.17" version = "0.7.22"
description = "Python wrapper for the Tavily API" description = "Python wrapper for the Tavily API"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "tavily_python-0.7.17-py3-none-any.whl", hash = "sha256:a2725b9cba71e404e73d19ff277df916283c10100137c336e07f8e1bd7789fcf"}, {file = "tavily_python-0.7.22-py3-none-any.whl", hash = "sha256:25d05f02be3fa2508ff1c114196b714e069d75312c26ddf747c9f5bdc617bbb3"},
{file = "tavily_python-0.7.17.tar.gz", hash = "sha256:437ba064639dfdce1acdbc37cbb73246abe500ab735e988a4b8698a8d5fb7df7"}, {file = "tavily_python-0.7.22.tar.gz", hash = "sha256:050c0113309b516f58fbdc484d6091efa7ce6c016c2a2cd9f111581269f00dfe"},
] ]
[package.dependencies] [package.dependencies]
@ -4784,6 +5243,45 @@ files = [
doc = ["reno", "sphinx"] doc = ["reno", "sphinx"]
test = ["pytest", "tornado (>=4.5)", "typeguard"] test = ["pytest", "tornado (>=4.5)", "typeguard"]
[[package]]
name = "textual"
version = "8.0.0"
description = "Modern Text User Interface framework"
optional = false
python-versions = "<4.0,>=3.9"
groups = ["main"]
files = [
{file = "textual-8.0.0-py3-none-any.whl", hash = "sha256:8908f4ebe93a6b4f77ca7262197784a52162bc88b05f4ecf50ac93a92d49bb8f"},
{file = "textual-8.0.0.tar.gz", hash = "sha256:ce48f83a3d686c0fac0e80bf9136e1f8851c653aa6a4502e43293a151df18809"},
]
[package.dependencies]
markdown-it-py = {version = ">=2.1.0", extras = ["linkify"]}
mdit-py-plugins = "*"
platformdirs = ">=3.6.0,<5"
pygments = ">=2.19.2,<3.0.0"
rich = ">=14.2.0"
typing-extensions = ">=4.4.0,<5.0.0"
[package.extras]
syntax = ["tree-sitter (>=0.25.0) ; python_version >= \"3.10\"", "tree-sitter-bash (>=0.23.0) ; python_version >= \"3.10\"", "tree-sitter-css (>=0.23.0) ; python_version >= \"3.10\"", "tree-sitter-go (>=0.23.0) ; python_version >= \"3.10\"", "tree-sitter-html (>=0.23.0) ; python_version >= \"3.10\"", "tree-sitter-java (>=0.23.0) ; python_version >= \"3.10\"", "tree-sitter-javascript (>=0.23.0) ; python_version >= \"3.10\"", "tree-sitter-json (>=0.24.0) ; python_version >= \"3.10\"", "tree-sitter-markdown (>=0.3.0) ; python_version >= \"3.10\"", "tree-sitter-python (>=0.23.0) ; python_version >= \"3.10\"", "tree-sitter-regex (>=0.24.0) ; python_version >= \"3.10\"", "tree-sitter-rust (>=0.23.0) ; python_version >= \"3.10\"", "tree-sitter-sql (>=0.3.11) ; python_version >= \"3.10\"", "tree-sitter-toml (>=0.6.0) ; python_version >= \"3.10\"", "tree-sitter-xml (>=0.7.0) ; python_version >= \"3.10\"", "tree-sitter-yaml (>=0.6.0) ; python_version >= \"3.10\""]
[[package]]
name = "textual-autocomplete"
version = "4.0.6"
description = "Easily add autocomplete dropdowns to your Textual apps."
optional = false
python-versions = ">=3.9.0"
groups = ["main"]
files = [
{file = "textual_autocomplete-4.0.6-py3-none-any.whl", hash = "sha256:bff69c19386e2cbb4a007503b058dc37671d480a4fa2ddb3959c15ceb4aff9b5"},
{file = "textual_autocomplete-4.0.6.tar.gz", hash = "sha256:2ba2f0d767be4480ecacb3e4b130cf07340e033c3500fc424fed9125d27a4586"},
]
[package.dependencies]
textual = ">=2.0.0"
typing-extensions = ">=4.5.0"
[[package]] [[package]]
name = "threadpoolctl" name = "threadpoolctl"
version = "3.6.0" version = "3.6.0"
@ -4915,6 +5413,18 @@ files = [
{file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
] ]
[[package]]
name = "tomli-w"
version = "1.2.0"
description = "A lil' TOML writer"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
{file = "tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90"},
{file = "tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021"},
]
[[package]] [[package]]
name = "torch" name = "torch"
version = "2.2.0" version = "2.2.0"
@ -5177,6 +5687,21 @@ files = [
{file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"},
] ]
[[package]]
name = "uc-micro-py"
version = "2.0.0"
description = "Micro subset of unicode data files for linkify-it-py projects."
optional = false
python-versions = ">=3.10"
groups = ["main"]
files = [
{file = "uc_micro_py-2.0.0-py3-none-any.whl", hash = "sha256:3603a3859af53e5a39bc7677713c78ea6589ff188d70f4fee165db88e22b242c"},
{file = "uc_micro_py-2.0.0.tar.gz", hash = "sha256:c53691e495c8db60e16ffc4861a35469b0ba0821fe409a8a7a0a71864d33a811"},
]
[package.extras]
test = ["coverage", "pytest", "pytest-cov"]
[[package]] [[package]]
name = "urllib3" name = "urllib3"
version = "2.5.0" version = "2.5.0"
@ -6085,4 +6610,4 @@ cffi = ["cffi (>=1.17,<2.0) ; platform_python_implementation != \"PyPy\" and pyt
[metadata] [metadata]
lock-version = "2.1" lock-version = "2.1"
python-versions = ">=3.12,<3.15" python-versions = ">=3.12,<3.15"
content-hash = "d930570328aea9211c1563538968847d8ba638963025e63a246559307e1d33ed" content-hash = "0664e4a7062edaccee87e4bef7277213cf1d48cb4d5baba4d36ea3c6d0252437"

View File

@ -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.2.8,<0.4.0)", "deepagents (>=0.4.3,<0.5.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 (>=2.0.0,<3.0.0)", "langgraph-checkpoint-postgres (>=3.0.0,<4.0.0)",
"deepagents-cli (>=0.0.11,<0.0.12)", "deepagents-cli (>=0.0.25,<0.0.26)",
"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

@ -3,8 +3,9 @@ aiohappyeyeballs==2.6.1 ; python_version >= "3.12" and python_version < "3.15"
aiohttp-retry==2.9.1 ; python_version >= "3.12" and python_version < "3.15" aiohttp-retry==2.9.1 ; python_version >= "3.12" and python_version < "3.15"
aiohttp==3.13.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" 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" annotated-types==0.7.0 ; python_version >= "3.12" and python_version < "3.15"
anthropic==0.75.0 ; python_version >= "3.12" and python_version < "3.15" anthropic==0.84.0 ; python_version >= "3.12" and python_version < "3.15"
anyio==4.11.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" 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" backoff==2.2.1 ; python_version >= "3.12" and python_version < "3.15"
@ -14,17 +15,19 @@ 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" cachetools==6.2.4 ; python_version >= "3.12" and python_version < "3.15"
cbor2==5.7.1 ; python_version >= "3.12" and python_version < "3.15" cbor2==5.7.1 ; python_version >= "3.12" and python_version < "3.15"
certifi==2025.10.5 ; 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" 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" 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" click==8.3.0 ; 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" 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 < "3.15"
daytona-api-client-async==0.127.0 ; python_version >= "3.12" and python_version < "3.15" daytona-api-client-async==0.127.0 ; python_version >= "3.12" and python_version < "3.15"
daytona-api-client==0.127.0 ; python_version >= "3.12" and python_version < "3.15" daytona-api-client==0.127.0 ; python_version >= "3.12" and python_version < "3.15"
daytona-toolbox-api-client-async==0.127.0 ; python_version >= "3.12" and python_version < "3.15" daytona-toolbox-api-client-async==0.127.0 ; python_version >= "3.12" and python_version < "3.15"
daytona-toolbox-api-client==0.127.0 ; python_version >= "3.12" and python_version < "3.15" daytona-toolbox-api-client==0.127.0 ; python_version >= "3.12" and python_version < "3.15"
daytona==0.127.0 ; python_version >= "3.12" and python_version < "3.15" daytona==0.127.0 ; python_version >= "3.12" and python_version < "3.15"
deepagents-cli==0.0.11 ; python_version >= "3.12" and python_version < "3.15" deepagents-cli==0.0.25 ; python_version >= "3.12" and python_version < "3.15"
deepagents==0.2.8 ; python_version >= "3.12" and python_version < "3.15" deepagents==0.4.3 ; python_version >= "3.12" and python_version < "3.15"
deprecated==1.3.1 ; python_version >= "3.12" and python_version < "3.15" deprecated==1.3.1 ; python_version >= "3.12" and python_version < "3.15"
distro==1.9.0 ; 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" docstring-parser==0.17.0 ; python_version >= "3.12" and python_version < "3.15"
@ -32,8 +35,11 @@ environs==14.5.0 ; python_version >= "3.12" and python_version < "3.15"
et-xmlfile==2.0.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" 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" 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"
frozenlist==1.8.0 ; python_version >= "3.12" and python_version < "3.15" 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" 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"
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") 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-tools==1.71.2 ; python_version >= "3.13" and python_version < "3.15" grpcio-tools==1.71.2 ; python_version >= "3.13" and python_version < "3.15"
grpcio==1.76.0 ; python_version >= "3.12" and python_version < "3.15" grpcio==1.76.0 ; python_version >= "3.12" and python_version < "3.15"
@ -57,22 +63,26 @@ 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" jsonpointer==3.0.0 ; python_version >= "3.12" and python_version < "3.15"
jsonschema-specifications==2025.9.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" jsonschema==4.25.1 ; python_version >= "3.12" and python_version < "3.15"
langchain-anthropic==1.2.0 ; python_version >= "3.12" and python_version < "3.15" langchain-anthropic==1.3.4 ; python_version >= "3.12" and python_version < "3.15"
langchain-core==1.1.3 ; python_version >= "3.12" and python_version < "3.15" langchain-core==1.2.16 ; 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-mcp-adapters==0.2.1 ; python_version >= "3.12" and python_version < "3.15"
langchain-openai==1.1.1 ; python_version >= "3.12" and python_version < "3.15" langchain-openai==1.1.9 ; python_version >= "3.12" and python_version < "3.15"
langchain==1.1.3 ; python_version >= "3.12" and python_version < "3.15" langchain==1.2.10 ; python_version >= "3.12" and python_version < "3.15"
langgraph-checkpoint-postgres==2.0.25 ; 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==2.1.2 ; 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-prebuilt==1.0.5 ; python_version >= "3.12" and python_version < "3.15" langgraph-checkpoint==4.0.1 ; python_version >= "3.12" and python_version < "3.15"
langgraph-prebuilt==1.0.8 ; python_version >= "3.12" and python_version < "3.15"
langgraph-sdk==0.3.3 ; python_version >= "3.12" and python_version < "3.15" langgraph-sdk==0.3.3 ; python_version >= "3.12" and python_version < "3.15"
langgraph==1.0.6 ; python_version >= "3.12" and python_version < "3.15" langgraph==1.0.10 ; python_version >= "3.12" and python_version < "3.15"
langsmith==0.4.59 ; 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" 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" 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" markupsafe==3.0.3 ; python_version >= "3.12" and python_version < "3.15"
marshmallow==4.1.1 ; python_version >= "3.12" and python_version < "3.15" marshmallow==4.1.1 ; python_version >= "3.12" and python_version < "3.15"
mcp==1.12.4 ; 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" mdurl==0.1.2 ; python_version >= "3.12" and python_version < "3.15"
mem0ai==0.1.116 ; python_version >= "3.12" and python_version < "3.15" mem0ai==0.1.116 ; python_version >= "3.12" and python_version < "3.15"
modal==1.2.1 ; python_version >= "3.12" and python_version < "3.15" modal==1.2.1 ; python_version >= "3.12" and python_version < "3.15"
@ -101,6 +111,7 @@ 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" 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" pandas==2.3.3 ; python_version >= "3.12" and python_version < "3.15"
pillow==12.0.0 ; 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==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 < "3.15" posthog==7.6.0 ; python_version >= "3.12" and python_version < "3.15"
@ -111,10 +122,14 @@ 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" 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" 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" 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-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-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" 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" pygments==2.19.2 ; 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-dateutil==2.8.2 ; python_version >= "3.12" and python_version < "3.15"
python-dotenv==1.1.1 ; python_version >= "3.12" and python_version < "3.15" python-dotenv==1.1.1 ; python_version >= "3.12" and python_version < "3.15"
python-multipart==0.0.20 ; python_version >= "3.12" and python_version < "3.15" python-multipart==0.0.20 ; python_version >= "3.12" and python_version < "3.15"
@ -130,6 +145,7 @@ 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" 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" 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" 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"
runloop-api-client==1.2.0 ; python_version >= "3.12" and python_version < "3.15" runloop-api-client==1.2.0 ; python_version >= "3.12" and python_version < "3.15"
safetensors==0.6.2 ; 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" scikit-learn==1.7.2 ; python_version >= "3.12" and python_version < "3.15"
@ -141,16 +157,20 @@ 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" 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" 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" 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" 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" starlette==0.47.3 ; python_version >= "3.12" and python_version < "3.15"
sympy==1.14.0 ; python_version >= "3.12" and python_version < "3.15" sympy==1.14.0 ; python_version >= "3.12" and python_version < "3.15"
synchronicity==0.10.5 ; python_version >= "3.12" and python_version < "3.15" synchronicity==0.10.5 ; python_version >= "3.12" and python_version < "3.15"
tavily-python==0.7.17 ; 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" 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==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" 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" 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" tokenizers==0.22.1 ; python_version >= "3.12" and python_version < "3.15"
toml==0.10.2 ; python_version >= "3.12" and python_version < "3.15" toml==0.10.2 ; 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" 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" 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" transformers==4.57.1 ; python_version >= "3.12" and python_version < "3.15"
@ -161,6 +181,7 @@ types-toml==0.10.8.20240310 ; python_version >= "3.12" and python_version < "3.1
typing-extensions==4.15.0 ; 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" 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" 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" 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" 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" uvicorn==0.35.0 ; python_version >= "3.12" and python_version < "3.15"