使用 OpenAI Python SDK 构建 GPT-5.6 Sol 应用,推荐从 Responses API 开始:把密钥放进环境变量,以 OpenAI() 创建客户端,再将模型设为 gpt-5.6-sol。一个可用的应用不应止于“成功打印一句话”,还应明确输入边界、流式输出、异常分类、重试策略和密钥保护。下面从最小调用逐步扩展为一个适合继续开发的命令行程序。
Python 程序并不是在本机运行 GPT-5.6 Sol。SDK 负责把输入、模型名和生成参数序列化为请求,发送到 OpenAI API,再把响应转换成 Python 对象。模型生成的正文可以通过响应对象的 output_text 便捷属性读取;需要边生成边展示时,则使用流式事件。把这几层分开理解,排错会简单很多:认证失败通常属于密钥或项目配置问题,连接失败属于网络链路问题,限流属于配额或并发问题,而内容不符合预期才主要涉及提示词和应用逻辑。
GPT-5.6 Sol 面向复杂专业任务,模型 ID 是 gpt-5.6-sol。它支持 Responses API,也支持流式输出、函数调用和结构化输出。本文选择 Responses API,是因为它能用统一的响应对象承载文本和工具调用,后续增加能力时不必重写整个调用层。
建议为项目创建独立虚拟环境,避免全局包版本互相影响。以下命令适用于 macOS、Linux 以及常见的类 Unix 终端;Windows 用户可以使用对应的虚拟环境激活命令。
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade openai
在运行程序的终端中设置环境变量:
export OPENAI_API_KEY="你的 API 密钥"
不要把真实密钥直接写进 Python 文件,也不要提交到 Git。SDK 会自动读取 OPENAI_API_KEY,因此代码无需保存或打印密钥。生产环境应使用部署平台的密钥管理功能,并让开发、测试、生产分别使用不同的项目或凭据,以便控制权限和追踪用量。
新建 app.py,写入下面的最小示例:
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5.6-sol",
instructions=(
"你是一名严谨的中文技术助手。先给结论,再给可执行步骤;"
"不确定的信息要明确说明。"
),
input="请用三个要点解释 Python 虚拟环境解决了什么问题。",
)
print(response.output_text)
运行 python app.py 即可发起请求。instructions 用来定义跨本次请求生效的行为约束,input 是用户任务。把两者分开,比把所有内容拼成一个长字符串更便于维护。output_text 会聚合响应中的文本输出,适合只关心最终文字的应用;如果应用还要处理工具调用或其他输出项,应遍历响应的结构化内容,而不是假设所有结果都只有一段文本。
最小示例验证了四件事:Python 包能够导入、环境变量可读取、账户可以访问指定模型、响应能够被应用解析。出现问题时,先保持这个示例足够小,确认基础链路后再加入数据库、Web 框架或消息队列,否则多个故障源会混在一起。
真实应用应在入口处校验输入,并把模型调用集中在单独函数中。这样测试代码可以替换调用层,界面层也不会依赖 SDK 返回对象的全部细节。
from openai import OpenAI
client = OpenAI()
def ask(question: str) -> str:
cleaned = question.strip()
if not cleaned:
raise ValueError("问题不能为空")
if len(cleaned) > 4000:
raise ValueError("问题过长,请拆分后重试")
response = client.responses.create(
model="gpt-5.6-sol",
instructions="用简体中文回答。结论清楚,示例可执行,不编造事实。",
input=cleaned,
)
answer = response.output_text.strip()
if not answer:
raise RuntimeError("模型没有返回可展示的文本")
return answer
if __name__ == "__main__":
question = input("请输入问题:")
print(ask(question))
长度上限不是模型的上下文上限,而是应用自己的产品约束。越早限制无意义或异常大的输入,越容易控制延迟和成本。具体阈值应结合业务数据调整。对于公开服务,还应在服务端做身份认证、请求大小限制与频率限制,不能依赖前端输入框的字符限制。
较长回答如果等到全部生成后才显示,会让用户误以为程序卡住。设置 stream=True 后,可以按事件读取增量文本:
from openai import OpenAI
client = OpenAI()
stream = client.responses.create(
model="gpt-5.6-sol",
instructions="使用简体中文,给出分步骤说明。",
input="解释如何为一个 Python Web 服务设计健康检查。",
stream=True,
)
for event in stream:
if event.type == "response.output_text.delta":
print(event.delta, end="", flush=True)
print()
流式输出改变的是交付方式,不代表整次响应已经成功完成。终端示例可以直接打印增量内容,Web 应用则通常把事件转发给浏览器,并在结束事件到达后保存完整结果。若连接中途断开,界面应标明回答不完整,避免把半段内容当成最终记录。需要审计的业务还应同时保存请求标识、完成状态和错误类型,但不应把密钥或未经处理的敏感输入写进日志。
“捕获所有异常然后立即重试”会隐藏程序错误,也可能放大限流。更稳妥的做法是区分连接问题、限流、API 状态错误和本地代码错误。下面给出一个有限次数、指数退避并带少量随机抖动的示例:
import random
import time
from openai import APIConnectionError, APIStatusError, OpenAI, RateLimitError
client = OpenAI(timeout=60.0, max_retries=0)
def generate(prompt: str, attempts: int = 3) -> str:
for attempt in range(attempts):
try:
response = client.responses.create(
model="gpt-5.6-sol",
input=prompt,
)
return response.output_text
except (APIConnectionError, RateLimitError):
if attempt == attempts - 1:
raise
delay = (2 ** attempt) + random.uniform(0, 0.5)
time.sleep(delay)
except APIStatusError as exc:
if exc.status_code >= 500 and attempt < attempts - 1:
time.sleep((2 ** attempt) + random.uniform(0, 0.5))
continue
raise
raise RuntimeError("请求未完成")
这里把 SDK 自动重试关闭,是为了清楚展示应用自己的重试边界,避免两层重试叠加后产生超出预期的请求次数。连接失败、限流和部分服务端错误通常可以短暂退避后重试;认证、权限、参数和输入错误一般不会因等待而自动恢复,应立即返回明确提示并修正配置。对于有副作用的工具调用,还要设计幂等键或业务去重,不能把一次生成请求的重试思路原样套用到付款、发信或写数据库操作上。
命令行脚本只是验证入口。接入 Web 服务时,建议将代码分为接口层、业务层和模型网关层:接口层负责认证及参数校验,业务层组织上下文和权限规则,模型网关层只负责调用 SDK、超时、重试与观测。模型名也应集中配置,而不是散落在多个路由中。这样需要调整模型或增加灰度策略时,只改一处。
多轮对话不能简单地无限拼接全部历史。应用应决定哪些消息与当前任务有关,并为上下文设置预算。长会话可以保留近期消息,再把较早内容压缩为经过校验的状态摘要。涉及账户资料、内部文档或个人信息时,应先做权限判断和数据最小化,再决定是否把内容发送给模型。
如果输出必须被程序消费,应优先采用结构化输出并用模式校验,不要依靠正则表达式从自然语言中猜字段。需要访问实时数据或执行业务动作时,可以增加函数工具:模型负责选择工具并生成参数,应用负责校验参数、执行授权检查、调用真实服务,再把工具结果交回模型。模型生成的参数不能绕过现有权限体系。
至少覆盖空输入、普通中文问题、英文输入、超长输入、包含代码的输入和流式中断。检查回答是否遵守指令,空文本是否被正确处理,界面是否能区分进行中、完成和失败状态。不要用一次演示成功代替测试,应准备一组稳定的代表性问题,对每次提示词或模型配置变更做回归检查。
记录请求耗时、成功率、错误类别和重试次数,并为异常增长设置告警。日志中可保存应用生成的关联标识,便于串联前端请求与后端调用;敏感正文应脱敏或避免记录。为每个请求设置合理超时,为服务整体设置并发上限,并在依赖不可用时返回可理解的降级信息。
密钥只存在服务端,浏览器和移动客户端不应直接持有长期 API 密钥。为公开入口增加身份认证、频率限制和滥用防护。成本控制要从输入长度、输出目标、并发和重试次数共同入手;上线前先用代表性流量测量,而不是凭单次请求推断。模型价格、配额和可用能力可能变化,涉及采购或容量规划时应以当前官方控制台和文档为准。
如果程序提示找不到 openai,先确认运行脚本的 Python 与安装包时使用的是同一个虚拟环境,可用 python -m pip show openai 检查。若提示缺少密钥,确认环境变量是在启动进程的同一终端或部署环境中设置,而不是只写在另一个会话里。
认证或权限错误应检查密钥是否有效、项目配置是否正确,以及当前账户是否能访问目标模型。限流时应降低并发并采用退避,不要快速循环重试。连接超时要分别检查本地网络、代理配置、DNS 和服务端状态。模型返回内容不理想时,先固定一组测试输入,再调整 instructions、上下文组织和输出约束;不要同时修改模型、提示词和业务代码,否则很难判断改动效果来自哪里。
至此,应用已经具备清晰的最小调用、输入校验、流式展示和分类错误处理。下一步可以按业务需要加入结构化输出、工具调用、持久化和评测,但每增加一层能力,都应保留最小调用作为诊断基线,并继续把权限、失败状态和可观测性当作应用逻辑的一部分。