access: private
Tool-Augmented LLM Gateway — 从 Proxy 到 AI 能力平台
🎯 一句话版本
关于Tool Augmented Llm Gateway Report的深度研究报告
一、背景与起源
1.1 问题:LLM 只能说,不能做
当前的 LLM API(OpenAI、Anthropic、Google 等)本质上是「纯文本进,纯文本出」的服务。即使模型支持 tool calling,执行端仍然在客户端 —— 开发者需要自己写代码解析 tool_call、调用外部 API、构造 tool_result、再次请求 LLM。
这意味着每个使用 LLM 的应用都要:
- 自建 tool 执行基础设施
- 管理各种外部 API key(搜索、TTS、图片生成等)
- 处理 tool call 的多轮循环逻辑
- 承担安全风险(key 泄露、沙箱逃逸等)
1.2 启发:OpenRouter 的 Web Search Plugin
OpenRouter 提供了一个有趣的先例:通过 :online 后缀或 plugins 字段,给任意模型添加联网搜索能力。
它的实现分两种模式:
- Exa 模式(搜索增强生成 / SAG):在请求到达 LLM 之前,先用 heuristic 判断是否需要搜索,如果需要就注入搜索结果到 prompt
- Native 模式:利用模型厂商内置的 tool calling 能力(如 Google 的 grounding)
这证明了一个关键洞察:proxy 层可以增强 LLM 的能力,而不仅仅是路由请求。
1.3 小虾 llmproxy 的突破
小虾(xiaoxia)的 Docker hosting 平台中,llmproxy 做了一件更激进的事:
当 LLM 返回 tool_call(如 web_search)时,proxy 不把 tool_call 返回给用户容器,而是直接在主机侧执行,把结果注入对话,再次调用 LLM,直到获得最终文本回复。
这个设计最初是为了解决一个实际问题:用户的 Docker 容器没有网络出口(为了安全隔离),但 LLM 需要联网搜索。通过在 proxy 层拦截和执行 tool call,用户容器无需任何改动就获得了搜索能力。
二、核心概念
2.1 Tool-Augmented LLM Gateway
一个兼容 OpenAI API 的网关服务,在 proxy 层拦截 LLM 返回的 tool calls 并在服务端执行,对调用者完全透明。
一句话定位:OpenRouter 解决了「统一 LLM 接口」的问题,我们解决「统一 LLM + Tool 接口」的问题。
2.2 核心价值主张
| 维度 | 传统方式 | Tool-Augmented Gateway |
|---|---|---|
| Tool 执行 | 客户端自建 | 服务端透明执行 |
| API Key 管理 | 散落在各客户端 | 集中在 Gateway |
| 安全隔离 | 客户端需要网络出口 | 客户端可完全隔离 |
| 能力扩展 | 每个应用单独集成 | 所有应用自动获得 |
| 计费 | 多处分散计费 | 统一计费 |
| 模型绑定 | 部分能力锁定特定模型 | 任意模型 + 任意工具 |
2.3 关键设计原则
- 对调用者透明:标准 OpenAI API 格式,无需修改客户端代码
- LLM 自主决策:模型自己决定是否调用工具(不需要 heuristic 判断)
- 服务端执行:tool 在 Gateway 侧执行,客户端不感知中间过程
- 模型无关:支持任意 LLM provider,不锁定特定模型
- 渐进增强:从 web_search 开始,逐步扩展到所有工具
三、技术架构
3.1 请求流程
用户请求 (OpenAI API 格式)
│
▼
┌─────────────────────────────┐
│ Gateway Layer │
│ ┌───────────────────────┐ │
│ │ 请求预处理 │ │
│ │ - 注入可用 tools │ │
│ │ - 路由选择 LLM │ │
│ └───────────┬───────────┘ │
│ ▼ │
│ ┌───────────────────────┐ │
│ │ LLM Provider │ │
│ │ (任意模型) │ │
│ └───────────┬───────────┘ │
│ ▼ │
│ ┌───────────────────────┐ │
│ │ 响应分析 │ │
│ │ - 检测 tool_call │ │
│ │ - 文本 → 直接返回 │ │
│ │ - tool_call → 拦截 │ │
│ └───────────┬───────────┘ │
│ ▼ │
│ ┌───────────────────────┐ │
│ │ Tool Executor │ │
│ │ - web_search │ │
│ │ - tts / stt │ │
│ │ - image_gen │ │
│ │ - code_exec │ │
│ │ - file_fetch │ │
│ └───────────┬───────────┘ │
│ ▼ │
│ ┌───────────────────────┐ │
│ │ 构造 tool_result │ │
│ │ 再次调用 LLM │ │
│ │ (循环直到纯文本) │ │
│ └───────────────────────┘ │
└─────────────────────────────┘
│
▼
最终文本回复返回用户
3.2 支持的工具集
第一阶段(MVP):
| 工具 | 后端实现 | 说明 |
|---|---|---|
| `web_search` | Brave Search API | 联网搜索,最高频需求 |
| `file_fetch` | HTTP client | 抓取网页/下载文件 |
第二阶段(能力扩展):
| 工具 | 后端实现 | 说明 |
|---|---|---|
| `tts` | IndexTTS2 / Edge TTS | 文字转语音 |
| `stt` | Whisper | 语音转文字 |
| `image_gen` | Stable Diffusion / DALL-E | 图片生成 |
| `code_exec` | 安全沙箱 | 代码执行 |
第三阶段(生态):
- 用户自定义 tool(类似 OpenAI 的 function calling,但 Gateway 执行)
- MCP 协议集成
- 第三方工具市场
3.3 流式响应处理
关键技术挑战:当 LLM 以 streaming 模式返回时,tool_call 可能分散在多个 chunk 中。
处理策略:
1. Buffer 模式:收集完整 tool_call 后执行,执行完再切回 streaming
2. 通知模式:在等待 tool 执行期间,向客户端发送 status event(如 SSE 注释)
3. 并行执行:多个 tool_call 并行执行,减少等待时间
3.4 Tool 注入策略
Gateway 需要在请求中注入可用的 tool definitions。两种策略:
- Always-inject:每个请求都注入所有可用工具(简单,但增加 token 消耗)
- Smart-inject:根据请求内容和模型能力,选择性注入(复杂,但更高效)
推荐先用 Always-inject 上线,后续根据数据优化为 Smart-inject。
四、竞品分析
4.1 竞品矩阵
| 产品 | LLM 路由 | Tool 定义 | Tool 执行 | 模型无关 | 独立 API |
|---|---|---|---|---|---|
| **OpenRouter** | ✅ | ❌ | ❌ | ✅ | ✅ |
| **OpenAI Assistants** | ❌ | ✅ | ✅ | ❌ (仅 OpenAI) | ✅ |
| **LangChain / CrewAI** | ❌ | ✅ | ✅ (客户端) | ✅ | ❌ (框架) |
| **Anthropic MCP** | ❌ | ✅ | ✅ (客户端) | ❌ (仅 Claude) | ❌ (协议) |
| **我们** | ✅ | ✅ | ✅ (服务端) | ✅ | ✅ |
4.2 OpenAI Assistants API 的兴衰:一个重要的市场信号
时间线:
- 2023 年 11 月:Assistants API 在 OpenAI DevDay 发布,定位为"全家桶"Agent 平台
- 2025 年 3 月:OpenAI 发布 Responses API 作为替代品
- 2025 年 8 月:正式宣布 Assistants API 废弃(deprecated)
- 2026 年 8 月:彻底关停(还剩约 5 个月)
失败原因分析:
- 有状态设计(stateful)失败:对话 Thread 存在 OpenAI 服务器上,开发者控制力弱,调试困难
- 黑盒太多:工具执行、上下文管理都在 OpenAI 内部,出了问题无从排查
- 不灵活:想换模型不行,想自定义工具执行逻辑也不行
- 开发者社区反响差:很多人发现用了 Assistants API 反而比直接用 Chat Completions 更难开发
替代品 Responses API 的设计转向:
- 回归无状态(stateless):不再帮开发者管 Thread,状态自己管
- 单次调用:一个请求搞定,不用创建 Assistant → Thread → Run 的三步流程
- 工具内置但透明:web_search / code_interpreter 还在,但开发者能看到中间过程
对我们的启示:
1. OpenAI 自己验证了"有状态全托管"路线是错的,转向无状态——跟我们的 proxy 拦截模式天然吻合
2. Responses API 仍然锁定 OpenAI 模型——我们的"任意模型 + 任意工具"定位依然成立且更有价值
3. 大量基于 Assistants API 的应用需要在 5 个月内迁移——部分开发者会寻找不绑定单一厂商的替代方案,这是我们的获客窗口
4. OpenAI 验证了方向正确,但他们的实现太封闭——开放版本正好填这个空缺
4.3 关键差异化
- vs OpenRouter:OpenRouter 只路由 LLM 请求,不执行 tool。我们在路由基础上增加 tool 执行层。
- vs OpenAI Assistants/Responses API:锁定 OpenAI 模型,工具有限且不可扩展。Assistants 已废弃,Responses API 仍是封闭生态。我们支持任意模型 + 任意工具,完全开放。
- vs LangChain/CrewAI:这些是编排框架,tool 执行在客户端。我们是基础设施服务,tool 执行在服务端。
- vs Anthropic MCP:MCP 是协议标准,tool 执行在客户端。我们可以作为 MCP 的服务端实现,在 Gateway 层执行 MCP tools。
4.3 护城河
- 工具生态:随着支持的工具越多,用户迁移成本越高
- 执行优化:服务端可以做缓存、预取、批处理等优化
- 数据飞轮:tool 调用数据可以用于优化注入策略和 tool 选择
- 成本优势:集中采购 API 额度,比用户单独购买更便宜
五、商业模式
5.1 收入来源
1. LLM 调用透传
- 与 OpenRouter 类似,在 LLM 调用费用上加一层利润
- 典型加价:10-20%
2. Tool 调用按次计费
- web_search:$0.005/次
- image_gen:$0.02/次
- tts:$0.01/千字符
- code_exec:$0.01/次
- 按实际使用付费,对轻度用户友好
3. Pro 套餐
- 月费包含一定量的 Tool 调用额度
- 更高的并发限制和优先队列
- 自定义 Tool 能力
- SLA 保证
5.2 成本结构
| 成本项 | 预估 | 说明 |
|---|---|---|
| LLM API 费用 | 变动成本 | 按量透传 |
| 搜索 API (Brave) | ~$0.003/次 | 按量付费 |
| GPU 算力 (TTS/STT/图片) | 固定+变动 | 自建或云 GPU |
| 服务器/带宽 | 固定成本 | Gateway 本身 |
5.3 关键指标
- Tool 命中率:多少比例的请求触发了 tool call(越高说明价值越大)
- Tool 成功率:tool 执行成功的比例
- 端到端延迟:包含 tool 执行在内的总响应时间
- Tool 调用 ARPU:每用户平均 tool 调用收入
六、实现路线图
Phase 0:验证(1-2 周)
- [ ] 基于小虾 llmproxy 代码,搭建独立的 Gateway 原型
- [ ] 支持 web_search 单一工具
- [ ] 兼容 OpenAI API 格式
- [ ] 内部测试,验证核心流程
Phase 1:MVP(2-4 周)
- [ ] 支持 5+ LLM providers(OpenAI、Anthropic、Google、DeepSeek、Qwen)
- [ ] 添加 file_fetch 工具
- [ ] 实现流式响应处理
- [ ] 用户认证和 API key 管理
- [ ] 基础计费系统
- [ ] 文档和 SDK
Phase 2:能力扩展(1-2 月)
- [ ] TTS / STT 工具
- [ ] 图片生成工具
- [ ] 代码执行沙箱
- [ ] Dashboard(用量统计、费用查看)
- [ ] Pro 套餐上线
Phase 3:生态(3-6 月)
- [ ] 用户自定义 Tool
- [ ] MCP 协议集成
- [ ] 第三方工具市场
- [ ] 企业版(私有部署)
七、风险与挑战
技术风险
- 延迟:tool 执行增加额外延迟,需要优化(缓存、预取、并行)
- 流式处理:tool_call 在 streaming 中的处理复杂度高
- 沙箱安全:code_exec 等工具需要严格的安全隔离
- 多模型兼容:不同模型的 tool calling 格式不完全一致
商业风险
- OpenRouter 跟进:OpenRouter 可能扩展到 tool 执行
- 模型厂商内化:OpenAI/Anthropic 可能把更多工具内置到模型中
- 定价压力:需要在价值和价格之间找到平衡
缓解策略
- 速度:先跑起来,建立用户基础和数据壁垒
- 差异化:专注于「任意模型 + 任意工具」的独特定位
- 生态锁定:通过工具市场和自定义 tool 建立生态
- 成本领先:集中采购和优化,提供更低的价格
八、设计讨论:Tool Call 上下文透传
8.1 初始担忧
最初我们担心:proxy 拦截 tool call 后,用户侧的 AI 应用(如 OpenClaw)只看到最终回复,中间的搜索过程被"吞掉",可能导致上下文断裂、调试困难等问题。
8.2 实际分析:问题远没有那么严重
仔细分析实际流程后发现,简单方案就够了:
完整流程:
1. 用户: "阿森纳的后面赛程是?"
2. LLM 返回: tool_call(web_search, "阿森纳 2026 赛程")
3. proxy 拦截 → 调用主机 Brave Search → 拿到结果 → 喂回 LLM
4. LLM 生成最终回答: "4月5日打切尔西,4月12日打..."
5. proxy 只返回第4步的最终回答给用户
用户侧的对话历史:
[
{"role": "user", "content": "阿森纳的后面赛程是?"},
{"role": "assistant", "content": "阿森纳接下来的赛程是:4月5日打切尔西..."}
]
为什么这就够了?
- LLM 的最终回答是基于搜索结果生成的自然语言,关键信息已经融入回答中
- 后续追问"和切尔西那场在哪踢?"——LLM 从自己上一轮回答里就能找到上下文
- 不需要保留原始搜索结果,因为结论已经包含了信息
唯一的边际损失:搜索结果里有 20 条数据但 LLM 只提了 5 条,追问第 6 条时需要重新搜。但这种情况很少见,且重新搜一次的成本($0.005)远低于每轮都带着搜索结果的 token 成本。
8.3 结论:简单方案优先
默认策略:只返回最终回答,不透传中间步骤。
理由:
- 实现简单,兼容所有 OpenAI 格式客户端
- Token 消耗最低(不带搜索结果原文)
- 对 99% 的使用场景够用
- 避免过度设计
可选增强(未来按需添加):
annotations字段标注引用来源(方便用户验证)- 调试模式下返回完整 tool call 链路(开发者排查问题用)
这个设计印证了一个原则:先做最简单的,遇到真实问题再优化。
九、总结
Tool-Augmented LLM Gateway 的核心洞察是:在 proxy 层拦截和执行 tool calls,将 LLM 从「只能说」变成「能说也能做」。
这不仅仅是一个技术创新,更是一个产品范式的转变:
- 对开发者:一个 API 调用 = LLM + 所有工具能力,零集成成本
- 对用户:任意模型都能联网搜索、生成图片、执行代码
- 对生态:统一的 tool 执行层,为工具市场提供基础设施
从小虾 llmproxy 的一个巧妙 hack,到一个独立的 AI 能力平台 —— 这是一条清晰的产品化路径。
评分
| 维度 | 分数 | 说明 |
|---|---|---|
| 创意 | ?/10 | |
| 技术深度 | ?/10 | |
| 实用性 | ?/10 | |
| 影响力 | ?/10 | |
| 数据支撑 | ?/10 | |
| 与我们的相关性 | ?/10 | |
| **综合** | **?/10** | 需要后续评估 |
> 一句话总结:(报告的核心价值与我们的关联)