排查 Llama API 报错前,先确认一件事:Meta 的 Llama API 公共预览版已于 2026 年 7 月 6 日下线。继续调用旧地址,得到的往往不是 401 或 429,而是下线提示或重定向。很多“Key 失效”“模型不存在”的判断,其实是在调用已经停止服务的端点。

现在调用 Llama 模型,通常经过第三方托管商、自建推理服务或统一网关。各平台的鉴权、Base URL、模型 ID、限流口径和错误结构并不统一,不存在一张通用的报错表。本文按 401、404、429、超时和 400 工具调用五类拆开,给出排查顺序和可复用的错误处理代码。模型与价格以站内模型价格为准。

说明:Llama 是 Meta Platforms, Inc. 的商标。各托管商的接口、错误码和限流口径可能随版本调整,本文以 2026 年 10 月的常见情况为例,最终以对应平台的官方文档为准。

一、先分清报错发生在哪一层

同样失败,原因可能完全不同。先看状态码、错误类型和请求 ID,再决定改配置、改代码还是换平台。

现象 常见含义 优先检查
返回下线提示或重定向 请求打到已停止的端点 域名和 Base URL
401 鉴权失败 Key、请求头、平台配对
404 路径或模型不存在 Base URL、路径、模型 ID
429 限流或配额受限 并发、共享 Key、重试策略
400 且提到 context length 上下文超限 输入长度、输出预留
400 且提到 tool 或 JSON 工具调用格式不合法 参数 Schema、解析与重试
超时 连接、首 Token、读取超时 网络、输入长度、超时配置
5xx 上游服务错误 退避重试、平台状态页

日志至少记录时间、平台、Base URL、模型 ID、状态码、错误类型、耗时和请求 ID;不要记录完整 Key 或用户原文。

二、401:Key 与平台必须配对

401 表示身份未通过验证,和模型能力、余额通常无关。Llama 没有通用 Key:Meta 旧平台的 Key 不能用于第三方托管商,反之亦然。常见原因还包括:

  • 请求头没有使用 Authorization: Bearer <key>,或拼写、大小写不对。
  • Key 前后带空格、换行或引号,从聊天窗口复制时最常见。
  • 环境变量没有真正加载,部署环境仍是旧值。
  • Key 被删除、轮换或停用,定时任务还在用旧值。
  • 反向代理或网关覆盖、丢弃了 Authorization 头。
  • 账户状态或区域权限有问题,Key 有效但无权调用该模型。

先用 curl 打一条最小请求,确认 Key、Base URL 和模型 ID 三项同时通过。仍然 401 时换一把新 Key 复测,区分 Key 本身、代理和网关的问题。不要在客户端写死 Key,也不要让前端直接持有 Key。

三、404:Base URL、模型名与已下线端点

404 通常不是“模型坏了”,而是请求打到了不存在的地址或模型。2026 年最常见的情况,是旧教程里的 Meta 第一方地址已下线,请求返回 404 或下线提示。其他原因包括:

  • Base URL 写成另一家平台,或多写、少写 /v1。
  • SDK 会自动拼接 /chat/completions,手写路径时又拼了一次。
  • 模型 ID 用了旧平台的名字,新托管商并不认识。
  • 模型 ID 需要前缀或版本后缀,大小写、连字符不一致。
  • 模型在目标区域未开放,或已被平台下架。
  • 反向代理重写规则把路径改坏。

平台间模型命名差异很大,建议在配置里维护映射表,而不是在代码里散落模型名。切换时只改映射和 Base URL。遇到 404 先查模型目录,再查路径,不要靠重试解决。

四、429:限流、配额与重试风暴

429 表示请求超过速率、并发或配额限制。各托管商口径不同,可能按每分钟请求数、每分钟 Token 数、每日配额或账户等级计算,以平台文档为准。常见场景:

  • 多个服务共用一把 Key,互相挤占额度。
  • 批量任务整点同时启动,形成流量脉冲。
  • 重试没有退避,越失败越发,形成重试风暴。
  • 长上下文或长输出占用较多 Token,挤压并发空间。
  • 免费或试用额度用完后,平台仍以 429 或类似错误返回。

处理顺序:先降并发,再加指数退避和随机抖动,最后才考虑拆 Key 或升级配额。拆 Key 只能缓解共享冲突,不能解决总量超限。监控要单独统计 429 比例,按平台、模型和项目拆分,否则很难判断是哪个调用方吃掉了额度。

五、超时:连接、首 Token、读取与流式

超时不等于服务不可用,先定位卡在哪一段:

  • 连接超时:DNS、出口或代理不可达,请求还没到平台。
  • 首 Token 很慢:输入太长、平台排队、模型负载高。
  • 读取超时:输出太长、推理时间长、连接被中间设备断开。
  • 流式中断:网络抖动或代理断流,只收到半截内容。
  • 全站同时超时:本地出口或上游故障,先看平台状态页。

连接超时和读取超时要分开设置。全设成一个很大的值,故障时会拖住线程池;设得太小,又会误杀正常长任务。流式接口要记录已接收内容和中断位置,支持重连与去重,不要把半截内容入库。

六、400:上下文超限与工具调用格式

