AIREITER

OpenRouter CLI:Ori、curl、llm 與 aichat

最近更新: 2026-09-01 01:55:49

搜尋 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 設定
送出單次提示或處理 stdincurl 搭配 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。

OpenRouter Ori Harness 頁面,顯示官方 CLI 入口

換模型,不必更換代理工具

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/openrouterclinpm install -g @aaronjmars/openroutercli廣泛的 OpenRouter API 存取、OAuth PKCE、--json、用量資料、媒體工作,以及 request METHOD path非官方;需要 Node.js 20+;管理指令需要管理金鑰
@letuscode/openrouter-clinpm i -g @letuscode/openrouter-cliopenrouter ask、repl、模糊模型搜尋、設定檔、範本,以及 Markdown/純文字輸出README 說明目前仍在 MVP 開發階段;需要 Node.js 18.17+;採用 Polyform Noncommercial 1.0.0
orcnpm install -g openrouter-cli多模型提示、設定檔、範本、批次處理、提示串接與程式碼分析需要 Node.js 22+;使用 orc 指令;專案與套件名稱都不同於上方的 scoped client
ortcargo +nightly-2026-03-25 install --locked ort-openrouter-cli快速的 Linux 終端機操作、服務商選擇、stdin、圖片、支援 tmux 的延續工作,以及延遲/成本統計僅支援 Linux/x86_64;README 明確揭露它不會驗證 TLS 憑證
llm-openrouterllm 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_KEYShell 或客戶端驗證
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 模型、服務商路由、上下文大小與帳戶限制。