allow、ask 或 deny;client-side 自定义工具始终暂停,由你的应用执行后回传结果。
运行时行为
工具调用进入事件流时,会投影为:| 事件 | 含义 | 关键字段 |
|---|---|---|
agent.tool_use | 内置工具调用 | id, name, input, evaluated_permission |
agent.mcp_tool_use | MCP 工具调用 | id, name, input, mcp_server_name, evaluated_permission |
agent.custom_tool_use | Client-side 自定义工具请求 | id, name, input |
evaluated_permission 可能为:
| 值 | 行为 |
|---|---|
allow | 平台直接执行工具 |
ask | 当前 turn 暂停,等待 user.tool_confirmation |
deny | 平台向 Agent 返回被拒绝的工具结果 |
permission_policy;它们由客户端执行,并通过 user.custom_tool_result 恢复。
在 Agent 中配置权限
内置工具和 MCP 工具的权限配置写在 Agent 的tools 数组里:
| 位置 | 作用范围 | 说明 |
|---|---|---|
tools[].configs[].permission_policy | 一个具名工具 | 单工具权限覆盖。内置工具的 name 使用 Read 等内置工具名;MCP 工具的 name 使用该 MCP server 暴露的原始工具名 |
tools[].configs[].enabled | 一个具名工具 | 设为 false 时会禁用并拒绝该工具。如果同时使用 enabled_tools 白名单,不要把已禁用工具放进白名单 |
permission_policy.type 可选值:
| 值 | 运行时结果 |
|---|---|
always_allow | evaluated_permission: "allow" |
always_ask | evaluated_permission: "ask",当前 turn 等待 user.tool_confirmation |
always_deny | evaluated_permission: "deny" |
Pending Action 流程
当工具调用需要人工或客户端输入时:- 事件流先发送
agent.tool_use或agent.custom_tool_use - 事件流再发送
session.status_idle,其中stop_reason.type为"requires_action" stop_reason.event_ids列出需要响应的事件 ID- 客户端向
POST /v1/sessions/{session_id}/events发送响应事件 - Agent 继续同一个 turn
确认工具调用
使用agent.tool_use 事件的 id 作为 tool_use_id。这里传的是 evt_... 事件 ID,不是模型供应商内部的 tool-use ID。
- 批准
- 拒绝
完成自定义工具
自定义工具通过 Agent 的type: "custom" 配置,详见 Agent 工具配置。当 Agent 请求自定义工具时,你的应用执行该工具,然后使用 agent.custom_tool_use 事件 ID 回传:
content 可以是字符串、单个 text block 或 text block 数组。返回事件会以 content block 结构保存。
常见问题
Q:一个 turn 可以有多个待响应操作吗? A:可以。stop_reason.event_ids 可能包含多个事件 ID,需要逐个响应。
Q:pending action 会超时吗? A:不会。它会保持 pending,直到被解决,或 session/turn 被取消。
Q:自定义工具能使用 permission_policy 吗? A:不能。自定义工具是 client-side 工具,是否执行或拒绝由客户端负责。
下一步
Agent 工具
为 Agent 配备内置、MCP 和自定义工具。
Session 事件流
通过 SSE 实时获取 Agent 的思考、消息、工具调用与状态。
启动 Session
管理会话生命周期。
定义 Agent
回顾 Agent 配置。