400 覆盖范围很广,先看错误信息里的关键词。提到 context length、maximum tokens 或 input too long,通常是上下文超限:输入加输出预留超过模型上限。处理方式是统计 Token、截断历史、压缩检索内容,或换上下文更长的模型。不要只调大 max_tokens,那会挤压输入空间。

提到 tool、function、arguments 或 JSON,通常是工具调用格式不合法:无法解析的 JSON、缺少必填字段、参数类型不对,或工具名不存在。处理原则:

  1. 用 JSON Schema 校验参数,不要直接字符串拼接。
  2. 解析失败时把错误信息和期望格式回传给模型,让它修正一次。
  3. 限制修正次数,避免无限循环。
  4. 记录原始返回,判断是模型问题还是提示词问题。
  5. 高风险工具做二次校验,不要因为模型说“已执行”就相信。

七、一份可复用的错误处理代码

示例使用 OpenAI 兼容接口,Base URL 和模型 ID 从环境变量读取;SDK 自动重试已关闭,避免与自定义退避叠加。

import os
import random
import time
import logging
from openai import (
    OpenAI, AuthenticationError, NotFoundError, RateLimitError,
    BadRequestError, APITimeoutError, APIStatusError,
)

logging.basicConfig(level=logging.INFO)
client = OpenAI(
    api_key=os.environ["LLAMA_HOST_API_KEY"],
    base_url=os.environ["LLAMA_HOST_BASE_URL"],  # 各托管商的兼容地址
    max_retries=0,
    timeout=90,
)

def ask(prompt: str, retries: int = 4) -> str:
    for attempt in range(retries):
        try:
            resp = client.chat.completions.create(
                model=os.environ["LLAMA_MODEL_ID"],
                messages=[{"role": "user", "content": prompt}],
                max_tokens=1024,
            )
            return resp.choices[0].message.content
        except AuthenticationError:
            raise  # Key 与平台不匹配,重试没有意义
        except NotFoundError as exc:
            logging.error("检查 Base URL 与模型 ID: %s", exc.request_id)
            raise
        except BadRequestError as exc:
            logging.error("参数、上下文或工具调用格式有问题: %s", exc.request_id)
            raise
        except (RateLimitError, APITimeoutError) as exc:
            wait = min(2 ** attempt, 20) + random.random()
            logging.warning("第 %s 次失败,%.1f 秒后重试: %s",
                            attempt + 1, wait, exc.request_id)
            time.sleep(wait)
        except APIStatusError as exc:
            if exc.status_code >= 500:
                wait = min(2 ** attempt, 20) + random.random()
                logging.warning("上游 %s,%.1f 秒后重试", exc.status_code, wait)
                time.sleep(wait)
                continue
            raise
    raise RuntimeError("重试次数已用完,请检查限流与超时配置")

重试只适合瞬时错误。401、404 和大多数 400 重试不会变好,只会放大日志和账单。有副作用的业务,先用幂等键或状态检查确认是否执行过。

八、日志、监控与排查顺序

按下面顺序排查,避免一上来就换模型:

  1. 记录状态码、错误类型、请求 ID、平台、Base URL、模型 ID 和时间。
  2. 请求打到旧的第一方 Llama API 地址时,先完成迁移。
  3. 401 查 Key、请求头、环境变量和平台配对。
  4. 404 查 Base URL、/v1 路径和当前模型目录。
  5. 429 查并发、共享 Key、重试策略和高峰时段。
  6. 超时查 DNS、代理、输入长度、首 Token 时间和读取超时。
  7. 400 查上下文长度、参数支持和工具 Schema。
  8. 5xx 先退避重试,持续出现再带请求 ID 联系平台。

监控至少按小时统计 401、404、429、超时和 5xx,并按平台与模型拆分。错误率突增时,先看是否集中在某个项目、Key 或模型,再决定降并发、切通道还是回滚。

常见问题

Llama API 返回 401 是不是 Key 过期了?

不一定。最常见的是 Key 与平台不匹配,例如把旧 Meta 平台的 Key 用到第三方托管商,或反过来。先确认请求头、环境变量和 Key 所属平台,再用最小请求复测。

为什么换了托管商就返回 404?

模型 ID 变了。不同平台的命名、前缀、版本后缀和可用区域不同,旧模型名在新平台通常不存在。建立映射表,并以新平台的模型目录为准。

遇到 429 要不要马上重试?

不要立刻密集重试。先降并发,再用指数退避加随机抖动,并设置上限。持续 429 说明总量或配额不够,需要拆 Key、错峰或调整配额。

超时能不能无限重试?

不能。重试要有上限、退避和告警。超时还可能意味着请求已经在上游执行,有副作用的业务要先确认状态,再决定是否重发。

工具调用参数 JSON 解析失败怎么办?

先用 JSON Schema 校验并保留原始返回;再把错误信息和期望格式回传给模型修正一次,并限制次数。高风险工具要二次校验,不能因为模型声称成功就采信。

下一步

先在中商起航 AI 网关创建测试 Key,把 401、404、429、超时和工具调用失败各演练一次,再接入生产监控。模型可用性与价格以模型价格为准。

相关阅读: