跳转到主要内容
PRODUCT DOCUMENTS

快速找到所需文档,高效完成接入与排障

浏览产品文档与友盟 Skill,展开目录并阅读正文。

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

base_url

https://ai.umeng.com/api/llm/v1

api_key

形如 sk-um-xxxxxxxx, 前往申请 API Key

model

auto 推荐,网关智能路由,自动省 token 费用
qwen3.7-max 旗舰对话,复杂任务
qwen3.7-plus 均衡档,日常对话
qwen3.6-flash 轻量档,高并发/低成本
qwen3-vl-plus 图文多模态
qwen3-coder-plus 代码场景
完整列表(含图像/视频模型)调 client.models.list() 获取





从 OpenAI / Anthropic 切换过来

OpenAI 官方

Anthropic 官方

友盟 AI 网关

安装包

pip install openai

pip install anthropic

pip install openai
✓ 直接复用 OpenAI SDK

base_url

https://api.openai.com/v1

https://api.anthropic.com

https://ai.umeng.com/api/llm/v1

鉴权方式

Authorization: Bearer sk-…

x-api-key: sk-ant-…

Authorization: Bearer sk-um-…
✓ 与 OpenAI 一致

对话接口

chat.completions.create()
responses.create()

messages.create()

chat.completions.create()
responses.create()
✓ 两个都支持

max_tokens

可选

必填

可选,不传即不限长

取回答文本

resp.choices[0].message.content

resp.content[0].text

resp.choices[0].message.content
✓ 与 OpenAI 一致

模型名

具体型号,需自行权衡成本

具体型号,需自行权衡成本

auto
✓ 网关自动选模型,平均省 50%+

⚠️ **Anthropic SDK 用户请注意:**网关目前 未提供 Anthropic 格式的兼容端点(即没有 /v1/messages), anthropic SDK 无法直连。请改用 openai SDK, 改写量很小,具体对照见下方代码。

切换示例(复制即用)

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.content

1)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, description

8) 视频生成(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":{…}} 数据帧后结束流。鉴权/余额错误会在流开始前以正常状态码抛出。