tools 写法,换模型只需改 model。
各模型该用哪个端点
下表是 2026 年 10 月 14 日用同一个天气函数完成”调用 → 回传结果 → 最终回答”两轮的结果:
表中标「—」的模型用 Chat Completions。拿不准时也先用 Chat Completions;GPT-6 系列用 Responses。Gemini 也可以用原生
generateContent 的 functionDeclarations,见 Gemini 原生协议。
Chat Completions 示例
运行前安装 SDK(python -m pip install openai),并设置 LAOZHANG_API_KEY 环境变量。
message.tool_calls 里有函数名和 JSON 字符串形式的参数。第二轮把模型的这条消息和每个 tool 结果一起发回去,tool_call_id 要和对应调用的 id 一致。
把 MODEL 换成上表中 Chat Completions 可用的其他模型,代码不用改。gpt-6-sol 还要在两次请求里都加上 reasoning_effort="none",否则返回 400。
Responses 示例
Responses 的工具定义少一层function,结果以 function_call_output 回传:
Responses 多轮回传
回传历史时只带call_id、name 和 arguments,像上面的示例一样自己重建 function_call 项。不要依赖服务端保存的会话:
- 不要用
previous_response_id接着上一轮。 - 不要把第一轮的
output原样拼回input。
The requested item was created under a different Azure OpenAI resourcePrevious response with id '...' not found
常见问题
gpt-6.1-sol 带 tools 为什么报 400?
OpenAI 对 gpt-6.1-sol 的规定是:Chat Completions 中函数工具不能和推理同时使用,而这个模型的 reasoning_effort 又不能设为 none。改用 Responses 即可,示例见上文。
模型一次返回多个函数调用怎么办?
逐个执行,每个结果单独回传,并带上对应的tool_call_id(Chat Completions)或 call_id(Responses)。上面两个示例都已经用循环处理了多个调用。
参数不是合法 JSON 怎么办?
先用json.loads 校验,失败时把错误信息作为函数结果回传,让模型重新生成。Responses 中给工具加 "strict": true 并在 parameters 里写 "additionalProperties": false,可以让参数严格符合 schema。
函数调用会额外收费吗?
不会。工具定义和函数结果都算作输入 token,模型返回的调用参数算作输出 token,按模型单价计费。服务端工具(例如联网搜索)另有按次费用。相关文档
- 让模型搜索网页并引用来源:联网搜索
- Chat Completions 与 Responses 的选择、GPT-6 的参数规则:OpenAI 模型接入
- Gemini 原生格式的函数调用:Gemini 原生协议
参考资料
- OpenAI:Function calling
- Google:Function calling with the Gemini API