算子最佳实践
可靠算子应具有单一职责、明确契约、安全重试、最小权限和可观察结果。
一个方法只做一项操作
优先使用 getCustomer、listInvoices 和 createTicket,不要使用笼统的 runOperation。职责聚焦的方法更容易在工作流中映射,也更容易被智能体正确选择。
Runtime 工具目录中的名称必须唯一。即使内部注册键不同,重复工具名也会让模型选择和结果渲染产生歧义。
设计类型化契约
- 使用稳定业务 ID。
- 真正必需的字段才设为必填。
- 定义数组 Item 和嵌套对象。
- 封闭取值集合使用 Enum。
- 说明单位、时区、格式和值含义。
- 严格操作应拒绝未知字段。
- 返回稳定 ID 和类型化事实。
不要只返回展示文案。界面可以格式化结构化数据,但下游节点无法可靠解析一句话。
明确表达空结果
只读操作没有匹配不是执行错误,应返回明确状态:
{
"success": true,
"results": [],
"total": 0
}
请求失败应返回或抛出独立错误,并包含安全 Code 与消息。明确区分可避免智能体在工具没有数据时声称已经找到结果。
让写操作具有幂等性
重试可能重复发送邮件、支付、工单或新增记录。对有重要后果的写操作:
- 接收或派生幂等键;
- 记录生成的资源 ID;
- 重放时复用,不执行第二次写入;
- 交互调用时要求确认;
- 参数或授权失败不重试。
有意设置超时与重试
- 算子超时必须位于任务或轮次预算内。
- 只重试临时错误。
- 使用有边界的退避,不要立即循环。
- 对重复警告进行频率限制。
- 在错误中保留 execution/request ID。
- Runtime 和供应商支持时,取消远端工作。
保护 Secret 与数据
- 凭据保存在托管连接或 Secret 中。
- 对空间和远端系统实施最小权限。
- 日志中屏蔽敏感输入输出。
- 不记录完整简历、文档、API Header 或包含数据的 curl 命令。
- 只返回调用方需要且有权查看的字段。
- 渲染工具结果时按不可信内容处理。
支持智能体选择工具
面向智能体的描述应回答:
- 工具执行哪项准确操作?
- 什么情况下应该选择?
- 什么情况下应选择其他工具?
- 必须提供哪些 ID 或证据?
- 空结果意味着什么?
数据集工具必须保持以下边界:
- 结构化查询用于精确类型条件和 ID;
- 计数用于精确总数;
- 全文搜索用于字面文本;
- 向量搜索用于概念、相似性和跨语言匹配。
不要把某个行业的词汇写成全局 Runtime 规则。行业专属选择指导应放在对应智能体或解决方案模板中。
保持结果可观察
在执行过程中展示状态、时长、安全参数、结构化结果和错误详情。应用插件可以提供更丰富卡片,但不能丢弃底层算子结果。
异步操作应展示进度和最终资源/执行 ID。如果没有真正创建后台 Job,不要把“处理中”作为最终成功结果。
测试契约边界
测试范围不能只有成功路径:
- 必填与可选输入;
- 错误类型和额外字段;
- 空结果与多条结果;
- Unicode 和区域文本;
- 大型嵌套值;
- 无权访问资源;
- 连接失败、限流、超时和取消;
- 安全重试与重复写;
- 工作流映射和智能体工具渲染。
修改契约后,必须运行引用它的工作流和智能体。Helper 单元测试不能替代端到端契约测试。
版本变更
优先增加可选字段。破坏性变更应创建新 Identifier 或方法,迁移并验证调用方后,再停用原契约。不要悄悄改变已有字段含义。
评审清单
- 名称唯一且动作明确
- 适用范围说明清楚
- 输入输出 Schema 类型明确
- 空结果表达明确
- 连接与空间权限最小化
- 超时、重试与幂等行为安全
- 日志不包含敏感值
- 工作流与 Chat 能看到结构化结果
- 覆盖成功、错误、空结果、重复和取消测试
- 启用前已完成调用方回归