Skip to content

tool替换relay #214

Description

@bouillipx

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 操作类型和写入字节数

导入模式说明

延迟导入模式:大部分服务文件采用函数内导入,而非文件顶部导入。

原因

  1. 避免循环依赖问题
  2. 减少模块加载时的依赖检查
  3. 仅在实际需要时才加载 AgentScope 模块

导入位置:通常在函数 docstring 之后、实际逻辑之前


二、扩展依赖:视觉分析能力

依赖说明

类/函数 模块路径 用途
ImageBlock agentscope.message 图像内容块,支持 base64 编码的图像数据
Msg agentscope.message 消息对象,用于 agent memory 传递

使用文件清单

文件路径 导入位置 主要功能 使用场景
service/browser_vision.py 行 10 浏览器截图视觉分析 将截图添加到 agent memory

工作流程说明

视觉分析的工作流程:

  1. 截图捕获:调用 browser_screenshot 获取页面截图
  2. 图像块构建:将 base64 编码的图像数据封装为 ImageBlock
  3. 消息创建:使用 Msg 创建包含 ImageBlock 的消息对象
  4. 内存注入:通过 agent memory 的异步添加方法将图像消息注入
  5. 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)进行统一管理:

优势

  1. 支持批量卸载,无需逐个移除
  2. 避免工具名称冲突
  3. 便于工具生命周期管理

应用场景

  • 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"

解决方案

参数类型转换服务的工作流程:

  1. 获取工具 Schema:通过 AgentBase.toolkit.get_json_schemas() 获取所有工具的参数定义
  2. 匹配当前工具:根据工具名称查找对应的参数 Schema
  3. 类型转换:根据 Schema 中定义的参数类型,将字符串值转换回正确类型
  4. 返回修正参数:返回类型正确的参数字典

类型转换规则

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions