Запрос OpenRouter CLI может привести к двум совершенно разным решениям. Официальная команда OpenRouter ori настраивает и запускает уже существующих coding-агентов, тогда как сторонние клиенты умеют отправлять разовые запросы, работать в REPL, возвращать JSON и закрывать более широкий спектр задач API. Если нужен всего лишь shell-пайплайн, достаточно API OpenRouter и curl.
Что на практике скрывается за названием OpenRouter CLI
«OpenRouter CLI» — не название единого универсального официального клиента для терминала. Под ним обычно понимают один из трёх сценариев: запуск агента через OpenRouter, прямой вызов API из shell или использование сторонней терминальной среды вроде llm или aichat.
| Что нужно сделать в терминале | С чего начать | Почему |
|---|---|---|
| Запустить Claude Code, Codex, OpenCode или другого поддерживаемого агента | Официальный Ori Harness | OAuth, выбор модели и настройки OpenRouter применяются поверх уже существующего агента |
| Отправить один запрос или обработать stdin | curl вместе с jq | Не нужны дополнительные зависимости, а тело запроса полностью под контролем |
| Работать со множеством эндпоинтов OpenRouter и получать JSON | @aaronjmars/openroutercli | Много команд, JSON-режим и универсальная команда для произвольных запросов |
| Использовать чат-REPL с поиском моделей | @letuscode/openrouter-cli | Разовые запросы, REPL-чат, нечёткий поиск моделей и профили конфигурации |
| Запускать запросы к нескольким моделям, пакетную обработку или цепочки промптов | orc | Профили, шаблоны, пакетная обработка, цепочки запросов и анализ кода |
| Хранить логи, схемы, вложения и плагины | llm-openrouter | Добавляет модели OpenRouter в расширяемый CLI llm |
| Объединить чат, помощь с shell, RAG, агентов и локальные провайдеры | aichat | Более широкая терминальная среда на Rust, а не клиент только для OpenRouter |
Главное различие — в происхождении и области применения инструментов. Интеграция OpenRouter с ori и пакет @openrouter/cli DevTools являются официальными, но ни один из них не представляет собой универсальный клиент формата openrouter ask: пакет DevTools сосредоточен на просмотре телеметрии SDK и статусной строке Claude Code, а Ori запускает уже существующие harness-инструменты.
Официальный вариант: установка и запуск Ori Harness
Ori — официальный CLI OpenRouter для настройки поддерживаемых coding-агентов. Он аутентифицирует пользователя в OpenRouter, передаёт выбранную модель нижележащему агенту и сохраняет его стандартные команды и флаги. Ori не заменяет Claude Code, Codex, OpenCode и другие harness-инструменты.
Установите его командой из анонса и документации 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 и передаёт нераспознанные аргументы нижележащему harness-инструменту:
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, а OpenAI-совместимые клиенты вроде Codex работают с https://openrouter.ai/api/v1. Одна из задач Ori как раз состоит в том, чтобы скрывать эти различия конфигурации.
Для входа Ori использует браузерный OAuth PKCE, поэтому в обычном сценарии не требуется вставлять API-ключ OpenRouter в каждый агент. В документации Ori Harness OpenRouter указано, что запросы учитываются в стандартной биллинговой системе и статистике активности OpenRouter, отдельного счёта за Ori нет. При этом стоимость инференса по-прежнему зависит от выбранной модели и самого harness-инструмента.
Ori — не самостоятельный чат-REPL
Ori стоит использовать, если вам нужны инструменты агента, операции с файлами или его модель подтверждений. Для обычного промпта, структурированного ответа или shell-пайплайна, который не должен запускать coding-агента, подойдут curl, прямой клиент, llm или aichat.
Это важная граница: в официальных материалах Ori представлен как слой совместимости и конфигурации. Путаницу добавляет отдельный официальный пакет @openrouter/cli. Согласно его текущей документации, команды пакета — openrouter devtools и openrouter statusline, а в ветке версии 1.0 были удалены прежние proxy-команды start, stop, restart и code.
Сторонние OpenRouter-клиенты, о которых стоит знать
Сторонние клиенты отличаются прежде всего тем, какой интерфейс для терминала они предлагают. На практике выбор сводится к тому, нужен ли вам интерактивный выбор модели, полный доступ к API, компактный бинарник, автоматизация для нескольких моделей или предсказуемый машиночитаемый вывод.
| Клиент | Установка или запуск | Сильная сторона | Что проверить заранее |
|---|---|---|---|
@aaronjmars/openroutercli | npm install -g @aaronjmars/openroutercli | Широкий доступ к API OpenRouter, OAuth PKCE, --json, данные об использовании, медиа-задачи и request METHOD path | Неофициальный проект; нужен Node.js 20+; для команд управления требуется management key |
@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-клиент, что указан выше |
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 | Логи, алиасы, схемы, вложения, инструменты и зрелый workflow на базе плагинов | Использует переменную OPENROUTER_KEY; каталог моделей кэшируется на один час |
aichat | Установка через менеджер пакетов или из бинарника | REPL, shell-ассистент, RAG, агенты, MCP, локальные провайдеры и локальный HTTP-сервер | Широкая абстракция; в README нет матрицы возможностей и безопасности по каждому провайдеру |
Это перечисленные в документации возможности, а не сопоставимые тесты производительности.
Самый простой надёжный вариант: curl и jq
Если curl и jq уже установлены, прямой вызов API OpenRouter остаётся самым компактным и прозрачным способом работы из терминала. В Quickstart OpenRouter описаны 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'
Модель лучше хранить в переменной окружения, а не дублировать её идентификатор в каждом скрипте. Официальный Models API возвращает id, длину контекста, цены, поддерживаемые параметры, ограничения провайдера и, опционально, метаданные бенчмарков.
Оберните запрос в переиспользуемые shell-функции
Эти функции формируют корректный JSON: кодированием промпта занимается jq. 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 можно отличить от пустого ответа модели.
Как найти совместимые модели из командной строки
Наличие модели в каталоге ещё не означает, что она поддерживает любой параметр запроса. Models API OpenRouter умеет фильтровать модели по 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
Перед тем как указывать модель в production-скрипте, проверьте её описание. 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 указаны за токен или единицу, поэтому не воспринимайте сырое десятичное число как цену за миллион токенов без пересчёта. Поле 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. Они лучше подходят, чем небольшой wrapper, если нужны переиспользуемые промпты, сессии, вложения, инструменты, локальные модели или история предыдущей работы.
llm-openrouter: расширяемый клиент с логами
Сначала установите базовую команду llm, затем добавьте плагин OpenRouter:
llm install llm-openrouter
llm keys set openrouter
В документации плагина для переменной окружения используется имя OPENROUTER_KEY. Модели OpenRouter доступны под именами вроде openrouter/anthropic/claude-sonnet-5. Список кэшируется на один час, а обновить его можно так:
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 и автономным coding-harness, но кэш моделей может обновляться позже живого каталога.
aichat: более универсальная терминальная среда
aichat — CLI на Rust, который поддерживает OpenRouter наряду с более чем 20 именованными провайдерами и OpenAI-совместимыми эндпоинтами. В его документации перечислены CMD-режим, Chat-REPL, помощь с shell, сессии, макросы, RAG, вызов функций, MCP-инструменты, агенты и локальный сервер с эндпоинтами для чата, эмбеддингов и reranking.
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 запускает агента, но модель отклоняется | Проверьте идентификатор модели и требования нижележащего harness к API | Совместимость harness и модели |
| Модель не отображается в списке | Обновите часовой кэш llm; для других harness-инструментов сравните список с /api/v1/models | Каталог клиента |
| Запрос с инструментом или схемой завершается ошибкой | Отфильтруйте /models по supported_parameters=tools или изучите метаданные модели | Возможности модели |
| Бесплатный запрос неожиданно прекращается | Проверьте текущий лимит бесплатного плана и то, предлагается ли модель по-прежнему бесплатно | Аккаунт или правила платформы |
| Стоимость выше ожидаемой | Сохраните .usage, выбранного провайдера, параметры маршрутизации и поведение кэша | Запрос и маршрутизация провайдера |
В обсуждении OpenCode и Kilo Code на Reddit пользователь u/GrevireDev написал:
«И Kilo Code, и OpenCode используют жёстко заданный/предзагруженный список моделей OpenRouter вместо динамической загрузки полного каталога». — r/openrouter
В другой дискуссии об OpenRouter пользователь u/DrunkenRobotBipBop отметил связь стоимости и кэширования:
«Следите за тем, как обрабатывается кэш в OpenRouter. Каждый раз, когда провайдер меняется, кэш сбрасывается, и вам придётся платить полную цену». — r/openrouter
Воспринимайте эти высказывания как направления для диагностики, а не как правила биллинга. Стоимость нужно проверять по данным об использовании конкретного запроса, информации о провайдере и актуальным тарифам OpenRouter.
FAQ по OpenRouter CLI
Ниже — ответы на типичные вопросы, которые стоят за запросом openrouter cli. Они помогают понять, на каком уровне искать решение: в официальном launcher, прямом API, стороннем клиенте или каталоге моделей.
Есть ли у OpenRouter официальный CLI?
Да. OpenRouter официально документирует CLI ori, но Ori — это launcher и слой конфигурации для уже существующих coding-harness. npm-пакет OpenRouter @openrouter/cli — отдельная утилита DevTools, а CLI для прямой работы с чатом и API, например @aaronjmars/openroutercli, являются сторонними проектами.
Можно ли пользоваться OpenRouter из терминала без установки CLI?
Да. Для разового запроса достаточно выполнить Bearer-аутентифицированный вызов curl к https://openrouter.ai/api/v1/chat/completions, а с помощью jq можно извлечь текст или сохранить JSON для дальнейшего пайплайна.
Какой OpenRouter CLI лучше подходит для передачи JSON по пайпу?
Для небольшого скрипта сырой curl оставляет меньше скрытой логики. Если нужен более широкий набор команд, подойдёт клиент с документированным JSON-режимом, например @aaronjmars/openroutercli. Ещё один вариант — llm, если явно сохранять необходимые данные ответа.
Почему мой CLI показывает меньше моделей, чем сайт OpenRouter?
Клиент может кэшировать каталог или поставляться с заранее загруженным списком моделей. Сравните список в интерфейсе с результатом curl https://openrouter.ai/api/v1/models, обновите кэш там, где это поддерживается, и передавайте точный идентификатор модели, а не её отображаемое имя.
Требует ли Ori API-ключ OpenRouter?
Согласно документации Ori, обычный вход выполняется через OAuth PKCE, поэтому создавать и вставлять отдельный API-ключ не требуется. Для сырого curl, llm-openrouter и большинства сторонних клиентов всё равно понадобится ключ или собственная настройка аутентификации.
Что проверить до автоматизации workflow с OpenRouter CLI
Перед фиксацией модели запросите актуальный Models API, сохраните идентификатор модели и значение usage из ответа, а также установите бюджет для аккаунта или ключа. CLI — лишь внешний интерфейс: надёжность и стоимость workflow по-прежнему определяются моделью OpenRouter, маршрутом провайдера, размером контекста и лимитами аккаунта.