AIREITER

OpenRouter CLI: Ori, curl, llm и aichat

Последнее обновление: 2026-09-01 01:57:40

Запрос 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 HarnessOAuth, выбор модели и настройки OpenRouter применяются поверх уже существующего агента
Отправить один запрос или обработать stdincurl вместе с 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.

OpenRouter Ori Harness page showing the official CLI entry point

Выбирайте модель, не меняя самого агента

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/openrouterclinpm install -g @aaronjmars/openroutercliШирокий доступ к API OpenRouter, OAuth PKCE, --json, данные об использовании, медиа-задачи и request METHOD pathНеофициальный проект; нужен Node.js 20+; для команд управления требуется management key
@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-клиент, что указан выше
ortcargo +nightly-2026-03-25 install --locked ort-openrouter-cliБыстрая работа в Linux-терминале, выбор провайдера, stdin, изображения, продолжение с учётом tmux и статистика задержки/стоимостиТолько Linux/x86_64; README прямо сообщает, что клиент не проверяет TLS-сертификаты
llm-openrouterllm 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_KEYShell или аутентификация клиента
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, маршрутом провайдера, размером контекста и лимитами аккаунта.