OpenAI Python 库是官方提供的工具包,让你能在 Python 应用中便捷地调用 OpenAI 的强大模型。它的核心用途是简化与 OpenAI REST API 的交互,并提供了同步/异步客户端以及完整的类型定义。
下面是它的基本使用方法。
安装
在开始之前,需要完成安装和API密钥配置两步。
安装库
通过 pip 即可从 PyPI 安装。库要求 Python 3.9 或更高版本。
bash
pip install openai
核心用法
OpenAI Python 库目前支持两种主要的文本生成接口:Responses API (推荐)和 Chat Completions API。
方式一:Responses API(推荐的新标准)
这是与 OpenAI 模型交互的首要 API,提供了更简洁的接口。
python
import os
from openai import OpenAI
client = OpenAI(
api_key="sk-123",
base_url="https://api.qnaigc.com/v1",
)
response = client.responses.create(
model="deepseek/deepseek-v4.1-flash-1017",
instructions="You are a coding assistant that talks like a pirate.", # 系统级指令
input="How do I check if a Python object is an instance of a class?", # 用户输入
)
print(response.output_text)
这段代码会让模型扮演一个"像海盗一样说话"的编程助手来回答问题,并直接打印生成的文本。
方式二:Chat Completions API(经典接口)
这是之前的标准接口,目前仍被无限期支持,适合需要更精细控制对话角色的场景。
python
from openai import OpenAI
client = OpenAI(
api_key="sk-123",
base_url="https://api.qnaigc.com/v1",
)
completion = client.chat.completions.create(
model="deepseek/deepseek-v4.1-flash-1017",
messages=[
{"role": "developer", "content": "Talk like a pirate."}, # 开发者指令(类似系统角色)
{"role": "user", "content": "How do I check if a Python object is an instance of a class?"},
],
)
print(completion.choices[0].message.content)
关键区别 :Chat Completions API 通过 messages 列表来构建对话上下文,其中 role 可以是 developer(系统级指令)、user(用户消息)或 assistant(模型之前的回复)。
不用 openai SDK 后,本质就是用 requests 发 HTTP POST JSON 请求。等价的 requests 写法:Chat Completions
python
import os
import requests
API_KEY = os.getenv("LLM_API_KEY", "sk-123")
BASE_URL = os.getenv("LLM_BASE_URL", "https://api.qnaigc.com/v1").rstrip("/")
MODEL = os.getenv("LLM_MODEL", "deepseek/deepseek-v4.1-flash-1017")
headers = {
"Content-Type": "application/json",
}
# 本地模型没有 key 时可以不传 Authorization
if API_KEY:
headers["Authorization"] = f"Bearer {API_KEY}"
payload = {
"model": MODEL,
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "你好,简单介绍一下你自己"},
],
"temperature": 0.7,
}
try:
resp = requests.post(
f"{BASE_URL}/chat/completions",
headers=headers,
json=payload,
timeout=60,
)
resp.raise_for_status()
data = resp.json()
print(data["choices"][0]["message"]["content"])
except requests.RequestException as e:
print("请求失败:", e)
if "resp" in locals():
print("状态码:", resp.status_code)
print("响应内容:", resp.text)
代码的模型配置参数使用的是七牛云厂商提供,如果你还没有API_KEY,那么可以尝试扫码注册领取token,然后开发你的agent应用。

源码
我希望简单模拟自己实现一个类似OpenAI的调用方式。核心就是把 client.chat.completions.create(...) 这种链式属性访问用普通类模拟出来,再把 HTTP 返回的 JSON 递归包装成可以用 . 访问的对象。下面是一个可以直接运行的最小实现。
一、完整代码
python
import os
import requests
from types import SimpleNamespace
class APIError(Exception):
def __init__(self, status_code, body):
self.status_code = status_code
self.body = body
super().__init__(f"API error {status_code}: {body}")
def _wrap(obj):
"""递归把 dict/list 转成可用 . 属性访问的对象。"""
if isinstance(obj, dict):
return SimpleNamespace(**{k: _wrap(v) for k, v in obj.items()})
if isinstance(obj, list):
return [_wrap(x) for x in obj]
return obj
class Completions:
def __init__(self, client):
self._client = client
def create(self, *, model, messages, **kwargs):
payload = {"model": model, "messages": messages, **kwargs}
return self._client._post("/chat/completions", payload)
class Chat:
def __init__(self, client):
self.completions = Completions(client)
class OpenAI:
def __init__(self, api_key=None, base_url=None, timeout=60):
self.api_key = api_key or os.getenv("OPENAI_API_KEY")
self.base_url = (
base_url or os.getenv("OPENAI_BASE_URL") or "https://api.openai.com/v1"
).rstrip("/")
self.timeout = timeout
# 关键:把 chat 挂成实例属性,形成链式访问
self.chat = Chat(self)
def _post(self, path, payload):
headers = {"Content-Type": "application/json"}
if self.api_key:
headers["Authorization"] = f"Bearer {self.api_key}"
resp = requests.post(
f"{self.base_url}{path}",
headers=headers,
json=payload,
timeout=self.timeout,
)
if not resp.ok:
raise APIError(resp.status_code, resp.text)
return _wrap(resp.json())
二、使用方式(和官方一模一样)
python
client = OpenAI(
api_key="sk-...",
base_url="https://api.deepseek.com/v1", # 换成你实际服务的地址
)
completion = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": "Talk like a pirate."},
{"role": "user", "content": "How do I check if a Python object is an instance of a class?"},
],
)
print(completion.choices[0].message.content)
三、关键设计点
-
链式属性访问
client.chat→Chat实例client.chat.completions→Completions实例client.chat.completions.create→ 方法只要把每一层都挂成上一层的属性,就能自然形成
client.chat.completions.create(...)。 -
completion.choices[0].message.content怎么来的HTTP 返回的是:
json{"choices": [{"message": {"content": "..."}}]}原生的取值是
data["choices"][0]["message"]["content"]。_wrap()递归把 dict 转成SimpleNamespace,于是就能用.choices[0].message.content访问。这是整个模拟里最关键的一步。 -
create的签名用
def create(self, *, model, messages, **kwargs)显式声明model和messages,其余参数透传。这样调用姿势和官方 SDK 完全一致,也方便 IDE 提示。
但作为"理解官方 SDK 内部是怎么一层层组织请求和响应"的教学实现,上面这 50 行已经覆盖了核心机制。