博客

兼容 OpenAI 的 API:599 个模型一套接口

把现有 OpenAI SDK 的 base URL 指过来,即可在 599 个模型间切换,不用重写客户端代码。

目标关键词: OpenAI-compatible API

兼容 OpenAI 的 API 沿用与 OpenAI chat completions 相同的请求和响应结构。现有 SDK、提示词结构、流式循环和工具调用代码都能保留,只改 base URL、Key 和模型名。

GeniusRelay 通过一个这样的接口提供 37 家厂商的 599 个模型,包括 GLM、DeepSeek、Qwen、Claude、Gemini、GPT、Mistral、Meta、Anthropic 和小米。一个账号、一份账单、一套接入。

「兼容」覆盖哪些

接口接受这些标准字段:

  • model
  • messages
  • temperature
  • top_p
  • max_tokens
  • stream
  • stop
  • presence_penalty
  • frequency_penalty
  • seed
  • tools 与 tool_choice
  • response_format

响应保留 choices[].message 结构,包括工具调用和流式增量。错误体也沿用 OpenAI 信封,带 error.message、error.type、error.code,现有重试逻辑读得懂。完整字段见接口参考。

四行迁移

多数 OpenAI SDK 代码只换 base URL 和 Key:

from openai import OpenAI

client = OpenAI(
    api_key="YOUR_KEY",
    base_url="https://api.geniusrelaygpt.com/v1",
)

resp = client.chat.completions.create(
    model="deepseek-v4.1-flash",
    messages=[{"role": "user", "content": "你好"}],
)

Node 一样:

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.geniusrelaygpt.com/v1",
  apiKey: process.env.API_KEY,
});

const resp = await client.chat.completions.create({
  model: "deepseek-v4.1-flash",
  messages: [{ role: "user", content: "你好" }],
});

如果客户端从配置文件读地址,同样改成这个 URL。Cursor、Cline、SillyTavern 都有教程:Cursor、Cline、SillyTavern。

选模型

一个接口只有在后面的模型对的时候才有用。目录分成清楚的几类:

  • 无审查: 43 个拒答更少的变体——浏览
  • 推理: 404 个支持思考的模型——浏览
  • 识图: 334 个可接收图片的模型——浏览
  • 工具调用: 430 个接受 tools 的模型——浏览
  • 长上下文: 384 个 128K 及以上的模型——浏览

冒烟测试用的低价起点:

每个模型页都列输入、输出和缓存输入价,跑之前就能估。对比页最多并排四个。

和 OpenAI 不一样的地方

兼容是格式契约,不是行为保证。

  • 模型名不是 OpenAI 的名字。 gpt-4o 不一定存在,照模型页复制准确 ID。
  • 能力各不相同。 有的模型会忽略 response_format 或拒绝图片,先确认模态和标签。
  • 上下文按模型算。 给 8K 模型发 300K token 是 400,不是静默截断。
  • 价格按模型算,不按账号档位。 换模型账单立刻变。

把 model 当部署参数而不是常量:放进配置、启动时校验、每次请求记录,成本回退才查得到。

流式与工具调用

流式是标准 SSE,读增量,不读整条消息:

stream = client.chat.completions.create(
    model="deepseek-v4.1-flash",
    messages=[{"role": "user", "content": "从一数到五。"}],
    stream=True,
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")

工具调用走常规两段式:发 tools,收 tool_calls,执行,再把 tool 消息发回去。优先试带 tools 标签的模型。超时和保活见流式指南。

成本和稳定性

  • 预付余额。 先充值;余额空了返回 insufficient_quota,不会欠费。
  • 按 Key 限额。 每个 Key 设消费上限和到期日,一个跑飞的脚本花不穿账号。
  • 缓存输入价。 支持的模型对重复前缀按缓存价计,稳定部分放最前。
  • 故障转移。 线路不可用时流量可以改道,重试代码仍要处理 429 和 5xx。

上线前读错误码和扣费规则,从快速开始走一遍。

常见问题

要重写应用吗?

通常不用。已经在用 OpenAI SDK 的话,改 base URL、Key 和模型名。

支持流式吗?

支持标准 SSE。

支持工具调用吗?

支持,在带 tools 标签的模型上,schema 和循环都不用改。

兼容等于输出一样吗?

不等于,权重不同答案就不同。换生产提示词前先跑自己的评测集。

哪些模型最便宜?

DeepSeek V4.1 Flash 和 Claude Haiku 5.5 是便宜的主流选择,更小的模型见便宜 LLM API 指南。

有兼容的 embeddings 接口吗?

本文只讲 chat completions,其他端点看接口参考。

能活到生产环境的错误处理

错误信封同样兼容,常规处理可以直接搬:

import time

def call(model, messages, tries=3):
    for attempt in range(tries):
        try:
            return client.chat.completions.create(model=model, messages=messages)
        except Exception as exc:
            status = getattr(exc, "status_code", None)
            if status == 429 or (status and status >= 500):
                time.sleep(2 ** attempt)
                continue
            raise
    raise RuntimeError("retries exhausted")

429 和 5xx 指数退避重试;400、401 别重试,模型名错了或 Key 缺了每次都会错。失败时把请求 ID 和模型记下来。

并发与批处理

端点是 HTTP,限制按 Key 算。从四到八个并发起,一直加到出现 429,再往回收。批量活优先一条请求塞多条数据,重复的指令只发一次更便宜。

from concurrent.futures import ThreadPoolExecutor

def run(row):
    return call("deepseek-v4.1-flash", [{"role": "user", "content": row}])

with ThreadPoolExecutor(max_workers=6) as pool:
    results = list(pool.map(run, rows))

批量前给 Key 封顶。20 个并发又不设上限,几分钟就能清空余额。

配置检查单

  • base URL 进环境变量,别在多处写死。
  • 启动时用模型列表校验模型 ID。
  • 超时 60–120 秒,流式调用更短。
  • 回退模型选同价位。
  • 每条调用路径都显式设 max_tokens。
  • 失败时记录请求 ID 和模型。

客户端配置见 Cursor 和 Cline 教程,流式超时见流式指南。


相关阅读