Kvist
EN

Гайды

Двенадцать записей настоящего интерфейса

Каждая — это терминал, а не схема: спойлер интерфейса, а не его макет. Записаны так же, как прогон на главной, каждый раз одним и тем же скриптом, — то есть здесь ничего не поставлено ради красивого кадра.

Про эти записи Они показывают интерфейс, поэтому модель им не нужна: каждая снята под отдельным временным HOME и обращается к маленькому OpenAI-совместимому шлюзу на localhost — ровно для этого во встроенном списке и есть OmniRoute, вариант с локальным шлюзом. Ни один настоящий провайдер не вызывается, ни один настоящий ключ не вводится — поэтому модели и называются local-fast и local-smart. Всё остальное на экране — тот самый агент, который вы поставите.

Настройка

01

Первый запуск: выбор провайдера

При первом запуске в проекте Kvist спрашивает, каким провайдером пользоваться. В списке все встроенные плюс пункт для своего OpenAI- или Anthropic-совместимого эндпоинта. Стрелки двигают, Enter подтверждает, дальше он просит ключ этого провайдера на замаскированном приглашении и пишет его в ~/.kvist/config.json — но не в проект. В записи выбран OmniRoute, потому что это вариант с локальным шлюзом; выбрать OpenAI или Anthropic — те же три нажатия.

╭─ Select LLM Provider ────────────────────────────────────────────────────────────────────────────╮│                                                                                                  ││  ↑/↓ — select, Enter — confirm, Esc — cancel                                                     ││                                                                                                  │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯╭──────────────────────────────────────────────────────────────────────────────────────────────────╮│   OpenAI — Strict JSON mode with GPT models                                                      ││   Anthropic — Native Claude models (Opus, Sonnet, Haiku)                                         ││   DeepSeek — Native DeepSeek models (V4 Pro, V4 Flash)                                           ││   OpenRouter — Public multi-provider gateway (OpenAI, Anthropic, Google, etc.)                   ││ ❯ OmniRoute — Local OpenAI-compatible gateway                                                    ││   FreeFlow LLM — Gemini/Groq via FreeFlow, JSON — best effort                                    ││   + Create custom provider... — Add a new OpenAI- or Anthropic-compatible endpoint               │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯                  
0:00 / 0:00
02

Добавить свой эндпоинт

Последний пункт в списке провайдеров добавляет ваш собственный OpenAI- или Anthropic-совместимый эндпоинт: идентификатор, протокол, базовый URL, переживает ли он стриминг, ключ, отображаемое имя и идентификаторы моделей. Ключ — это то, чего ждёт сам эндпоинт: шлюз на вашей машине его обычно игнорирует. Стриминг по умолчанию выключен, потому что многие сторонние шлюзы корректно отвечают на обычные запросы и ломаются на stream=true.

╭─ Select LLM Provider ────────────────────────────────────────────────────────────────────────────╮│                                                                                                  ││  ↑/↓ — select, Enter — confirm, Esc — cancel                                                     ││                                                                                                  │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯╭──────────────────────────────────────────────────────────────────────────────────────────────────╮│   OpenAI — Strict JSON mode with GPT models                                                      ││   Anthropic — Native Claude models (Opus, Sonnet, Haiku)                                         ││   DeepSeek — Native DeepSeek models (V4 Pro, V4 Flash)                                           ││   OpenRouter — Public multi-provider gateway (OpenAI, Anthropic, Google, etc.)                   ││   OmniRoute — Local OpenAI-compatible gateway                                                    ││   FreeFlow LLM — Gemini/Groq via FreeFlow, JSON — best effort                                    ││ ❯ + Create custom provider... — Add a new OpenAI- or Anthropic-compatible endpoint               │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯                  
0:00 / 0:00
03

Две модели, две задачи

fast тянет маршрутизацию, чат и простые шаги; smart берёт сложную работу и восстановление после ошибок. /models задаёт обе — сразу или по одной. Провайдеры с фиксированным каталогом предлагают список, провайдеры с динамическими идентификаторами — например, локальный шлюз — принимают то, что вы введёте.

╭─ Select action: ─────────────────────────────────────────────────────────────────────────────────╮│                                                                                                  ││  Enter — cancel and keep current models                                                          ││                                                                                                  │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯╭──────────────────────────────────────────────────────────────────────────────────────────────────╮│   Enter one model id for all roles                                                               ││ ❯ Enter a separate model id per role                                                             ││   Keep current models (unchanged)                                                                │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯                      
0:00 / 0:00
04

Заменить ключ

/change-api заменяет ключ текущего провайдера на том же замаскированном приглашении, что и при первом запуске. Старый ключ он не печатает — панель лишь сообщает, что ключ настроен. Оставите поле пустым — останется прежний.

╭─ New OmniRoute API key ──────────────────────────────────────────────────────────────────────────╮│                                                                                                  ││  Leave empty and press Enter to keep the current key.                                            ││                                                                                                  ││  Current: *** (already configured)                                                               ││                                                                                                  ││  Enter value (input hidden, Esc to cancel):                                                      ││                                                                                                  │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯                       
0:00 / 0:00

