搜尋 OpenRouter CLI 時,通常會得到兩種完全不同的答案。OpenRouter 官方的 ori 指令,主要負責設定並啟動既有的程式代理工具;社群開發的客戶端則各有不同取向,從單次提示、REPL 對話、JSON 輸出,到完整 API 操作都有。如果你只需要在 Shell 管線中送出請求,其實 OpenRouter API 搭配 curl 就已經足夠。
實際上,「OpenRouter CLI」指的是什麼?
「OpenRouter CLI」並不是某個通用官方終端機客戶端的正式名稱。實際上,它涵蓋三種不同工作流程:透過 OpenRouter 啟動程式代理、直接在 Shell 呼叫 API,或使用 llm、aichat 這類第三方終端機工作台。
| 你想在終端機完成的工作 | 從這裡開始 | 原因 |
|---|---|---|
| 執行 Claude Code、Codex、OpenCode 或其他支援的代理工具 | 官方 Ori Harness | 在既有代理工具外層套用 OAuth、模型選擇與 OpenRouter 設定 |
| 送出單次提示或處理 stdin | curl 搭配 jq | 不需要額外 CLI 依賴,請求內容也能完全自行控制 |
| 查閱多個 OpenRouter 端點並回傳 JSON | @aaronjmars/openroutercli | 涵蓋廣泛指令、JSON 模式,以及可處理一般請求的逃生口 |
| 使用支援模型搜尋的聊天 REPL | @letuscode/openrouter-cli | 提供單次提示、REPL 對話、模糊模型搜尋與設定檔 |
| 執行多模型提示、批次工作或提示鏈 | orc | 支援設定檔、範本、批次處理、串接與程式碼分析 |
| 保留記錄、結構描述、附件與外掛 | llm-openrouter | 將 OpenRouter 模型加入可擴充的 llm CLI |
| 整合聊天、Shell 輔助、RAG、代理工具與本機服務商 | aichat | 功能更廣的 Rust 終端機工作台,而非只服務 OpenRouter 的客戶端 |
關鍵差異在於隸屬關係與涵蓋範圍。OpenRouter 的 ori 整合與 @openrouter/cli DevTools 套件 都是官方工具,但兩者都不是一般用途的 openrouter ask 客戶端:DevTools 套件主要用於 SDK 遙測檢視器與 Claude Code 狀態列,而 Ori 的工作則是啟動既有的代理工具。
官方做法:安裝並使用 Ori Harness
Ori 是 OpenRouter 官方推出、用來設定受支援程式代理工具的 CLI。它會以 OpenRouter 驗證身分,把指定模型傳給底層代理,同時保留該代理原本的指令與參數;它並不會取代 Claude Code、Codex、OpenCode 或其他代理工具。
請依照 OpenRouter 公告與指南中的指令安裝:
curl -fsSL https://openrouter.ai/labs/ori/install.sh | bash
接著完成驗證並啟動代理:
ori login
ori claude
ori codex
ori opencode
ori hermes
目前 Ori 文件也將 grok、pi、prime-agent 與 dsh 列為支援的指令。ori dsh 只會設定 DeepSeek Harness,不會直接啟動它;完成後還要另外執行 dsh。若要更新 Ori,則使用 ori update。
換模型,不必更換代理工具
Ori 接受 OpenRouter 模型 ID,並會把不認得的參數轉交給底層代理:
ori claude --model anthropic/claude-sonnet-4.6
ori codex --model openai/gpt-5.2 --full-auto
ori opencode --model openrouter/auto
ori hermes --model openrouter/auto
不同代理使用的端點設定並不完全相同。例如 OpenRouter 的 Claude Code 指南使用 Anthropic 相容的基礎 URL https://openrouter.ai/api;Codex 這類 OpenAI 相容客戶端則使用 https://openrouter.ai/api/v1。Ori 的其中一個用途,就是把這些依代理而異的設定差異藏在後面。
Ori 採用瀏覽器式 OAuth PKCE 驗證,因此一般流程不需要把 OpenRouter API 金鑰逐一貼進每個代理工具。OpenRouter 的 Ori Harness 文件表示,請求會依照標準 OpenRouter 計費並納入活動記錄,不會另外收取 Ori 費用;實際推論成本仍取決於所選模型與底層代理工具。
Ori 不是獨立的聊天 REPL
如果你需要代理工具提供的工具整合、檔案操作或核准機制,就適合使用 Ori。若只是要送出提示、取得結構化回應,或建立不應啟動程式代理的 Shell 管線,則應改用 curl、直接 API 客戶端、llm 或 aichat。
這個界線很重要,因為官方的啟動資料將 Ori 定位為相容性與設定層。官方的 @openrouter/cli 套件也常讓人誤解:目前文件列出的指令是 openrouter devtools 與 openrouter statusline,而 1.0 版本線已移除早期的 start、stop、restart 與 code 等 Proxy 指令。
值得認識的社群 OpenRouter 客戶端
社群客戶端的差異,主要體現在它們提供什麼樣的終端機操作介面。實際選擇時,先釐清你需要的是互動式選擇器、完整 API 覆蓋、小型執行檔、多模型自動化,還是穩定且適合機器處理的輸出格式。
| 客戶端 | 安裝或啟動方式 | 最適合的用途 | 需要留意的限制 |
|---|---|---|---|
@aaronjmars/openroutercli | npm install -g @aaronjmars/openroutercli | 廣泛的 OpenRouter API 存取、OAuth PKCE、--json、用量資料、媒體工作,以及 request METHOD path | 非官方;需要 Node.js 20+;管理指令需要管理金鑰 |
@letuscode/openrouter-cli | npm i -g @letuscode/openrouter-cli | openrouter ask、repl、模糊模型搜尋、設定檔、範本,以及 Markdown/純文字輸出 | README 說明目前仍在 MVP 開發階段;需要 Node.js 18.17+;採用 Polyform Noncommercial 1.0.0 |
orc | npm install -g openrouter-cli | 多模型提示、設定檔、範本、批次處理、提示串接與程式碼分析 | 需要 Node.js 22+;使用 orc 指令;專案與套件名稱都不同於上方的 scoped client |
ort | cargo +nightly-2026-03-25 install --locked ort-openrouter-cli | 快速的 Linux 終端機操作、服務商選擇、stdin、圖片、支援 tmux 的延續工作,以及延遲/成本統計 | 僅支援 Linux/x86_64;README 明確揭露它不會驗證 TLS 憑證 |
llm-openrouter | llm install llm-openrouter | 記錄、別名、結構描述、附件、工具,以及成熟的外掛式工作流程 | 使用 OPENROUTER_KEY 慣例;模型目錄會快取一小時 |
aichat | 透過套件管理器或執行檔安裝 | REPL、Shell 助理、RAG、代理、MCP、本機服務商,以及本機 HTTP 伺服器 | 抽象層較廣;README 沒有提供逐一服務商的功能或安全性矩陣 |
以上是文件中列出的功能,不代表可直接互相比較的效能基準測試。
最精簡可靠的做法:curl 搭配 jq
如果系統已經安裝 curl 與 jq,直接呼叫 OpenRouter API 就是最精簡、也最透明的終端機方案。OpenRouter Quickstart 說明了 Bearer 驗證、OpenAI 相容的 /api/v1/chat/completions 端點、model 欄位、messages 陣列,以及可選用的串流輸出。
先在目前的 Shell 工作階段設定金鑰與模型:
export OPENROUTER_API_KEY='sk-or-v1-...'
export OR_MODEL='openai/gpt-4o'
接著送出單次提示:
curl -sS https://openrouter.ai/api/v1/chat/completions \
-H "Authorization: Bearer ${OPENROUTER_API_KEY}" \
-H "Content-Type: application/json" \
-d "$(jq -n \
--arg model "$OR_MODEL" \
--arg prompt "Explain Unix pipes in three sentences." \
'{model: $model, messages: [{role: "user", content: $prompt}], stream: false}')" \
| jq -r '.choices[0].message.content // .error.message'
把模型放在環境變數中,比起將模型 ID 散落在每個腳本裡更容易維護。官方 Models API 會提供 id、上下文長度、定價、支援的參數、服務商限制,以及可選的基準測試中繼資料。
把請求包成可重複使用的 Shell 函式
以下函式交由 jq 編碼提示內容,確保請求本文維持有效 JSON。orask 用來處理命令列參數;orpipe 則會把完整標準輸入當成一則提示。
orask() {
local prompt="$*"
local model="${OR_MODEL:?Set OR_MODEL to an OpenRouter model ID}"
jq -n \
--arg model "$model" \
--arg prompt "$prompt" \
'{model: $model, messages: [{role: "user", content: $prompt}], stream: false}' \
| curl -sS --fail-with-body \
https://openrouter.ai/api/v1/chat/completions \
-H "Authorization: Bearer ${OPENROUTER_API_KEY:?Set OPENROUTER_API_KEY}" \
-H "Content-Type: application/json" \
-d @- \
| jq -r '.choices[0].message.content // .error.message // "Unknown OpenRouter error"'
}
orpipe() {
orask "$(cat)"
}
使用方式:
orask "Turn this error message into a likely diagnosis: connection reset by peer"
cat README.md | orpipe
如果腳本還需要中繼資料,就不要只擷取文字,而是保留完整 JSON:
orjson() {
local prompt="$*"
local model="${OR_MODEL:?Set OR_MODEL to an OpenRouter model ID}"
jq -n \
--arg model "$model" \
--arg prompt "$prompt" \
'{model: $model, messages: [{role: "user", content: $prompt}], stream: false}' \
| curl -sS --fail-with-body \
https://openrouter.ai/api/v1/chat/completions \
-H "Authorization: Bearer ${OPENROUTER_API_KEY:?Set OPENROUTER_API_KEY}" \
-H "Content-Type: application/json" \
-d @-
}
如此一來,回應中的 usage 物件仍可用於成本統計,也能分辨 API 錯誤與模型回傳空內容這兩種情況。
從命令列找出相容模型
模型出現在目錄中,不代表它支援所有請求參數。OpenRouter Models API 支援依 supported_parameters 篩選,包括 tools,也能依定價、上下文長度、吞吐量、延遲、熱門程度或新近程度排序。
以下指令會依文件定義的排序方式,從價格較低的一端列出支援工具的模型:
curl -sS -G https://openrouter.ai/api/v1/models \
--data-urlencode 'supported_parameters=tools' \
--data-urlencode 'sort=pricing-low-to-high' \
| jq -r '.data[] | [.id, .context_length, .pricing.prompt, .pricing.completion] | @tsv' \
| head -20
把模型放進正式腳本前,先檢查一次模型詳細資料。OpenRouter 將單一模型的詳細端點定義為 /api/v1/model/{author}/{slug}:
curl -sS \
"https://openrouter.ai/api/v1/model/${OR_MODEL}" \
| jq '.data | {id, context_length, architecture, pricing, supported_parameters, top_provider}'
pricing 的數值是以每個 token 或單位表示,因此不能直接把原始小數當成「每百萬 token 多少美元」來解讀,必須先換算。若要確認一次請求實際消耗多少輸入與輸出 token,回應中的 usage 欄位才是較可靠的依據。
在 Shell 管線中進行批次處理
一個實用的批次流程,是讓文字檔每行放一則提示,並為每個結果輸出一個 JSON 物件。下面的腳本會保留原始提示、回答、用量與錯誤欄位,避免模型文字和機器可讀輸出混在一起。
建立 prompts.txt:
Summarize the release notes in one paragraph.
List three security risks in this configuration.
Extract the names and versions from this sentence.
執行批次工作:
#!/usr/bin/env bash
set -u
: "${OPENROUTER_API_KEY:?Set OPENROUTER_API_KEY}"
: "${OR_MODEL:?Set OR_MODEL}"
while IFS= read -r prompt || [[ -n "$prompt" ]]; do
[[ -z "$prompt" ]] && continue
request=$(jq -n \
--arg model "$OR_MODEL" \
--arg prompt "$prompt" \
'{model: $model, messages: [{role: "user", content: $prompt}], stream: false}')
response=$(curl -sS --fail-with-body \
https://openrouter.ai/api/v1/chat/completions \
-H "Authorization: Bearer ${OPENROUTER_API_KEY}" \
-H "Content-Type: application/json" \
-d "$request" || true)
if jq -e '.choices[0].message.content' >/dev/null 2>&1 <<<"$response"; then
jq -c --arg prompt "$prompt" \
'{prompt: $prompt, answer: .choices[0].message.content, usage: (.usage // null)}' \
<<<"$response"
else
jq -c --arg prompt "$prompt" \
'{prompt: $prompt, answer: null, error: (.error.message // "Request failed"), usage: (.usage // null)}' \
<<<"$response"
fi
done < prompts.txt > results.jsonl
這個腳本會循序執行;只有在確認速率限制與預算後,才值得加入並行處理,因為平行請求可能很快推高成本。OpenRouter 的 定價頁面列出免費方案每天 50 次請求,以及隨用隨付方案 5.5% 的平台費,因此免費模型不代表可以無限制進行批次處理。
llm 與 aichat 適合放在哪裡?
llm 與 aichat 都是支援 OpenRouter 的通用終端機工作台。當你需要可重複使用的提示、工作階段、附件、工具、本機模型,或想保留過往操作記錄時,它們會比簡單的 Shell 包裝函式更合適。
llm-openrouter:具備記錄與擴充能力的選項
先安裝基礎的 llm 指令,再加入 OpenRouter 外掛:
llm install llm-openrouter
llm keys set openrouter
外掛文件將 OPENROUTER_KEY 列為環境變數名稱。它會以 openrouter/anthropic/claude-sonnet-5 這類名稱提供 OpenRouter 模型,並把模型清單快取一小時;若要重新整理,可執行:
llm openrouter refresh
llm models list
一般提示與 Shell 管線可以這樣寫:
llm -m openrouter/anthropic/claude-sonnet-5 \
"Give me five short names for a pet tarantula"
cat app.py | llm -m openrouter/anthropic/claude-sonnet-5 \
-s "Review this code for a security bug"
外掛文件列出結構描述、附件、工具呼叫、推理選項、服務商路由 JSON、OpenRouter 網路工具,以及金鑰檢視等功能。它介於原始 curl 與自主程式代理之間,但模型快取可能會落後於即時目錄。
aichat:功能更完整的終端機工作台
aichat 是以 Rust 開發的 CLI,除了 OpenRouter,也支援 20 多個具名服務商與 OpenAI 相容端點。文件列出的功能包括 CMD 模式、Chat-REPL、Shell 輔助、工作階段、巨集、RAG、函式呼叫、MCP 工具、代理,以及提供聊天、嵌入與重新排序端點的本機伺服器。
它的 OpenRouter 設定方式,是將 OpenAI 相容客戶端指向 https://openrouter.ai/api/v1;專案範例則使用 openrouter:<model> 格式指定模型。如果終端機逐漸成為你的應用程式介面,可以考慮這類工作台;如果想要更精簡、也更容易檢查的請求路徑,則可使用 curl 或 llm。
排查那些看起來像 CLI 問題的故障
OpenRouter CLI 的故障可能發生在 Shell、客戶端、指定模型與帳戶之間的任一層。與其立刻更換工具,不如先分層確認問題所在。
| 症狀 | 先檢查什麼 | 可能出問題的層級 |
|---|---|---|
401 或找不到金鑰 | 確認客戶端預期的環境變數名稱;llm-openrouter 使用 OPENROUTER_KEY,原始 API 範例則使用 OPENROUTER_API_KEY | Shell 或客戶端驗證 |
| Ori 能開啟代理,但模型被拒絕 | 確認模型 ID,以及底層代理對 API 的要求 | 代理與模型的相容性 |
| 選擇器中找不到某個模型 | 重新整理 llm 的一小時快取;其他代理則拿 /api/v1/models 的結果比對 | 客戶端模型目錄 |
| 工具或結構描述請求失敗 | 以 supported_parameters=tools 篩選 /models,或檢查模型中繼資料 | 模型能力 |
| 免費請求突然停止 | 確認目前免費方案的請求上限,以及該模型是否仍以免費形式提供 | 帳戶或平台政策 |
| 成本高於預期 | 記錄 .usage、所選服務商、路由選項與快取行為 | 請求與服務商路由 |
在一篇討論 OpenCode 與 Kilo Code 的 Reddit 討論中,使用者 u/GrevireDev 寫道:
「Kilo Code 與 OpenCode 都使用硬編碼/預先載入的 OpenRouter 模型清單,而不是動態抓取完整目錄。」— r/openrouter
使用者 u/DrunkenRobotBipBop 也在另一篇 OpenRouter 討論中提到成本與快取問題:
「請留意你在 OpenRouter 中處理快取的方式。每次服務商變更,快取就會失效,而你將支付完整價格。」— r/openrouter
這些內容可以當作排錯線索,但不要視為計費規則;實際成本仍應透過請求用量、服務商資料與目前的 OpenRouter 定價進行確認。
OpenRouter CLI 常見問題
以下整理的是搜尋 openrouter cli 時最常見的安裝與選擇問題。簡短答案會把問題導向正確層級:官方啟動器、原始 API、社群客戶端或模型目錄。
OpenRouter 有官方 CLI 嗎?
有。OpenRouter 官方文件目前介紹的是 ori CLI,但 Ori 的定位是既有程式代理工具的啟動器與設定層。OpenRouter 的 @openrouter/cli npm 套件則是另一個 DevTools 工具;至於 @aaronjmars/openroutercli 這類直接處理聊天與 API 的 CLI,則屬於社群專案。
不安裝 CLI,也能從終端機使用 OpenRouter 嗎?
可以。只要對 https://openrouter.ai/api/v1/chat/completions 發送帶有 Bearer 驗證的 curl 請求,就能完成單次提示;再搭配 jq,即可擷取文字或在管線中保留完整 JSON。
哪個 OpenRouter CLI 最適合 JSON 管線?
對小型腳本來說,直接使用 curl 的隱藏行為最少。若需要更完整的指令介面,可選擇明確文件化 JSON 模式的客戶端,例如 @aaronjmars/openroutercli;也可以使用 llm,並明確保留腳本真正需要的回應資料。
為什麼我的 CLI 顯示的模型比 OpenRouter 網站少?
客戶端可能會快取模型目錄,或直接附帶預先載入的模型清單。請將選擇器內容與 curl https://openrouter.ai/api/v1/models 的結果比對,在支援的情況下重新整理客戶端快取,並使用 API 回傳的確切模型 ID,而不是顯示名稱。
Ori 需要 OpenRouter API 金鑰嗎?
OpenRouter 的 Ori 文件表示,一般登入流程使用 OAuth PKCE,因此使用者不需要建立並貼上另一組 API 金鑰。原始 curl、llm-openrouter 與大多數社群客戶端,仍需要金鑰或各自的驗證設定。
開始自動化 OpenRouter CLI 工作流程前
在固定使用某個模型前,先查詢即時 Models API;同時記錄模型 ID 與回應中的 usage,並設定帳戶或金鑰預算。CLI 只是前端介面:真正決定工作流程是否可靠、是否負擔得起的,仍是 OpenRouter 模型、服務商路由、上下文大小與帳戶限制。