OpenAI API 调用与兼容接入指南:Base URL 怎么填、Python / Node.js 示例与客户端配置

更新于

这篇讲清楚 OpenAI 兼容接口(OpenAI Compatible API)是什么、各种客户端的 Base URL 到底填哪个、Python 和 Node.js 怎么调用、怎么流式输出,以及接入前该做哪些测试。看完可以把 API 快连接进任何支持「自定义 OpenAI 服务商」的软件或自己的代码。

📌
一句话答案:OpenAI 兼容客户端和 SDK 的 Base URL 填 https://apikl.ai/v1(带 /v1);Claude Code、Anthropic SDK 这类 Anthropic 协议的客户端填 https://apikl.ai(不带 /v1)。两种写法不要混用。

OpenAI Compatible API 是什么

OpenAI 兼容接口,是指服务方按 OpenAI 的请求格式提供接口:同样的 base_url、api_key、model 三个参数,同样的 /v1/chat/completions、/v1/responses 路径。很多软件和 SDK 原生就支持这种格式,所以只要把 Base URL 和密钥换成 API 快连的,就能用同一套代码调用 GPT、Claude、Gemini、DeepSeek 等不同模型,不用为每家模型各写一套接入。

需要注意,「兼容」主要指请求和返回的格式一致,不代表每个功能都完全一样。不同模型对工具调用、图片输入、推理参数的支持程度不同,正式使用前要用自己的真实请求测一遍。

Base URL 怎么填:按客户端速查

客户端 / 场景协议Base URL
Codex CLI / Codex 桌面版OpenAI 兼容https://apikl.ai/v1(教程)
Cline / Roo Code / Cursor / TRAEOpenAI 兼容https://apikl.ai/v1
OpenClaw / Hermes 等 Agent 工具OpenAI 兼容https://apikl.ai/v1
Python / Node.js 的 OpenAI SDK、curlOpenAI 兼容https://apikl.ai/v1
Claude CodeAnthropichttps://apikl.ai(教程)
Anthropic SDK / Claude 原生接口Anthropichttps://apikl.ai
Gemini CLIGeminihttps://apikl.ai(教程)

三条线路:默认、备用和直连

线路地址什么时候用
默认线路https://apikl.ai大多数情况都用它,经过 CDN 加速
备用线路https://api.apikl.ai以前的默认地址,同样经过 CDN 加速,已经配好的不用改;默认线路访问异常时也可以换它
直连线路https://dc.apikl.ai不经过 CDN,直连服务器。网络不稳定,或长时间的非流式请求经常超时(524)时换用

三条线路用法完全相同,只是换域名。以直连线路为例:OpenAI 兼容客户端写 https://dc.apikl.ai/v1,Claude Code 写 https://dc.apikl.ai。

控制台里的「专业生图」网页同样可以走直连线路:打开右上角「设置」→「API 配置」,在「当前配置」里把「GPT 生图 · 主线路(默认)」换成「GPT 生图 · 直连线路(超时用)」即可,两档出的图一样。主线路经常卡住或超时时再切换过去,切换后需要重新填一次 API Key。

