--- name: sub_agent_python_rewrite description: 当需要了解子智能体当前实现、修改子智能体代码、或排查子智能体相关问题时,应该索引本记忆 --- # 子智能体现状(Python 主进程内协程) ## 核心变更 子智能体已经从 **Node.js 子进程**(`easyagent/src/batch/index.js`)彻底改为 **Python 主进程内协程**。 ## 代码位置 所有子智能体专用代码集中在 `modules/sub_agent/` 包内: ``` modules/sub_agent/ ├── __init__.py # 导出 SubAgentManager ├── manager.py # 任务调度、创建、终止、状态查询 ├── task.py # LLM 循环、模型调用、工具执行驱动 ├── toolkit.py # 8 个工具定义、工具结果格式化、模型配置解析 ├── prompts.py # 用户消息和系统提示词构建 ├── tools.py # search_workspace、read_mediafile 本地实现 ├── state.py # 状态加载、保存、刷新、超时、僵尸清理 Mixin ├── stats.py # 统计摘要与结果消息组装 Mixin └── creation.py # 创建参数校验、任务 ID 生成、交付目录解析 Mixin ``` ## 执行机制 - 子智能体作为 `asyncio.Task` 在独立的后台事件循环线程中运行(避免与 Flask-SocketIO threading 模式冲突)。 - 所有实际工具调用都通过 `WebTerminal.handle_tool_call()` 执行,因此**自然复用主进程的宿主机沙箱 / Docker 容器链路**。 - 子智能体自身不再被整体沙箱限制网络(因为它需要调用模型 API),网络调用走 `utils.api_client.DeepSeekClient`。 - 权限固定为 `unrestricted`,但工具执行本身受主进程沙箱/容器/审批链路约束。 ## 模型配置 - 子智能体模型独立配置,不跟主模型合并。 - 配置文件:`~/.astrion/astrion/config/sub_agent_models.json`(由 `SUB_AGENT_MODELS_CONFIG_FILE` 指定)。 - 默认读取该文件中的 `default_model` 和 `models` 列表。 ## 可用工具(8 个) 1. `read_file` - 读取/搜索/抽取文件 2. `write_file` - 创建或覆盖文件(支持 append) 3. `edit_file` - 精确字符串替换,支持 `replacements` 数组和 `replace_all` 4. `run_command` - 执行命令(走主进程沙箱/容器) 5. `web_search` - 网络搜索 6. `extract_webpage` - 网页内容提取 7. `search_workspace` - 工作区搜索 8. `read_mediafile` - 读取图片/视频文件(base64 返回) ## easyagent/ 目录状态 - `easyagent/` 是旧的 Node.js 子智能体实现,目前**暂时保留但已不再使用**。 - 主项目 Python 代码没有任何地方引用 `easyagent/`。 - 是否删除待后续决策。 ## 入口点 - 主项目创建子智能体:`modules.sub_agent.manager.SubAgentManager.create_sub_agent()` - `core/main_terminal.py` 中通过 `SubAgentManager.set_terminal(self)` 注入 WebTerminal 引用。 ## 回归测试 - 测试脚本:`test/test_sub_agent_regression.py` - 覆盖:write_file、edit_file(多处替换 + replace_all)、search_workspace、read_mediafile、terminate ## 已删除/清理的内容 - `config/sub_agent.py` 中已删除 `SUB_AGENT_HOST_NETWORK_PERMISSION` 临时配置。 - `easyagent/src/batch/index.js` 已删除(旧子进程入口)。 - `AGENTS.md` 和 `CLAUDE.md` 中关于子智能体的描述已更新为当前实现。