IKORG
English

← Практика · 30 августа 2026

OpenRouter вместо пяти подписок: одна команда для совета любой модели

Настраиваем доступ к Kimi, Qwen, DeepSeek, Gemini и Grok по одному ключу с оплатой за токены — и считаем, во сколько реально обходится совет.

7 минут чтенияинструменты

Подписка на ChatGPT — тысяча рублей в месяц. На Claude — столько же. А если захотелось спросить ещё и Kimi, Qwen, DeepSeek, Gemini и Grok, подписок нужно семь, и это уже не «сравнить модели», а статья расходов.

Есть третий путь: OpenRouter — один ключ, через который доступны десятки моделей, оплата по токенам, никаких ежемесячных списаний. Я через него провёл целый сезон сравнения семи нейросетей — девять заданий, шестьдесят три работы, пятьдесят семь голосований — и уложился в 22 доллара.

Ниже — как это подключить и сколько на самом деле стоит.

Когда это выгоднее подписки

Подписка выгодна, если вы работаете с моделью каждый день по многу часов. Поштучная оплата выгодна, когда обращения редкие, но разнообразные: спросить второе мнение, сравнить ответы трёх моделей, разово перегнать текст, проверить, не появилось ли что-то лучше вашего основного инструмента.

Простая прикидка: типичная консультация — вопрос на пару тысяч знаков и ответ на четыре — это примерно тысяча входных и полторы тысячи выходных токенов. У DeepSeek такой обмен стоит примерно четверть цента. Тысяча таких вопросов — около трёх долларов. Подписка окупится, только если вы задаёте их сотнями в день.

Шаг 1. Ключ

Регистрируетесь на openrouter.ai, пополняете баланс (минимум небольшой — от пяти долларов), в разделе Keys создаёте ключ. Он выглядит как sk-or-v1-….

Ключ — это деньги. Никогда не кладите его в код и не публикуйте в статьях:

mkdir -p ~/.config/openrouter
printf 'sk-or-v1-ваш-ключ\n' > ~/.config/openrouter/key
chmod 600 ~/.config/openrouter/key

Шаг 2. Скрипт

Кладём в ~/.local/bin/ask-or:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Вопрос любой модели через OpenRouter: ask-or <модель> "вопрос" (или текст в stdin)."""
import json, os, sys, urllib.request

КЛЮЧ = open(os.path.expanduser('~/.config/openrouter/key')).read().strip()
МОДЕЛИ = {                      # короткие имена, чтобы не помнить полные
    'kimi':     'moonshotai/kimi-k3',
    'qwen':     'qwen/qwen3.8-max',
    'deepseek': 'deepseek/deepseek-v4-pro-0813',
    'gemini':   'google/gemini-3.7-flash',
    'grok':     'x-ai/grok-4.6',
}

имя = sys.argv[1] if len(sys.argv) > 1 else 'deepseek'
вопрос = ' '.join(sys.argv[2:]) or sys.stdin.read()
if not вопрос.strip():
    sys.exit('пустой вопрос')

запрос = urllib.request.Request(
    'https://openrouter.ai/api/v1/chat/completions',
    data=json.dumps({
        'model': МОДЕЛИ.get(имя, имя),
        'messages': [{'role': 'user', 'content': вопрос}],
        'max_tokens': 8000,
    }).encode(),
    headers={
        'Authorization': f'Bearer {КЛЮЧ}',
        'Content-Type': 'application/json',
        'X-Title': 'personal cli',      # только латиница: заголовок ломается на кириллице
    })

ответ = json.load(urllib.request.urlopen(запрос, timeout=600))
выбор = ответ['choices'][0]
print(выбор['message']['content'])

п = ответ.get('usage', {})
print(f"\n[{ответ.get('model')}: вход {п.get('prompt_tokens')}, "
      f"выход {п.get('completion_tokens')}, причина: {выбор.get('finish_reason')}]",
      file=sys.stderr)
chmod +x ~/.local/bin/ask-or
ask-or deepseek "Ответь одним словом: работает?"
cat модуль.py | ask-or kimi "найди ошибки в этом коде"

Расход печатается в stderr — это удобно: ответ можно направить в файл, а цифры останутся на экране.

Сколько это стоит на самом деле

Тарифы OpenRouter на момент моего сезона, доллары за миллион токенов:

Модель Вход Выход
DeepSeek V4 Pro 0,66 1,98
Gemini 3.7 Flash 0,75 3,75
Qwen 3.8 Max 2,00 6,00
Grok 4.6 2,00 6,00
Kimi K3 3,00 15,00

Разница между крайними — больше чем в семь раз по выходу. И вот что важно: дороже не значит лучше для вашей задачи. В моём сравнении Kimi обошёлся почти в восемь раз дороже GPT и набрал всего на шестнадцать баллов больше из двухсот семидесяти возможных.

Ещё одна ловушка — «думающие» модели. Они тратят токены на рассуждения, которых вы не видите, но платите за них. У меня в сезоне DeepSeek на одной логической задаче сжёг 313 тысяч токенов и справился хуже, чем модель, потратившая тысячу. Поэтому смотрите не на цену за миллион, а на цену ответа.

Проверить остаток на балансе можно в любой момент:

curl -s -H "Authorization: Bearer $(cat ~/.config/openrouter/key)" \
  https://openrouter.ai/api/v1/key | python3 -m json.tool

Грабли, которые стоили мне времени

Кириллица в заголовках HTTP. Заголовок X-Title с русским текстом валит запрос: библиотека не может закодировать его в latin-1. Только латиница.

Обрыв по лимиту токенов выглядит как готовый ответ. Если finish_reason вернулся как length, ответ обрезан на полуслове — модель не закончила. У меня из-за этого один участник сравнения получил обрезанную работу и последнее место, пока я не поднял потолок. Проверяйте это поле всегда.

Пустой ответ при непустом расходе. Некоторые модели ухитряются потратить весь лимит на внутренние рассуждения и вернуть пустое поле с содержимым. Формально успех, фактически ничего. Обрабатывайте этот случай отдельно, иначе получите пустоту в выводе и полное непонимание, что произошло.

Не все модели видят картинки. Отправить изображение можно только тем, у кого есть зрение; остальным нужно текстовое описание. Проверять надо заранее, а не по факту странного ответа.

Модели меняются и исчезают. Идентификаторы вроде moonshotai/kimi-k3 живут не вечно: версии обновляются, старые уходят. Держите список моделей в одном месте — как в словаре выше, — чтобы правка была в одной строке.

Что с этим делать дальше

Самое полезное применение — не «заменить основную модель», а получать разные мнения. Одну и ту же задачу можно отдать трём моделям сразу и посмотреть, где они расходятся: расхождение почти всегда указывает на настоящую неоднозначность, а не на ошибку одной из них.

for м in deepseek qwen gemini; do
  echo "=== $м"; cat вопрос.txt | ask-or $м
done

Три ответа на такую пачку обойдутся в считанные центы — дешевле, чем полчаса собственных сомнений.