填错了会怎样

  • 少写 /v1(例如 Base URL 填成 https://apikl.ai):聊天、Responses、模型列表这些常用接口现在不带 /v1 也能访问,但不是所有接口都支持,所以 OpenAI 兼容方式仍请按上表带上 /v1。
  • 多写路径(例如 Base URL 填成 https://apikl.ai/v1/chat/completions):客户端会再拼一次路径,结果 404。
  • 填成了网页地址(例如控制台 https://apikl.ai/keys、文档站 https://docs.apikl.ai/v1),或写成 http://、www.apikl.ai:请求拿到的是网页或跳转,客户端通常报「Unexpected token <」「无法解析 JSON」这类看不懂的错误。地址只能用上表里的写法。
  • Base URL 还是官方地址(https://api.openai.com/v1):官方不认识 API 快连的密钥,返回 401 invalid_api_key。
  • Claude Code 带了 /v1:路径变成 /v1/v1/messages,表现为 404 或模型不存在。

标准填写:服务商、Base URL、密钥、模型

大多数图形界面软件的「自定义服务商」设置都是下面这几项:

字段填写说明
服务商类型(Provider)OpenAI Compatible / 自定义 OpenAI不要选需要登录官方账号的那一项
Base URLhttps://apikl.ai/v1带 /v1,末尾不加斜杠
API Keysk-你的密钥在 控制台 创建
模型(Model)gpt-5.6-sol先用它测通,再换成你要用的模型
💡
密钥绑定在分组上:GPT 分组的密钥调 GPT 模型,Claude 分组的密钥调 Claude 模型。想知道一把密钥能用哪些模型,看下面的「查询可用模型」,或打开 模型广场。

代码示例:curl、Python、Node.js

curl 最小请求

BASH
curl https://apikl.ai/v1/chat/completions \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"gpt-5.6-sol","messages":[{"role":"user","content":"你好"}]}'

Python(openai 官方 SDK)

先安装:pip install openai。密钥建议放在环境变量 OPENAI_API_KEY 里,不要写死在代码中。

Python
from openai import OpenAI client = OpenAI(base_url="https://apikl.ai/v1") # 密钥自动读取环境变量 OPENAI_API_KEYresp = client.chat.completions.create( model="gpt-5.6-sol", messages=[{"role": "user", "content": "你好"}],)print(resp.choices[0].message.content)

Python 流式输出(长回答推荐)

Python
stream = client.chat.completions.create( model="gpt-5.6-sol", messages=[{"role": "user", "content": "写一段 300 字的介绍"}], stream=True,)for chunk in stream: if chunk.choices and chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end="", flush=True)
⚠️
耗时长的请求(长上下文、复杂推理、长输出)请用流式。非流式请求如果超过约 100 秒还没返回,可能被网络链路超时断开(表现为 524),而服务端可能已经完成计算并计费。

Node.js(openai 官方 SDK)

先安装:npm install openai。

Node.js
import OpenAI from "openai"; const client = new OpenAI({ baseURL: "https://apikl.ai/v1", apiKey: process.env.OPENAI_API_KEY });const resp = await client.chat.completions.create({ model: "gpt-5.6-sol", messages: [{ role: "user", content: "你好" }],});console.log(resp.choices[0].message.content);

Node.js(不装 SDK,直接用 fetch)

Node.js 18 以上自带 fetch,不想装依赖时可以直接发请求:

Node.js
const res = await fetch("https://apikl.ai/v1/chat/completions", { method: "POST", headers: { "Authorization": `Bearer ${process.env.OPENAI_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ model: "gpt-5.6-sol", messages: [{ role: "user", content: "你好" }], }),});if (!res.ok) throw new Error("HTTP " + res.status + ": " + await res.text());const data = await res.json();console.log(data.choices[0].message.content);
💡
自己用底层 HTTP 库(例如 Python 原生 urllib)发请求时,记得带一个正常的 User-Agent 请求头,否则可能被接入层拦截并返回 403(error code: 1010)。OpenAI SDK、requests、curl、fetch 都会自动带,不受影响。

Responses 接口

新版 OpenAI SDK 和 Codex 使用的 Responses 接口同样支持,路径是 /v1/responses:

Python
resp = client.responses.create(model="gpt-5.6-sol", input="你好")print(resp.output_text)

查询可用模型

想知道当前密钥能调哪些模型,直接请求模型列表,返回的就是可以填的准确模型名:

BASH
curl https://apikl.ai/v1/models -H "Authorization: Bearer $OPENAI_API_KEY"

Claude 模型也能走 OpenAI 兼容接口吗

能调通,但不建议长期这样用。用 Claude 分组的密钥,按上面的 OpenAI 写法把 model 换成 claude-sonnet-5-5 等即可,网关会自动转换协议。

⚠️
OpenAI 兼容方式不走提示缓存:Claude 的提示缓存要求请求里带缓存标记,用 OpenAI 格式(/v1/chat/completions、/v1/responses)发出的请求一般不带,每一轮都会按原价重新计算全部上下文。上下文越长、轮数越多,差距越大,长对话和编程任务的费用常常是原生接入的好几倍。偶尔问一句没关系;长对话、写代码、批量任务请用 Anthropic 原生接口。

Anthropic 原生接口的地址填 https://apikl.ai(不带 /v1)。Claude Code 会自动加缓存标记,不用额外设置;自己写代码时用 Anthropic SDK,在 system 或较长的固定内容上加 cache_control,就能命中缓存。最简单的调用:

Python
import anthropic client = anthropic.Anthropic(base_url="https://apikl.ai") # 不带 /v1;密钥读取 ANTHROPIC_API_KEYmsg = client.messages.create( model="claude-sonnet-5-5", max_tokens=1024, messages=[{"role": "user", "content": "你好"}],)print(msg.content[0].text)

接入前先做 3 个测试

  1. 短问题测试:发一句「你好」,排除地址、密钥和模型名的问题。
  2. 换模型测试:再换一个你要用的模型,确认分组里有这个模型、名字没写错。
  3. 真实任务测试:用你项目里的真实上下文和输出长度跑几次,记录耗时、成功率和使用记录里的实际费用。

生产环境使用建议

  • 在 控制台 给每个项目单独建密钥,并按需设置额度上限、过期时间和 IP 白名单,密钥泄露时损失可控。
  • 在你的代码里设置超时、失败重试(带退避)和并发上限,长请求用流式。
  • 准备降级方案:主模型繁忙时切换到备用模型或备用线路,不要让业务只依赖单一路径。
  • 定期看控制台的使用记录,核对每次请求的输入、输出、缓存 token 和费用。

常见问题

OpenAI 官方 SDK 能直接用吗?

能。只要把 base_url(Node.js 里是 baseURL)改成 https://apikl.ai/v1,密钥换成 API 快连的即可,其余代码不用改。

支持流式输出和工具调用吗?

支持流式输出(stream: true)。工具调用(function calling)取决于所选模型本身是否支持,主流的 GPT 和 Claude 模型都支持。

请求报错了先看哪里?

按报错类型看:401 invalid_api_key、model not exist / model not found,其他状态码看 报错大全。

✅