模型雷达 (Model Radar)
OpenRouter 模型选择 CLI。将自然语言约束解析为 token:value 参数,查询模型元数据 + 排名的本地缓存,并输出 JSON 供代理渲染为 Markdown 表格。
设置
- 运行环境:Node.js 18+(无需安装步骤,无 npm 依赖)
- 无需 API 密钥 — 使用 OpenRouter 公共端点
- 所有命令请在此技能目录(包含此文件的目录)中运行
- 首次运行会从网络填充缓存;后续调用使用本地缓存(模型 TTL 6 小时,排名 TTL 24 小时)
- 默认启用自动更新。每次 CLI 运行时,每 24 小时最多检查一次固定 GitHub 源,并自动应用于已安装的副本。设置
MODEL_RADAR_AUTO_UPDATE=0可禁用。
工作流程
- 使用技能前,运行
node scripts/self-update.js auto。如果 stderr 输出MODEL_RADAR_UPDATED,请重新阅读此SKILL.md后再继续。 - 使用下面的 意图 → 令牌 映射将用户的请求解析为
token:value参数 - 选择命令:
list(筛选+排序)、recommend(根据预设加权评分)、compare(并排对比) - 在技能目录中运行。
scripts/main.js也会自动运行相同的自我更新预检,因此直接使用 CLI 也能保持最新。 - 将 JSON 输出渲染为 Markdown 表格(参见输出)
- 以
数据截至 {fetched_at}结尾;如果数据早于 12 小时,建议使用refresh
命令
node scripts/main.js list [tokens...] # 筛选 + 排序
node scripts/main.js recommend [tokens...] # 根据预设加权评分
node scripts/main.js compare <id|name>... # 并排对比
node scripts/main.js refresh # 强制刷新所有缓存
node scripts/self-update.js status # 检查更新状态
node scripts/self-update.js check # 检查 GitHub 上的更新
node scripts/self-update.js apply # 应用最新的技能更新
自动更新
- 源由
package.json.repository固定:primexiao/agent-skills,路径skills/model-radar。 - 已安装的副本会自动更新。除非设置了
MODEL_RADAR_AUTO_UPDATE_SOURCE=1,否则源检出会跳过自动更新。 - 技能目录下的本地未提交更改会导致自动更新跳过。
- 直接使用
scripts/main.js时,成功自更新后会重新启动当前命令,以确保结果由更新后的代码生成。 - 更新使用临时检出,验证所需文件,备份当前技能,替换非运行时文件,失败时回滚。
- 成功更新会清除
cache/raw.json、cache/models.json和cache/rankings.json,以便新代码不与旧缓存数据混合。 - 自更新状态和警告输出到 stderr。命令 JSON 保持在 stdout。
令牌语法
Tailwind 启发的定位 token:value 参数。顺序无关紧要。
| 令牌 | 含义 | 值格式 | 示例 |
|---|---|---|---|
sort | 排序维度 | 预设词(见下文) | sort:cheap sort:popular |
price | $/MTok 混合价格 | ..max / min.. / min..max / bare=max | price:..10 price:5..20 |
ctx | 上下文长度 | 同上,支持 k/m 后缀,bare=min | ctx:128k ctx:128k..1m |
out | 最大输出令牌 | 同上,bare=min | out:32k |
cap | 能力(AND 逻辑) | 逗号分隔 | cap:tool_use,reasoning |
in | 输入模态(AND 逻辑) | 逗号分隔 | in:image in:audio,image |
gen | 输出模态(AND 逻辑) | 逗号分隔 | gen:image gen:audio |
open | 开源过滤器 | true / false | open:true |
top | 结果数量限制 | 数字(默认:list=20,recommend=3) | top:5 |
preset | 评分预设(仅 recommend) | 预设名称 | preset:coding |
sort 值: cheap expensive new(默认) ctx popular throughput latency
能力: tool_use reasoning structured_output vision long_output prompt_caching web_search audio_input video_input file_input image_generation audio_output
输入模态: text image audio video file
输出模态: text image audio
推荐预设: coding batch chat vision(权重和所需能力见 config/presets.json)
意图 → 令牌
| 用户输入 | 令牌 |
|---|---|
| “预算 $X” / “低于 $X” | price:..X |
| “至少 $X” / “高级别” | price:X.. |
| “至少 Nk 上下文” | ctx:Nk |
| “需要工具调用 / 视觉 / 推理” | cap:tool_use / cap:vision / cap:reasoning |
| “结构化输出” / “JSON 模式” | cap:structured_output |
| “可以接收音频 / 图像输入” | in:audio / in:image |
| “可以生成图像 / 音频” | gen:image / gen:audio |
| “仅开源” | open:true |
| “最便宜” / “最实惠” | sort:cheap |
| “最流行” / “流行趋势” | sort:popular |
| “最新” / “最新发布” | sort:new |
| “最快” / “最低延迟” | sort:latency |
| “最高吞吐量” | sort:throughput |
| “编码代理” | recommend preset:coding |
| “批量 / 批量任务” | recommend preset:batch |
| “视觉代理” | recommend preset:vision |
模型匹配 (compare)
对于 compare 参数的每个参数,匹配优先级为:
- 精确 ID —
anthropic/claude-sonnet-4-5 - 后缀精确匹配 —
claude-sonnet-4→anthropic/claude-sonnet-4(从不匹配-fast变体) - ID/名称的部分子串匹配,最新版本优先 —
claude-sonnet→ 最新的 Sonnet
输出
始终将 JSON 输出渲染为 Markdown 表格 — 表格是主要的显示格式。
list
| # | 模型 | $/MTok (提示/补全/混合) | 上下文 | 输出 | 能力 | 排名# |
$/MTok:提示/补全/混合价格能力:简短标签(toolreasonvision…)排名#:如果排名缓存有效则为流行度排名,否则为—
recommend
| 排名 | 模型 | 得分 | 成本↑ | 上下文↑ | 输出↑ | 能力↑ | $/MTok | 能力标签 |
每个模型附带一行简短理由。得分和各个维度的得分范围在 [0, 1]。
compare
垂直表格 — 每列一个模型,每行一个维度:
| 维度 | 模型 A | 模型 B | 模型 C |
| ------------------ | ------ | ------ | ------ |
| 价格 (提示/补全/混合) | … | … | … |
| 上下文 | … | … | … |
| 最大输出 | … | … | … |
| 输入模态 | … | … | … |
| 输出模态 | … | … | … |
| 能力 | … | … | … |
| 流行度排名 | … | … | … |
| 每周请求数 | … | … | … |
始终以: 数据截至 {fetched_at} 结尾。如果数据早于 12 小时,建议用户运行 node scripts/main.js refresh。
缓存
cache/
raw.json — OpenRouter 前端卡片数据适配本地原始模式(TTL 6 小时)
models.json — 增强数据:标准化定价 + 能力标签(TTL 6 小时)
rankings.json — 流行度/吞吐量/延迟 + 使用分析(TTL 24 小时)
config/
presets.json
tier1-categories.json
- 缓存文件位于
cache/目录下,不提交 — 首次运行时会从网络获取 - TTL 过期后,CLI 会以 10 秒超时重新获取
- 任何获取失败时,会回退到过期缓存并在 stderr 输出
[warn]— 因此只读/离线沙箱仍能应答(可能数据过时) - 成功的技能更新会删除模型数据缓存文件。下次模型命令会重新填充缓存。
沙箱注意事项
- Codex CLI: 需要
-s workspace-write(CLI 写入cache/)以及到openrouter.ai的网络出站。在 TTL 内,无需网络调用。 - 在全新检出中的首次调用 是唯一严格需要网络的一次。
- 自动更新需要对此技能目录的文件系统写入权限以及对 GitHub 的网络访问。如果不可用,会发出警告或跳过,模型命令仍会使用当前本地副本运行。
已知问题
- OpenRouter 前端 API (
/api/frontend/v1/models/find?active=true&fmt=cards) 是非官方的;如果失败,CLI 会在可用时回退到过期缓存并输出[warn]。
数据源
- 模型:
https://openrouter.ai/api/frontend/v1/models/find?active=true&fmt=cards - 排名: 同一端点,加上
order=top-weekly、order=throughput-high-to-low和order=latency-low-to-high