AIREITER

OpenRouter CLI: Ori, curl, llm, aichat 비교

마지막 업데이트: 2026-09-01 01:55:24

OpenRouter CLI를 찾다 보면 서로 다른 두 가지 답을 만나게 됩니다. OpenRouter의 공식 ori 명령은 기존 코딩 에이전트를 설정하고 실행하는 도구이고, 커뮤니티 클라이언트는 일회성 프롬프트, REPL 채팅, JSON 출력, 폭넓은 API 접근을 제공합니다. 단순히 셸 파이프라인만 필요하다면 OpenRouter API와 curl만으로도 충분합니다.

실제로 ‘OpenRouter CLI’가 가리키는 것

‘OpenRouter CLI’는 하나의 범용 공식 터미널 클라이언트 이름이 아닙니다. OpenRouter를 통해 에이전트를 실행하거나, 셸에서 API를 직접 호출하거나, llm이나 aichat 같은 서드파티 터미널 작업 환경을 사용하는 세 가지 흐름을 통칭하는 표현에 가깝습니다.

터미널에서 하려는 일시작점이유
Claude Code, Codex, OpenCode 또는 지원되는 다른 에이전트 실행공식 Ori Harness기존 에이전트 위에 OAuth, 모델 선택, OpenRouter 설정을 적용할 수 있음
프롬프트 하나를 보내거나 표준 입력을 처리curl과 jq추가 CLI 의존성 없이 요청을 완전히 제어할 수 있음
여러 OpenRouter 엔드포인트를 살펴보고 JSON 반환@aaronjmars/openroutercli폭넓은 명령 범위, JSON 모드, 범용 요청을 위한 우회 경로 제공
모델 검색이 가능한 채팅 REPL 사용@letuscode/openrouter-cli일회성 프롬프트, REPL 채팅, 퍼지 모델 검색, 설정 프로필 지원
여러 모델을 대상으로 프롬프트, 배치 작업, 프롬프트 체인 실행orc프로필, 템플릿, 배치 처리, 체이닝, 코드 분석 지원
로그, 스키마, 첨부 파일, 플러그인 관리llm-openrouter확장 가능한 llm CLI에 OpenRouter 모델을 추가할 수 있음
채팅, 셸 지원, RAG, 에이전트, 로컬 제공자를 한데 사용aichatOpenRouter 전용 클라이언트가 아닌, 더 넓은 범위의 Rust 기반 터미널 작업 환경

핵심은 누가 만들었는지와 어디까지 다루는지를 구분하는 것입니다. 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 page showing the official CLI entry point

에이전트는 그대로 두고 모델만 선택하기

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 문서에 따르면 요청은 별도의 Ori 요금 없이 일반적인 OpenRouter 과금 및 활동 보고 체계를 따릅니다. 실제 추론 비용은 선택한 모델과 기반 하니스에 따라 달라집니다.

독립형 채팅 REPL은 아니다

에이전트의 도구, 파일 작업, 승인 방식을 사용하려는 경우에는 Ori가 적합합니다. 반대로 코딩 에이전트를 실행하지 않고 프롬프트, 구조화된 응답, 셸 파이프라인만 처리하려면 curl, 직접 API 클라이언트, llm, aichat을 사용하는 편이 맞습니다.

이 구분이 중요한 이유는 공식 출시 자료가 Ori를 호환성과 설정을 담당하는 계층으로 설명하기 때문입니다. 공식 @openrouter/cli 패키지도 자주 혼동되는 대상입니다. 현재 문서에 나오는 명령은 openrouter devtools와 openrouter statusline이며, 버전 1.0 계열에서는 start, stop, restart, code 같은 이전 프록시 명령이 제거되었습니다.

알아둘 만한 커뮤니티 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 명령을 사용하며, 위의 스코프 클라이언트와 프로젝트 및 패키지 이름이 다름
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, 셸 어시스턴트, RAG, 에이전트, MCP, 로컬 제공자, 로컬 HTTP 서버추상화 범위가 넓으며, README에는 제공자별 기능 또는 보안 매트릭스가 제공되지 않음

위 내용은 문서에 명시된 기능을 정리한 것이며, 서로 비교 가능한 성능 벤치마크는 아닙니다.

가장 작고 투명한 방법: curl과 jq

이미 curl과 jq가 설치되어 있다면, OpenRouter API를 직접 호출하는 방식이 가장 간단하고 동작을 확인하기 쉽습니다. OpenRouter Quickstart는 Bearer 인증, OpenAI 호환 /api/v1/chat/completions 엔드포인트, model 필드, messages 배열, 선택적 스트리밍을 안내합니다.

셸 세션에서 키와 모델을 지정합니다.

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, 컨텍스트 길이, 가격, 지원 파라미터, 제공자 제한, 선택적 벤치마크 메타데이터를 확인할 수 있습니다.

재사용 가능한 셸 함수로 감싸기

