# 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
```

## 成功��准

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