[智能体-175]:OpenAI 标准是如何支持Tools调用的? OpenAI Tools 调用标准完整说明纯文本、无图片OpenAI Tools前身 Function Calling是基于对话接口 结构化字段 JSON Schema实现的一套调用规范核心逻辑大模型只生成调用指令客户端负责执行函数 / 工具再将结果回传给模型完成问答闭环。一、基础概念与版本说明适用接口chat.completions对话接口仅聊天模型gpt-3.5-turbo、gpt-4、gpt-4o 等支持文本补全接口不支持。字段演进早期为functions字段新版统一升级为tools通用字段向下兼容函数调用能力。核心约束通过JSON Schema定义工具入参可开启强校验保证输出格式合法。二、请求体核心结构调用接口时在原有model、messages基础上新增三个关键字段tools、tool_choice。1. tools 字段定义所有可用工具tools是数组每一个元素代表一个工具固定结构如下json[ { type: function, function: { name: 工具唯一名称, description: 工具功能描述供大模型理解用途, strict: true, parameters: { type: object, properties: {}, required: [], additionalProperties: false } } } ]字段释义type固定取值function代表工具类型为可调用函数。name工具名全局唯一模型通过该名称指定调用目标。description自然语言描述模型依赖此字段判断是否需要调用当前工具。strict布尔值开启后强制模型输出完全符合 JSON Schema的参数杜绝格式错误。parameters标准 JSON Schema定义工具的入参规则properties键值对定义每个参数的名称、类型、描述、枚举等required数组声明必填参数名additionalProperties设为false禁止模型生成额外未定义参数。2. tool_choice 字段控制工具调用策略用于指定模型是否、以及如何调用工具支持三种取值auto默认模型自主判断选择调用工具或直接回复文本。none禁止模型使用任何工具强制返回自然语言内容。自定义对象{type:function,function:{name:指定工具名}}强制调用某一个固定工具。3. 完整请求示例精简版json{ model: gpt-3.5-turbo, messages: [ {role: user, content: 查询北京市今日天气} ], tools: [ { type: function, function: { name: get_weather, description: 查询指定城市的天气信息, strict: true, parameters: { type: object, properties: { city: {type: string, description: 城市名称} }, required: [city], additionalProperties: false } } } ], tool_choice: auto }三、接口响应结构工具调用模式当模型判定需要调用工具时响应不再返回纯文本而是在message中新增tool_calls结构化数组。标准响应格式json{ choices: [ { message: { role: assistant, content: null, tool_calls: [ { id: call-xxxxxx, type: function, function: { name: get_weather, arguments: {\city\:\北京市\} } } ] }, finish_reason: tool_calls } ] }字段释义content为空代表模型无自然语言回答仅下发工具调用指令。tool_calls工具调用列表支持一次调用多个工具id调用唯一标识后续回传结果执行完工具后的结果时必须携带该 ID用于关联请求与响应name待调用的工具名称与请求tools内名称一一对应argumentsJSON 字符串格式的入参内容严格匹配前文 JSON Schema。finish_reason结束标记tool_calls代表本轮会话结束需要执行工具。四、消息角色规范多轮闭环核心OpenAI 定义了 4 种对话角色工具调用全流程依靠角色消息流转实现闭环user用户原始提问。assistant模型回复可承载文本内容 或tool_calls调用指令。tool工具执行结果消息专门用于回传工具返回数据。tool 角色消息格式结果回传必填解析tool_calls并执行本地工具后需要把结果封装为tool角色消息追加到消息列表再次请求接口json{ role: tool, tool_call_id: call-xxxxxx, name: get_weather, content: 北京市今日晴气温25摄氏度 }tool_call_id必须和模型返回的tool_calls.id完全一致用于链路关联。content工具执行后的返回结果字符串格式。五、完整调用流程标准 4 步闭环步骤 1发起首轮请求客户端组装user消息 tools工具定义调用 Chat Completions 接口。步骤 2解析工具调用指令判断响应中finish_reason是否为tool_calls若是解析tool_calls数组提取工具名、id、arguments参数若否直接读取content作为最终回答流程结束。步骤 3本地执行工具对arguments字符串做 JSON 反序列化得到结构化参数根据name匹配本地对应函数 / 工具传入参数执行这步是执行函数捕获工具返回结果。步骤 4回传结果并获取最终回答将工具结果封装为tool角色消息追加到原有消息队列再次调用接口此时模型结合工具返回数据生成自然语言最终回答读取assistant.content流程结束。补充支持多轮嵌套调用若第二轮响应依然包含tool_calls重复执行 2-4 步骤即可。六、流式调用支持OpenAI 流式接口streamtrue同样兼容 Tools 标准流式分片会逐步推送tool_calls的id、name、arguments片段客户端拼接完整字段后再执行本地工具后续流程与非流式保持一致。七、关键特性与规则强格式校验开启strict: true后模型输出的arguments严格遵循 JSON Schema不会出现多余字段、类型错误、缺失必填项大幅降低解析异常。并行工具调用tool_calls为数组单轮响应可同时返回多个工具调用指令客户端可并行执行多个工具。无代码执行模型全程只生成调用指令不执行任何本地代码 / 逻辑所有工具运行、权限控制、异常捕获均由客户端负责。上下文持久化所有消息用户、模型、工具结果都需要保留在messages列表中保证多轮调用上下文连贯。八、与 LangChain 的对接关系LangChain 读取内部BaseTool工具的名称、描述、参数 Schema自动转换成 OpenAI 要求的toolsJSON 结构bind_tools方法本质是封装了工具转译逻辑调用时自动携带tools、tool_choice参数LangChain 解析 OpenAI 返回的tool_calls自动路由、执行对应工具最后将工具结果封装为框架内部ToolMessage对齐 OpenAItool消息格式回传完成闭环。