设置

语言

Agent-First API 设计:如何构建 AI Agent 真正理解的 API

L
LemonData
·2026年2月27日·613 次浏览
#AI API 设计#Agent 优先#API 开发#AI 智能体#LLM 集成
Agent-First API 设计:如何构建 AI Agent 真正理解的 API

Agent-First API 设计:如何构建 AI Agent 真正理解的 API

大多数 API 是为阅读文档、浏览示例并使用堆栈跟踪进行调试的人类开发人员设计的。但在 2026 年,增长最快的 API 消费者不再是人类,而是 AI Agent。而且它们与 API 交互的方式截然不同。

这是一个关于我们如何围绕一个简单原则重新设计 LemonData 统一 AI API 的故事:不要自作聪明,要提供信息。其结果就是我们所说的 Agent-First API 设计——它将我们用户的 token 浪费减少了 60% 以上。

什么是 Agent-First API 设计?

Agent-First API 设计意味着构建你的 API 响应(尤其是错误响应),以便 AI Agent 能够理解出了什么问题并在没有外部帮助的情况下修复它。

传统 API 错误:

{"error": {"message": "Model not found"}}

Agent-First API 错误:

{
  "error": {
    "code": "model_not_found",
    "message": "Model 'gpt5' not found",
    "did_you_mean": "gpt-4o",
    "suggestions": [{"id": "gpt-4o"}, {"id": "gpt-4o-mini"}],
    "hint": "Use GET /v1/models to list all available models."
  }
}

区别在哪里?使用传统 API,Agent 需要搜索网络、查找文档、解析 HTML 并进行猜测。而使用 Agent-First API,它只需一步即可完成自我修正。

为什么传统 API 会让 AI Agent 失败

看看当 AI Agent 第一次访问典型的 API 聚合器时会发生什么:

Agent: POST /v1/chat/completions {"model": "gpt5"}
API:   400 {"error": {"message": "Model not found"}}
Agent: (searches the web for "lemondata models list")
Agent: (fetches a docs page, maybe the wrong one)
Agent: (parses HTML, finds a model name)
Agent: POST /v1/chat/completions {"model": "gpt-4o"}
API:   200 ✓

六个步骤。多次网络请求。数百个浪费的 token。而这还是“理想路径”——Agent 猜对了文档 URL。

使用 Agent-First 设计:

Agent: POST /v1/chat/completions {"model": "gpt5"}
API:   400 {"did_you_mean": "gpt-4o", "hint": "Use GET /v1/models..."}
Agent: POST /v1/chat/completions {"model": "gpt-4o"}
API:   200 ✓

两个步骤。零网络搜索。Agent 仅凭错误响应就完成了自我修正。

核心原则:智能保留在模型端

诱惑在于构建“聪明”的 API——自动纠正模型名称、静默路由到类似模型、添加推荐引擎。我们拒绝了所有这些。

当 Agent 发送 model: "gpt5" 时,你并不知道它的意图。也许它在测试 GPT-5 是否存在。也许它有预算限制。也许它需要特定的功能。自动路由到 gpt-4o 会在 Agent 不知情的情况下静默改变成本、输出质量和功能。

正确的做法是快速失败并提供丰富的信息。把所有数据交给 Agent。让它来决定。

四种 Agent-First API 设计模式

模式 1:未找到模型 → 模糊建议

{
  "error": {
    "code": "model_not_found",
    "did_you_mean": "gpt-4-turbo",
    "suggestions": [
      {"id": "gpt-4o"},
      {"id": "gpt-4o-mini"},
      {"id": "claude-sonnet-4-5"}
    ],
    "hint": "Did you mean 'gpt-4-turbo'? Use GET /v1/models to list all available models."
  }
}

did_you_mean 字段使用三层解析:静态别名映射(来自生产数据,而非猜测)、归一化字符串匹配和有界编辑距离。所有候选模型都会根据实时模型列表进行验证——我们绝不会建议当前离线的模型。

模式 2:余额不足 → 预算感知的替代方案

{
  "error": {
    "code": "insufficient_balance",
    "balance_usd": 0.12,
    "estimated_cost_usd": 0.35,
    "suggestions": [
      {"id": "gpt-4o-mini", "estimated_cost_usd": 0.02},
      {"id": "deepseek-chat", "estimated_cost_usd": 0.01}
    ],
    "hint": "Insufficient balance. Try a cheaper model or top up."
  }
}

与其只说“钱不够”,我们不如确切地告诉 Agent 它有多少钱、需要多少钱,以及它负担得起哪些模型。Agent 可以自主降级到更便宜的 AI 模型——无需人工干预。

模式 3:所有通道均失败 → 实时替代方案

{
  "error": {
    "code": "all_channels_failed",
    "retryable": true,
    "retry_after": 30,
    "alternatives": [
      {"id": "claude-sonnet-4-5", "status": "available"},
      {"id": "gpt-4o", "status": "available"}
    ],
    "hint": "All channels for 'claude-opus-4-6' temporarily unavailable. Retry in 30s or try an alternative."
  }
}

