错误处理

处理 GLM 5 API 的参数校验、认证、额度、限流与服务端错误。

非流式错误使用 OpenAI 兼容的错误对象:

{
  "error": {
    "message": "Invalid API key provided.",
    "type": "invalid_request_error",
    "code": "invalid_api_key",
    "param": null
  }
}

这也是多数 OpenAI 兼容 SDK 能直接识别的结构。应用逻辑优先读取 error.code,重试决策同时结合 HTTP 状态码。

错误码参考

HTTPCode含义建议重试?
400invalid_request_errorJSON、messages、工具参数或工具结果顺序不合法。
400context_length_exceeded请求超过了所选模型的上下文窗口。
400unsupported_parameter当前模型不支持请求中的某项能力。
401invalid_api_keyBearer Key 缺失、无效、已停用或已删除。
402insufficient_quota当前积分无法覆盖预占。
404model_not_found模型 ID 不在公开模型列表中。
413request_too_large请求体超过 4 MB。
429rate_limit_exceededAPI Key 超过每分钟请求限制。
500internal_errorGLM 5 API 出现临时内部错误。
503service_unavailable公共 API 暂时不可用。

重试策略

只建议自动重试临时错误:

  • 429:降低并发并按指数退避重试。
  • 500:使用指数退避重试。
  • 503:稍后重试。

不要自动重试 400401402404413。应先修正请求参数、凭证、余额或模型选择。

遇到 context_length_exceeded 时,缩短或摘要历史消息、减少工具定义,或降低 max_completion_tokens。不同模型的上下文限制可能不同。请求失败后,已经预占的积分会进入退款/结算流程。

async function withBackoff<T>(operation: () => Promise<T>): Promise<T> {
  let delay = 500;

  for (let attempt = 0; attempt < 4; attempt += 1) {
    try {
      return await operation();
    } catch (error: any) {
      const status = error?.status;
      if (![429, 500, 503].includes(status) || attempt === 3) {
        throw error;
      }

      await new Promise((resolve) => setTimeout(resolve, delay));
      delay *= 2;
    }
  }

  throw new Error('Unreachable');
}

流式错误

当流式响应已经开始后再出现错误,错误对象会出现在 SSE 数据流中:

data: {"error":{"message":"Internal server error.","type":"server_error","code":"internal_error","param":null}}

客户端需要同时处理开始流式响应前的 HTTP 状态码,以及流中出现的 error 对象。

排查上下文持续增长导致的失败

如果一个长时间运行的客户端开始出现 402 insufficient_quota,建议按顺序检查:

  1. 最近一次 usage.prompt_tokens
  2. 客户端是否每轮都重新发送完整历史。
  3. 当前 max_completion_tokens 设置。
  4. GLM 5 剩余积分。

更多方法见上下文与成本控制