最近一直在整理 AI API 接入过程中遇到的问题。
写到后面,我发现一个很常见的情况:
很多调用失败,看起来像代码问题。
但最后查下来,其实是 Key、Base URL、环境配置这些东西没管好。
比如:
本地能跑,服务器不能跑。
测试环境能跑,正式环境不能跑。
昨天能跑,今天突然不行。
A 项目能跑,B 项目一直报错。
换了模型以后,有的项目正常,有的项目失败。
刚开始遇到这些问题,很容易去看代码。
但排查多了以后会发现:
AI API 调用失败,很多时候先别急着改代码。
先看配置有没有乱。
一、最常见的错误:Key 不对
很多项目里都会这样配置:
OPENAI_API_KEY=sk_xxxxxxxxx
OPENAI_BASE_URL=https://api.example.com/v1
然后代码里调用:
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
baseURL: process.env.OPENAI_BASE_URL
});
async function askAI(message) {
const res = await client.chat.completions.create({
model: "gpt-4o-mini",
messages: [
{
role: "user",
content: message
}
]
});
return res.choices[0].message.content;
}
代码看起来没问题。
但如果 Key 配错了,照样会失败。
常见情况有:
复制了旧 Key
用了已经停用的 Key
测试环境用了正式 Key
正式环境用了测试 Key
Key 前后多了空格
Key 没有对应模型权限
Key 额度已经用完
这些问题都不是代码问题。
但表现出来就是接口调用失败。
二、Base URL 写错也很常见
除了 Key,Base URL 也很容易出问题。
比如:
OPENAI_BASE_URL=https://api.example.com/v1
有的人写成:
OPENAI_BASE_URL=https://api.example.com
少了一个 /v1。
也有人复制了旧地址:
OPENAI_BASE_URL=https://old-api.example.com/v1
还有人测试环境和正式环境写了不同入口。
最后就会出现:
本地能跑,线上不能跑。
A 项目能跑,B 项目不能跑。
明明代码一样,结果表现不一样。
所以我后来觉得,AI API 项目多了以后,Base URL 最好统一。
不要每个项目各写各的。
三、先用最小请求测试
遇到调用失败时,不要一上来就跑复杂业务。
先用最简单的请求测试一下。
比如:
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
baseURL: process.env.OPENAI_BASE_URL
});
async function test() {
const res = await client.chat.completions.create({
model: "gpt-4o-mini",
messages: [
{
role: "user",
content: "你好"
}
]
});
console.log(res.choices[0].message.content);
}
test();
如果这个都失败,那大概率不是业务代码问题。
先查:
Key 是否正确
Base URL 是否正确
模型名是否正确
额度是否足够
网络是否能访问
如果最小请求能成功,再去查业务逻辑。
这样排查会快很多。
四、中间说一下我现在用的 API 中转站
我自己后来也整理了一个 API 中转站:
https://bmapi.020212.xyz/register?aff=ABMYCFYH6VXE
它主要适合这些情况:
你有多个 AI 项目
你不想每个项目都单独维护 Base URL
你想统一管理 API Key
你想把正式、测试、本地环境分开
你想避免旧 Key 到处散落
你想后面更方便排查调用失败
你想让项目接入方式更统一
如果只是一个 Demo,直接调 API 没问题。
但如果你已经有多个项目、多个环境、多个 Key,中转站会省很多排查时间。
至少能先做到:
入口统一。
Key 分开。
环境清楚。
出问题时知道从哪里查。
五、统一入口以后,错误更容易定位
以前每个项目自己配置时,报错以后要查很多地方:
这个项目用哪个 Key?
这个项目 base_url 是哪个?
这个模型有没有权限?
这个 Key 额度够不够?
这个环境是不是旧配置?
是不是复制了别的项目配置?
如果统一走中转站,排查入口会清楚很多。
可以先看:
这个中转站 Key 是否有效
这个 Key 对应哪个项目
这个 Key 是否超额
这个 Key 是否允许当前模型
请求有没有到达中转站
上游返回了什么错误
这样比每个项目各查各的更省心。
六、正式和测试不要混用
很多调用失败,其实是环境混用造成的。
比如:
测试环境用了正式 Key。
正式环境用了测试 Key。
本地开发用了旧 Key。
批量脚本用了线上 Key。
这类问题很常见。
所以我现在更建议:
prod_chat_api:正式聊天项目
test_chat_api:测试聊天项目
dev_chat_api:本地开发
batch_summary_job:批量摘要任务
不同用途分不同 Key。
不要一个 Key 到处用。
这样即使某个 Key 出问题,也能快速知道影响范围。
七、错误日志里要记录关键配置
调用失败时,日志不要只写:
AI request failed
这样后面很难查。
至少要记录这些信息:
{
"request_id": "req_1001",
"project": "prod_writer_tool",
"key_name": "prod_writer_key",
"model": "gpt-4o-mini",
"base_url": "https://your-api-site.com/v1",
"error_code": "insufficient_quota",
"error_message": "quota exceeded"
}
注意不要把真实 Key 打到日志里。
只记录 Key 名称或 Key ID 就够了。
这样后面看到报错,就能知道:
哪个项目失败了
用的是哪个 Key
请求的是哪个模型
走的是哪个入口
错误原因是什么
八、不要让真实 Key 出现在日志里
这个非常重要。
很多人排查问题时,会直接打印环境变量。
比如:
console.log(process.env.OPENAI_API_KEY);
这很危险。
日志可能被很多人看到。
也可能被上传到日志平台。
真实 Key 一旦进了日志,就很难保证安全。
更好的做法是只打印 Key 名称或部分脱敏信息。
比如:
function maskKey(key) {
if (!key) return "";
return `${key.slice(0, 6)}****${key.slice(-4)}`;
}
console.log(maskKey(process.env.OPENAI_API_KEY));
或者直接不要打印 Key,只打印配置名称:
key_name=prod_writer_key
九、调用失败时的排查顺序
我现在遇到 AI API 调用失败,一般会按这个顺序查:
先看 Key 是否有效
再看 Base URL 是否正确
再看模型名是否正确
再看 Key 是否有模型权限
再看额度是否用完
再看网络是否能访问
再用最小请求测试
最后再看业务代码
很多时候,前面几步就能找到问题。
不要一上来就怀疑业务逻辑。
因为 AI API 接入里,配置问题真的太常见了。
十、最后总结
AI API 调用失败,不一定是代码写错。
很多时候是这些地方出了问题:
Key 过期
Key 停用
Key 用错环境
Key 没有模型权限
额度用完
Base URL 写错
模型名写错
测试和正式配置混用
旧配置没有清理
所以我现在更倾向于把 AI API 接入统一收口。
通过 API 中转站管理 Key、Base URL 和项目环境。
这样不是为了复杂。
而是为了让问题更容易定位。
AI API 接入最怕的不是报错。
最怕的是报错以后不知道该查哪里。
入口统一、Key 清楚、环境分开,排查就会轻松很多。
9

被折叠的 条评论
为什么被折叠?



