qwen_agent/plans/deepagents-upgrade.md
2026-04-11 17:52:48 +08:00

373 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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=False,
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=False),
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=False,
env=shell_env,
inherit_env=True,
)
# 或使用 CompositeBackend 路由
composite_backend = CompositeBackend(
default=FilesystemBackend(root_dir=workspace_root, virtual_mode=False),
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=False,
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
**状态**: 已完成