今天早上我醒来时,我的AI代理审核了印度纳加尔的14家餐厅评价,更新了一个共享的Google表格,签署了我已经忽略了一周的20页PDF文件,并编写了一个bash脚本来清理我的服务器日志.
我并没有要求它做任何这些事。它只是...现在会自己做事了.
认识OpenClaw — 我那个一直运行的自主代理,住在树莓派上,接入Discord,全天候运行。它管理我的记忆,处理研究,编写代码,编辑文档,通过抓取实时评分找出班加罗尔最好的周末去处——基本上,它用自动驾驶模式运行了我一半的人生。
但几周前,我注意到一些让我困扰的事情。
我问它:"写一个Python脚本解析JSON日志。" 简单的编码任务。它向一个云API发送了请求,等待了3秒钟,消耗了我购买的token,然后返回了一个答案——而我的Mac Mini上正好有一个完全能用的本地LLM在闲置,就在三英尺远的地方。
然后我问: "逐步思考一下我的通知系统在事件驱动和轮询架构之间的权衡。" 这是一个困难的推理问题。我想让它去一个前沿模型。这是值得用token的。
同一个代理。同一个终点。完全不同的需求。
那就是时一个愚蠢的想法击中了我:
如果系统可以在请求甚至到达模型之前就能确定使用哪个大脑呢?
结果,这根本不傻。而且它花了我一个周末、一个树莓派、一个Mac Mini、50行Python代码和一个开源网关才建成。
这是怎么做到的。
设置
这是我客厅里运行的设备:
树莓派 → 运行OpenClaw,我的自主代理。它从Discord获取输入,管理上下文、内存,并协调所有事情。
Mac Mini → 大脑农场。运行三项事务:
Ollama with qwen2.5-coder:7b — 一个不会离开我网络的本地编码模型
AgentGateway — 来自Google的开源AI网关,处理路由、认证、可观测性
轻量级Python路由器 — 我用约50行代码编写的“意图分类器”
魔法?OpenClaw不知道这一切正在发生。它只是向一个端点发送请求。在幕后,系统处理剩下的部分。
架构
三个模型。三个价格点。一个统一的端点。OpenClaw只需击打http://192.168.1.15:1234/v1/chat/completions然后忘记它。
为什么是AgentGateway?
我评估了几个选项——原始的Envoy、带Lua脚本的Nginx,甚至从头构建一个完整的代理。但AgentGateway由于几个原因脱颖而出:
它开箱即给您的:
协议转换 — 它在前面端宣称兼容 OpenAI 的 API,但在后面端可以与 Gemini、Vertex AI、Bedrock、Ollama 等进行通信。我从未编写过任何特定于提供者的代码.
后端认证 — API 密钥在网关级别进行管理。OpenClaw 从不看到或存储任何 API 密钥。我只需在配置中设置 backendAuth: key: $GEMINI_API_KEY,它就会处理其余部分.
模型别名 — OpenClaw 在每个请求中都发送模型:"inteli-llm"。AgentGateway 默默地将它翻译为 qwen2.5-coder:7b、gpt-4o 或 gemini-2.5-flash,具体取决于匹配的路由。客户端对此一无所知。
可观察性 — 每个请求都会记录提供者名称、模型、令牌计数和延迟。我能精确看到有多少令牌发送给 OpenAI,有多少留在本地。
提示保护& 速率限制 — 内置基于正则表达式的PII掩码、基于webhook的内容审核和速率限制。我免费获得的企业级功能。
加权负载均衡&故障转移 — 如果Ollama崩溃(它会发生),我可以配置自动故障转移到云端模型。无停机时间。
它目前无法实现的功能: 内容感知路由。AgentGateway 基于路径、头部和方法进行路由——这是网关的正确设计。它不会窥探你的请求体来决定将其发送到何处。这是一个特性,而不是缺陷——网关应该是快速且协议级的,而不是解析 JSON 负载。
但我需要内容感知路由。所以我不是在寻找其他工具,而是扩展了它。
能让一切运行起来的50行路由器
我编写了一个微型的FastAPI代理,它位于AgentGateway之前。这是它的功能:
- 截获传入的OpenAI兼容请求
- 读取聊天中的最后一条消息
-
使用简单的关键字匹配+提示长度启发式算法进行意图分类:
-
包含
code,python,script,function,bug? → 编码 - 包含
think,analyze,reasoning,deduce? 或提示> 400 个字符? → 推理 - 其他所有内容? → 简单
-
包含
- 注入一个 x-intent HTTP 头
- 将请求原样转发给AgentGateway 就这样。没有分类的机器学习模型。没有向量数据库。没有语义相似度。只是传统的关键字匹配,虽然它只有90%的有效率——但对于家庭实验室来说已经足够了。
coding_keywords = ["code", "python", "javascript", "bash", "script", "function", "bug"]
reasoning_keywords = ["think", "analyze", "explain in detail", "reasoning", "logic", "deduce"]
if any(k in prompt_lower for k in coding_keywords):
intent = "coding"
elif len(prompt) > 400 or any(k in prompt_lower for k in reasoning_keywords):
intent = "reasoning"
else:
intent = "simple"
成本方程
这套设置实际为我节省了这些:
| 意图 | 模型 | 运行位置 | 每1M个token的成本 |
|---|---|---|---|
| 编程 | qwen2.5-coder:7b | 本地(Ollama) | $0 |
| 简单Q&A | gemini-2.5-flash | Google Cloud | ~$0.15 |
| 深度推理 | gpt-4o | OpenAI | ~$2.50 |
在这个设置之前,每个请求都发往云API。现在,大约60-70%的查询都留在本地——编程问题、快速查找、简单的格式化任务。它们快速、免费且私密.
只有在我确实需要时,才会调用昂贵的推理模型。而中端的Gemini处理中间的所有事务。
我的每月API账单显著下降,而且本地响应实际上更快了。
设计选择 & 它们为何有效
1. 基于头的路由胜过基于路径的路由 最初,我打算使用URL路径 (/coding,/reasoning/simple) 并通过URL重写进行剥离。但头部注入更干净——原始请求路径保持完整,而且AgentGateway的头部匹配是一流的.
2. 代理端分类,而非网关端 我本可以尝试使用 AgentGateway 的 CEL 表达式或 ExtProc 策略进行分类。但那些是在后端选择之后运行的,而不是之前。将分类保持在单独的轻量级层意味着我可以更换算法,而无需触碰我的网关配置.
3. 关键词启发式方法胜过机器学习分类器 我能用一个小分类器模型,甚至 RouteLLM 来实现更智能的路由吗?当然可以。但对于家庭实验室来说,关键字匹配是:
- 零延迟开销
- 零依赖
- 易于调试(只需查看日志)
- 对我的用例来说出人意料地准确
4. 一个统一的模型名称 OpenClaw 发送模型:"inteli-llm" 用于一切。AgentGateway 的 modelAliases 功能按路由翻译它。这意味着我可以更换后端模型,而无需触碰 OpenClaw 的配置的一行代码。上周是 gemini-1.5-flash,这周是 gemini-2.5-flash。OpenClaw 从未知道。
下一步是什么
更智能的分类 — 也许是一个微型的本地分类器模型,甚至使用响应的前几个标记在更好的模型上重新分类并重试。
指标面板 — AgentGateway已经发出OpenTelemetry跟踪。我想连接一个Grafana面板来查看哪些模型在处理什么,以及延迟和标记细分情况。
故障转移链 — 如果 Ollama 负载过重,自动回退到 Gemini 执行编码任务。AgentGateway 支持为这个目的设置优先级组。
更多代理 — OpenClaw 只是开始。我想为不同领域运行专门的代理,所有流量都通过同一个网关路由。
总结
你不需要一个 Kubernetes 集群或一个 $10K 的 GPU 服务器来构建一个多模型 AI 系统。一个树莓派、一个 Mac Mini、一个开源网关和 50 行 Python 代码就让我实现了:
✅ 一个始终在线的自主代理 ✅智能路由 ✅跨越 3 个不同的 LLM ✅本地优先以确保隐私和速度 ✅需要计算能力时连接云端 ✅零 API 密钥暴露给客户端 ✅一个我实际上不介意支付的月度账单
最好的部分是什么?整个配置就是一个YAML文件和一个Python脚本。没有Docker。没有Kubernetes。没有Terraform。只是在Mac Mini上运行两个进程,在Pi上运行一个代理。
有时候最好的基础设施就是你能在餐巾纸上解释清楚的。
如果你在构建类似的东西或者想看看配置文件,留言一下——很乐意分享完整设置。
















