跳转到主要内容

选择策略与协议形状

字段需要目标模型和渠道支持。Chat 的并行开关为可选布尔指针,显式 false 不等于省略;当前 Chat ↔ Responses 转换会映射布尔值及指定函数形状。Chat → Claude 会将 required 映射为 any、指定函数映射为 tool,并将关闭并行映射为 disable_parallel_tool_use;这不是所有模型都接受所有组合的保证。 parallel_tool_calls 控制模型单轮输出,不替应用调度并发、不限制多个独立 HTTP 请求,也不表示网关执行本地函数。应用仍应检查实际调用数量、参数、名称与关联 ID。要求一个调用时收到多个,应先停止验证;不要先执行一部分再报错。内置搜索等服务端工具有独立限制。

strict 与转换边界

原生 Chat 的函数声明可携带 function.strict,原生 Responses 使用同层 strict。当前两个方向的 Chat / Responses 函数工具转换都只复制名称、描述和参数,没有复制 strict 字段。原生请求、转换请求和上游默认严格策略因此不能视为等价;参数 schema 被保留也不证明严格模式生效。 这是函数工具声明的限制,不要与最终文本的 response_format.json_schema.strict / text.format.strict 混淆。无论 strict 是否保留,都要在应用侧校验业务参数。OpenRouter 的 require_parameters 路由偏好、allowed_tools、工具搜索和托管执行不能由这几个字段推导为项目通用功能。

有界的只读工具示例

脚本支持 API_TOOL_POLICY=forced|required|auto|none,默认 forced。第一轮按所选策略请求本地演示库存,始终发送 parallel_tool_calls=false;收到合法调用后回传匹配的 tool_call_id,第二轮切换到 none 请求最终答案。最多两次模型请求、一次本地只读计算,没有自动重试。 forced / required 缺少调用视为示例失败;auto 可以直接回答;none 收到调用会失败。所有参数必须通过检查才执行固定的演示查询,不动态分派函数,也不连接真实库存系统。保留完整助手消息用于续聊,不打印私有推理。第二轮失败不会重做调用;生产中会改变数据的工具仍需独立权限、去重和恢复设计。 输出包含回答和实际工具调用数;模型是否正确引用库存值需另行验收。示例依赖模型支持工具选择,不能通过 HTTP 200 认定策略已生效。 源码:relaykit/dto/openai_request.go、relaykit/relayconvert/internal/oai_chat/to_oai_responses_req.go、relaykit/relayconvert/internal/oai_responses/to_oai_chat_req.go、relaykit/relayconvert/internal/shared/claude/tool_choice.go。参见 工具调用、OpenRouter 客户端工具 和 OpenAI 工具说明。

可运行示例

在文档目录运行;复制脚本时一并保留 http-client.mjs,配置见 REST 运行时。
Read in English