调用AI接口,报错是家常便饭。别烦,这东西90%的坑就那几种,我把最常见的错误码和对应的土办法给你捋一遍。看完这篇,你至少能自己搞定八成问题,不用半夜去群里问人。
401 - 你谁啊?
这错误翻译成人话就是:我没认出你。
根源基本就两个。第一个,API Key写错了。复制的时候多带了个空格,或者只复制了前半截。我见过最离谱的是把Key贴进了代码里,但前后带了尖括号没删干净。第二个,你用的Key被干掉了。去控制台重新生成一个,立马解决。
有个小动作养成习惯:Key这种东西,永远用环境变量去读,别硬编码。不是为安全,是为你自己省事——换Key不用改代码重新部署。
402 / 429 - 钱不够或者太猛了
这俩放一块说,因为处理方式一样——等。
402是余额不足。厂商扣费失败,或者体验金用完了。去账户里充点钱,或者在控制台把“单日消耗上限”调高一档。我习惯给测试账号只留5块钱,够跑几百次,丢了也不心疼。
429是请求太频繁。你一秒发了几十个请求,超过厂商给你设定的速率限制。代码里加个重试逻辑,等1-2秒再发。别傻乎乎地立刻重试,那样只会继续被429拍回来,形成一个死循环。
正经做法是用指数退避——第一次等1秒,还报错就等2秒,再报错等4秒。大部分厂商的限流在几秒内会重置。
400 - 你说了啥我没听懂
这是请求格式有问题。最常见的是messages数组里缺了role字段,或者role写了“userr”这种拼写错误。把官方文档里的示例请求复制出来,跟你的逐字段比对,三分钟能揪出来。
另外有个隐藏雷区:system角色的消息,有些模型只允许放第一条。你要是插在中间,直接400拍脸。DeepSeek和智谱都认这个规矩。
404 - 你要找的东西不存在
两个可能。第一个,接口地址(base_url)写错了,末尾多了一个斜杠或者少了/v1。第二个,模型名字拼错了。比如“deepseek-chat”写成“deepseek_chat”,下划线还是横杠,看着像但就是不行。
去文档里找到正确的模型名,复制粘贴,别手敲。
500 - 厂商那边炸了
这是服务端内部错误,跟你没关系。等几分钟再试,如果持续超过10分钟,去他们的状态页看看,八成在发公告说服务异常。
别反复重试,没意义。该喝茶喝茶,等恢复了自然好。
503 - 高峰期排队
服务过载,你的请求被挤出来了。跟500的处理一样——等。但503通常来得快去得也快,等个十几秒重试就通了。
超时(Timeout) - 你家网或者他家慢
请求发出去了,但等了半天没回音。两种情况:你这边网络连不上,或者大模型生成内容太慢。
先检查你的服务器能不能直连厂商的域名。国内厂商基本没问题,但如果用国外服务,网络环境要自己搞定。
如果网络OK,那就是生成时间太长。你问的问题复杂,或者max_tokens设得太大(比如8192),模型要算一阵子。把超时时间从默认的30秒调到120秒,绝大多数情况能等到。
最烦人的一种——没报错,但回答胡说八道
这不算报错,但比报错更让人头疼。请求成功了,返回的content里是一堆乱码、重复的话、或者跟问题完全不搭边的回答。
去检查temperature参数。设到1.5以上就容易抽风,尤其是小模型。我一般写正经内容压到0.3,写创意类才敢拉到0.9。另外检查messages里有没有把user和assistant的角色搞反,顺序乱了模型会懵。
还有一个容易被忽略的:上下文太长。你塞了几千字的对话历史,模型处理不过来,可能在中间某个位置截断了,导致理解偏差。截断历史,只留最近三五轮对话,再试。
实战排查流程,照着走
遇到报错别慌,我自己的操作顺序:
看状态码是4开头还是5开头。4开头的去找自己代码的问题,5开头的去厂商状态页。
复制完整的返回信息,别只看第一行。有时候body里藏着详细的错误描述,比如“model not found”或者“rate limit exceeded”。
用cURL命令行直接发一个最简单的请求。如果cURL通了,那就是你代码里SDK用错了。如果cURL也报错,问题锁定在Key、地址、模型名这三件事上。
把上面那三个挨个核对一遍,99%的问题在这步解决。
日常防报错的两个习惯
第一个,日志打全。每次请求把输入参数、状态码、返回内容都记下来。出问题的时候能倒回去看,不用靠猜。
第二个,先用小量测试再上量。新接入一个模型,先用1块钱的预算跑一天,观察有没有异常报错和奇怪的扣费。没问题了再放开。
报错不可怕,可怕的是报错了你不知道从哪儿下手。上面这些码你记个大概,下次遇到了直接对号入座,十分钟内搞定。搞不定的,再去翻文档或者找技术支持,那会儿你已经知道自己要问什么了,效率高得多。