Разделы базы знаний ▾

Навигация

▸ Начните здесь По ролям

Категории

Инструменты 52
Глоссарий 12

Инструменты

Crush + JoinGonka Gateway: агент Charm на моделях сети Gonka

Crush — терминальный coding-агент от Charm, команды, на чьих библиотеках для консольных интерфейсов построены десятки тысяч программ. Он читает и правит файлы проекта, запускает команды, берёт контекст у языковых серверов (LSP), подключает внешние инструменты через MCP и умеет сменить модель посреди сессии, не теряя контекста. Работает в терминалах macOS, Linux и Windows, а также на Android и BSD; лицензия — FSL-1.1-MIT. Родословная у проекта заметная: архивный репозиторий opencode-ai/opencode прямо отсылает к Crush — проект продолжили его первый автор и команда Charm.

Сторонних провайдеров Crush принимает двух видов — с OpenAI- и с Anthropic-совместимым API. JoinGonka Gateway подключается как openai-compat: одной командой установщика или десятком строк конфига. После этого агент работает на моделях децентрализованной сети Gonka — DeepSeek V4 Flash, GLM-5.3 Flash и MiniMax M2.7 — по единой цене: $0.0069 за миллион входных токенов.

Две особенности Crush стоит знать до первой сессии: модели он раскладывает по двум слотам, large и small, а модель, выбранную в интерфейсе, хранит в отдельном файле состояния, который главнее конфига. Им посвящён отдельный раздел. Команды и сообщения ниже сверены живым прогоном Crush 0.96.1 через шлюз 23 сентября 2026. После подтверждения адреса на счёт придут 3M бесплатных токенов — их хватит, чтобы повторить всё это самому.

Быстрый старт: установка и одна команда

Шаг 1: поставить Crush. Официальные способы из README проекта:

# Homebrew
brew install charmbracelet/tap/crush

# npm
npm install -g @charmland/crush

# Arch Linux
yay -S crush-bin

# Windows
winget install charmbracelet.crush

# Go
go install github.com/charmbracelet/crush@latest

Там же описаны репозитории пакетов для Debian, Ubuntu, Fedora и RHEL, Nix и Scoop, а на странице релизов лежат готовые бинарники. Проверка — crush --version, в ответ придёт строка вида crush version v0.96.1.

Шаг 2: получить ключ. Зарегистрируйтесь на gate.joingonka.ai/register, подтвердите адрес и создайте ключ с префиксом jg- в разделе «API-ключи». Один ключ и один баланс действуют для всех моделей сети.

Шаг 3: запустить установщик.

npx @joingonka/setup --tool crush

Установщик спросит ключ — в аргументах командной строки он не передаётся, чтобы не осесть в истории оболочки, — и сделает четыре вещи:

  • пропишет провайдера joingonka в ~/.config/crush/crush.json: тип openai-compat, адрес шлюза, ключ литералом и три модели сети с окнами контекста, потолками ответа и ценами за миллион токенов, которые он в момент установки берёт у шлюза живыми, — по ним Crush считает стоимость сессии. Файл получит права 600;
  • назначит модели: в слот large — DeepSeek V4 Flash, в small — MiniMax M2.7, а GLM-5.3 Flash останется в списке для ручного выбора. Делает он это, только если слот large пуст или указывает на нашу модель, ушедшую из сети; чужой выбор остаётся, а в выводе будет подсказка, как переключиться;
  • проверит, что выбор подействует: модель из интерфейса Crush держит в файле состояния, и тот перекрывает конфиг, — об этом раздел про large и small;
  • сделает резервную копию, остальные провайдеры и настройки оставит как были и закончит живым запросом к шлюзу, чтобы сразу проверить ключ, адрес и модель.

Другую модель задаёт флаг --model с сокращением deepseek, glm или minimax; явно указанная модель записывается всегда. Нестандартные каталоги установщик учитывает так же, как сам Crush: CRUSH_GLOBAL_CONFIG для конфига, CRUSH_GLOBAL_DATA для файла состояния, а также XDG_CONFIG_HOME и XDG_DATA_HOME. Для серверов и скриптов есть режим без вопросов, ключ в нём берётся из переменной окружения:

JOINGONKA_API_KEY=jg-your-key npx @joingonka/setup --tool crush --model glm --non-interactive

Основным форматом Crush теперь стал crushrc, но установщик пишет crush.json: его понимают все версии. Если crushrc у вас уже есть, Crush сольёт оба файла, при совпадении ключей победит crushrc, а сам его установщик не трогает.

Ручная настройка: crush.json или crushrc

Всё, что делает установщик, можно написать руками. Вот рабочий ~/.config/crush/crush.json — этот файл мы прогнали через шлюз:

