用途:设计 Agent UI 背后的工具表面(tool surface)。资料强调元数据决定发现与选择,界面再漂亮,模型不调用就等于没有。
命名:使用动作导向的动词_名词、小写、下划线分隔,如 search_listings、render_listings_widget、complete_checkout;避免 listings、handler、doStuff、get_data。名称是模型最强的信号,并用 search_、get_、render_、create_、update_* 等一致前缀帮助模型推理工具家族。
描述:把描述当作提示词写给模型,需覆盖四件事——具体做什么(含返回形态)、何时调用(用户情境)、依赖什么(前置调用)、何时不该调用(近似误用场景)。依赖声明在解耦模式中很关键,缺少“先调用 roll_dice”之类说明,模型会自行编造参数。
输入模式:每个参数都要有描述,优先枚举而非自由字符串,为数字设 min/max、字符串设 maxLength、数组设 maxItems;必填即必填,可选参数给合理默认值;保持工具表面小,15 个参数的工具容易调用出错。
输出:返回 structuredContent 时应声明 outputSchema,作为对模型、视图与测试的契约。三种结果通道:structuredContent 供视图渲染、模型可检视;content 为简短自然语言摘要,供模型与纯文本宿主读取;_meta 仅客户端可见,用于渲染提示、会话令牌等模型不应推理的内容。content 不可省,否则纯文本宿主与后续追问会失效;structuredContent 要精简,避免回传整份数据集浪费上下文。
可见性:默认 ["model","app"] 供双方调用;["app"] 仅视图可见,适用于分页、轮询、购物车变更、分块传输;["model"] 仅模型可调用,用于 UI 不应发起的敏感操作。app-only 是保持对话上下文干净的主要手段。可见性属于上下文卫生而非访问控制,服务端仍须自行鉴权。ChatGPT 旧等价物是 _meta["openai/widgetAccessible"];M365 Copilot 支持 openai/visibility 但不支持 widgetAccessible,建议用 _meta.ui.visibility。
安全注解:可设 readOnlyHint、destructiveHint、idempotentHint、openWorldHint,成本低且部分宿主会使用,但不要依赖 destructiveHint 产生确认提示,不可逆操作要在自有 UI 内建确认。调用状态文本 _meta["openai/toolInvocation/invoking"]、["openai/toolInvocation/invoked"] 仅 ChatGPT 支持,M365 Copilot 不支持,应在组件内提供真实状态。
发现与数量:发现取决于名称、描述中的用户触发情境、参数描述区分度、服务/应用描述的总括语境;应写五种真实用户说法测试选择是否正确,选错是元数据缺陷而非模型失败。约 10 个命名良好的工具内选择可靠,超过约 20 个明显下降;优先一个带枚举参数的工具而非五个近似工具,机械辅助工具用 visibility ["app"] 隐藏;超出单一领域时拆分服务。
反模式:每个工具都带 resourceUri 会导致组件每次调用重挂载丢状态;只有 structuredContent 破坏纯文本宿主与追问;面向人写的描述无法让模型判断;无约束字符串参数带来畸形调用与注入面;返回整份数据集烧上下文;渲染处理器里放业务逻辑不可测试;依赖 destructiveHint 做确认被主要宿主忽略。
限制:上述部分 _meta 字段与可见性行为因宿主而异;资料未提供具体价格、平台支持清单或版本要求。