模型雷達 (Model Radar) 是做什麼的?
OpenRouter 模型選擇命令列工具。將自然語言條件解析為 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」對應表,將使用者的請求解析為
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。
Token 語法
受 Tailwind 啟發的定位式 token:value 參數。順序無關。
| Token | 意義 | 值格式 | 範例 |
|---|---|---|---|
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 | 最大輸出 Token 數 | 同上,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)
意圖 → Token
| 使用者說法 | Token(s) |
|---|---|
| "預算 $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/name,取最新發布版本 —
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 前端卡片資料轉換為本地原始 schema(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