UniterRouter

错误处理

UniterRouter API 错误码和故障排除指南。处理 GPT-4、Claude、Gemini API 的速率限制、认证错误、模型错误等问题的最佳实践。

错误处理

UniterRouter 使用标准 HTTP 响应码,并以与 OpenAI API 规范兼容的一致 JSON 格式返回错误。

错误响应格式

所有错误遵循以下结构:

{
  "error": {
    "message": "人类可读的错误信息",
    "type": "error_type",
    "param": "parameter_name",  // 可选:导致错误的参数
    "code": "error_code"
  }
}

HTTP 状态码

状态码描述
200成功
400错误请求 —— 无效的请求参数
401未授权 —— 无效或缺少 API 密钥
402需要付款 —— 余额不足
403禁止访问 —— 被 IAM 规则拒绝
404未找到 —— 模型或资源不存在
429请求过多 —— 超出速率限制
500服务器内部错误 —— 服务端错误
502网关错误 —— 上游提供商错误
503服务不可用 —— 没有可用通道

错误类型

身份验证错误

invalid_api_key —— API 密钥无效或缺失。

{
  "error": {
    "message": "提供的 API 密钥不正确。你可以在 https://uniterouter.ai/dashboard 找到你的 API 密钥。",
    "type": "invalid_request_error",
    "code": "invalid_api_key"
  }
}

解决方案:验证你的 API 密钥是否正确,并在 Authorization 头中格式正确。


模型错误

model_not_found —— 请求的模型不存在或无法访问。

{
  "error": {
    "message": "模型 `gpt-5` 不存在或你没有访问权限。",
    "type": "invalid_request_error",
    "param": "model",
    "code": "model_not_found"
  }
}

解决方案:查看模型页面了解可用模型。


配额和计费错误

insufficient_quota —— 你的账户余额不足。

{
  "error": {
    "message": "你已超出当前配额,请检查你的计划和计费详情。",
    "type": "insufficient_quota",
    "code": "insufficient_quota"
  }
}

解决方案:在计费控制台为账户充值。


速率限制错误

rate_limit_exceeded —— 短时间内请求过多。

{
  "error": {
    "message": "达到速率限制。请控制你的请求频率。",
    "type": "rate_limit_error",
    "code": "rate_limit_exceeded"
  }
}

解决方案:实现指数退避并降低请求频率。参见速率限制。


服务错误

no_available_channel —— 该模型没有可用的提供商通道。

{
  "error": {
    "message": "模型 `gpt-4o` 没有可用通道。请稍后重试或联系支持。",
    "type": "server_error",
    "code": "no_available_channel"
  }
}

解决方案:短暂延迟后重试。如果持续出现,请联系支持。


no_available_key —— 所有提供商 API 密钥都被限速或禁用。

{
  "error": {
    "message": "模型 `claude-3-opus` 没有可用的 API 密钥。所有密钥可能被限速或禁用。",
    "type": "server_error",
    "code": "no_available_key"
  }
}

解决方案:等待并重试,或考虑使用 BYOK(自带密钥)。


provider_error —— 上游提供商返回错误。

{
  "error": {
    "message": "上游提供商返回错误: context_length_exceeded",
    "type": "server_error",
    "code": "provider_error"
  }
}

解决方案:检查你的请求是否超出模型的上下文长度或其他限制。


service_unavailable —— 服务器过载。

{
  "error": {
    "message": "服务器当前过载。请稍后重试。",
    "type": "server_error",
    "code": "service_unavailable"
  }
}

解决方案:实现带指数退避的重试逻辑。

在代码中处理错误

Python

from openai import OpenAI, APIError, AuthenticationError, RateLimitError

client = OpenAI(
    base_url="https://api.uniterouter.ai/v1",
    api_key="your_api_key",
)

try:
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": "你好!"}]
    )
except AuthenticationError as e:
    print(f"身份验证失败: {e}")
except RateLimitError as e:
    print(f"被限速,退避后重试: {e}")
except APIError as e:
    print(f"API 错误: {e.status_code} - {e.message}")

TypeScript

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.uniterouter.ai/v1",
  apiKey: process.env.UNITEROUTER_API_KEY,
});

try {
  const response = await client.chat.completions.create({
    model: "gpt-4o",
    messages: [{ role: "user", content: "你好!" }],
  });
} catch (error) {
  if (error instanceof OpenAI.AuthenticationError) {
    console.error("无效的 API 密钥");
  } else if (error instanceof OpenAI.RateLimitError) {
    console.error("被限速,需要实现退避");
  } else if (error instanceof OpenAI.APIError) {
    console.error(`API 错误: ${error.status} - ${error.message}`);
  }
}

重试策略

对于临时性错误(429、503、502),实现指数退避:

import time
import random

def call_with_retry(func, max_retries=5):
    for attempt in range(max_retries):
        try:
            return func()
        except (RateLimitError, ServiceUnavailableError) as e:
            if attempt == max_retries - 1:
                raise
            # 带抖动的指数退避
            delay = (2 ** attempt) + random.uniform(0, 1)
            time.sleep(delay)

提示:OpenAI SDK 内置重试逻辑。使用 max_retries 参数进行配置。

错误码参考

错误码HTTP 状态码描述
invalid_api_key401API 密钥无效或缺失
invalid_request400请求体格式错误
model_not_found404模型不存在或无访问权限
insufficient_quota402账户余额不足
rate_limit_exceeded429请求过多
no_available_channel503没有可用提供商
no_available_key503所有提供商密钥已耗尽
provider_error502上游提供商错误
service_unavailable503服务器过载
internal_error500意外的服务器错误

下一步

How is this guide?