
openai python sdk 1.0+ 版本已将 api 响应改为 pydantic 模型对象,不再支持字典式下标访问(如 `response['choices'][0]['message']['content']`),需改用点号链式属性访问。
在 OpenAI 官方 Python SDK 升级至 v1.0(特别是当前主流的 v1.x 系列,如你使用的 v1.12.0)后,client.chat.completions.create() 的返回值不再是传统字典(dict),而是一个 ChatCompletion 类型的 Pydantic 模型实例。这意味着你不能再使用方括号语法(如 response['choices'] 或 response.choices[0]['message'])来访问字段——这正是报错 'ChatCompletion' object is not subscriptable 的根本原因。
✅ 正确做法是:统一使用点号(.)访问属性,并遵循响应结构的嵌套路径:
def ask_chatgpt(question, model="gpt-3.5-turbo", temperature=0.7, max_tokens=500):
try:
response = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": question},
],
temperature=temperature,
max_tokens=max_tokens,
)
# ✅ 正确:Pydantic 模型属性访问(非字典下标!)
answer = response.choices[0].message.content.strip()
print(answer)
return answer
except Exception as e:
print(f"API 调用失败:{e}")
return None? 关键变更说明:
- response.choices 是一个 list[Choice],可按索引访问(如 response.choices[0]);
- response.choices[0].message 是 ChatCompletionMessage 对象;
- response.choices[0].message.content 是最终的字符串回复内容(类型为 str)。
⚠️ 注意事项:
- 确保已正确初始化 client(如 from openai import OpenAI; client = OpenAI(api_key="your-key"));
- 建议添加异常处理(如 openai.APIError, openai.RateLimitError),避免因网络或配额问题导致程序崩溃;
- 若需兼容历史代码或做类型安全检查,可使用 isinstance(response, ChatCompletion)(需导入:from openai.types.chat import ChatCompletion);
- 不要尝试 .json() 或 .dict()(除非显式调用 .model_dump(),但通常不必要)——直接属性访问更简洁、高效。
? 小贴士:可通过 print(response.model_dump()) 查看完整响应结构(调试用),但生产环境请避免打印敏感字段(如 usage 或完整 messages)。升级 SDK 后务必查阅 OpenAI Python 迁移指南,以规避其他常见 breaking changes(如参数名变更、异步接口调整等)。










