OpenAI SDK
安装官方 OpenAI SDK
# Python
pip install openai
# Node.js
npm install openai网关已提供 /api/llm/v1/chat/completions、/api/llm/v1/responses、 /api/llm/v1/models、/api/llm/v1/videos 等 OpenAI 兼容端点,格式与官方 API 一致。 只需把 base_url 指向网关地址 + /api/llm/v1,即可用熟悉的 SDK 调用, chat.completions.create / responses.create / models.list / videos.create / videos.retrieve 均可直接使用。
首次调用 API
网关使用与 OpenAI 兼容的 API 格式。已在用 OpenAI SDK 的项目, 只需改下面三个参数即可切过来,业务代码一行不动。
PARAM | VALUE |
|
|
| 形如 |
|
|
从 OpenAI / Anthropic 切换过来
OpenAI 官方 | Anthropic 官方 | 友盟 AI 网关 | |
安装包 |
|
|
|
base_url |
|
|
|
鉴权方式 |
|
|
|
对话接口 |
|
|
|
max_tokens | 可选 | 必填 | 可选,不传即不限长 |
取回答文本 |
|
|
|
模型名 | 具体型号,需自行权衡成本 | 具体型号,需自行权衡成本 |
|
⚠️ **Anthropic SDK 用户请注意:**网关目前 未提供 Anthropic 格式的兼容端点(即没有/v1/messages),anthropicSDK 无法直连。请改用openaiSDK, 改写量很小,具体对照见下方代码。
切换示例(复制即用)
from openai import OpenAI
client = OpenAI(
base_url="https://ai.umeng.com/api/llm/v1", # 改动 1:指向网关
api_key="YOUR_API_KEY" # 改动 2:换成 sk-um- 开头的 Key
)
# 以下业务代码完全不需要改
resp = client.chat.completions.create(
model="auto", # (可选)改成 auto 让网关自动选模型省钱
messages=[
{"role": "user", "content": "用一句话介绍牛顿第一定律"}
]
)
print(resp.choices[0].message.content)# ---------- 改写前:Anthropic SDK ----------
# from anthropic import Anthropic
#
# client = Anthropic(api_key="sk-ant-xxx")
# resp = client.messages.create(
# model="claude-sonnet-…",
# max_tokens=1024, # 必填
# messages=[{"role": "user", "content": "介绍牛顿第一定律"}]
# )
# print(resp.content[0].text) # 取文本方式不同
# ---------- 改写后:openai SDK + 友盟网关 ----------
from openai import OpenAI
client = OpenAI(
base_url="https://ai.umeng.com/api/llm/v1",
api_key="YOUR_API_KEY"
)
resp = client.chat.completions.create(
model="auto",
# max_tokens 不再必填,需限长时才传
messages=[
{"role": "user", "content": "介绍牛顿第一定律"}
]
)
print(resp.choices[0].message.content) # 不再是 resp.content[0].text
# 流式也一样:Anthropic 的 client.messages.stream(...) 上下文管理器
# → 换成 create(..., stream=True) 直接迭代,取 chunk.choices[0].delta.content1)Python · 非流式
from openai import OpenAI
client = OpenAI(
base_url="https://ai.umeng.com/api/llm/v1",
api_key="YOUR_API_KEY"
)
resp = client.chat.completions.create(
model="auto",
messages=[{"role": "user", "content": "用一句话介绍牛顿第一定律"}],
extra_body={
# "enableThinking": True,
# "sessionId": "sess-001",
}
)
print("回答:", resp.choices[0].message.content)
print("实际模型:", resp.model)
print("Token:", resp.usage.total_tokens)2) Python · 流式
from openai import OpenAI
client = OpenAI(
base_url="https://ai.umeng.com/api/llm/v1",
api_key="YOUR_API_KEY"
)
stream = client.chat.completions.create(
model="auto",
messages=[{"role": "user", "content": "请用 Python 写一个 LRU 缓存"}],
stream=True
)
for chunk in stream:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end="", flush=True)3)Node.js · 非流式
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'https://ai.umeng.com/api/llm/v1',
apiKey: 'YOUR_API_KEY'
});
const resp = await client.chat.completions.create({
model: 'auto',
messages: [{ role: 'user', content: '用一句话介绍牛顿第一定律' }]
});
console.log('回答:', resp.choices[0].message.content);4) Node.js · 流式
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'https://ai.umeng.com/api/llm/v1',
apiKey: 'YOUR_API_KEY'
});
const stream = await client.chat.completions.create({
model: 'auto',
messages: [{ role: 'user', content: '请用 Python 写一个 LRU 缓存' }],
stream: true
});
for await (const chunk of stream) {
const delta = chunk.choices[0].delta;
if (delta && delta.content) {
process.stdout.write(delta.content);
}
}5) Responses API
from openai import OpenAI
client = OpenAI(
base_url="https://ai.umeng.com/api/llm/v1",
api_key="YOUR_API_KEY"
)
# 最简形式
resp = client.responses.create(
model="auto",
input="用一句话介绍牛顿第一定律"
)
print(resp.output_text)
# 完整形式
resp = client.responses.create(
model="auto",
instructions="你是一个严谨的物理老师,回答不超过 50 字",
input=[{"role": "user", "content": [{"type": "input_text", "text": "什么是惯性?"}]}],
extra_body={
# "sessionId": "sess-001", # 用 sessionId 代替 previous_response_id
}
)
print(resp.output_text)Responses 兼容边界:已支持文本输入、多轮、instructions、流式。暂不支持 tools、previous_response_id、非文本输入。
6) 图像生成
from openai import OpenAI
client = OpenAI(
base_url="https://ai.umeng.com/api/llm/v1",
api_key="YOUR_API_KEY"
)
resp = client.chat.completions.create(
model="doubao-seedream-5-0-pro-260628",
messages=[{"role": "user", "content": "一只在读书的兔子"}],
extra_body={
"imageParams": {"size": "1024x1024", "quality": "low", "n": 1}
}
)
print(resp.choices[0].message.content) # Markdown 图片链接7) 模型列表
from openai import OpenAI
client = OpenAI(
base_url="https://ai.umeng.com/api/llm/v1",
api_key="YOUR_API_KEY"
)
models = client.models.list()
for m in models.data:
print(m.id, "|", m.owned_by)
# model_extra 含: model_type, tier, supports_thinking, supports_image, description8) 视频生成(videos API)
import time
from openai import OpenAI
client = OpenAI(api_key="YOUR_API_KEY", base_url="https://ai.umeng.com/api/llm/v1")
# ① 提交任务
video = client.videos.create(
model="wan2.5-t2v-preview",
prompt="一只橘猫在窗台上晒太阳,镜头缓慢推近",
seconds="5",
size="854x480", # 短边=分辨率档位;竖屏写 "480x854"
)
print("任务已提交:", video.id, video.status)
# ② 轮询结果
while video.status not in ("completed", "failed"):
time.sleep(15)
video = client.videos.retrieve(video.id)
print("状态:", video.status)
if video.status == "failed":
raise RuntimeError(f"视频生成失败: {video.error}")
extra = video.model_extra or {}
print("视频地址:", extra.get("video_url"))
print("扣费:", extra.get("credits"), "算力点")download_content() 不可用。网关把视频地址放在扩展字段 video_url,请从该字段自行下载。
错误处理
OpenAI 兼容端点(返回真实 HTTP 状态码)
状态码 | 含义 | 处理建议 |
401 | Key 无效/过期 | 不要重试,检查 Key |
402 | 算力点余额不足 | 充值后重试(网关用 402 而非 429,避免 SDK 自动重试放大调用) |
429 | 频率过高 | SDK 自动退避重试 |
400 | 入参缺失/非法 | 检查 messages 是否为空 |
404 | 模型不存在 | 用 models.list() 核对 |
502 | 上游故障 | 可重试 |
import openai
from openai import OpenAI
client = OpenAI(base_url="https://ai.umeng.com/api/llm/v1", api_key="YOUR_API_KEY")
try:
resp = client.chat.completions.create(
model="auto",
messages=[{"role": "user", "content": "你好"}]
)
print(resp.choices[0].message.content)
except openai.AuthenticationError as e:
print("鉴权失败:", e.body)
except openai.RateLimitError as e:
print("被限流:", e.body)
except openai.APIStatusError as e:
if e.status_code == 402:
print("余额不足,请充值")
else:
print("调用失败:", e.status_code, e.body)
except openai.APIConnectionError as e:
print("网络异常:", e)网关自有端点(恒 200 + success/sCode)
result = resp.json()
if not result.get("success"):
print("错误码:", result.get("sCode"), "消息:", result.get("msg"))流式错误
流式中途出错时,网关下发 {"error":{…}} 数据帧后结束流。鉴权/余额错误会在流开始前以正常状态码抛出。