Управление прогоном

05

Все команды разом

Ввод / открывает дополнение, а /commands печатает весь список с назначением каждой. Шестнадцать команд закрывают провайдеров, модели, роли, усилие, сессии, журнал изменений и переключатель подробного вывода.

╭────────────────────────────────────────────────────────────────────────────────────╮│                                                      │                             ││  ╭────────────────────────────────────────────╮      │                             ││  │                                            │      │    Provider: [OmniRoute]    ││  │                                            │      │                             ││  │                                            │      │    Fast:     [local-fast]   ││  │ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀       │      │                             ││  │ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀       │      │    Smart:    [local-smart]  ││  │ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀       │      │                             ││  │ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀       │      │    Planner:  [local-planner]││  │                                            │      │                             ││  │                                            │      │    Role:     [auto]         ││  │                                            │      │                             ││  │                                            │      │    Effort:   [medium]       ││  ╰────────────────────────────────────────────╯      │                             ││                                                      │                             │╰────────────────────────────────────────────────────────────────────────────────────╯  /models — Select fast, smart and planner models  /role — Choose auto, coder, devops or chat role  /effort — Set the model's reasoning effort level  /session — Create, switch or delete saved sessions  /style — Select a style for chat/agent responses  /resume — Continue the latest saved checkpoint  /verbose — Enable or disable verbose runtime output  /plan — Enable or disable the planning stage  /changes — Show agent file changes across all sessions  /revert — Restore agent-changed files to their baselines  /strime — Toggle streaming for the active custom provider  /bye — Save the active session and exit Kvist (aliases: /exit, /quit)  ❯
0:00 / 0:00
06

Роль решает, что ему можно трогать

/role закрепляет прогон за coder, reader, devops или chat либо оставляет auto. Auto маршрутизирует каждый запрос сам: сначала явные правила, потом маленькая модель, потом ключевые слова. Закрепить devops — это разница между агентом, который правит ваши исходники, и агентом, который занимается сервисами и деплоем.

╭─ Select Agent Role ──────────────────────────────────────────────────────────────────────────────╮│                                                                                                  ││  ↑/↓ — select, Enter — confirm, Esc — cancel                                                     ││                                                                                                  │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯╭──────────────────────────────────────────────────────────────────────────────────────────────────╮│   Auto (automatic role detection) — Agent automatically detects role from your request           ││ (coder/reader/devops/chat)                                                                       ││   Coder — Code generation, editing, debugging, refactoring, testing                              ││   Reader — Read-only: inspect/analyze files and report; writes are disabled                      ││ ❯ DevOps — Infrastructure, deployment, server management, CI/CD, Docker                          ││   Chat — Questions, explanations, advice, brainstorming, discussions                             │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯                   
0:00 / 0:00
07

Глубина рассуждения — одна ручка

/effort задаёт, насколько усердно думает модель, по одной шкале от false до max — шесть уровней, одна команда, как бы их ни называл провайдер под низом. Провайдеры делят её по-разному, поэтому, когда ваш выбор схлопывается во что-то более грубое, Kvist говорит об этом сразу, а не оставляет гадать: DeepSeek, например, отвечает, что различимы там только false, high и max.

╭─ Reasoning effort (applies to every provider) ───────────────────────────────────────────────────╮│                                                                                                  ││  ↑/↓ — select, Enter — confirm, Esc — cancel                                                     ││                                                                                                  │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯╭──────────────────────────────────────────────────────────────────────────────────────────────────╮│   false — No reasoning — fastest, cheapest, weakest on hard problems                             ││   low — Light reasoning — quick answers, shallow multi-step work                                 ││   medium — Balanced reasoning — the default trade-off                                            ││   high — Deep reasoning — slower, better on complex tasks                                        ││ ❯ xhigh — Extended reasoning — noticeably slower, for the hardest tasks                          ││   max — Maximum reasoning the provider allows — slowest                                          │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯                   
0:00 / 0:00
08

Рабочие стили

/style выбирает, как Kvist работает и как пишет: девять стилей для цикла действий — среди них minimalist, paranoid, architect, perfectionist, senior-dev — и пять для чата. Одна сессия держит один стиль, зафиксированный на старте, чтобы план и следующие за ним шаги исходили из одних убеждений.

╭─ Select agents style ────────────────────────────────────────────────────────────────────────────╮│                                                                                                  ││  ↑/↓ — select, Enter — confirm, Esc — cancel                                                     ││                                                                                                  │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯╭──────────────────────────────────────────────────────────────────────────────────────────────────╮│   Default — Does what was asked. Answers for everything it touched, and nothing else.            ││   Senior-dev — Does what the result needs, not only what was asked. Never makes a point of it.   ││   Friendly Developer — The same work, but you are never left alone with the result.              ││   Perfectionist — Quality is part of the task, not a task for later. Pays in time.               ││ ❯ Paranoid — An outage costs more than time spent checking. Looks before irreversible steps.     ││   Minimalist — Every line is an obligation for years. Extends a task only toward deletion.       ││   Explainer — A fix it cannot explain is no different from a wrong one. Finds the cause.         ││   Fast-and-dirty — A prototype may be bad if it is honestly called one. Says so first.           ││   Architect — A change that blurs the structure is negative even when the task is done.          │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯                
0:00 / 0:00
09

