Skip to main content
函数调用让模型返回”要调用哪个函数、参数是什么”,由你的程序执行函数,再把结果交回模型生成最终回答。老张API的 OpenAI 兼容接口对多数文本模型使用同一种 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。
老张API的同一个模型可能由多条官方线路承接,两轮请求不一定落在同一条线路上。这两种写法引用的是上一条线路上保存的对象,换了线路就会报 400:
  • The requested item was created under a different Azure OpenAI resource
  • Previous response with id '...' not found
只回传内容、不回传 ID 的写法不受影响。

常见问题

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,按模型单价计费。服务端工具(例如联网搜索)另有按次费用。

相关文档

参考资料