AI API Function Calling / 工具调用实战指南 2026:跨模型兼容性与避坑清单
2026-08-30 · 约 10 分钟阅读
Function Calling(工具调用)是构建 AI Agent、执行外部操作(查数据库、调用第三方 API、执行代码)的核心能力。但不同厂商的实现细节存在差异,尤其在通过中转站接入多个模型时,这些差异容易导致线上报错。本文系统梳理主流模型的工具调用实现方式,并给出实战避坑清单。
各家模型 Function Calling 实现对比
| 模型 | 参数名 | 并行调用 | 强制调用 | 特殊说明 |
|---|---|---|---|---|
| GPT-5 系列 | tools / tool_choice | 支持 | tool_choice: "required" | 原生支持结构化 JSON Schema |
| Claude 系列 | tools / tool_choice | 支持 | tool_choice: {"type": "tool", "name": "xxx"} | 需在 system prompt 中明确工具使用规则效果更好 |
| Gemini 系列 | tools (functionDeclarations) | 支持 | function_calling_config.mode: "ANY" | 参数命名和结构与 OpenAI 格式差异较大 |
| DeepSeek/国产模型 | 多数兼容 OpenAI 格式 | 部分支持 | 部分不支持强制模式 | 建议先用简单工具测试兼容性 |
基础调用代码示例(OpenAI 兼容格式)
from openai import OpenAI
import json
client = OpenAI(
api_key="你的中转站API Key",
base_url="https://你的中转站域名/v1"
)
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的实时天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"}
},
"required": ["city"]
}
}
}
]
response = client.chat.completions.create(
model="gpt-5.6-sol",
messages=[{"role": "user", "content": "北京今天天气怎么样?"}],
tools=tools,
tool_choice="auto"
)
message = response.choices[0].message
if message.tool_calls:
for call in message.tool_calls:
args = json.loads(call.function.arguments)
print(f"模型请求调用: {call.function.name}, 参数: {args}")
处理并行工具调用
复杂 Agent 任务经常需要模型同时发起多个工具调用,比如“查天气+查日历”一次性返回。处理并行调用的完整链路:
messages = [{"role": "user", "content": "帮我查一下北京天气,同时看看我明天有什么安排"}]
response = client.chat.completions.create(
model="gpt-5.6-sol",
messages=messages,
tools=tools,
)
message = response.choices[0].message
messages.append(message)
# 依次执行每个工具调用并把结果回填
for call in message.tool_calls:
result = execute_tool(call.function.name, json.loads(call.function.arguments))
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": json.dumps(result)
})
# 把工具结果再喂回模型,得到最终回复
final_response = client.chat.completions.create(
model="gpt-5.6-sol",
messages=messages,
tools=tools,
)
print(final_response.choices[0].message.content)
中转站场景下的常见报错与排查
1. tool_calls 字段为空但模型明显应该调用工具:部分中转站没有完整透传 tools 参数或做了字段过滤,建议先用官方 SDK 直连对比排查
2. JSON Schema 校验失败:不同模型对 JSON Schema 复杂度(嵌套层级、枚举、正则约束)的支持程度不同,建议 schema 尽量简单化,避免过度嵌套
3. 强制工具调用(tool_choice: required)不生效:并非所有中转的国产模型都完整实现了这一参数,遇到不生效的情况可以改用 Prompt 层面强约束作为兜底
4. 多轮工具调用丢失上下文:务必把每一轮的 tool_calls 消息和对应的 tool 结果消息都完整保留在 messages 数组里,顺序错误会导致模型报错或产生幻觉
5. 超时问题:外部工具执行耗时较长时,容易触发中转站的整体请求超时,建议异步执行工具、必要时拆分成多轮独立请求
跨模型兼容性建议
如果你的应用需要同时支持多个模型供应商(比如主备容灾场景),建议:
- 统一封装一层适配层,把不同厂商的工具调用格式转换成内部统一结构
- 工具描述(
description)尽量写得清晰具体,减少模型对参数含义的误判 - 针对国产模型做单独的兼容性测试清单,逐个验证并行调用、强制调用等边界情况
- 在中转站选择上,优先选择明确标注"完整支持 Function Calling 透传"的平台
总结
Function Calling 是 AI Agent 落地生产的必经之路,但跨模型、跨中转站的实现差异容易埋坑。建议在正式上线前,针对目标模型逐一验证工具调用的完整链路(发起调用→执行→回填结果→生成最终回复),尤其要关注中转站在参数透传上的完整度。
想了解如何构建更稳定的多供应商容错架构,可以查看站内 AI API 多供应商容错架构设计,或访问 openairouter.net 查看主流中转站的功能支持对比。