Единый терминальный пульт для codex, claude, cursor-agent и opencode — на ratatui.
Один интерфейс, четыре агента, независимые сессии и бесплатный русско-английский перевод без единого потраченного токена.
┌─ Русский запрос ─────────────────────────────────────────────┐
│ «Отрефактори модуль аутентификации и покрой тестами» │
└──────────────────────────────┬───────────────────────────────┘
│ Google Translate → LibreTranslate
│ 0 токенов, ~150 мс
▼
English prompt ─► Codex / Claude / Cursor / OpenCode
│ агент работает на английском
▼
English answer ─► перевод обратно (0 токенов)
▼
Русский ответ в transcript
Ассистенты берут деньги за токены, а русский текст токенизируется в среднем на четверть «тяжелее» английского. Agent Deck решает обе проблемы сразу:
- Перевод больше не стоит токенов. Раньше каждый русский запрос требовал трёх прогонов модели: перевести запрос, выполнить задачу, перевести ответ. Теперь перевод делают бесплатные сервисы по HTTP, а модель запускается ровно один раз — только на саму работу.
- Агент думает по-английски. В рабочий контекст уходит английский промпт, который короче русского оригинала (см. таблицу ниже). Экономия идёт и на входе, и на выходе.
Замер сделан токенизатором o200k_base — тем самым, что использует семейство GPT-5 / gpt-5.6-sol в Codex. Английские варианты получены тем же переводчиком, что встроен в утилиту.
| Запрос | Токенов (RU) | Токенов (EN) | Экономия |
|---|---|---|---|
Исправь баг в app.rs и добавь тест |
11 | 10 | −9 % |
| Отрефактори модуль аутентификации, вынеси проверку токена, покрой юнит-тестами | 31 | 19 | −39 % |
| Добавь тёмную тему с переключением по горячей клавише и сохранением выбора | 27 | 22 | −19 % |
| Почему падает сборка после обновления зависимостей? Найди причину и предложи фикс | 21 | 16 | −24 % |
| Напиши функцию: парсит JSON от API, обрабатывает ошибки сети, возвращает типизированную структуру | 27 | 20 | −26 % |
| Итого | 117 | 87 | −26 % |
Это экономия только на входном промпте. Сверх неё исчезают два полноценных прогона модели на перевод — на практике русский запрос дешевеет в разы, а не на четверть.
Повторить замер:
pip install tiktoken # o200k_base — токенизатор gpt-5.6
python3 tools/measure_tokens.py # печатает таблицу по своим запросам- определяет установку и авторизацию
codex,claude,cursor-agent,opencode— не читая файлы с токенами; - тянет актуальный список моделей прямо из Codex app-server и поддерживаемые каждой моделью уровни reasoning effort;
- предлагает официальные aliases моделей Claude Code, модели Cursor Agent и reasoning-варианты OpenCode из их CLI;
- переводит русский запрос → английский, отдаёт агенту, показывает ответ, переведённый обратно на русский;
- держит независимую сессию каждого провайдера — можно переключаться между четырьмя CLI в одном окне;
- запускает агентов в текущем каталоге.
Перевод вынесен из ИИ в обычный HTTP-клиент (src/backend.rs):
- Google Translate — бесплатный публичный endpoint, без ключа. Основной путь.
- LibreTranslate — автоматический фолбэк, если Google недоступен. Полностью офлайн, если поднять свой сервер:
Адрес настраивается через
docker run -ti --rm -p 5000:5000 libretranslate/libretranslate
LIBRETRANSLATE_URL(по умолчаниюhttp://localhost:5000), ключ — черезLIBRETRANSLATE_API_KEY.
Оба варианта не тратят токены. Компромисс честный: обычный машинный перевод может исказить длинные блоки кода внутри текста — короткие идентификаторы и пути (app.rs, Cargo.toml) переживают перевод нормально.
В режиме по умолчанию текст запроса и ответа агента уходит в Google Translate — третью сторону. Если в запрос попадёт проприетарный код, внутренние пути или случайно вставленный секрет, всё это покинет вашу машину. Для чувствительных проектов есть офлайн-режим:
# только LibreTranslate; при локальном сервере ничего не уходит в интернет
export AGENT_DECK_TRANSLATE=localAGENT_DECK_TRANSLATE |
Поведение |
|---|---|
| не задано | Google, при ошибке — фолбэк на LibreTranslate |
local / offline |
только LibreTranslate; Google не вызывается |
google |
только Google, без фолбэка |
Дополнительные меры в коде: соединение с Google идёт по HTTPS с проверкой сертификата; LIBRETRANSLATE_URL принимается только с https:// или http:// на loopback (localhost/127.0.0.1/::1) — чтобы промпт, который затем управляет агентом с правами записи, нельзя было перехватить по открытому каналу.
- Rust 1.85+ (edition 2024);
- хотя бы один CLI:
codex,claude,cursor-agentилиopencode; - авторизация штатной командой соответствующего CLI (бесплатные модели OpenCode работают без credentials);
- доступ в сеть для перевода — или локальный LibreTranslate.
# из каталога проекта
cargo run --release
# либо установить бинарник в ~/.cargo/bin
cargo install --path .Запускать Agent Deck нужно из каталога проекта, над которым работаете:
cd /path/to/your/project
agent-deck| Клавиша | Действие |
|---|---|
/ |
список slash-команд |
/provider · F2 |
выбор провайдера |
/model · F3 |
выбор модели |
/effort · F4 |
глубина рассуждений |
/new · Ctrl+L |
новый разговор и свежие CLI-сессии |
Enter |
перевести и отправить |
Shift+Enter |
новая строка (если терминал различает сочетание) |
PgUp / PgDn |
прокрутка transcript |
? · F1 |
помощь |
Ctrl+C |
закрыть меню; дважды — выйти |
Agent Deck вызывает официальные CLI как дочерние процессы и не открывает файлы с учётными данными. Рабочий Codex ограничен текущим workspace, Claude Code — в acceptEdits, Cursor Agent — в trusted print-режиме, OpenCode — в своей permission-конфигурации. Идентификаторы сессий живут только в памяти процесса. Перевод изолирован от рабочего сеанса: в контекст агента попадает лишь английский промпт.
GNU General Public License v3.0 или новее. Вы можете свободно использовать, изучать, менять и распространять код при условии, что производные работы остаются под той же лицензией.