切换日光/暗黑模式
如果你已经在用 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.content3. 多轮对话要自己带历史
接口是无状态的,模型不会记得上一轮:
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 都能用,配置逻辑一样:
| 语言 | 包 |
|---|---|
| Python | openai |
| Node.js / TypeScript | openai |
| Go | github.com/sashabaranov/go-openai |
| Java | com.openai:openai-java |
| .NET | OpenAI |
关键就一条:把 base URL 指向 https://api.wxiai.com/v1。
