面向 Python 开发者的 OpenAI SDK 快速参考。 从第一次调用模型,到 Streaming、Structured Output、Function Calling、Web Search、File Search、Embedding 与多模态开发。
1. 安装
pip install -U openai
查看版本:
pip show openai
SDK 要求 Python 3.10+。
推荐把 API Key 放入环境变量。
Linux / macOS:
export OPENAI_API_KEY="sk-..."
Windows PowerShell:
$env:OPENAI_API_KEY="sk-..."
不建议直接写在代码中:
client = OpenAI(api_key="sk-xxxx")
尤其不要把 API Key 提交到 Git。
2. 最重要的两个类
整个 SDK 首先记住:
from openai import OpenAI, AsyncOpenAI
OpenAI
同步客户端:
from openai import OpenAI
client = OpenAI()
适合:
- 普通脚本
- CLI
- Notebook
- 简单后端
- 学习示例
AsyncOpenAI
异步客户端:
from openai import AsyncOpenAI
client = AsyncOpenAI()
调用时:
response = await client.responses.create(...)
适合:
- FastAPI
- 高并发服务
- Agent 服务
- Web 后端
- 同时调用多个模型/API
同步和异步客户端的主要 API 基本一致。
3. SDK 的整体结构
可以把 client 理解成 OpenAI API 的入口:
OpenAI
│
├── responses
├── chat.completions
├── embeddings
├── files
├── vector_stores
├── images
├── audio
│ ├── transcriptions
│ ├── translations
│ └── speech
├── moderations
├── models
├── batches
├── fine_tuning
├── uploads
├── conversations
├── evals
└── realtime / live ...
其中日常开发最重要的是:
responses
新项目优先从:
client.responses.create()
开始。
可以先形成一个最简单的认识:
OpenAI()
↓
client.responses
↓
create()
↓
Response
4. 第一次调用模型
最简单的完整程序:
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5.6",
input="用三句话解释什么是 Agent。"
)
print(response.output_text)
先记住这个模板:
response = client.responses.create(
model="...",
input="..."
)
print(response.output_text)
这是整个 SDK 最重要的一段代码。
5. Response 对象
responses.create() 返回的是:
Response
而不是普通字符串。
例如:
response = client.responses.create(
model="gpt-5.6",
input="什么是 RAG?"
)
常用字段:
response.id
response.model
response.output
response.output_text
response.usage
response.status
response._request_id
最常用的是:
response.output_text
output 和 output_text 的区别
不要默认:
response.output[0]
一定就是最终文字。
output 中还可能出现:
message
function_call
web_search_call
file_search_call
reasoning
...
例如一个 Agent 请求可能是:
Response
│
├── reasoning
├── function_call
└── message
因此,单纯想取得最终文本时,优先:
response.output_text
6. input 的两种常见写法
简单字符串
response = client.responses.create(
model="gpt-5.6",
input="解释一下 Transformer。"
)
适合简单任务。
Message 形式
response = client.responses.create(
model="gpt-5.6",
input=[
{
"role": "user",
"content": "解释一下 Transformer。"
}
]
)
复杂应用通常会逐渐使用第二种形式。
它的结构更接近:
input
└── message
├── role
└── content
7. instructions
需要设置模型行为时,可以使用:
response = client.responses.create(
model="gpt-5.6",
instructions="""
你是一名资深 Python 工程师。
回答必须简洁,并提供代码示例。
""",
input="解释 Python decorator。"
)
print(response.output_text)
可以简单理解为:
instructions
↓
模型应该如何工作
input
↓
这一次具体要完成什么
典型结构:
client.responses.create(
model=MODEL,
instructions=SYSTEM_PROMPT,
input=user_input,
)
例如:
SYSTEM_PROMPT = """
你是一名代码审查助手。
要求:
1. 优先指出实际 Bug
2. 不讨论无关风格问题
3. 提供修改建议
"""
然后:
response = client.responses.create(
model=MODEL,
instructions=SYSTEM_PROMPT,
input=code,
)
8. 常用参数
一个典型请求:
response = client.responses.create(
model="gpt-5.6",
input="分析这段代码。",
max_output_tokens=2000,
)
常见参数包括:
model
input
instructions
max_output_tokens
reasoning
tools
tool_choice
stream
store
previous_response_id
conversation
metadata
include
background
新手首先掌握:
model
input
instructions
max_output_tokens
tools
stream
就足够覆盖大量场景。
9. Reasoning Effort
支持推理等级的模型可以配置:
response = client.responses.create(
model="gpt-5.6",
reasoning={
"effort": "high"
},
input="分析这个复杂的软件架构问题。"
)
不同模型可能支持不同的 reasoning effort。
常见概念包括:
none
low
medium
high
xhigh
max
具体支持范围取决于模型。
什么时候提高推理等级
简单提取、改写、分类:
reasoning={"effort": "low"}
复杂架构分析、研究、规划:
reasoning={"effort": "high"}
不要简单认为:
reasoning 越高越好
通常还需要考虑:
质量
延迟
成本
10. 模型怎么选
不要在整个项目里到处硬编码:
model="..."
推荐集中配置:
MODEL = "gpt-5.6"
然后:
response = client.responses.create(
model=MODEL,
input="..."
)
基本选择思路:
复杂推理任务
↓
高能力模型
大量普通任务
↓
均衡模型
大规模简单处理
↓
低延迟 / 低成本模型
图片生成
↓
Image 模型
Embedding
↓
Embedding 模型
实时语音
↓
Realtime / Live 模型
生产项目最好让模型 ID:
配置化
而不是写死在业务逻辑中。
例如:
import os
MODEL = os.getenv("OPENAI_MODEL", "gpt-5.6")
11. Streaming 流式输出
普通调用:
请求
↓
等待模型完整生成
↓
一次性返回
Streaming:
请求
↓
文本片段
↓
文本片段
↓
文本片段
↓
完成
基本写法:
from openai import OpenAI
client = OpenAI()
stream = client.responses.create(
model="gpt-5.6",
input="写一篇介绍 MCP 的短文。",
stream=True,
)
for event in stream:
print(event)
实际应用通常只处理文本增量事件:
for event in stream:
if event.type == "response.output_text.delta":
print(event.delta, end="", flush=True)
Streaming 非常适合:
聊天界面
Agent
长文本生成
代码生成
网页应用
用户不用等模型把所有文字生成完成后才看到结果。
12. Async Streaming
异步版本:
from openai import AsyncOpenAI
client = AsyncOpenAI()
async def main():
stream = await client.responses.create(
model="gpt-5.6",
input="介绍一下 RAG。",
stream=True,
)
async for event in stream:
if event.type == "response.output_text.delta":
print(event.delta, end="", flush=True)
同步:
for event in stream:
异步:
async for event in stream:
这是两种客户端的重要区别之一。
13. Structured Output
很多应用并不想得到一段自然语言:
这家公司的名称是 OpenAI,它属于 AI 行业……
而是希望得到:
{
"name": "OpenAI",
"industry": "AI"
}
这时应该使用 Structured Output。
Python SDK 与 Pydantic 的结合非常方便。
先定义模型:
from pydantic import BaseModel
class Person(BaseModel):
name: str
age: int
occupation: str
然后:
response = client.responses.parse(
model="gpt-5.6",
input="张三今年28岁,是一名Python开发工程师。",
text_format=Person,
)
person = response.output_parsed
print(person.name)
print(person.age)
print(person.occupation)
此时得到的:
person
本身就是:
Person
不需要自己:
json.loads(...)
14. 为什么 Structured Output 很重要
一种常见但不够稳定的方式:
response = client.responses.create(
model=MODEL,
input="""
分析下面的信息。
请只输出 JSON。
"""
)
data = json.loads(response.output_text)
模型可能输出:
当然可以,结果如下:
{
...
}
于是 JSON 解析失败。
更好的方式:
response = client.responses.parse(
model=MODEL,
input=input,
text_format=MySchema,
)
Structured Output 特别适合:
信息提取
分类
REST API
数据库写入
Agent State
工作流节点输出
表单生成
数据分析
一个实际例子
from pydantic import BaseModel
class ArticleAnalysis(BaseModel):
title: str
category: str
keywords: list[str]
score: int
调用:
result = client.responses.parse(
model=MODEL,
input=article,
text_format=ArticleAnalysis,
)
analysis = result.output_parsed
然后业务代码可以直接:
save_to_database(
title=analysis.title,
category=analysis.category,
score=analysis.score,
)
15. Function Calling
这是开发 Agent 时最重要的能力之一。
模型本身不会真正:
查数据库
发邮件
查询订单
获取天气
操作 GitHub
调用内部 API
你可以把自己的函数提供给模型。
整体流程:
User
↓
LLM
↓
判断需要调用 get_weather
↓
你的 Python 程序
↓
执行 get_weather()
↓
返回执行结果
↓
LLM
↓
生成最终回答
最重要的一点:
模型负责决定调用什么工具,你的程序负责真正执行工具。
16. 定义一个 Function Tool
例如:
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",
input="北京今天天气怎么样?",
tools=tools,
)
模型可能不直接回答文字,而是返回:
function_call
其中包含:
调用哪个函数
参数是什么
call_id 是什么
17. 处理 Function Call
可以遍历:
import json
for item in response.output:
if item.type == "function_call":
print(item.name)
print(item.arguments)
print(item.call_id)
例如:
name:
get_weather
arguments:
{"city":"北京"}
解析参数:
args = json.loads(item.arguments)
执行 Python 函数:
result = get_weather(**args)
例如:
def get_weather(city: str) -> dict:
return {
"city": city,
"temperature": 26,
"condition": "sunny",
}
18. 把 Tool Result 返回给模型
执行:
result = get_weather("北京")
之后,还需要把结果交回模型。
response2 = client.responses.create(
model="gpt-5.6",
previous_response_id=response.id,
input=[
{
"type": "function_call_output",
"call_id": tool_call.call_id,
"output": json.dumps(result),
}
],
tools=tools,
)
最后:
print(response2.output_text)
其中:
call_id
用于把:
Function Call
与:
Function Call Output
对应起来。
整体关系:
function_call
│
│ call_id
↓
执行 Python 函数
│
↓
function_call_output
│
│ same call_id
↓
Model
19. 完整 Function Calling 流程
可以把整个过程记成:
1. 定义 tools
2. responses.create()
3. 检查 response.output
4. 找到 function_call
5. 解析 arguments
6. 执行 Python function
7. 构造 function_call_output
8. 再次 responses.create()
9. 得到最终回答
这已经是一个最基础的 Agent Loop。
20. 多个 Tools
真实 Agent 通常不会只有一个 Tool。
例如:
tools = [
get_weather_tool,
search_order_tool,
query_customer_tool,
send_email_tool,
]
模型可以根据任务决定:
调用哪个工具
是否需要调用工具
参数是什么
调用一次还是多次
是否需要多个工具配合
例如:
用户:
帮我检查订单 123,如果已经发货,把物流信息发给客户。
↓
Model
↓
query_order()
↓
get_shipping_info()
↓
send_email()
↓
最终回答
这就是:
LLM + Tools
构成 Agent 的基础。
21. tool_choice
默认情况下,可以让模型自行决定是否调用工具。
概念上:
tool_choice="auto"
常见模式包括:
auto
required
none
指定某个 Tool
auto
模型自己决定:
是否需要工具
required
要求:
必须调用工具
none
禁止调用工具。
实际 Agent 系统通常以:
auto
为主。
22. Web Search
Responses API 可以使用 Web Search Tool:
response = client.responses.create(
model="gpt-5.6",
tools=[
{
"type": "web_search"
}
],
input="最近 AI Agent 领域有什么重要进展?"
)
print(response.output_text)
这时不需要自己实现:
search_google()
模型可以根据请求搜索网络。
可以把它理解为:
User
↓
Model
↓
Web Search
↓
Internet
↓
Search Result
↓
Model
↓
Answer
适合:
新闻
最新资料
研究
当前产品信息
事实核查
市场信息
23. File Search
如果希望模型搜索自己的:
PDF
产品文档
企业知识库
技术资料
规章制度
内部文件
可以使用:
Files
+
Vector Store
+
File Search
基本流程:
文件
↓
Files API
↓
Vector Store
↓
File Search Tool
↓
LLM
这是一种 OpenAI 托管的知识库检索方案。
24. 上传文件
file = client.files.create(
file=open("manual.pdf", "rb"),
purpose="user_data",
)
print(file.id)
常见字段:
file.id
file.filename
file.bytes
file.status
文件上传之后,可以用于不同功能。
例如:
File Search
Batch
Fine-tuning
Evals
具体需要使用什么 purpose,应根据对应 API 的要求设置。
25. 创建 Vector Store
vector_store = client.vector_stores.create(
name="Product Docs"
)
print(vector_store.id)
然后加入文件:
client.vector_stores.files.create(
vector_store_id=vector_store.id,
file_id=file.id,
)
处理文件索引时,还可以使用辅助方法,例如:
create_and_poll()
upload()
upload_and_poll()
poll()
如果希望:
上传
+
等待索引完成
通常使用对应的 *_and_poll() 方法更加方便。
26. File Search Tool
知识库准备完成后:
response = client.responses.create(
model="gpt-5.6",
input="这个产品支持哪些认证方式?",
tools=[
{
"type": "file_search",
"vector_store_ids": [
vector_store.id
]
}
]
)
print(response.output_text)
完整流程:
User
↓
Model
↓
File Search
↓
Vector Store
↓
相关文档
↓
Model
↓
Answer
这已经可以构成一个非常基础的 RAG 系统。
27. Embeddings
Embedding 会把文本转换成向量。
例如:
"Python 是一种编程语言"
↓
[0.012, -0.31, 0.82, ...]
调用:
response = client.embeddings.create(
model="text-embedding-...",
input="什么是人工智能?",
)
vector = response.data[0].embedding
print(len(vector))
Embedding 常用于:
语义搜索
RAG
相似内容推荐
聚类
去重
文本匹配
异常检测
入口:
client.embeddings.create(...)
28. 多条 Embedding
可以一次传多条文本:
response = client.embeddings.create(
model="text-embedding-...",
input=[
"Python 是一种编程语言",
"Java 是一种编程语言",
"今天天气很好",
],
)
然后:
for item in response.data:
print(item.embedding)
不要在大量数据处理中:
一条文本
调用一次 API
更合理的是进行:
批量 Embedding
29. File Search 和 Embedding 的区别
这两个概念很容易混淆。
Embedding
你自己得到:
向量
例如:
文本
↓
Embedding Model
↓
Vector
后续:
存在哪里
怎么搜索
如何计算相似度
怎么切 Chunk
都可以自己控制。
File Search
OpenAI 提供更高层的:
托管检索能力
你主要提供:
文件
Vector Store
然后模型通过 File Search Tool 使用。
所以:
Embedding
↓
底层能力
File Search
↓
更高层的托管检索方案
30. Vision:让模型看图片
Responses API 可以同时传文字和图片:
response = client.responses.create(
model="gpt-5.6",
input=[
{
"role": "user",
"content": [
{
"type": "input_text",
"text": "分析这张图片。"
},
{
"type": "input_image",
"image_url": "https://example.com/image.jpg"
}
]
}
],
)
print(response.output_text)
因此 Responses API 本身就是多模态入口。
可以处理类似:
图片理解
截图分析
图表解释
UI 检查
照片问答
文档截图分析
31. 本地图片
本地图片可以转成 Base64。
import base64
with open("image.png", "rb") as f:
image_data = base64.b64encode(f.read()).decode()
构造 Data URL:
image_url = f"data:image/png;base64,{image_data}"
然后:
{
"type": "input_image",
"image_url": image_url,
}
完整形式:
response = client.responses.create(
model="gpt-5.6",
input=[
{
"role": "user",
"content": [
{
"type": "input_text",
"text": "这张图里有什么?"
},
{
"type": "input_image",
"image_url": image_url
}
]
}
],
)
32. Images API
图片生成主要通过:
client.images
常见能力包括:
生成图片
编辑图片
图片变体
主要方法:
client.images.generate()
client.images.edit()
client.images.create_variation()
例如:
result = client.images.generate(
model="gpt-image-...",
prompt="一座未来城市,清晨,极简科技风",
)
注意区分:
理解图片
↓
Responses API
生成 / 编辑图片
↓
Images API
33. Audio API
入口:
client.audio
主要分为:
audio.transcriptions
audio.translations
audio.speech
可以简单理解为:
Audio
├── Speech → Text
├── Translation
└── Text → Speech
34. Speech to Text
音频转文字:
with open("meeting.mp3", "rb") as audio_file:
transcription = client.audio.transcriptions.create(
model="...",
file=audio_file,
)
print(transcription.text)
用途:
会议转录
语音助手
视频字幕
客服录音
Podcast 转写
35. Text to Speech
文字转语音:
response = client.audio.speech.create(
model="...",
voice="...",
input="你好,欢迎使用我们的应用。",
)
记住入口:
client.audio.speech.create()
典型应用:
AI 语音助手
有声内容
辅助阅读
实时语音应用
客服系统
36. Moderation
用于检测内容:
result = client.moderations.create(
model="omni-moderation-latest",
input="..."
)
例如:
result.results[0].flagged
可以用于:
UGC
聊天系统
评论系统
AI 产品输入检查
模型输出检查
可以把流程理解为:
User Input
↓
Moderation
↓
允许 / 阻止 / 进一步处理
↓
Model
37. 多轮对话:previous_response_id
Responses API 可以通过:
previous_response_id
继续之前的响应。
第一轮:
response1 = client.responses.create(
model="gpt-5.6",
input="我的名字叫 Alex。"
)
第二轮:
response2 = client.responses.create(
model="gpt-5.6",
previous_response_id=response1.id,
input="我的名字是什么?"
)
print(response2.output_text)
关系:
response1
↓
response2
↓
response3
它非常适合简单的连续对话。
38. previous_response_id 的本质
它并不代表:
模型永久记住用户
而是在告诉 API:
这次请求继续之前那个 Response。
即:
previous_response_id=response.id
可以理解为:
conversation lineage
它减少了手动管理历史消息的工作。
但上下文依然会影响:
Token 使用
上下文长度
调用成本
39. Conversation
复杂场景可以使用 Conversation。
概念上:
Conversation
│
├── User Message
├── Assistant Message
├── Tool Call
├── Tool Result
├── User Message
└── Assistant Message
适合:
长期聊天
Agent Session
客服 Session
多轮工作流
可以把几个概念这样区分:
单次任务
↓
Response
连续 Response
↓
previous_response_id
长期会话状态
↓
Conversation
40. Structured Output 和 Function Calling 的区别
这两个概念不要混淆。
Structured Output
解决:
模型最终回答应该是什么结构?
例如:
class Article(BaseModel):
title: str
summary: str
结果:
{
"title": "...",
"summary": "..."
}
Function Calling
解决:
模型应该调用哪个外部能力?
例如:
search_database()
send_email()
get_weather()
对比:
| 能力 | 主要用途 |
|---|---|
| Structured Output | 控制模型输出结构 |
| Function Calling | 调用业务函数或外部系统 |
| Web Search | 查询互联网 |
| File Search | 查询知识库 |
41. Tool 与 Structured Output 可以一起使用
真实应用经常是:
User
↓
Model
↓
Tool
↓
获取数据
↓
Model
↓
Structured Output
↓
Python Object
例如股票分析:
User
↓
查询股票
↓
获取行情
↓
查询新闻
↓
模型分析
↓
StockAnalysis
其中:
查询行情 / 新闻
↓
Tools
StockAnalysis
↓
Structured Output
这是现代 Agent 后端非常常见的组合。
42. AsyncOpenAI
Web 服务通常应该熟悉:
from openai import AsyncOpenAI
client = AsyncOpenAI()
完整示例:
import asyncio
from openai import AsyncOpenAI
client = AsyncOpenAI()
async def main():
response = await client.responses.create(
model="gpt-5.6",
input="解释 async/await。"
)
print(response.output_text)
asyncio.run(main())
核心区别:
同步:
response = client.responses.create(...)
异步:
response = await client.responses.create(...)
43. 并发调用
Async 最大价值之一是并发。
例如:
import asyncio
responses = await asyncio.gather(
client.responses.create(
model="gpt-5.6",
input="分析方案 A"
),
client.responses.create(
model="gpt-5.6",
input="分析方案 B"
),
client.responses.create(
model="gpt-5.6",
input="分析方案 C"
),
)
适合:
并行 Agent
批量分析
多文档摘要
多个候选方案比较
同时查询多个独立任务
例如 Multi-Agent:
┌→ Research Agent
User → Router ──┼→ Code Agent
└→ Review Agent
三个 Agent 可以在适合的情况下并发运行。
44. Pydantic Response
SDK 返回的数据通常不是普通 dict,而是带类型的模型。
例如:
response = client.responses.create(...)
可以访问:
response.output
response.output_text
response.id
也可以转换:
response.to_dict()
或:
response.to_json()
因此通常不要写:
response["output"]
而是:
response.output
这也意味着 IDE 可以获得比较好的:
类型检查
自动补全
字段提示
45. Files
Files 的常用操作:
client.files.create(...)
client.files.retrieve(file_id)
client.files.list()
client.files.delete(file_id)
client.files.content(file_id)
结构:
Files
│
├── create
├── retrieve
├── list
├── delete
└── content
例如列出文件:
files = client.files.list()
for file in files.data:
print(file.id, file.filename)
46. Vector Stores
常见方法:
client.vector_stores.create()
client.vector_stores.retrieve()
client.vector_stores.update()
client.vector_stores.list()
client.vector_stores.delete()
client.vector_stores.search()
子资源:
vector_stores.files
vector_stores.file_batches
基本结构:
Vector Store
│
├── Files
├── File Batches
└── Search
它主要服务于:
知识库
File Search
语义检索
47. Models API
查看当前账户能够访问的模型:
models = client.models.list()
for model in models:
print(model.id)
查询模型:
model = client.models.retrieve("...")
常见方法:
models.list()
models.retrieve()
models.delete()
其中删除操作并不是:
删除 OpenAI 官方模型
而是针对支持删除的自定义模型资源。
48. Batch API
大量非实时任务可以使用 Batch API。
例如:
10 万条商品分类
大量文本审核
批量 Embedding
离线数据生成
数据集处理
基本流程:
JSONL
↓
Files API
↓
Batch
↓
后台批量处理
↓
Output File
主要方法:
client.batches.create()
client.batches.retrieve()
client.batches.list()
client.batches.cancel()
Batch 适合:
量大
不要求立即响应
适合离线处理
而不适合:
实时聊天
实时 Agent
用户正在等待的请求
49. Fine-tuning
入口:
client.fine_tuning.jobs
常用操作:
client.fine_tuning.jobs.create(...)
client.fine_tuning.jobs.retrieve(...)
client.fine_tuning.jobs.list(...)
client.fine_tuning.jobs.cancel(...)
还可能包括:
pause
resume
checkpoints
events
Fine-tuning 不等于知识库
如果需求是:
让模型知道我的产品文档
一般先考虑:
RAG / File Search
而不是 Fine-tuning。
Fine-tuning 更偏向:
行为模式
输出风格
固定任务
格式稳定性
领域任务适配
可以简单记成:
知识
↓
RAG / File Search
行为
↓
Fine-tuning
50. 错误处理
不要只写:
except Exception:
...
至少应该认识:
import openai
然后:
try:
response = client.responses.create(
model="gpt-5.6",
input="Hello"
)
except openai.RateLimitError:
print("触发 Rate Limit")
except openai.APIConnectionError:
print("无法连接 OpenAI")
except openai.APIStatusError as e:
print(e.status_code)
print(e.response)
常见异常:
APIError
├── APIConnectionError
├── APIStatusError
│ ├── BadRequestError
│ ├── AuthenticationError
│ ├── PermissionDeniedError
│ ├── NotFoundError
│ ├── UnprocessableEntityError
│ ├── RateLimitError
│ └── InternalServerError
└── APITimeoutError
51. 常见 HTTP 错误
可以大概这样理解:
400
↓
Bad Request
401
↓
API Key / Authentication
403
↓
Permission
404
↓
Resource Not Found
429
↓
Rate Limit
500+
↓
Server Error
生产环境不要把错误简单显示成:
请求失败
最好至少记录:
状态码
错误类型
Request ID
模型
业务请求 ID
52. Request ID
生产环境推荐记录:
response._request_id
例如:
response = client.responses.create(
model="gpt-5.6",
input="hello"
)
print(response._request_id)
失败时:
except openai.APIStatusError as exc:
print(exc.request_id)
Request ID 对排查 API 问题很重要。
日志中可以记录:
request_id
model
latency
status
token_usage
business_request_id
53. Timeout
全局设置:
client = OpenAI(
timeout=30.0
)
或者只设置某次请求:
client.with_options(
timeout=10.0
).responses.create(
model="gpt-5.6",
input="..."
)
超时异常:
openai.APITimeoutError
生产系统一定要考虑:
网络慢
模型生成时间长
上游请求取消
用户已经离开页面
54. Retry
全局:
client = OpenAI(
max_retries=5
)
单次调用:
client.with_options(
max_retries=5
).responses.create(
model="gpt-5.6",
input="..."
)
关闭重试:
max_retries=0
不过需要注意:
不是所有业务操作都应该盲目重试。
例如 Tool 调用了:
支付
发送邮件
创建订单
就要额外考虑:
幂等性
55. Chat Completions
还会经常看到:
client.chat.completions.create(...)
例如:
completion = client.chat.completions.create(
model="gpt-5.6",
messages=[
{
"role": "user",
"content": "Hello"
}
]
)
print(
completion.choices[0].message.content
)
它仍然存在,也有大量项目正在使用。
但是对于新项目,优先掌握:
client.responses.create()
56. Responses 和 Chat Completions
可以这样理解:
Chat Completions
↓
经典聊天调用方式
Responses
↓
更统一的现代模型调用入口
Responses 更自然地整合:
Text
Vision
Tools
Function Calling
Web Search
File Search
Structured Output
Reasoning
Conversation
Agent 工作流
因此:
新项目
↓
优先 Responses
维护旧项目
↓
需要认识 Chat Completions
57. 旧的 Completions API
还可能看到:
client.completions.create()
或者老教程中的:
openai.Completion.create(...)
这些属于更早期的调用方式。
新手学习时不需要把精力放在这里。
重点学习:
Responses API
即可。
看到旧教程时,要能够判断:
这是不是当前应该继续采用的写法?
58. 推荐项目结构
实际项目中,不建议把 OpenAI 调用散落在所有业务代码中。
可以使用:
app/
├── main.py
├── config.py
├── ai/
│ ├── client.py
│ ├── models.py
│ ├── prompts.py
│ ├── schemas.py
│ ├── tools.py
│ └── service.py
└── services/
client.py
from openai import OpenAI
client = OpenAI()
config.py
MODEL = "gpt-5.6"
prompts.py
SYSTEM_PROMPT = """
你是一名专业技术助手。
回答准确、清晰、简洁。
"""
service.py
from .client import client
from .config import MODEL
from .prompts import SYSTEM_PROMPT
def ask(prompt: str) -> str:
response = client.responses.create(
model=MODEL,
instructions=SYSTEM_PROMPT,
input=prompt,
)
return response.output_text
这样比整个项目中反复:
OpenAI()
更容易维护。
59. 一个最小 Agent
理解 Agent,可以从这个公式开始:
Agent
=
Model
+
Instructions
+
Tools
+
State
+
Agent Loop
最简单调用:
response = client.responses.create(
model=MODEL,
instructions=AGENT_PROMPT,
input=user_input,
tools=TOOLS,
)
接下来判断:
response.output
↓
有没有 function_call?
↓
┌───┴───┐
│ │
有 没有
│ │
↓ ↓
执行 Tool 返回答案
│
↓
Tool Result
│
↓
再次调用 Model
这就是 Agent Loop。
60. Tool Loop 伪代码
最核心的结构可以写成:
while True:
response = client.responses.create(...)
tool_calls = [
item
for item in response.output
if item.type == "function_call"
]
if not tool_calls:
return response.output_text
results = []
for call in tool_calls:
result = execute_tool(call)
results.append({
"type": "function_call_output",
"call_id": call.call_id,
"output": result,
})
# 把 Tool Result 再交给模型
真正实现时还需要考虑:
上一轮 Response
Tool Schema
多 Tool Call
失败重试
超时
最大循环次数
权限
日志
Tracing
但核心机制就是这一段。
61. 为什么先理解 Tool Loop
理解:
Model
↓
Tool Call
↓
Tool Execution
↓
Tool Result
↓
Model
之后,再学习:
OpenAI Agents SDK
LangGraph
LangChain
AutoGen
CrewAI
就容易很多。
因为各种 Agent Framework 虽然抽象层不同,但很多核心概念都建立在:
Model
Tools
State
Loop
Routing
这些基础机制上。
62. OpenAI SDK 和 Agents SDK 不要混淆
OpenAI Python SDK:
pip install openai
主要负责:
模型调用
Responses
Embeddings
Files
Vector Stores
Images
Audio
Batch
Fine-tuning
...
而 Agent Framework / Agents SDK 通常会进一步提供:
Agent
Runner
Session
Handoff
Tracing
Guardrails
Multi-Agent
建议学习顺序:
openai SDK
↓
Responses API
↓
Structured Output
↓
Function Calling
↓
Tool Loop
↓
Agent
↓
Agents SDK / LangGraph
这样不会只会“调用框架”,却不知道底层发生了什么。
63. 一个完整 Tool Calling 示例
需求:
用户询问某个城市天气,模型自己判断并调用天气工具。
定义业务函数
def get_weather(city: str) -> dict:
return {
"city": city,
"temperature": 26,
"condition": "sunny",
}
定义 Tool
weather_tool = {
"type": "function",
"name": "get_weather",
"description": "查询指定城市当前天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": ["city"],
"additionalProperties": False,
},
"strict": True,
}
第一次请求
response = client.responses.create(
model="gpt-5.6",
input="北京天气怎么样?",
tools=[weather_tool],
)
执行 Tool
import json
tool_outputs = []
for item in response.output:
if item.type != "function_call":
continue
args = json.loads(item.arguments)
if item.name == "get_weather":
result = get_weather(**args)
tool_outputs.append({
"type": "function_call_output",
"call_id": item.call_id,
"output": json.dumps(
result,
ensure_ascii=False
),
})
把结果交回模型
final_response = client.responses.create(
model="gpt-5.6",
previous_response_id=response.id,
input=tool_outputs,
tools=[weather_tool],
)
print(final_response.output_text)
完整流程:
用户
│
▼
Responses API
│
▼
Model
│
│ function_call
▼
get_weather()
│
│ result
▼
function_call_output
│
▼
Responses API
│
▼
Model
│
▼
最终回答
掌握这个例子,就基本理解了 Agent Tool Calling 的核心。
64. 主要类和 Resource 速查
| 类 / Resource | 用途 |
|---|---|
OpenAI | 同步客户端 |
AsyncOpenAI | 异步客户端 |
client.responses | 主要模型交互 API |
Response | Responses API 返回对象 |
client.chat.completions | Chat Completions |
client.embeddings | 文本向量 |
client.files | 文件管理 |
client.vector_stores | 向量知识库 |
client.images | 图片生成与编辑 |
client.audio | 音频相关 |
client.moderations | 内容审核 |
client.models | 模型查询 |
client.batches | 批量异步处理 |
client.fine_tuning | Fine-tuning |
client.evals | AI 应用评估 |
client.realtime | 实时交互 |
client.webhooks | Webhook 相关能力 |
65. 主要方法速查
# 模型调用
client.responses.create()
# Structured Output
client.responses.parse()
# Streaming
client.responses.create(
stream=True
)
# Chat Completions
client.chat.completions.create()
# Embedding
client.embeddings.create()
# 上传文件
client.files.create()
# 获取文件列表
client.files.list()
# 创建 Vector Store
client.vector_stores.create()
# Vector Search
client.vector_stores.search()
# 图片生成
client.images.generate()
# 图片编辑
client.images.edit()
# Speech to Text
client.audio.transcriptions.create()
# Text to Speech
client.audio.speech.create()
# Moderation
client.moderations.create()
# 模型列表
client.models.list()
# Batch
client.batches.create()
# Fine-tuning
client.fine_tuning.jobs.create()
66. 一张 SDK 调用关系图
OpenAI()
│
┌──────────────┼──────────────┐
│ │ │
Responses Files Embeddings
│ │ │
┌────┼────┐ │ │
│ │ │ ▼ ▼
Text Tools Vision Vector Store Vector
│ │ │ │
│ │ │ ▼
│ │ └───── File Search
│ │
│ ├── Function
│ ├── Web Search
│ ├── File Search
│ └── Other Tools
│
▼
Response
│
├── output
├── output_text
├── usage
└── id
67. 新手最容易犯的错误
继续从旧教程学习 Completions
看到:
openai.Completion.create(...)
要知道这是旧写法。
新项目优先学习:
client.responses.create()
把 API Key 写进代码
不要:
API_KEY = "sk-..."
优先:
环境变量
Secrets Manager
部署平台 Secret
把 Response 当 dict
不要:
response["output"]
通常使用:
response.output
为 JSON 输出只写 Prompt
不要只依赖:
请只输出 JSON
优先考虑:
client.responses.parse()
配合:
Pydantic
认为 Function Calling 会自动执行函数
模型只会:
请求调用 Tool
真正执行的是:
你的程序
把 File Search 和 Embedding 混为一谈
Embedding:
生成向量
File Search:
托管的文件检索 Tool
手动维护所有聊天历史
简单多轮场景可以考虑:
previous_response_id
复杂会话可以进一步使用:
Conversation
所有任务都用最高推理等级
要同时考虑:
效果
成本
延迟
68. 推荐学习路线
第一阶段:基础调用
学习:
OpenAI
↓
responses.create()
↓
response.output_text
目标:
可以完成最基础的模型调用。
第二阶段:控制模型
学习:
instructions
input
model
reasoning
max_output_tokens
目标:
可以控制模型的任务和行为。
第三阶段:真实应用体验
学习:
Streaming
AsyncOpenAI
目标:
可以开发聊天界面和 Web 服务。
第四阶段:可靠数据输出
学习:
Pydantic
responses.parse()
Structured Output
目标:
可以让模型输出业务代码能够直接使用的数据。
第五阶段:Agent 基础
学习:
Function Calling
Tool Result
Tool Loop
目标:
可以自己实现最基础的 Agent。
第六阶段:外部知识
学习:
Web Search
File Search
Vector Store
Embedding
目标:
可以让模型获取外部信息和私有知识。
第七阶段:多模态
学习:
Vision
Audio
Images
目标:
可以处理文字之外的数据。
第八阶段:生产能力
学习:
Conversation
Batch
Fine-tuning
Evals
Realtime
目标:
可以构建更完整的生产级 AI 系统。
69. 新手最需要记住的代码
如果只能记住一个调用模板:
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5.6",
instructions="你是一名专业助手。",
input="你好",
)
print(response.output_text)
然后再记住几个核心能力:
Structured Output
↓
responses.parse()
Streaming
↓
stream=True
Function Calling
↓
tools=[...]
多轮对话
↓
previous_response_id
知识库
↓
File Search + Vector Store
语义向量
↓
embeddings.create()
异步调用
↓
AsyncOpenAI
70. 最终心智模型
可以把 OpenAI Python SDK 记成:
OpenAI
│
▼
Responses
│
▼
Model
├── Text
├── Vision
├── Reasoning
├── Structured Output
│
└── Tools
├── Function Calling
├── Web Search
├── File Search
└── Other Tools
│
▼
Response
而一个现代 AI 应用通常可以抽象成:
Input
│
▼
Model
│
├──────► Reasoning
│
├──────► Tools
│
└──────► Knowledge
│
▼
Structured Result
│
▼
Application
如果进一步发展为 Agent:
┌──────────────┐
│ User │
└──────┬───────┘
│
▼
┌──────────────┐
│ Model │
└──────┬───────┘
│
判断下一步
│
┌──────────┴──────────┐
│ │
▼ ▼
┌───────────┐ ┌───────────┐
│ Tools │ │ Answer │
└─────┬─────┘ └───────────┘
│
▼
┌───────────┐
│Tool Result│
└─────┬─────┘
│
└──────────────► Model
掌握:
Responses
Structured Output
Function Calling
Streaming
Async
File Search
Embedding
之后,就已经具备使用 OpenAI Python SDK 开发大多数 LLM 和 Agent 应用所需要的核心基础。
社区讨论
参与讨论
有问题或想法?欢迎继续讨论。