{
  "$schema": "https://charm.land/crush.json",
  "providers": {
    "joingonka": {
      "name": "JoinGonka (Gonka)",
      "type": "openai-compat",
      "base_url": "https://gate.joingonka.ai/v1",
      "api_key": "jg-your-key",
      "models": [
        { "id": "deepseek-ai/DeepSeek-V4-Flash-0731", "name": "DeepSeek V4 Flash (Gonka)",
          "context_window": 380000, "default_max_tokens": 32768,
          "can_reason": true, "supports_attachments": false },
        { "id": "MiniMaxAI/MiniMax-M2.7", "name": "MiniMax M2.7 (Gonka)",
          "context_window": 200000, "default_max_tokens": 8192,
          "can_reason": false, "supports_attachments": false },
        { "id": "zai-org/GLM-5.3-Flash", "name": "GLM-5.3 Flash (Gonka)",
          "context_window": 390000, "default_max_tokens": 8192,
          "can_reason": true, "supports_attachments": false }
      ]
    }
  },
  "models": {
    "large": { "provider": "joingonka", "model": "deepseek-ai/DeepSeek-V4-Flash-0731" },
    "small": { "provider": "joingonka", "model": "MiniMaxAI/MiniMax-M2.7" }
  }
}
ПолеЗначениеЧто важно
typeopenai-compatТип для сторонних сервисов с OpenAI-совместимым API. Тип openai документация Crush оставляет для запросов через саму OpenAI
base_urlhttps://gate.joingonka.ai/v1С /v1 на конце: путь /chat/completions Crush дописывает сам
api_keyваш ключ jg-…Crush прогоняет значение через подстановку оболочки, поэтому вместо ключа можно написать $JOINGONKA_API_KEY — тогда переменная должна быть экспортирована там, откуда запускается Crush
context_windowокно моделиПо нему Crush показывает заполненность контекста и решает, когда сжимать историю
default_max_tokensпотолок ответаУходит в каждый запрос как max_tokens. У рассуждающих моделей в этот бюджет входит и рассуждение

Crush принимает только строгий JSON: комментарий или висячая запятая — и он не стартует. Поля цены (cost_per_1m_in, cost_per_1m_out и два поля для кеша) нужны лишь счётчику стоимости: установщик вписывает туда живую цену шлюза, а без них Crush работает и показывает ноль — только редактор со схемой из $schema подсветит их как обязательные.

Тот же провайдер в формате crushrc — это обычный Bash со встроенными командами Crush. Файл ~/.config/crush/crushrc:

provider add joingonka \
  --name "JoinGonka (Gonka)" \
  --type openai-compat \
  --base-url "https://gate.joingonka.ai/v1" \
  --api-key "${JOINGONKA_API_KEY:?set JOINGONKA_API_KEY}"

model add joingonka/deepseek-ai/DeepSeek-V4-Flash-0731 \
  --name "DeepSeek V4 Flash (Gonka)" \
  --context-window 380000 --default-max-tokens 32768 --can-reason true

model add joingonka/MiniMaxAI/MiniMax-M2.7 \
  --name "MiniMax M2.7 (Gonka)" \
  --context-window 200000 --default-max-tokens 8192

model add joingonka/zai-org/GLM-5.3-Flash \
  --name "GLM-5.3 Flash (Gonka)" \
  --context-window 390000 --default-max-tokens 8192 --can-reason true

model large joingonka/deepseek-ai/DeepSeek-V4-Flash-0731
model small joingonka/MiniMaxAI/MiniMax-M2.7

Модель здесь называется в форме provider/model-id: до первой косой черты — имя провайдера, дальше — идентификатор сети как есть. Форма ${JOINGONKA_API_KEY:?…} держит ключ вне файла, но без экспортированной переменной Crush не стартует — лучше ошибка на старте, чем запросы с пустым ключом.

Модели large и small и файл состояния

Модель в Crush выбирается не одна на всё, а для двух слотов:

СлотЧто на нём выполняетсяЧто ставит установщикКак сменить
largeОсновной агент: все ходы с чтением и правкой файлов и командамиDeepSeek V4 Flash: окно 380K и самый большой в сети потолок ответа, 32768ctrl+l в интерфейсе, -m у crush run, models.large в конфиге
smallВспомогательные задачи: название сессии и под-агент, который ищет в сети и читает веб-страницы. Если малая модель не справилась с названием, Crush повторяет запрос большойMiniMax M2.7: у неё больше всего ёмкости в сети--small-model у crush run, models.small в конфиге, model small в crushrc

Третью модель сети, рассуждающую GLM-5.3 Flash, выбирают для запутанной логики, помня, что потолок ответа у неё 8192 и часть его уходит на рассуждение, — подробности в обзоре модели. На один запуск модель задаётся полным именем: crush run -m joingonka/zai-org/GLM-5.3-Flash "…". Все доступные имена печатает crush models joingonka.

