跳转到主要内容

概览

LemonData 的 Agent 优先 API 通过结构化提示增强了错误响应,AI Agent 可以立即解析并采取行动——无需网页搜索,无需查阅文档,无需猜测。 每个错误响应在标准的 error 对象中都包含了可选字段,如 did_you_meansuggestionshintretryableretry_after。这些字段是向后兼容的——不使用它们的客户端不会看到任何区别。

错误提示字段

所有提示字段都是 error 对象内部的可选扩展:
字段类型描述
did_you_meanstring最接近匹配的模型名称
suggestionsarray带有元数据的推荐模型
alternativesarray当前可用的替代模型
hintstring人类/Agent 可读的下一步操作指南
retryableboolean重试相同请求是否可能成功
retry_afternumber重试前需等待的秒数
balance_usdnumber当前账户余额(美元)
estimated_cost_usdnumber失败请求的预估成本

错误代码示例

model_not_found (400)

当模型名称与任何活动模型都不匹配时:
{
  "error": {
    "message": "Model 'gpt5' not found",
    "type": "invalid_request_error",
    "param": "model",
    "code": "model_not_found",
    "did_you_mean": "gpt-4o",
    "suggestions": [
      {"id": "gpt-4o"},
      {"id": "gpt-4o-mini"},
      {"id": "claude-sonnet-4-5"}
    ],
    "hint": "Did you mean 'gpt-4o'? Use GET /v1/models to list all available models."
  }
}
did_you_mean 的解析逻辑使用:
  1. 静态别名映射(来自生产环境错误数据)
  2. 归一化字符串匹配(去除连字符,不区分大小写)
  3. 编辑距离匹配(阈值 ≤ 3)

insufficient_balance (402)

当账户余额低于预估成本时:
{
  "error": {
    "message": "Insufficient balance: need ~$0.3500 for claude-sonnet-4-5, but balance is $0.1200.",
    "type": "insufficient_balance",
    "code": "insufficient_balance",
    "balance_usd": 0.12,
    "estimated_cost_usd": 0.35,
    "suggestions": [
      {"id": "gpt-4o-mini"},
      {"id": "deepseek-chat"}
    ],
    "hint": "Insufficient balance: need ~$0.3500 for claude-sonnet-4-5, but balance is $0.1200. Try a cheaper model, or top up at https://lemondata.cc/dashboard/billing."
  }
}
suggestions 包含比预估成本更便宜的模型,Agent 可以切换到这些模型。

all_channels_failed (503)

当模型的所有上游渠道都不可用时:
{
  "error": {
    "message": "Model claude-opus-4-6 temporarily unavailable",
    "code": "all_channels_failed",
    "retryable": true,
    "retry_after": 30,
    "alternatives": [
      {"id": "claude-sonnet-4-5", "status": "available", "tags": []},
      {"id": "gpt-4o", "status": "available", "tags": []}
    ],
    "hint": "All channels for 'claude-opus-4-6' are temporarily unavailable. Retry in 30s or try an alternative model."
  }
}
当原因为 no_channels(未为此模型配置渠道)时,retryablefalse。仅在熔断器触发或配额耗尽等瞬时故障时,它才为 true

rate_limit_exceeded (429)

{
  "error": {
    "message": "Rate limit: 60 rpm exceeded",
    "type": "rate_limit_error",
    "code": "rate_limit_exceeded",
    "retryable": true,
    "retry_after": 8,
    "hint": "Rate limited. Retry after 8s. Current limit: 60/min for user role."
  }
}
retry_after 的值是根据实际速率限制窗口的重置时间计算的。

context_length_exceeded (400)

当输入超过模型的上下文窗口时(上游错误,增加了提示信息):
{
  "error": {
    "message": "This model's maximum context length is 128000 tokens...",
    "type": "invalid_request_error",
    "code": "context_length_exceeded",
    "retryable": false,
    "suggestions": [
      {"id": "gemini-2.5-pro"},
      {"id": "claude-sonnet-4-5"}
    ],
    "hint": "Reduce your input or switch to a model with a larger context window."
  }
}

原生端点 Header

当你使用具有原生端点(Anthropic 或 Gemini)的模型调用 /v1/chat/completions 时,成功响应会包含优化 Header:
X-LemonData-Hint: This model supports native Anthropic format. Use POST /v1/messages for better performance (no format conversion).
X-LemonData-Native-Endpoint: /v1/messages
模型提供商建议端点优势
Anthropic (Claude)/v1/messages无格式转换,支持 Extended Thinking,支持 Prompt 缓存
Google (Gemini)/v1beta/gemini无格式转换,支持 Grounding,支持安全设置
OpenAIChat completions 本身就是原生格式
这些 Header 会同时出现在流式和非流式响应中。

/v1/models 增强功能

每个模型对象的 lemondata 扩展中有三个新字段:
{
  "id": "gpt-4o",
  "lemondata": {
    "category": "chat",
    "pricing_unit": "per_token",
    "cache_pricing": {
      "cache_read_per_1m": "1.25",
      "cache_write_per_1m": "2.50",
      "platform_cache_discount": 0.9
    }
  }
}
字段取值描述
categorychat, image, video, audio, tts, stt, 3d, embedding, rerank模型类型
pricing_unitper_token, per_image, per_second, per_request模型的计费方式
cache_pricing对象或 null上游 Prompt 缓存价格 + 平台语义缓存折扣

类别过滤

GET /v1/models?category=chat          # 仅限聊天模型
GET /v1/models?category=image         # 图像生成模型
GET /v1/models?tag=coding&category=chat  # 针对代码优化的聊天模型

llms.txt

可在以下地址获取机器可读的 API 概览:
GET https://api.lemondata.cc/llms.txt
它包含:
  • 首次调用模板及运行示例
  • 常用模型名称(根据使用数据动态生成)
  • 所有 12 个 API 端点
  • 模型发现的过滤参数
  • 错误处理指南
在首次 API 调用前读取 llms.txt 的 AI Agent 通常能在第一次尝试时就成功。

在 Agent 代码中的使用

Python (OpenAI SDK)

from openai import OpenAI, BadRequestError

client = OpenAI(
    api_key="sk-your-key",
    base_url="https://api.lemondata.cc/v1"
)

def smart_chat(messages, model="gpt-4o"):
    try:
        return client.chat.completions.create(
            model=model, messages=messages
        )
    except BadRequestError as e:
        error = e.body.get("error", {}) if isinstance(e.body, dict) else {}
        # 使用 did_you_mean 进行自动纠错
        if error.get("code") == "model_not_found" and error.get("did_you_mean"):
            return client.chat.completions.create(
                model=error["did_you_mean"], messages=messages
            )
        raise

JavaScript (OpenAI SDK)

import OpenAI from 'openai';

const client = new OpenAI({
  apiKey: 'sk-your-key',
  baseURL: 'https://api.lemondata.cc/v1'
});

async function smartChat(messages, model = 'gpt-4o') {
  try {
    return await client.chat.completions.create({ model, messages });
  } catch (error) {
    const err = error?.error;
    if (err?.code === 'model_not_found' && err?.did_you_mean) {
      return client.chat.completions.create({
        model: err.did_you_mean, messages
      });
    }
    throw error;
  }
}

设计原则

快速失败,提供详尽信息

错误会立即返回 Agent 自动纠错所需的所有数据。

无自动路由

API 绝不会静默替换为其他模型。由 Agent 决定。

数据驱动的建议

所有推荐均来自生产数据,而非硬编码列表。

向后兼容

所有提示字段都是可选的。现有客户端不会感知到任何差异。