Skip to main content
Python 工具是任意继承 ToolBase 基类的对象。AgentScope 提供了一组内置工具覆盖常见操作,并对外暴露同一接口供开发者自定义:

ToolBase 接口

ToolBase 是所有工具的抽象基类。下表列出其属性与方法。 工具的属性: ToolBase 提供的核心方法:

使用内置工具

AgentScope 预置了一组覆盖常见智能体操作的工具,实例化后传入 Toolkit(tools=[...]) 即可:
元工具 reset_toolsSkill 查看工具只有在存在额外的工具组或技能时才会自动注册,开发者无需手动实例化。详见元工具Skill

Bash

Bash 工具执行 shell 命令并返回 stdout / stderr。它实现了所有可选接口方法,提供精细的权限控制。 check_permissions() 对命令字符串做分层安全分析:
  1. 注入风险检测:标记 $(...)、反引号、进程替换等无法静态分析的动态结构 → ASK
  2. 只读命令检测:自动放行安全命令(git statuslscatgrepdocker ps 等),包括所有子命令均只读的复合命令 → ALLOW
  3. 危险命令模式:识别破坏性操作(如 chmod 777mkfs) → ASK
  4. Sed 约束检查:阻止针对危险文件的就地 sed -i → ASK
  5. 危险路径保护:检查命令是否操作敏感配置文件(.bashrc.ssh/.env) → ASK
  6. 危险删除检测:捕获指向关键系统路径(/~/usr)的 rm / rmdir → ASK
  7. ACCEPT_EDITS 模式:自动放行文件系统命令(mkdirtouchrmrmdirmvcpsed),且仅当所有目标路径都在某个配置的工作目录内时。任一目标路径越出工作集(例如 cp /etc/hosts /tmp/x)会落到 PASSTHROUGH 而不自动放行。
check_read_only() 在上述第 2 步只读检测器识别出的任何命令上返回 True,其余返回 False。权限引擎用它在 EXPLORE / ACCEPT_EDITS 决定自动放行,避免重复跑完整的安全分析。 match_rule() 使用基于前缀的通配匹配: generate_suggestions() 抽取命令前缀(前两个 token)并给出前缀规则。例如 git commit -m "fix bug" 生成建议 git commit:* 构造函数支持向危险路径列表追加自定义条目:

文件工具

文件工具强制执行「先读后写」规则:WriteEdit 要求目标文件先经由 Read 读取过。这避免了盲目覆写,并保证智能体总是基于最新内容进行操作。 check_permissions()WriteEdit 共用同一权限逻辑:
  1. 危险路径保护:操作敏感文件(.bashrc.env.ssh/)返回带 bypass_immune=True 的 ASK,allow 规则无法静默授权。BYPASS 模式下该 ASK 仍然被跳过(BYPASS 明确选择放弃 safety 提示),DONT_ASK 下被转为 DENY。完整契约见安全检查契约
  2. ACCEPT_EDITS 模式:自动放行配置工作目录内的文件操作
  3. PASSTHROUGH:交给权限引擎做规则匹配
Read 是只读工具,始终返回 PASSTHROUGH(EXPLORE 与 ACCEPT_EDITS 模式下的自动放行由引擎通过 check_read_only 处理)。 match_rule():三个工具都使用 fnmatchfile_path 参数做 glob 匹配: generate_suggestions() 提议覆盖父目录的 glob。例如编辑 /project/src/main.py 会生成建议 src/**

计划工具

计划工具让智能体能够显式地维护一份结构化的任务清单,智能体可以通过工具调用来创建、查询和更新任务。计划相关的数据会被存储在智能体实例的 agent.state.tasks_context 中,所有计划相关的工具通过操作这个共享的状态来实现任务的管理。同时,所有计划相关的工具在权限检查中被默认放行。 完整的任务生命周期、存储模型,以及如何以编程方式预置或自定义任务,请参见计划模式

切换工具后端

AgentScope 中的 BashGrepGlobReadWriteEdit 工具支持后端切换,即将运行逻辑委派到不同的执行环境中,例如本地文件系统、Docker 容器、E2B 沙箱等。 通过指定 backend 参数即可切换后端,而 backend 实例可以通过 Workspace 实例获取,默认为本地环境。关于 Workspace 的更多信息,请参见工作空间章节。

自定义工具

通过继承 ToolBase 基类并实现对应的抽象接口即可创建自定义工具,同时通过设定相关的属性可以控制工具的权限审查和执行逻辑。
自定义工具时,有两个权限审查相关的逻辑需要注意:
  • check_read_only(tool_input):当某次调用是否只读取决于输入时,需要覆写该函数(例如 Bashls 是只读,rm 不是)。该函数默认返回 is_read_only 静态属性。权限引擎在判定 EXPLORE / ACCEPT_EDITS 是否自动放行时调用。
  • PermissionDecision(..., bypass_immune=True):在返回的 ASK 上设置,把它标记为 allow 规则无法静默的 safety check(例如 DeployTool 标记 prod-* 目标)。各模式下的具体处理见 安全检查契约

将函数包装为工具

当需要把一个 Python 函数暴露给智能体时,一个轻量化的方法是用 FunctionTool 适配器包装。它会自动从 func.__name__ 取工具名、从 docstring 提取工具描述、从类型注解推导 input schema。
当自动推导的默认值不合适时,FunctionTool 支持显式覆盖:
被包装的函数默认走 ASK 权限行为:用户必须为每次调用显式放行。需要自定义权限逻辑时,请直接继承 ToolBase

定义外部执行工具

外部执行工具把实际执行委派给智能体运行时之外,通常是人工操作员或外部系统。智能体调用此类工具时会发出 RequireExternalExecutionEvent 事件并退出 reply / reply_stream 函数,直到结果通过 ExternalExecutionResultEvent 回传。 这种模式是人机交互工作流的基础:某些动作需要人工确认或人工执行。 创建外部执行工具只需把 is_external_tool 设为 True,不必实现 call 函数:

工具中间件

工具中间件(Tool Middleware)把洋葱式钩子直接挂到某个工具实例上。每次调用该工具时(无论由智能体触发还是直接调用),已注册的中间件都会按顺序触发,包裹执行流程。 这与智能体级中间件是独立的两套机制:智能体中间件中的 on_acting 包裹 ReAct 循环内整个工具调用逻辑(包括权限检查与事件产出),而 ToolMiddlewareBase 只在工具自身的 call() 执行链内触发,即使工具在智能体之外被调用也会生效。

自定义中间件

实现自定义中间件需要继承 ToolMiddlewareBase 并实现唯一的抽象异步生成器方法 on_tool_call

执行模型

  • 第一个注册的中间件是最外层:其前置逻辑最先执行,后置逻辑最后执行。
  • next_handler(**input_kwargs) 始终返回 AsyncGenerator[ToolChunk, None]。流式与非流式工具统一处理,中间件无需区分。
  • 最内层调用工具自身的 call()

挂载中间件

通过 middlewares 参数向工具构造函数传入中间件实例列表:

示例

一个在调用前后打印日志的中间件,以及一个在出错时自动重试的中间件:
工具中间件 vs. 智能体中间件:对属于工具本身的横切关注点(日志、指标、重试),使用 ToolMiddlewareBase。若需要访问更广泛的智能体上下文(权限决策、工具调用事件或所在的 ReAct 轮次),请使用 MiddlewareBase.on_acting。完整的智能体级钩子参考见中间件