兼容 OpenAI 接口的好处是:代码不用改,换一个 base_url 和一个 model 就能切到别的模型。但“兼容”不等于“完全一样”,下面把能直接复用的部分和不一致的部分分开说。
from openai import OpenAI
client = OpenAI(api_key="sk-你的密钥", base_url="https://newmao.cn/v1")
for model in ["claude-sonnet-4-5", "gpt-5.1", "gemini-2.5-pro"]:
r = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": "你好,用一句话介绍你自己"}],
)
print(model, "->", r.choices[0].message.content)
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.NEWMAO_API_KEY,
baseURL: "https://newmao.cn/v1",
});
const stream = await client.chat.completions.create({
model: "claude-sonnet-4-5",
messages: [{ role: "user", content: "写一句产品 slogan" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
| 参数 | 通用性 | 说明 |
|---|---|---|
messages | 通用 | system / user / assistant 三种角色都被支持 |
stream | 通用 | SSE 流式输出,各模型行为一致 |
temperature | 基本通用 | 部分推理模型会忽略该参数 |
max_tokens | 通用 | 各模型上下文长度不同,超限会返回 400 |
tools / function calling | 多数支持 | 格式一致,但各模型的调用成功率差别较大 |
response_format | 部分支持 | 结构化输出不是每个模型都有,建议先小样本验证 |
多模态模型统一用 content 数组传图片,URL 和 base64 都支持:
resp = client.chat.completions.create(
model="gemini-2.5-pro",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "这张图里有什么?"},
{"type": "image_url", "image_url": {"url": "https://example.com/a.png"}},
],
}],
)
base_url 写成完整接口地址:SDK 会自己拼路径,写成 /v1/chat/completions 会 404;想先确认某个模型名是否存在,调一次 /v1/models 就行;价格见 模型广场。