GPT-5.6 Sol 接入应用时,建议把 Responses API 作为统一入口:普通问答只需传入 model 与 input,需要外部能力时再通过 tools 增加函数、网页搜索或文件搜索。真正需要注意的不是“把工具名称写进请求”这么简单,而是应用必须正确处理模型输出的工具调用、执行本地业务逻辑、回传结果,并持续保存调用标识。下面从一个最小请求开始,逐步搭出可用于实际项目的 Agent 调用循环。
GPT-5.6 Sol 的模型标识是 gpt-5.6-sol。来源页面将它定位为面向复杂专业工作、代码与工具密集型工作流的旗舰层级,并列出了 Responses API、函数调用、网页搜索、文件搜索、Computer Use、Programmatic Tool Calling、持久化推理和多 Agent 等能力。能力列表说明模型可以参与这些工作流,不等于每个客户端、账户和兼容服务都自动开放全部工具。
接入前应先核对三件事:当前 API 服务是否实现 Responses 端点;账户是否有目标模型和相应托管工具的权限;所用 SDK 是否足够新,能够识别 Responses 对象和工具输出类型。如果服务商只兼容 Chat Completions,就不能仅把方法名改成 responses.create。两种接口的返回结构、工具调用表示和多轮状态衔接并不相同。
Python SDK 会从环境变量读取密钥。若使用兼容服务,应按服务商说明配置客户端地址,但不要把密钥写进源码、日志或浏览器前端。最小文本请求如下:
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5.6-sol",
instructions="使用简洁中文回答;不确定时明确说明。",
input="解释 Responses API 适合解决什么问题。",
)
print(response.output_text)
instructions 适合放稳定的角色、边界和输出要求,input 放本轮任务。output_text 是 SDK 提供的文本聚合便利属性,适合只关心最终文本的场景;一旦使用函数或内置工具,就应检查 response.output 中的每个条目,因为输出可能同时包含消息、工具调用和其他类型的项目。
不要假定每次响应都有文本。模型决定调用函数时,当前响应的关键产物可能是 function_call;如果代码只打印 output_text,表面上就会像“模型没有回答”。因此,Agent 应用的处理器应按 type 分派输出,而不是把整个响应当成一段字符串。
函数调用允许模型选择应用提供的业务能力,例如查询订单、读取库存或创建工单。模型只生成结构化调用意图,不会自动执行你的 Python 函数。应用仍要负责参数校验、授权、执行、审计和异常处理。
下面定义一个只读的天气函数。参数使用 JSON Schema 描述,并开启严格校验。函数名和描述应具体,字段应尽量少;含糊的描述会增加选错工具或填错参数的概率。
import json
from openai import OpenAI
client = OpenAI()
tools = [{
"type": "function",
"name": "get_weather",
"description": "查询指定城市当前天气,用于回答实时天气问题。",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称,例如上海"
}
},
"required": ["city"],
"additionalProperties": False
},
"strict": True
}]
response = client.responses.create(
model="gpt-5.6-sol",
input="今天上海天气如何?",
tools=tools,
)
def get_weather(city):
# 真实项目在这里调用经过授权的天气服务。
return {"city": city, "condition": "示例数据", "verified": False}
tool_outputs = []
for item in response.output:
if item.type != "function_call":
continue
if item.name != "get_weather":
raise ValueError(f"不允许的函数: {item.name}")
args = json.loads(item.arguments)
result = get_weather(args["city"])
tool_outputs.append({
"type": "function_call_output",
"call_id": item.call_id,
"output": json.dumps(result, ensure_ascii=False),
})
if tool_outputs:
response = client.responses.create(
model="gpt-5.6-sol",
previous_response_id=response.id,
input=tool_outputs,
tools=tools,
)
print(response.output_text)
这里有四个不能省略的环节。第一,只执行白名单函数,不能把模型返回的名称直接映射到任意反射调用。第二,即使启用了严格模式,也要在业务层再次校验参数范围和用户权限。第三,用 call_id 把执行结果对应回原调用。第四,把工具输出交给模型后再取得面向用户的自然语言结果。
示例中的天气结果故意标记为未核验,避免把占位数据误当成真实结果。生产代码应替换为真实数据源,并给调用设置超时。涉及写入、付款、删除或发送消息的函数,还应增加幂等键和人工确认;模型提出调用不等于用户已经授权执行不可逆操作。
默认的 tool_choice="auto" 允许模型在直接回答和调用工具之间选择。若某个流程必须读取权威业务数据,可设为 required,要求至少调用一个工具;若当前阶段禁止工具,则设为 none。还可以约束到特定函数,但应仅在业务流程明确时这样做。
工具选择和函数授权是两层不同控制。tool_choice 影响模型生成什么,服务端白名单和权限系统决定什么能够真正执行。即使强制模型调用查询函数,也不能绕过租户隔离;即使模型没有选择危险函数,后端仍不应给它超出当前用户身份的凭据。
托管工具由 API 平台执行,应用通常不需要像自定义函数那样编写本地执行器。网页搜索可以这样加入请求:
response = client.responses.create(
model="gpt-5.6-sol",
tools=[{"type": "web_search"}],
input="汇总今天与 Python 相关的重要发布,并区分事实与推测。",
)
print(response.output_text)
网页搜索适合需要时效信息的任务。应用展示结果时应保留响应中的来源标注,不要把带来源的回答压平成无法追溯的纯文本。还要考虑搜索成本、延迟、地域可用性和不可信网页中的提示注入风险。网页内容只能作为数据,不能成为覆盖开发者指令的命令。
文件搜索需要先建立向量存储并上传或关联文件,然后在工具定义中传入允许搜索的存储标识:
response = client.responses.create(
model="gpt-5.6-sol",
tools=[{
"type": "file_search",
"vector_store_ids": ["vs_project_docs"]
}],
input="根据项目文档概括发布前检查项;没有依据的内容不要补充。",
)
print(response.output_text)
这里的存储标识只是格式示例,必须换成实际创建的资源。多租户系统不能把所有客户文件放入一个无过滤的检索范围。文件上传、向量存储授权、检索过滤和响应引用都应与租户身份绑定。对于合规数据,还要确认保存期限、删除流程和审计要求。
一个 Agent 并不是单次 API 调用,而是受限的循环:接收目标,向模型提供当前上下文和可用工具,执行被批准的调用,回传结果,再判断是否完成。最简单的循环可以设置最大步数,并在每一步只接受已知输出类型。
MAX_STEPS = 8
response = client.responses.create(
model="gpt-5.6-sol",
input="检查订单状态并说明下一步。",
tools=tools,
)
for _ in range(MAX_STEPS):
calls = [x for x in response.output if x.type == "function_call"]
if not calls:
break
outputs = []
for call in calls:
outputs.append(execute_approved_call(call))
response = client.responses.create(
model="gpt-5.6-sol",
previous_response_id=response.id,
input=outputs,
tools=tools,
)
else:
raise RuntimeError("Agent 超过最大工具调用步数")
print(response.output_text)
execute_approved_call 应返回符合 function_call_output 结构的数据,并集中处理白名单、参数验证、超时、重试和审计。循环上限可以防止模型在两个工具之间反复调用。除此之外,还应限制单轮工具数、累计耗时和预算。并行调用只适合彼此独立的只读任务;存在先后依赖或写操作时,应按业务顺序串行执行。
previous_response_id 让后续调用衔接上一轮响应,省去应用手动重组所有项目。应用仍需保存业务状态,不能只依赖模型会话:订单是否已更新、邮件是否已发送、审批是否通过,都应以业务数据库为准。调用链标识适合延续推理上下文,却不是事务日志。
长回答或高推理强度可能增加等待时间,可以启用 stream=True。流式接口返回的是一系列带类型的事件,不应假定每个事件都有文本。界面层可消费文本增量事件,工具层则应等待函数参数完成事件后再解析完整 JSON;在参数尚未结束时执行函数,容易得到截断数据。
stream = client.responses.create(
model="gpt-5.6-sol",
input="给出一个三步排错清单。",
stream=True,
)
for event in stream:
if event.type == "response.output_text.delta":
print(event.delta, end="", flush=True)
elif event.type == "response.failed":
raise RuntimeError("响应生成失败")
实际事件类型应以当前 SDK 定义为准。流式传输中断时,不要立即把同一个写操作重新执行一遍;先根据请求标识、幂等键和业务记录判断工具是否已经成功。文本生成通常可以重试,产生外部副作用的工具调用必须先确认状态。
出现模型不可用时,先检查模型标识是否确实为 gpt-5.6-sol,再检查账户权限和兼容服务支持范围。不要用自动替换到另一个模型来掩盖问题,因为不同模型的工具能力、成本和输出行为可能不同。
若客户端没有 responses,通常是 SDK 版本过旧;若服务返回端点不存在,则可能是兼容服务尚未实现该接口。升级 SDK 前查看变更说明,并在隔离环境运行最小请求。第三方服务宣称“兼容 OpenAI”不代表覆盖全部 Responses 工具。
检查函数描述是否清楚、用户任务是否真的需要外部数据,以及 tool_choice 是否允许调用。可以在测试中暂时使用 required 验证调用链,但生产环境不应无条件强制无关工具。参数 Schema 过宽、函数之间职责重叠,也会降低选择稳定性。
这通常是应用只执行了函数,却没有把 function_call_output 连同正确的 call_id 回传,或者没有继续创建下一次响应。记录响应 ID、调用 ID、函数名、耗时和错误码,排查时不要记录密钥或敏感参数原文。
工具搜索、长上下文和较高推理强度都会增加延迟或成本。对可重试的读取请求使用带随机抖动的指数退避,对写请求使用幂等键;同时设置连接超时、总时限、最大步骤和预算。遇到限流应读取服务返回的限制信息,而不是固定间隔无限重试。
先用不带工具的最小请求确认模型和 Responses 端点可用,再用一个无副作用函数验证调用与回传,最后逐项启用网页搜索、文件搜索或其他 Agent 工具。测试至少覆盖:模型直接回答、单次函数调用、多个调用、非法参数、未知函数、函数超时、流式中断、达到步骤上限以及用户取消。
生产环境还应保存结构化遥测,包括请求追踪标识、响应 ID、工具调用次数、各工具耗时、令牌用量和终态,但要脱敏。对有副作用的动作建立审批点和幂等机制,对检索内容做权限隔离,对网页内容按不可信输入处理。这样,GPT-5.6 Sol 才是受控工作流中的推理与编排组件,而不是拥有无限权限的自主执行者。
ASP实现多行注释的方法(dw)
GPT-5.6 Sol 的 API 提示词应如何调整?
为什么 GPT-5.6 Sol 在 OpenCode 中提示模型不可用?
GPT-5.6 Sol 与 Fable 5 构建同一应用时有何差异?
GPT-5.6 Sol 如何使用 Responses API、函数调用和 Agent 工具?
GPT-5.6 Sol 如何通过 OpenAI Responses API 创建 AI 应用?