# 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 ``` ## 成功��准 - [ ] 所有现有功能正常工作 - [ ] 性能无明显下降(响应时间 < 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 **状态**: 已完成