Skip to content
场景示例

OpenAI SDK

如果你已经在用 OpenAI 的 SDK,接我们这里只需要改两行——api_key 和 base_url。业务代码一行都不用动。

Python ​

安装 ​

bash
pip install openai

最小示例 ​

python
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["WXIAI_API_KEY"],      # 从环境变量读,别写死在代码里
    base_url="https://api.wxiai.com/v1",      # 只改这一行
)

resp = client.chat.completions.create(
    model="grok-4.6",
    messages=[{"role": "user", "content": "用一句话介绍你自己"}],
)

print(resp.choices[0].message.content)
bash
export WXIAI_API_KEY="sk-你的APIKey"
python main.py

流式输出 ​

python
stream = client.chat.completions.create(
    model="grok-4.6",
    messages=[{"role": "user", "content": "写一首关于雨的短诗"}],
    stream=True,
)

for chunk in stream:
    delta = chunk.choices[0].delta
    if delta.content:
        print(delta.content, end="", flush=True)

查可用模型 ​

不要凭记忆写模型名,用代码查:

python
for m in client.models.list().data:
    print(m.id)

Node.js ​

javascript
import OpenAI from 'openai'

const client = new OpenAI({
  apiKey: process.env.WXIAI_API_KEY,
  baseURL: 'https://api.wxiai.com/v1',   // 注意这里叫 baseURL
})

const resp = await client.chat.completions.create({
  model: 'grok-4.6',
  messages: [{ role: 'user', content: '用一句话介绍你自己' }],
})

console.log(resp.choices[0].message.content)

字段名不一样

Python 是 base_url,Node.js 是 baseURL。写错不会报错,只会连到 OpenAI 官方——然后因为 Key 不对而认证失败。

超时怎么设(很重要) ​

不同能力的合理超时差别很大。 用 SDK 默认值(大多 10 分钟)等太久,设太短又会在正常出图时断掉:

调用类型建议超时
文本对话60 秒
流式输出不设总超时,用「多久没收到新数据」判断
图像生成120 秒以上
语音识别 / 合成120 秒
视频任务提交30 秒(提交很快,等结果靠轮询)
python
from openai import OpenAI
import httpx

client = OpenAI(
    api_key=os.environ["WXIAI_API_KEY"],
    base_url="https://api.wxiai.com/v1",
    timeout=httpx.Timeout(120.0, connect=10.0),   # 总超时 120s,建连 10s
)

⚠️ 出图接口最容易踩这个坑:默认 30 秒的客户端很可能会在图片生成完成前就断开。

错误处理 ​

用 error.code 判断,不要匹配 message 文本——文案会调整,code 是稳定的。

python
import time
import openai

RETRYABLE = {
    "rate_limit", "too_many_requests", "overloaded",
    "upstream_error", "upstream_timeout_no_response",
}

def call_with_retry(fn, max_retries=4):
    for attempt in range(max_retries):
        try:
            return fn()
        except openai.APITimeoutError:
            if attempt == max_retries - 1:
                raise
            time.sleep(2 ** attempt)
        except openai.APIStatusError as e:
            code = ((e.body or {}).get("error") or {}).get("code")
            if code not in RETRYABLE or attempt == max_retries - 1:
                raise                          # 不该重试的,直接抛
            time.sleep(2 ** attempt)           # 1s → 2s → 4s → 8s

哪些错误重试没有意义:

错误重试有用吗
401 / invalid_api_key没有,Key 就是错的
404 / model_not_found没有,路径或模型名写错了
400 / invalid_request_error没有,参数不对
429 / 5xx / overloaded有用,退避重试

完整列表见 错误码。

生产环境的几个建议 ​

1. Key 从环境变量读,不要硬编码

python
# 不要这样
client = OpenAI(api_key="sk-abc123...", ...)

一旦提交到 Git,Key 就等于泄露了。发现泄露立刻去 https://api.wxiai.com/token 删除(不是改名)。

2. 复用 client 实例

OpenAI(...) 内部维护连接池。每次请求都新建一个 client 会浪费连接、拖慢速度:

python
# 在模块级别建一次,全局复用
client = OpenAI(api_key=..., base_url=..., timeout=...)

def ask(question: str) -> str:
    resp = client.chat.completions.create(
        model="grok-4.6",
        messages=[{"role": "user", "content": question}],
    )
    return resp.choices[0].message.content

3. 多轮对话要自己带历史

接口是无状态的,模型不会记得上一轮:

python
messages = [{"role": "system", "content": "你是一个简洁的助手。"}]

def chat(user_input: str) -> str:
    messages.append({"role": "user", "content": user_input})
    resp = client.chat.completions.create(model="grok-4.6", messages=messages)
    reply = resp.choices[0].message.content
    messages.append({"role": "assistant", "content": reply})
    return reply

⚠️ 上下文越长越贵也越慢。长会话要么截断旧消息,要么自己做个摘要。

4. 记录 request_id

出问题时只有带上它才能定位到具体那一次调用。响应头或响应体里都有。

换成其他语言 ​

任何支持自定义 Base URL 的 OpenAI SDK 都能用,配置逻辑一样:

语言包
Pythonopenai
Node.js / TypeScriptopenai
Gogithub.com/sashabaranov/go-openai
Javacom.openai:openai-java
.NETOpenAI

关键就一条:把 base URL 指向 https://api.wxiai.com/v1。

相关页 ​

基于 Apache-2.0 许可发布