名称: llmrouter
描述: 智能 LLM 代理,根据任务复杂度将请求路由到合适的模型。对简单任务使用更便宜的模型以节省成本。已测试支持 Anthropic、OpenAI、Gemini、Kimi/Moonshot 和 Ollama。
主页: https://github.com/alexrudloff/llmrouter
元数据: {"openclaw":{"emoji":"🔀","homepage":"https://github.com/alexrudloff/llmrouter","os":["darwin","linux"],"requires":{"bins":["python3"],"anyBins":["pip","pip3"]},"primaryEnv":"ANTHROPIC_API_KEY"}}
一个智能代理,它根据传入请求的复杂度进行分类,并将其路由到合适的 LLM 模型。对简单任务使用更便宜/更快的模型,将昂贵模型留给复杂任务。
与 OpenClaw 协同工作,通过将简单请求路由到较小的模型来减少令牌使用量和 API 成本。
状态: 已测试支持 Anthropic、OpenAI、Google Gemini、Kimi/Moonshot 和 Ollama。
# 如果尚未克隆,请克隆仓库
git clone https://github.com/alexrudloff/llmrouter.git
cd llmrouter
# 创建虚拟环境 (现代 Python 版本要求)
python3 -m venv venv
source venv/bin/activate
# 安装依赖
pip install -r requirements.txt
# 拉取分类器模型 (如果使用本地分类)
ollama pull qwen2.5:3b
# 复制并自定义配置
cp config.yaml.example config.yaml
# 编辑 config.yaml,填入你的 API 密钥和模型偏好
# 启动服务器
source venv/bin/activate
python server.py
# 在另一个终端中,测试健康检查端点
curl http://localhost:4001/health
# 应返回:{"status": "ok", ...}
python server.py
选项:
- --port PORT - 监听的端口 (默认:4001)
- --host HOST - 绑定的主机 (默认:127.0.0.1)
- --config PATH - 配置文件路径 (默认:config.yaml)
- --log - 启用详细日志记录
- --openclaw - 启用 OpenClaw 兼容性 (在系统提示中重写模型名称)
编辑 config.yaml 以进行自定义:
# Anthropic 路由
models:
super_easy: "anthropic:claude-haiku-4-5-20251001"
easy: "anthropic:claude-haiku-4-5-20251001"
medium: "anthropic:claude-sonnet-4-20250514"
hard: "anthropic:claude-opus-4-20250514"
super_hard: "anthropic:claude-opus-4-20250514"
# OpenAI 路由
models:
super_easy: "openai:gpt-4o-mini"
easy: "openai:gpt-4o-mini"
medium: "openai:gpt-4o"
hard: "openai:o3-mini"
super_hard: "openai:o3"
# Google Gemini 路由
models:
super_easy: "google:gemini-2.0-flash"
easy: "google:gemini-2.0-flash"
medium: "google:gemini-2.0-flash"
hard: "google:gemini-2.0-flash"
super_hard: "google:gemini-2.0-flash"
注意: 推理模型会自动检测并使用正确的 API 参数。
有三种选项用于分类请求复杂度:
本地 (默认) - 免费,需要 Ollama:
classifier:
provider: "local"
model: "qwen2.5:3b"
Anthropic - 使用 Haiku,快速且便宜:
classifier:
provider: "anthropic"
model: "claude-haiku-4-5-20251001"
OpenAI - 使用 GPT-4o-mini:
classifier:
provider: "openai"
model: "gpt-4o-mini"
Google - 使用 Gemini:
classifier:
provider: "google"
model: "gemini-2.0-flash"
Kimi - 使用 Moonshot:
classifier:
provider: "kimi"
model: "moonshot-v1-8k"
如果你的机器无法运行本地模型,请使用远程 (anthropic/openai/google/kimi) 分类器。
anthropic:claude-* - Anthropic Claude 模型 (已测试)openai:gpt-*, openai:o1-*, openai:o3-* - OpenAI 模型 (已测试)google:gemini-* - Google Gemini 模型 (已测试)kimi:kimi-k2.5, kimi:moonshot-* - Kimi/Moonshot 模型 (已测试)local:model-name - 本地 Ollama 模型 (已测试)| 级别 | 用例 | 默认模型 |
|---|---|---|
| super_easy | 问候、确认 | Haiku |
| easy | 简单问答、提醒 | Haiku |
| medium | 编码、邮件、研究 | Sonnet |
| hard | 复杂推理、调试 | Opus |
| super_hard | 系统架构、证明 | Opus |
编辑 ROUTES.md 以调整消息分类方式。分类器读取此文件中的表格来确定复杂度级别。
路由器暴露了一个 OpenAI 兼容的 API:
curl http://localhost:4001/v1/chat/completions \
-H "Authorization: Bearer $ANTHROPIC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "llm-router",
"messages": [{"role": "user", "content": "你好!"}]
}'
python classifier.py "写一个 Python 排序函数"
# 输出:medium
python classifier.py --test
# 运行测试套件
创建 ~/Library/LaunchAgents/com.llmrouter.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.llmrouter</string>
<key>ProgramArguments</key>
<array>
<string>/path/to/llmrouter/venv/bin/python</string>
<string>/path/to/llmrouter/server.py</string>
<string>--openclaw</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>WorkingDirectory</key>
<string>/path/to/llmrouter</string>
<key>StandardOutPath</key>
<string>/path/to/llmrouter/logs/stdout.log</string>
<key>StandardErrorPath</key>
<string>/path/to/llmrouter/logs/stderr.log</string>
</dict>
</plist>
重要: 将 /path/to/llmrouter 替换为你的实际安装路径。必须使用 venv 中的 python,而非系统 python。
# 创建日志目录
mkdir -p ~/path/to/llmrouter/logs
# 加载服务
launchctl load ~/Library/LaunchAgents/com.llmrouter.plist
# 验证是否正在运行
curl http://localhost:4001/health
# 停止/重启
launchctl unload ~/Library/LaunchAgents/com.llmrouter.plist
launchctl load ~/Library/LaunchAgents/com.llmrouter.plist
在 ~/.openclaw/openclaw.json 中将路由器添加为提供商:
{
"models": {
"providers": {
"localrouter": {
"baseUrl": "http://localhost:4001/v1",
"apiKey": "via-router",
"api": "openai-completions",
"models": [
{
"id": "llm-router",
"name": "LLM Router (按复杂度自动路由)",
"reasoning": false,
"input": ["text", "image"],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 200000,
"maxTokens": 8192
}
]
}
}
}
}
注意: 成本设置为 0,因为实际成本取决于路由器选择哪个模型。路由器会记录每个请求由哪个模型处理。
要将路由器默认用于所有代理,请添加:
{
"agents": {
"defaults": {
"model": {
"primary": "localrouter/llm-router"
}
}
}
}
如果你的 config.yaml 使用了来自 OpenClaw ~/.openclaw/auth-profiles.json 的 Anthropic OAuth 令牌,路由器会自动处理 Claude Code 身份标头。
如果与 OpenClaw 一起使用,必须使用 --openclaw 标志启动服务器:
python server.py --openclaw
此标志启用 OpenClaw 所需的兼容性功能:
- 重写响应中的模型名称,以便 OpenClaw 显示实际使用的模型
- 处理工具名称和 ID 重映射,以实现正确的工具调用路由
没有此标志,在使用路由器与 OpenClaw 时可能会遇到错误。
curl http://localhost:4001/healthcat config.yamlpython classifier.py "你的消息"python classifier.py --testpython server.pytail -f logs/stdout.logPython 3.11+ 需要虚拟环境。创建一个:
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
服务器未运行。启动它:
source venv/bin/activate && python server.py
编辑 ROUTES.md 以调整分类规则。分类器读取此文件以确定复杂度级别。
确保 Ollama 正在运行且模型已拉取:
ollama serve # 如果未运行,启动 Ollama
ollama pull qwen2.5:3b
确保 config.yaml 中的令牌以 sk-ant-oat 开头。路由器会自动检测 OAuth 令牌并添加必需的身份标头。
检查日志并确保路径是绝对路径:
cat ~/Library/LaunchAgents/com.llmrouter.plist # 验证路径
cat /path/to/llmrouter/logs/stderr.log # 检查错误