openai-compatible-header-swap · ZH · 2026-10-13

把直连 OpenAI 的客户端切到聚合站:请求头、base URL 与环境变量改哪里

本文说明如何把现有使用 OpenAI SDK 的应用切换到聚合站接口:改动 base URL、API key 与必要的请求头/环境变量,并给出验证与常见坑清单。

切换的本质:只改三处

大多数基于 OpenAI SDK 的应用并不依赖 api.openai.com 的域名特性,而是走 SDK 内部拼接的路径。把请求指向聚合站,通常只需要改三件事:

  • base URL(接口根地址)
  • API key(换成聚合站签发的 key)
  • 环境变量的读取位置(让部署环境注入新值,而不是改代码)

模型名一般不用动,聚合站通常沿用各厂商的原始模型标识,但建议以你所用聚合站文档为准。

用环境变量承载 base URL

不要让 base URL 硬编码在代码里。常见做法是引入一个变量,例如 OPENAIBASEURL 或自定义的 LLMBASEURL,默认值保留官方地址,部署时用环境变量覆盖。

export OPENAI_API_KEY="sk-xxx"
export OPENAI_BASE_URL="https://<聚合站域名>/v1"

注意两点:

  • 结尾是否带 /v1 取决于聚合站实现。OpenAI SDK 会在此基础路径后拼接 /chat/completions 等端点,少写或多写一段都会 404。
  • 不要保留尾部多余斜杠,SDK 拼接时可能产生双斜杠。

Python SDK 改法

OpenAI Python SDK 支持从环境变量自动读取,也可以显式传入:

from openai import OpenAI

client = OpenAI(
    api_key=os.environ["OPENAI_API_KEY"],
    base_url=os.environ["OPENAI_BASE_URL"],
)

如果原来写的是 OpenAI() 无参构造,SDK 会读 OPENAIAPIKEY 和 OPENAIBASEURL,把环境变量设好即可,代码零改动。

Node SDK 改法

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
  baseURL: process.env.OPENAI_BASE_URL,
});

注意 Node 版本里参数名是 baseURL(大写 URL),Python 里是 base_url,写错会被静默忽略并回落到官方地址,表现为请求仍打到 OpenAI 并被拒。

请求头要注意什么

聚合站一般兼容 OpenAI 的认证方式,即 Authorization: Bearer <key>。通常不需要额外自定义头。若你的网关或代理层之前注入了 OpenAI-Organization、OpenAI-Project 这类头,切到聚合站后应移除,因为聚合站不一定识别,部分实现会因未知头返回 4xx。

如果经过自建反代,确认没有覆盖 Host 或强制改写 Authorization。

环境变量清单与迁移顺序

一次切换建议按顺序:

  1. 先在本地或预发环境设置新的 key 与 base URL。
  2. 跑一次最简单的调用(如一次 chat.completions),确认返回结构正常。
  3. 观察流式输出是否正常(stream=true 的分块格式应与 OpenAI 一致)。
  4. 确认错误码语义:401 是 key 问题,404 多为 base URL 路径问题。
  5. 再更新生产环境的密钥管理或容器环境变量。

避免把 key 写进镜像或提交到仓库。放进 Secret 管理器或平台的环境变量配置。

常见坑

  • 只改了 key 没改 base URL:请求仍发往官方,报鉴权失败。
  • base URL 多写或少写 /v1:出现 404 或路径拼接异常。
  • 沿用旧 SDK 版本,参数名不匹配:升级 SDK 或按当前版本参数名调整。
  • 客户端缓存了旧 base URL:重启进程或容器,确保环境变量重新加载。
  • 同时保留 OPENAIAPIKEY 与自定义变量,读取顺序不确定:统一命名,避免歧义。

计费口径提醒

切换后你通过聚合站调用,消耗按官方价 ×1.3 扣费;如果你同时向聚合站贡献 key,按官方价 ×1.1(优质 ×1.2)以 USDC 返。这两件事分别对应“用”和“供”,不叠加成更低折扣。充值走 Base 上的 USDC,无 KYC 流程。