Диагностический переключатель

/verbose включает диагностический вывод. Он сообщает, что сделал, — гадать о текущем состоянии не приходится.

╭────────────────────────────────────────────────────────────────────────────────────╮│                                                      │                             ││  ╭────────────────────────────────────────────╮      │                             ││  │                                            │      │    Provider: [OmniRoute]    ││  │                                            │      │                             ││  │                                            │      │    Fast:     [local-fast]   ││  │ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │      │                             ││  │ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │      │    Smart:    [local-smart]  ││  │ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │      │                             ││  │ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │      │    Planner:  [local-planner]││  │                                            │      │                             ││  │                                            │      │    Role:     [auto]         ││  │                                            │      │                             ││  │                                            │      │    Effort:   [medium]       ││  ╰────────────────────────────────────────────╯      │                             ││                                                      │                             │╰────────────────────────────────────────────────────────────────────────────────────╯❯ /planPlanning stage disabled — the agent starts acting immediately, without an upfront plan.            ❯
0:00 / 0:00

Сессии и откат

10

Именованные сессии

/session показывает, что есть в рабочей директории, и создаёт новую. У каждой сессии своя история, свой чекпойнт и свой стиль. Создание новой не стирает прежний разговор — он остаётся на диске и достаётся тем же /session. Пустая авто-именованная сессия удаляется при уходе, так что запуском и выходом список не засорить.

╭─ Manage Sessions (current: chat-20260910-155928) ────────────────────────────────────────────────╮│                                                                                                  ││  ↑/↓ — select, Enter — switch, Esc — cancel                                                      ││                                                                                                  │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯╭──────────────────────────────────────────────────────────────────────────────────────────────────╮│   ● chat-20260910-155928 — current session                                                       ││ ❯ + Create new session... — Start a fresh named session                                          │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯                       
0:00 / 0:00
11

Посмотреть, что изменилось, и вернуть

/changes печатает диф всего, что Kvist записала в этой рабочей директории, по всем сессиям. /revert возвращает как было — после подтверждения, которое открывается на «Нет», потому что это решение. Перезаписывается только то, авторство чего журнал может доказать; ваши собственные правки остаются.

╭────────────────────────────────────────────────────────────────────────────────────╮│                                                      │                             ││  ╭────────────────────────────────────────────╮      │                             ││  │                                            │      │    Provider: [OmniRoute]    ││  │                                            │      │                             ││  │                                            │      │    Fast:     [local-fast]   ││  │ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀       │      │                             ││  │ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀       │      │    Smart:    [local-smart]  ││  │ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀       │      │                             ││  │ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀       │      │    Planner:  [local-planner]││  │                                            │      │                             ││  │                                            │      │    Role:     [auto]         ││  │                                            │      │                             ││  │                                            │      │    Effort:   [medium]       ││  ╰────────────────────────────────────────────╯      │                             ││                                                      │                             │╰────────────────────────────────────────────────────────────────────────────────────╯╭───────────────────────── Agent changes in this workspace (all sessions) ─────────────────────────╮│ # slugify.py (session: chat-20260910-042952)                                                     ││ --- slugify.py                                                                                   ││ +++ slugify.py                                                                                   ││ @@ -7,4 +7,4 @@                                                                                  ││                                                                                                  ││                                                                                                  ││  def slugify(title: str) -> str:                                                                 ││ -    return _KEEP.sub("-", title.lower())                                                        ││ +    return _KEEP.sub("-", title.lower()).strip("-")                                             ││                                                                                                  │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯  ❯
0:00 / 0:00

Без интерфейса

12

Совсем без интерфейса

Kvist отвечает на одиночные команды для скриптов и других фронтендов: --config-info сообщает сохранённого провайдера и модели без обращения к модели, --session-op управляет сессиями, --journal-op печатает или откатывает журнал изменений. Всё это JSON в stdout. Electron-интерфейс построен на этом же протоколе и ни на чём больше.

$ python main.py --workspace /tmp/kvist-hl-ws --config-info | jq '{provider: .saved_provider, role:.saved_role}'{  "provider": "omniroute",  "role": "auto"} $ python main.py --workspace /tmp/kvist-hl-ws --session-op status | jq '{active: .active_session, sessions}'{  "active": "chat-20260910-042952",  "sessions": [    "chat-20260910-042952"  ]} $ python main.py --workspace /tmp/kvist-hl-ws --session-op create --session-name review | jq '{ok, active_session}'{  "ok": true,  "active_session": "review"} $ python main.py --workspace /tmp/kvist-hl-ws --journal-op changes | jq -r .report        
0:00 / 0:00