1. 为什么我最后把 Claude 和 Codex 都塞进了 OpenAI-compatible 通道
如果你手上同时有 Python 脚本和 Node 服务,又想在 Claude 和 Codex 之间来回切,最烦的其实不是模型本身,而是每换一个模型就要换一套 SDK、换一套参数、换一套错误处理。OpenAI-compatible 接口能做什么?它把请求体、响应体、鉴权方式都收敛到一套约定上,让你用同一个openaiSDK 就能打到不同模型。适合谁?适合已经在用 OpenAI SDK、又想低成本接入 Claude / Codex 的 Python 与 Node 项目。
我试过最省事的路径:不改业务层,只改base_url、api_key、model三个值。这篇文章就按这个思路走,先给配置骨架,再给最小请求脚本,最后把 401、模型名不匹配、base_url漏/v1这三类报错逐个拆开定位。你跟着做,能拿到一个可运行、可切换、可排障的接入骨架。
2. 前置准备:统一 Key 通道与三个必填参数
不管 Python 还是 Node,先准备三个参数:BASE_URL、API_KEY、MODEL_NAME。这里的关键是BASE_URL要指向兼容 OpenAI 的 API 入口,而不是平台官网地址;MODEL_NAME要用当前服务实际支持的模型名,别照抄示例。
统一 Key 通道的意思是:把 Key 放在环境变量里,代码只读环境变量,不硬编码。这样 Python 和 Node 可以共用同一份.env,切换模型时只改一处。
# .env 骨架,Python 与 Node 共用 BASE_URL=https://taotoken.net/api/v1 API_KEY=sk-你的实际Key MODEL_NAME=你的实际模型名注意:
BASE_URL末尾的/v1是路径的一部分,漏掉它是最常见的 404 来源。Key 请到控制台生成,不要用示例里的占位串。
如果你还没拿到 Key,可以先在控制台创建:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,生成后复制到.env即可。模型名以你账号下实际可用的列表为准,不要想当然混用不同平台的命名。
3. 可复制配置:settings.json 与 config.toml 骨架
有些工具链不读环境变量,而是读配置文件。下面给两份骨架,字段名按常见约定写,你按自己工具的实际字段微调。
{ "openai_compatible": { "base_url": "https://taotoken.net/api/v1", "api_key_env": "API_KEY", "model": "你的实际模型名", "timeout_seconds": 60, "max_retries": 3 } }# config.toml 骨架 [provider] base_url = "https://taotoken.net/api/v1" api_key_env = "API_KEY" model = "你的实际模型名" timeout_seconds = 60 max_retries = 3提示:配置文件里建议写
api_key_env而不是直接写 Key,避免 Key 进版本库。真正读取时用os.environ["API_KEY"]或process.env.API_KEY。
这两份骨架的字段含义一致:base_url是 API 入口,model是默认模型,timeout_seconds和max_retries是稳定性参数。后面 Python 和 Node 的脚本都从这两个值里取。
4. Python 最小请求脚本与验证
Python 直接用openaiSDK 的兼容能力。先装依赖:
pip install openai python-dotenv最小可运行脚本:
import os from dotenv import load_dotenv from openai import OpenAI load_dotenv() client = OpenAI( api_key=os.environ["API_KEY"], base_url=os.environ["BASE_URL"], ) resp = client.chat.completions.create( model=os.environ["MODEL_NAME"], messages=[ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "请用 3 句话解释什么是统一接口接入。"}, ], temperature=0.7, timeout=60, ) print(resp.choices[0].message.content)跑通后你会看到模型返回的三句话。如果报 401,先查API_KEY是否读到了;如果报 404,先查BASE_URL是否带了/v1;如果报模型不存在,先查MODEL_NAME。这三个动作能覆盖大部分首次接入失败。
5. Node.js 最小请求脚本与验证
Node 同样用openaiSDK。先装依赖:
npm install openai dotenv最小可运行脚本:
import "dotenv/config"; import OpenAI from "openai"; const client = new OpenAI({ apiKey: process.env.API_KEY, baseURL: process.env.BASE_URL, }); async function main() { const resp = await client.chat.completions.create({ model: process.env.MODEL_NAME, messages: [ { role: "system", content: "You are a helpful assistant." }, { role: "user", content: "请解释为什么统一接口能降低接入成本。" }, ], temperature: 0.7, timeout: 60 * 1000, }); console.log(resp.choices[0].message.content); } main().catch(console.error);注意 Node 里字段名是baseURL(大写 URL),Python 里是base_url,这是最容易抄错的一处。跑通后输出与 Python 版本一致,说明同一套 Key 通道在两个语言里都生效了。
6. 常见报错排查:401、模型名不匹配、base_url 漏 /v1
6.1 401 Unauthorized
表现是请求直接被拒,SDK 初始化不报错但调用失败。定位动作:先确认.env是否被加载,再确认API_KEY没有多余空格或换行。可以在脚本里临时打印os.environ["API_KEY"][:6]看前缀是否正确,但不要打印完整 Key。
6.2 模型名不匹配
表现是model not found或 400/404。定位动作:不要猜模型名,先确认当前账号实际支持的模型列表,再写进MODEL_NAME。Claude 系列和 Codex 系列的命名规则不同,混用会直接失败。
6.3 base_url 漏 /v1
表现是 404 或鉴权失败,SDK 初始化正常但请求打不到正确路径。定位动作:把BASE_URL完整打印出来,确认末尾是/v1,且没有多拼路径。正确形态是https://taotoken.net/api/v1,不是官网首页。
6.4 超时与重试
长输出场景容易超时。建议普通问答设短一点,复杂生成设长一点,并加一个最小重试层:
import time def chat_with_retry(client, messages, model, retries=3): delay = 1 for attempt in range(retries): try: resp = client.chat.completions.create( model=model, messages=messages, timeout=60 ) return resp.choices[0].message.content except Exception as e: if attempt == retries - 1: raise print(f"第 {attempt + 1} 次失败:{e},{delay}s 后重试") time.sleep(delay) delay *= 2Node 版本同理,用setTimeout做退避即可。重试次数别设太大,退避要翻倍,否则高峰期会把问题放大。
7. 验证请求成功后的下一步
当你看到 Python 和 Node 都能返回内容,说明接入骨架已经通了。接下来最值得补的不是更多 demo,而是超时分级、重试退避、多模型切换和最小可观测。如果你主要做长期编码或 Agent 场景,可以了解 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。想先验证模型对话效果,可以直接在模型对话页试:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。需要管理 Key 就去 API Keys 页:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite ,接入细节看文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。API 入口统一用 https://taotoken.net/api ,不要加多余路径。