Файл состояния. Модель, выбранную в интерфейсе по ctrl+l, Crush записывает не в crush.json, а в машинный файл состояния: ~/.local/share/crush/crush.json, в Windows — %LOCALAPPDATA%\crush\crush.json. Этот файл главнее и пользовательского конфига, и crushrc: Crush читает их по порядку /etc/crush/crush.json → ~/.config/crush/crush.json → ~/.config/crush/crushrc → файл состояния, и каждый следующий перекрывает предыдущий. Выше стоят только настройки проекта — crush.json или crushrc в его каталоге. Где лежат файлы на вашей машине, покажет crush dirs.

В нашем прогоне мы открыли выбор моделей — провайдер «JoinGonka (Gonka)» стоит там с отметкой «✓ Configured» — и выбрали MiniMax M2.7. Crush ответил «Large model changed to MiniMax M2.7 (Gonka)» и записал в файл состояния:

{"models":{"large":{"model":"MiniMaxAI/MiniMax-M2.7","provider":"joingonka","max_tokens":8192}}, …}

Теперь эта модель главнее того, что написано в crush.json. Установщик такую ситуацию распознаёт и ведёт себя по-разному:

  • без --model файл состояния он не трогает — это ваш рабочий выбор, — но прямо предупреждает, с какой моделью Crush на самом деле откроется: Heads-up: Crush will still start with joingonka/MiniMaxAI/MiniMax-M2.7, not joingonka/deepseek-ai/DeepSeek-V4-Flash-0731. Так же он поступит, если в интерфейсе выбрана GLM-5.3 Flash или модель другого провайдера;
  • с явным --model он правит в файле состояния ровно одну запись — models.large, — предварительно сохранив копию, и пишет, что было и что стало. Иначе флаг молча не подействовал бы. После такого запуска Crush в нашем прогоне открылся на модели, указанной во флаге.

Проверка: что должно произойти

Сначала убедитесь, что Crush видит провайдера:

crush models joingonka

В ответ — три строки:

joingonka/MiniMaxAI/MiniMax-M2.7
joingonka/deepseek-ai/DeepSeek-V4-Flash-0731
joingonka/zai-org/GLM-5.3-Flash

Затем — разовый прогон без интерфейса. Положите в каталог проекта файл с очевидной ошибкой и попросите её найти:

crush run -q "Read calc.py and tell me in one sentence whether it has a bug."

Агент должен сам вызвать инструмент чтения файла и ответить по существу, с номером строки. В нашем прогоне ошибку нашли все три модели сети, на задачу уходило 20-40 секунд. Флаг -q прячет индикатор ожидания. В режиме crush run все вызовы инструментов одобряются автоматически, поэтому запускайте его в своём проекте. В обычном интерфейсе (команда crush) активная модель видна в строке состояния: ◇ DeepSeek V4 Flash (Gonka) via JoinGonka (Gonka). Сессии и журнал Crush хранит в каталоге .crush проекта, закрытом от git собственным .gitignore; журнал печатает crush logs. Со стороны шлюза запрос виден в кабинете: раздел «Использование», разбивка «По моделям» и «По ключам».

Если что-то пошло не так, диагноз обычно читается прямо из сообщения:

Что видноЧто это значитЧто сделать
unauthorized: Invalid API key.Шлюз не принял ключПроверьте api_key: ключ целиком, без пробелов. Если там ссылка на переменную, она должна быть экспортирована в этой оболочке
invalid JSON in config file …/crush.jsonВ файле комментарий, висячая запятая или опечаткаCrush принимает только строгий JSON: исправьте файл. Установщик комментарии сам не вычищает, но предупреждает о них, а файл, который совсем не разбирается, не трогает и называет причину
failed to load shell config …/crushrc: … exit status 1Ошибка в crushrc, чаще всего не задана переменная с ключом в форме ${…:?}Экспортируйте переменную перед запуском или исправьте строку, на которой скрипт падает
Failed to override models: large model "…" not foundОпечатка в имени модели у флага -mСкопируйте имя из вывода crush models joingonka
too many requests: Model "…" is currently overloaded in the Gonka network (rate limit)У модели в час пик закончилась свободная ёмкость в сетиCrush сам повторяет запрос с растущими паузами — в нашем прогоне около минуты — и только потом сдаётся. Переключитесь на другую модель через ctrl+l или -m либо подождите; состояние видно на странице статуса
Crush открылся не на той модели, о которой сообщил установщикВыбор из интерфейса лежит в файле состояния и перекрывает конфигВыберите модель через ctrl+l или повторите установку с --model
402На балансе закончились средстваПополните счёт в разделе «Биллинг»; ключ при этом рабочий

