Гайды
Двенадцать записей настоящего интерфейса
Каждая — это терминал, а не схема: спойлер интерфейса, а не его макет. Записаны так же, как прогон на главной, каждый раз одним и тем же скриптом, — то есть здесь ничего не поставлено ради красивого кадра.
Про эти записи Они показывают интерфейс, поэтому модель им не нужна: каждая снята под отдельным временным HOME и обращается к маленькому OpenAI-совместимому шлюзу на localhost — ровно для этого во встроенном списке и есть OmniRoute, вариант с локальным шлюзом. Ни один настоящий провайдер не вызывается, ни один настоящий ключ не вводится — поэтому модели и называются local-fast и local-smart. Всё остальное на экране — тот самый агент, который вы поставите.
Настройка
Первый запуск: выбор провайдера
При первом запуске в проекте 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 │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
Добавить свой эндпоинт
Последний пункт в списке провайдеров добавляет ваш собственный 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 │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
Две модели, две задачи
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) │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
Заменить ключ
/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): ││ │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
Управление прогоном
Все команды разом
Ввод / открывает дополнение, а /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) ❯
Роль решает, что ему можно трогать
/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 │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
Глубина рассуждения — одна ручка
/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 │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
Рабочие стили
/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. │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
Диагностический переключатель
/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. ❯
Сессии и откат
Именованные сессии
/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 │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
Посмотреть, что изменилось, и вернуть
/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("-") ││ │╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ ❯
Без интерфейса
Совсем без интерфейса
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