Function Calling工具调用实战教程Agent

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 查看主流中转站的功能支持对比。

找到最适合你的 AI API 中转站

收录 125+ 服务商,按价格、模型、标签一键筛选

查看所有中转站 →