아래 함수는 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에서는 tools를 포함한 supported_parameters 필터를 지원하며, 가격, 컨텍스트, 처리량, 지연 시간, 인기도, 최신순 등으로 정렬할 수 있습니다.

문서에 정의된 정렬 순서에서 저렴한 모델부터 도구 지원 모델을 나열하려면 다음과 같이 실행합니다.

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 값은 토큰 또는 단위당 기준으로 표시됩니다. 따라서 원시 소수값을 환산하지 않고 곧바로 100만 토큰당 달러 가격으로 읽으면 안 됩니다. 실제 요청에서 입력 및 출력 토큰을 얼마나 사용했는지는 응답의 usage 필드에서 확인하는 편이 안전합니다.

셸 파이프라인으로 배치 처리하기

텍스트 파일에 프롬프트를 한 줄씩 저장하고, 결과도 한 줄에 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를 지원하는 범용 터미널 작업 환경입니다. 재사용 가능한 프롬프트, 세션, 첨부 파일, 도구, 로컬 모델, 이전 작업 기록이 필요하다면 단순한 셸 래퍼보다 이런 도구가 더 적합합니다.

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

일반적인 프롬프트와 셸 파이프라인은 다음과 같은 형태입니다.

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은 OpenRouter를 비롯해 20개가 넘는 명시적 제공자와 OpenAI 호환 엔드포인트를 지원하는 Rust 기반 CLI입니다. 문서에 따르면 CMD 모드, Chat-REPL, 셸 지원, 세션, 매크로, RAG, 함수 호출, MCP 도구, 에이전트, 채팅·임베딩·리랭킹 엔드포인트를 제공하는 로컬 서버까지 포함합니다.

OpenRouter 설정에서는 https://openrouter.ai/api/v1을 가리키는 OpenAI 호환 클라이언트로 구성하며, 프로젝트 예제에서는 openrouter:<model> 형식의 모델 이름을 사용합니다. 터미널 자체가 애플리케이션의 주요 인터페이스가 되어가는 상황이라면 선택할 만하고, 더 작고 동작을 확인하기 쉬운 요청 경로가 필요하다면 curl이나 llm이 적합합니다.

CLI 문제처럼 보이는 오류를 진단하는 방법

OpenRouter CLI 오류는 셸, 클라이언트, 선택한 모델, 계정 사이의 경계에서 발생할 수 있습니다. 도구를 바꾸기 전에 각 계층을 따로 확인하는 것이 좋습니다.

증상먼저 확인할 것가능성이 높은 계층
401 또는 키 누락 오류클라이언트가 기대하는 변수 이름을 출력해 확인합니다. llm-openrouter는 OPENROUTER_KEY를 사용하고, 원시 API 예제는 OPENROUTER_API_KEY를 사용합니다셸 또는 클라이언트 인증
Ori가 에이전트를 열지만 모델이 거부됨모델 ID와 기반 하니스의 API 요구 사항을 확인합니다하니스와 모델의 호환성
모델 선택 목록에 특정 모델이 없음llm의 한 시간 캐시를 갱신하고, 다른 하니스는 /api/v1/models 결과와 비교합니다클라이언트 카탈로그
도구 또는 스키마 요청 실패supported_parameters=tools로 /models를 필터링하거나 모델 메타데이터를 확인합니다모델 기능
무료 요청이 예상보다 일찍 중단됨현재 무료 플랜 요청 한도와 해당 모델이 여전히 무료로 제공되는지 확인합니다계정 또는 플랫폼 정책
예상보다 비용이 많이 나옴.usage, 선택한 제공자, 라우팅 옵션, 캐시 동작을 기록합니다요청 및 제공자 라우팅

OpenCode와 Kilo Code에 관한 Reddit 토론에서 u/GrevireDev는 다음과 같이 썼습니다.

“Both Kilo Code and OpenCode maintain a hard-coded/preloaded list of OpenRouter models instead of dynamically fetching the full catalog.” — r/openrouter

또 다른 OpenRouter 토론에서 u/DrunkenRobotBipBop은 비용과 캐시에 관해 다음과 같이 지적했습니다.

“Take care of how you handle caching in openrouter. Everytime the provider changes, the cache is gone and you are going to pay full price.” — r/openrouter

이 의견들은 문제를 좁혀 가기 위한 단서로 참고하고, 과금 규칙으로 받아들이지는 마세요. 실제 비용은 요청 사용량, 제공자 데이터, 현재 OpenRouter 가격 정보를 기준으로 확인해야 합니다.

OpenRouter CLI FAQ

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을 그대로 보존할 수 있습니다.

JSON 파이핑에 적합한 OpenRouter CLI는 무엇인가요?

작은 스크립트라면 숨겨진 동작이 가장 적은 원시 curl이 단순합니다. 더 넓은 명령 범위가 필요하다면 @aaronjmars/openroutercli처럼 JSON 모드를 문서화한 클라이언트를 사용하거나, 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의 모델, 제공자 라우팅, 컨텍스트 크기, 계정 제한입니다.