alternatives 列表不是静态的——它是对我们通道健康数据的实时查询。Agent 可以获得关于当前哪些模型真正可用的实时信息。

模式 4:频率限制 → 精确的重试时间

{
  "error": {
    "code": "rate_limit_exceeded",
    "retryable": true,
    "retry_after": 8,
    "limit": "1000/min",
    "remaining": 0,
    "hint": "Rate limited. Retry after 8s."
  }
}

无需猜测。没有从任意值开始的指数退避。Agent 知道确切的等待时间。有关如何有效处理频率限制的更多信息,请参阅我们的 AI API 频率限制指南

成功响应也带有提示

当 Agent 使用 Claude 模型调用 /v1/chat/completions 时,响应包含:

X-LemonData-Hint: This model supports native Anthropic format. Use POST /v1/messages for better performance.
X-LemonData-Native-Endpoint: /v1/messages

我们在告诉 Agent:“这可行,但有更好的方法。”Agent 可以在下一次调用时切换到原生端点——从而获得诸如扩展思考(extended thinking)和 prompt 缓存等在 OpenAI 兼容格式中无法使用的功能。

我们将此放在 header 中,而不是响应体中,因为响应体遵循 OpenAI/Anthropic 规范。Header 是安全的扩展点。

/v1/models 响应作为 Agent 的“小抄”

我们在 /v1/models 响应中的每个模型中添加了三个字段:

  • category — 聊天模型、图像生成器、视频模型还是音频?不再需要根据名称猜测。
  • pricing_unit — 按 token、按图像、按秒还是按请求计费。这对于成本估算至关重要。
  • cache_pricing — 上游 prompt 缓存价格加上平台语义缓存折扣。

结合现有字段(定价、功能、别名、最大 token 数),Agent 可以通过单次 API 调用做出充分知情的模型选择决策。

llms.txt:Agent 的首读文件

我们在 api.lemondata.cc/llms.txt 提供动态的 llms.txt——整个 API 的机器可读概览。它包括:

  • 带有可用代码的首次调用模板
  • 常用模型名称(从使用数据自动生成,而非硬编码)
  • 带有参数的所有 12 个端点
  • 用于模型发现的过滤参数

在第一次 API 调用之前阅读此文件的 Agent 很有可能在第一次尝试时就成功。

数据驱动,而非知识驱动

我们系统中的每一个建议都来自生产数据。did_you_mean 别名映射是从我们请求日志中 30 天的实际 model_not_found 错误中提取的。模型建议按实际使用模式排序。llms.txt 中的“常用模型名称”是从我们的数据库生成的。

我们在 Redis 有序集合中跟踪每一次模型未命中。当某个拼写错误积累了足够的点击量时,它就会被提升到别名映射中。当模型下线时,它会自动从所有建议中消失。系统会自我完善。

让它发挥作用的设计约束

我们设定了一条规则:不增加新端点,不增加新 SDK,不进行破坏性更改。 一切都必须在现有的 OpenAI 兼容错误格式内运行。新字段是可选的——任何忽略它们的客户端都会获得与以前相同的体验。

这一约束迫使我们精确地确定哪些信息真正有助于 Agent 自我修正,而不是构建没人会采用的复杂新 API。

如何将 Agent-First 设计应用于你自己的 API

如果你正在构建 AI Agent 将要消费的 API:

  1. 每一个错误都应该是可操作的 — 包括出了什么问题、原因以及下一步该做什么
  2. 建议替代方案,不要自动纠正 — 让 Agent 做出知情的决定
  3. 使用结构化字段,而非纯文本did_you_mean 是可解析的,而字符串中的 "Did you mean..." 则不是
  4. 基于真实数据提供建议 — 生产使用模式优于硬编码列表
  5. 提供机器可读的发现机制llms.txt、OpenAPI 规范或结构化模型列表
  6. 保持向后兼容性 — 新的提示字段应该是附加的,绝不能是破坏性的

常见问题

什么是 Agent-First API 设计?

Agent-First API 设计是一种方法,其中错误响应包含结构化的、机器可读的提示,允许 AI Agent 在没有人工干预或外部文档查找的情况下进行自我修正。

Agent-First 与 Developer-First API 设计有何不同?

Developer-First API 针对人类可读性进行优化:清晰的错误消息、良好的文档、有用的示例。Agent-First API 增加了机器可以编程解析并执行的结构化字段(did_you_meansuggestionshint)。

Agent-First 设计会破坏现有客户端吗?

不会。Agent-First 字段是附加的——即 JSON 响应中的额外字段。不了解这些字段的客户端只需忽略它们即可。现有的集成将继续保持不变。

LemonData 如何实现 Agent-First 设计?

LemonData 的 统一 AI API 网关 为所有 300 多个模型添加了结构化错误提示。每个错误响应都包含可操作的建议,并且 llms.txt 端点 提供了机器可读的 API 发现。


LemonData 通过单一 API 提供对 300 多个 AI 模型的统一访问。在 lemondata.cc 尝试 Agent-First API。

分享: