问题与目标
第 07 阶段已经完成一次受控 Function Calling。进入 Agent 后,同一任务可能连续、并行或重复调用多个工具,工具结果还会影响下一轮决策。工具设计必须从“函数能调用”升级为“能力可治理”。
本篇把工具分为只读与写入两类,使用服务端身份做权限校验,为写操作加入确认令牌和幂等键,并限制超时与返回大小。示例不会真正发送邮件或写入外部系统。
核心概念
一个 Agent 工具至少包含:
- 清晰名称和单一职责;
- 紧凑的参数 Schema 与业务校验;
- 服务端注入的身份和权限范围;
- 明确的只读或副作用分类;
- 超时、重试和幂等策略;
- 结构化成功与失败结果;
- 审计 ID,以及对敏感字段的脱敏。
模型看见的参数不应包含可伪造的 user_id/role/tenant_id。这些值由 Runtime Context 或服务端会话注入。
可运行实现
python
from dataclasses import dataclass
from uuid import uuid4
@dataclass(frozen=True)
class RuntimeContext:
user_id: str
scopes: frozenset[str]
DEVICES = {"AX-3": {"team": "team-a", "status": "offline"}}
WORK_ORDERS: dict[str, dict] = {}
def get_device(device_id: str, context: RuntimeContext) -> dict:
device = DEVICES.get(device_id)
if not device:
return {"ok": False, "error": "not_found"}
if device["team"] not in context.scopes:
return {"ok": False, "error": "forbidden"}
return {"ok": True, "device_id": device_id, "status": device["status"]}
def create_work_order(
device_id: str,
reason: str,
idempotency_key: str,
confirmation: str | None,
context: RuntimeContext,
) -> dict:
if confirmation != "approved":
return {"ok": False, "error": "approval_required"}
if idempotency_key in WORK_ORDERS:
return {"ok": True, "replayed": True, **WORK_ORDERS[idempotency_key]}
device = get_device(device_id, context)
if not device["ok"]:
return device
order = {"work_order_id": f"WO-{uuid4().hex[:8]}", "device_id": device_id, "reason": reason[:120]}
WORK_ORDERS[idempotency_key] = order
return {"ok": True, "replayed": False, **order}
context = RuntimeContext("u-17", frozenset({"team-a"}))
print(get_device("AX-3", context))
print(create_work_order("AX-3", "设备离线", "task-88:create", None, context))
print(create_work_order("AX-3", "设备离线", "task-88:create", "approved", context))
print(create_work_order("AX-3", "设备离线", "task-88:create", "approved", context))
输出依次表示查询成功、缺少审批、首次创建和幂等重放。生产实现还要用数据库唯一约束或事务保证并发幂等,不能只靠进程内字典。
常见问题与排查
工具描述写“仅管理员可用”就认为安全
描述只影响模型选择。Executor 必须读取服务端身份并再次检查权限,不能依赖 Prompt 或模型传来的角色。
给所有错误统一重试
网络超时可以有限退避;Schema、权限和确认错误应立即返回;写操作重试必须携带相同幂等键。
工具返回数据库完整记录
只返回下一步需要的字段,设置行数和字节上限,并对凭据、个人信息和内部错误堆栈脱敏。
并行执行有依赖的工具
只有互相独立的只读操作适合并行。写后读、审批后执行等依赖必须由状态和边显式排序。
小结
Agent 工具不是普通函数列表,而是一组带身份、权限、预算和审计的业务能力。模型可以建议调用,应用必须保留最终执行权,尤其要守住写操作的审批与幂等边界。
License: CC BY-NC 4.0
Updated 2 hours ago
Was this article helpful? Give it a like.
0 comments


