Skip to content

OpenAI 兼容接入

why01 API 完整兼容 OpenAI v1 协议——原本能用 https://api.openai.com 跑的代码,把 base_url 换一下即可。

示例中的模型名仅为占位

本页代码示例里的 model 字段(如 gpt-5-mini)只是写法占位——上游模型几周一变,实际能用哪些模型 + 当前型号名永远以 控制台模型 / 定价页 为准。复制代码后请把 model 字段换成控制台当前可见的模型名。

端点

POST https://s1.why01.top/v1/chat/completions

其他常用端点:

  • 流式:在请求体加 "stream": true
  • 模型列表:GET /v1/models
  • Embeddings:POST /v1/embeddings

curl

bash
curl https://s1.why01.top/v1/chat/completions \
  -H "Authorization: Bearer sk-你的key" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5-mini",
    "messages": [
      {"role": "system", "content": "你是个简洁的助手。"},
      {"role": "user", "content": "用一句话介绍 Python。"}
    ],
    "temperature": 0.7
  }'

流式(SSE):

bash
curl https://s1.why01.top/v1/chat/completions \
  -H "Authorization: Bearer sk-你的key" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5-mini",
    "messages": [{"role": "user", "content": "数到 5"}],
    "stream": true
  }'

Python(openai SDK)

bash
pip install openai
python
from openai import OpenAI

client = OpenAI(
    base_url="https://s1.why01.top/v1",
    api_key="sk-你的key",
)

resp = client.chat.completions.create(
    model="gpt-5-mini",
    messages=[{"role": "user", "content": "你好"}],
)
print(resp.choices[0].message.content)

流式:

python
stream = client.chat.completions.create(
    model="gpt-5-mini",
    messages=[{"role": "user", "content": "数到 5"}],
    stream=True,
)
for chunk in stream:
    delta = chunk.choices[0].delta.content or ""
    print(delta, end="", flush=True)

Node.js(openai SDK)

bash
npm install openai
js
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://s1.why01.top/v1",
  apiKey: process.env.WHY01_API_KEY,
});

const resp = await client.chat.completions.create({
  model: "gpt-5-mini",
  messages: [{ role: "user", content: "你好" }],
});
console.log(resp.choices[0].message.content);

Go

bash
go get github.com/sashabaranov/go-openai
go
package main

import (
    "context"
    "fmt"
    openai "github.com/sashabaranov/go-openai"
)

func main() {
    config := openai.DefaultConfig("sk-你的key")
    config.BaseURL = "https://s1.why01.top/v1"
    client := openai.NewClientWithConfig(config)

    resp, err := client.CreateChatCompletion(
        context.Background(),
        openai.ChatCompletionRequest{
            Model: "gpt-5-mini",
            Messages: []openai.ChatCompletionMessage{
                {Role: openai.ChatMessageRoleUser, Content: "你好"},
            },
        },
    )
    if err != nil {
        panic(err)
    }
    fmt.Println(resp.Choices[0].Message.Content)
}

常见请求参数

参数作用备注
model模型名必填,按控制台 模型/定价页
messages对话历史必填,OpenAI 标准 schema
temperature随机度 0-2默认 1.0;要稳定输出建议 0-0.3
max_tokens输出 token 上限不传按上游默认
streamSSE 流式长输出建议开启
tools / tool_choice函数调用兼容 OpenAI 标准 schema
response_format结构化输出{"type": "json_object"} 强制 JSON
top_p, frequency_penalty, presence_penalty高级采样参数完全对齐 OpenAI

完整字段参考 OpenAI 官方文档

多模态(视觉输入)

python
resp = client.chat.completions.create(
    model="gpt-5",  # 或其他支持视觉的模型
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "图里是什么?"},
            {"type": "image_url", "image_url": {
                "url": "https://example.com/cat.jpg"
            }}
        ]
    }],
)

哪些模型支持视觉以控制台模型详情页标注为准。

用 OpenAI SDK 调 Claude / Gemini

直接把 model 字段填成 Claude / Gemini 模型名:

python
resp = client.chat.completions.create(
    model="claude-sonnet-4-6",  # 或 gemini-2.5-pro
    messages=[{"role": "user", "content": "你好"}],
)

返回结构与调 GPT 一样,业务代码不需要改。详见 Claude 接入 / Gemini 接入

调用失败先看

HTTP 状态含义处理
200成功
401Key 错或失效检查拼写、是否被禁用、过期
402余额不足控制台充值
404model not found模型名拼错 / 不在你的分组
429触限速加退避重试
5xx上游波动重试 1-2 次 / 切同类模型

完整错误码 → 错误码速查