tool 模块 AgentScope 依赖分析
版本: v1.0
生成日期: 2026-03-10
分析范围: src/relay/domain/tool/
概述
tool 模块是 RelayAgent 与 AgentScope 框架集成的核心层,通过标准化的工具响应机制和扩展能力实现与 Agent 系统的无缝对接。
依赖统计:
- 总文件数:17 个
- 总导入点:41 处
- 核心依赖:ToolResponse + TextBlock(覆盖率 94%)
- 扩展依赖:ImageBlock、Msg、Toolkit、AgentBase(覆盖率 6%)
一、核心依赖:工具响应标准化
依赖说明
| 类/函数 |
模块路径 |
用途 |
| ToolResponse |
agentscope.tool |
所有工具函数的统一返回类型,包含内容块和元数据 |
| TextBlock |
agentscope.message |
文本内容块,用于构建工具响应的内容部分 |
使用文件清单
| 文件路径 |
导入位置 |
主要功能 |
响应内容类型 |
| base_tool.py |
行 616-617 |
工具基类动态包装器 |
工具执行结果 |
| service/authorization_service.py |
行 1376-1377, 1449-1450, 1514-1515, 1658-1659 |
授权审批服务 |
审批状态、风险等级、规则信息 |
| service/browser_service.py |
行 32-33 |
浏览器操作服务 |
截图路径、页面信息、操作状态 |
| service/browser_vision.py |
行 10-11, 163 |
浏览器视觉分析 |
视觉分析状态、截图路径 |
| service/code_service.py |
行 26-27 |
代码执行服务 |
执行结果、输出、错误堆栈 |
| service/command_service.py |
行 16-17 |
Shell 命令执行 |
标准输出、错误输出、返回码 |
| service/datetime_service.py |
行 13-14 |
日期时间查询 |
时间戳、时区信息 |
| service/filesystem_service.py |
行 25-26 |
文件系统操作 |
文件内容、目录列表、文件元数据 |
| service/scheduler_service.py |
行 14-15 |
定时任务调度 |
任务ID、调度状态、下次执行时间 |
| service/sleep_service.py |
行 13-14 |
异步等待 |
等待时长、完成状态 |
| service/user_interaction_service.py |
行 16-17 |
用户交互 |
用户选择、问卷答案 |
| service/web_fetch_service.py |
行 166-167 |
网页内容获取 |
网页内容、格式类型 |
| service/web_search_service.py |
行 374-375 |
网页搜索 |
搜索结果列表、标题、URL、摘要 |
| specialized_tools/write_tool.py |
行 13-14 |
文件写入工具 |
写入路径、字节数、确认信息 |
| _codeact/interface/controllers.py |
行 10 |
CodeAct 控制器 |
类型注解(无实际使用) |
| _codeact/interface/presenters.py |
行 10-11 |
CodeAct 输出格式化 |
JSON 格式的执行结果 |
| _lsp/adapter/agent_tools.py |
行 14-15 |
LSP 工具适配器 |
补全项、定义位置、悬停信息 |
响应结构说明
工具响应采用统一的两层结构:
第一层:ToolResponse 对象
- content:内容块列表(支持多个 TextBlock/ImageBlock)
- metadata:元数据字典(操作状态、附加信息)
第二层:TextBlock 对象
- type:内容类型(固定为 "text")
- text:实际文本内容(通常为 JSON 字符串)
元数据字段规范
不同服务返回的 metadata 字段:
| 服务类型 |
核心字段 |
说明 |
| 授权服务 |
approved, risk_level, rule_name |
审批决策和风险信息 |
| 浏览器服务 |
success, operation, has_image |
操作状态和图像标识 |
| 代码服务 |
status, error, file_path |
执行状态和文件信息 |
| 命令服务 |
exit_code, duration |
命令退出码和执行时长 |
| 文件服务 |
operation, bytes_written |
操作类型和写入字节数 |
导入模式说明
延迟导入模式:大部分服务文件采用函数内导入,而非文件顶部导入。
原因:
- 避免循环依赖问题
- 减少模块加载时的依赖检查
- 仅在实际需要时才加载 AgentScope 模块
导入位置:通常在函数 docstring 之后、实际逻辑之前
二、扩展依赖:视觉分析能力
依赖说明
| 类/函数 |
模块路径 |
用途 |
| ImageBlock |
agentscope.message |
图像内容块,支持 base64 编码的图像数据 |
| Msg |
agentscope.message |
消息对象,用于 agent memory 传递 |
使用文件清单
| 文件路径 |
导入位置 |
主要功能 |
使用场景 |
| service/browser_vision.py |
行 10 |
浏览器截图视觉分析 |
将截图添加到 agent memory |
工作流程说明
视觉分析的工作流程:
- 截图捕获:调用 browser_screenshot 获取页面截图
- 图像块构建:将 base64 编码的图像数据封装为 ImageBlock
- 消息创建:使用 Msg 创建包含 ImageBlock 的消息对象
- 内存注入:通过 agent memory 的异步添加方法将图像消息注入
- LLM 分析:LLM 从 memory 中读取图像进行视觉分析
设计原因
为什么需要单独的消息注入:
AgentScope 的消息格式化器会将工具响应中的 ImageBlock 转换为字符串,导致图像数据丢失。通过单独创建消息并添加到 memory,可以确保 LLM 接收到正确格式的图像数据。
三、扩展依赖:工具注册管理
依赖说明
| 类/函数 |
模块路径 |
用途 |
| Toolkit |
agentscope.tool |
工具包管理器,提供工具注册、卸载、schema 查询能力 |
使用文件清单
| 文件路径 |
导入位置 |
主要功能 |
使用场景 |
| _lsp/adapter/agent_tools.py |
行 15 |
LSP 工具组管理 |
批量注册和卸载 LSP 工具 |
核心方法说明
| 方法名 |
功能 |
使用场景 |
| register_tool_function |
注册单个工具函数 |
LSP 工具初始化时注册代码补全、定义跳转等工具 |
| remove_tool_groups |
批量卸载工具组 |
LSP 服务停止时清理所有 LSP 相关工具 |
| get_json_schemas |
获取所有工具的 JSON Schema |
参数类型转换时查询工具参数定义 |
工具分组机制
LSP 工具使用分组标识(LSP_TOOL_GROUP)进行统一管理:
优势:
- 支持批量卸载,无需逐个移除
- 避免工具名称冲突
- 便于工具生命周期管理
应用场景:
- LSP 服务启动时注册整个工具组
- LSP 服务停止时一次性清理所有 LSP 工具
- 从多个 agent 实例中统一卸载 LSP 工具
四、扩展依赖:参数类型转换
依赖说明
| 类/函数 |
模块路径 |
用途 |
| AgentBase |
agentscope.agent |
Agent 基类,提供访问 toolkit 的能力 |
使用文件清单
| 文件路径 |
导入位置 |
主要功能 |
使用场景 |
| service/tool_parse_service.py |
行 25 |
参数类型转换服务 |
修复 LLM 错误识别的参数类型 |
问题背景
LLM 在生成工具调用时,可能将参数错误识别为字符串类型:
| 正确类型 |
LLM 错误识别 |
示例 |
| boolean |
string |
True → "true" |
| integer |
string |
123 → "123" |
| number |
string |
3.14 → "3.14" |
解决方案
参数类型转换服务的工作流程:
- 获取工具 Schema:通过 AgentBase.toolkit.get_json_schemas() 获取所有工具的参数定义
- 匹配当前工具:根据工具名称查找对应的参数 Schema
- 类型转换:根据 Schema 中定义的参数类型,将字符串值转换回正确类型
- 返回修正参数:返回类型正确的参数字典
类型转换规则
| Schema 类型 |
字符串值 |
转换结果 |
| boolean |
"true", "false" |
True, False |
| integer |
"123", "-456" |
123, -456 |
| number |
"3.14", "-2.5" |
3.14, -2.5 |
| string |
任意字符串 |
保持不变 |
| array |
JSON 字符串 |
解析为列表 |
| object |
JSON 字符串 |
解析为字典 |
五、依赖关系图
tool 模块对 AgentScope 的依赖
│
├── 核心层(必需,94% 覆盖率)
│ ├── ToolResponse
│ │ └── 统一的工具响应格式
│ │ ├── content: List[TextBlock | ImageBlock]
│ │ └── metadata: Dict[str, Any]
│ │
│ └── TextBlock
│ └── 文本内容块
│ ├── type: "text"
│ └── text: str (通常为 JSON)
│
├── 扩展层(可选,6% 覆盖率)
│ ├── ImageBlock
│ │ └── 图像内容块(浏览器视觉分析)
│ │
│ ├── Msg
│ │ └── 消息对象(agent memory 传递)
│ │
│ ├── Toolkit
│ │ └── 工具包管理(LSP 工具生命周期)
│ │
│ └── AgentBase
│ └── Agent 基类(schema 访问)
│
└── 使用模式
├── 延迟导入:函数内导入,避免循环依赖
├── 统一响应:所有工具返回 ToolResponse
└── 元数据规范:标准化的 metadata 字段
六、最佳实践建议
1. 工具响应规范
推荐做法:
- 所有工具函数必须返回 ToolResponse 对象
- content 使用 TextBlock 列表,即使只有一个内容块
- metadata 包含操作状态和关键信息
- 文本内容使用 JSON 格式,便于解析和扩展
避免做法:
- 直接返回字符串或字典
- 省略 metadata 字段
- 使用非标准的内容块类型
2. 导入策略
推荐做法:
- 服务层文件使用函数内延迟导入
- 基础设施层文件可使用顶部导入
- 保持导入语句的一致性
避免做法:
- 在循环或频繁调用的代码段中导入
- 混合使用顶部导入和延迟导入
3. 视觉分析集成
推荐做法:
- 使用专门的视觉分析服务(browser_vision.py)
- 将图像消息单独添加到 agent memory
- 返回简化的 ToolResponse(不含 ImageBlock)
避免做法:
- 在 ToolResponse.content 中直接返回 ImageBlock
- 期望 AgentScope formatter 保留图像数据
4. 工具生命周期管理
推荐做法:
- 使用工具分组标识进行批量管理
- 在服务停止时主动卸载工具
- 避免工具名称冲突
避免做法:
七、版本兼容性说明
AgentScope 版本要求
| 依赖项 |
最低版本 |
推荐版本 |
说明 |
| agentscope.tool |
- |
最新 |
ToolResponse、Toolkit 核心功能稳定 |
| agentscope.message |
- |
最新 |
TextBlock、ImageBlock、Msg 核心功能稳定 |
| agentscope.agent |
- |
最新 |
AgentBase 基类稳定 |
接口稳定性
| 接口 |
稳定性 |
变更风险 |
| ToolResponse |
高 |
核心接口,变更可能性低 |
| TextBlock |
高 |
核心接口,变更可能性低 |
| ImageBlock |
中 |
视觉功能,可能随多模态能力演进 |
| Msg |
高 |
消息传递核心,变更可能性低 |
| Toolkit |
中 |
工具管理,可能随工具系统演进 |
| AgentBase |
中 |
Agent 基类,可能随框架演进 |
八、附录
A. 文件分类统计
| 分类 |
文件数 |
占比 |
| 基础工具 |
2 |
12% |
| 服务层 |
11 |
65% |
| 专用工具 |
1 |
6% |
| 适配器 |
3 |
17% |
B. 导入位置统计
| 导入位置类型 |
文件数 |
说明 |
| 文件顶部 |
6 |
浏览器、代码、命令、日期时间、文件系统、调度器服务 |
| 函数内部 |
11 |
授权、网页获取、网页搜索、视觉分析、基类等 |
C. 依赖深度分析
| 依赖深度 |
文件数 |
说明 |
| 单层依赖(仅 ToolResponse + TextBlock) |
14 |
标准工具服务 |
| 双层依赖(+ Toolkit) |
1 |
LSP 适配器 |
| 双层依赖(+ AgentBase) |
1 |
参数转换服务 |
| 三层依赖(+ ImageBlock + Msg) |
1 |
浏览器视觉分析 |
文档维护者: RelayAgent 开发团队
最后更新: 2026-03-10
tool 模块 AgentScope 依赖分析
概述
tool 模块是 RelayAgent 与 AgentScope 框架集成的核心层,通过标准化的工具响应机制和扩展能力实现与 Agent 系统的无缝对接。
依赖统计:
一、核心依赖:工具响应标准化
依赖说明
使用文件清单
响应结构说明
工具响应采用统一的两层结构:
第一层:ToolResponse 对象
第二层:TextBlock 对象
元数据字段规范
不同服务返回的 metadata 字段:
导入模式说明
延迟导入模式:大部分服务文件采用函数内导入,而非文件顶部导入。
原因:
导入位置:通常在函数 docstring 之后、实际逻辑之前
二、扩展依赖:视觉分析能力
依赖说明
使用文件清单
工作流程说明
视觉分析的工作流程:
设计原因
为什么需要单独的消息注入:
AgentScope 的消息格式化器会将工具响应中的 ImageBlock 转换为字符串,导致图像数据丢失。通过单独创建消息并添加到 memory,可以确保 LLM 接收到正确格式的图像数据。
三、扩展依赖:工具注册管理
依赖说明
使用文件清单
核心方法说明
工具分组机制
LSP 工具使用分组标识(LSP_TOOL_GROUP)进行统一管理:
优势:
应用场景:
四、扩展依赖:参数类型转换
依赖说明
使用文件清单
问题背景
LLM 在生成工具调用时,可能将参数错误识别为字符串类型:
解决方案
参数类型转换服务的工作流程:
类型转换规则
五、依赖关系图
六、最佳实践建议
1. 工具响应规范
推荐做法:
避免做法:
2. 导入策略
推荐做法:
避免做法:
3. 视觉分析集成
推荐做法:
避免做法:
4. 工具生命周期管理
推荐做法:
避免做法:
七、版本兼容性说明
AgentScope 版本要求
接口稳定性
八、附录
A. 文件分类统计
B. 导入位置统计
C. 依赖深度分析
文档维护者: RelayAgent 开发团队
最后更新: 2026-03-10