Сколько это стоит

Агент тратит токены иначе, чем чат: к каждой вашей фразе Crush добавляет системный промпт и описания своих инструментов, а задача обычно занимает несколько ходов. В нашем прогоне каждый запрос к модели нёс около 11,5 тысячи входных токенов, а задача «прочитать файл и найти ошибку» заняла два-три запроса и 23-35 тысяч токенов, почти всё — вход. Поэтому цена за токен здесь решает.

Через JoinGonka Gateway токены стоят $0.0069 за миллион на входе и $0.021 за миллион на выходе — цена одинакова для всех моделей сети и подставляется на этой странице из живого источника.

СценарийРасходЧерез Gateway
Разовая задача: прочитать файл, найти ошибку23-35K токеновсотые доли цента
День активной работы3-7M токеновнесколько центов
Месяц активной разработки~150M токеновоколо доллара

Оценки в правой колонке — по ценам на сентябрь 2026. Для сравнения — как вообще можно платить за модели в Crush:

СпособМодель оплатыЧто ограничивает
Hyper — официальный провайдер Charmподписка, есть бесплатный уровеньусловия тарифа на стороне Charm
Ключ вендора напрямуюза токены по прайсу вендорасчёт растёт вместе с длиной сессий; цена зависит от модели
JoinGonka Gatewayза токены, предоплаченный балансрасход виден в кабинете; подписки и месячных квот нет

Счётчик стоимости в интерфейсе Crush считает по полям цены из конфига. Туда попадает цена шлюза на момент установки, а долларовая цена в сети плавает вместе с курсом GNK, поэтому счётчик — ориентир. Точный расход и остаток — в кабинете, в разделах «Использование» и «Биллинг». Почему в слот large по умолчанию встаёт DeepSeek V4 Flash, подробно разобрано в обзоре модели.

Что учесть в работе

Разрешения. В интерфейсе Crush по умолчанию спрашивает разрешение перед вызовом инструмента. Флаг --yolo отключает все вопросы разом, а точечно доверенные инструменты перечисляются в конфиге:

# crushrc
permissions allow view ls grep

# crush.json
"permissions": { "allowed_tools": ["view", "ls", "grep"] }

Напомним, что crush run одобряет всё сам. Это свойство Crush, от провайдера модели оно не зависит.

Таймаут запроса. Crush обрывает запрос, если от модели долго не приходит ни одного фрагмента ответа: в версии 0.96.1 это две минуты тишины (документация называет 60 секунд, но в коде и на нашей проверке — две минуты). Служебные пинги, которыми шлюз держит соединение, этот счётчик не сбрасывают — мы проверили на локальном стенде. Шлюз же в часы нагрузки ждёт первого токена от сети до 150 секунд, поэтому запас стоит поднять:

# crushrc
option request-timeout 300

# crush.json
"options": { "request_timeout": 300 }

Подписи в коммитах. Коммиты и пул-реквесты, которые создаёт Crush, по умолчанию получают строку Assisted-by: Crush:<model> и приписку «Generated with Crush». Если это не нужно:

# crushrc
option attribution-trailer-style none
option attribution-generated-with false

# crush.json
"options": { "attribution": { "trailer_style": "none", "generated_with": false } }

Метрики. Crush отправляет разработчикам псевдонимную статистику использования — только метаданные, без промптов и ответов. Отключается переменной CRUSH_DISABLE_METRICS=1 или DO_NOT_TRACK=1. Шлюз, со своей стороны, не хранит содержимое промптов и ответов — в статистике остаются только агрегаты расхода.

Конфиг — это код. И crushrc, и crush.json Crush исполняет с правами вашей оболочки: $(…) в поле ключа запустится при загрузке, а проектный crushrc сработает, как только вы откроете Crush в этом каталоге. Не запускайте агент в чужом репозитории, не прочитав его конфиги.

Crush подключается к JoinGonka Gateway одной командой — npx @joingonka/setup --tool crush — или блоком providers.joingonka в ~/.config/crush/crush.json: тип openai-compat, адрес https://gate.joingonka.ai/v1, ключ jg-…, модели с честными context_window и default_max_tokens. То же пишется несколькими строками provider add и model add в crushrc. Слот large отдают DeepSeek V4 Flash, small — MiniMax M2.7, GLM-5.3 Flash — для запутанной логики. Главная ловушка — файл состояния: модель, выбранная по ctrl+l, главнее конфига, поэтому установщик с явным --model правит и его. Проверка — crush models joingonka и crush run; таймаут запроса стоит поднять до 300 секунд.

Хотите узнать больше?

Изучите другие разделы или начните зарабатывать GNK прямо сейчас.

Получить ключ и бесплатные токены →