ENGitHubУстановить

🇬🇧 English version — каноническая версия, она может быть новее.

Конфигурация

Iva настраивается одним файлом: .env в директории установки. Мастер установки заполняет его за вас — любой шаг можно переиграть командой iva config (cli.md). Шаблон — .env.example в корне репозитория. На этой странице описана каждая переменная.

Смена модели, ключа или провайдера требует только перезапуска. Iva читает эти настройки .env при старте. После правки:

iva restart

Сменить модель, ключ или провайдера — это правка → перезапуск, без пересборки.

MEMORY_NIGHT_TIME=HH:mm задаёт местное время единственного Schedule memory-night в ASSISTANT_TIMEZONE (по умолчанию 04:00; строго 00:00..23:59). Это настройка сборки: после правки .env запустите iva update --force; в чекауте разработчика — npm run build и iva restart. Одна правка .env не меняет ни Schedule, ни догон. /menu → ⏰ показывает активное расписание и время, ожидающее пересборки. Schedule и догон читают один артефакт сборки; неудачная сборка или откат сохраняют прежнее время. Старые сборки без артефакта сохраняют 04:00.

Одно исключение — язык ответов. Кнопка 🌐 Язык в /menu пишет data/settings.json, который оба процесса перечитывают на лету — смена срабатывает сразу, без перезапуска. См. menu.md.

Провайдер модели

Шесть провайдеров. Выберите один через MODEL_PROVIDER и заполните только его блок. ollama/opencode/openrouter — API-ключ (OpenAI-совместимы); codex — личная подписка OpenAI (ChatGPT) по OAuth, без ключа; claude — подписка Claude Pro/Max через CLI claude, залогиненный на том же сервере, тоже без ключа; custom — любой OpenAI-совместимый эндпоинт, адрес которого вы задаёте сами. Цены и полные списки моделей: providers.md.

ПеременнаяПо умолчаниюЗаметки
MODEL_PROVIDERollamaollama (Ollama Cloud), opencode (OpenCode Go), openrouter (OpenRouter), codex (подписка OpenAI ChatGPT), claude (подписка Claude Pro/Max через CLI claude) или custom (свой OpenAI-совместимый эндпоинт).
OLLAMA_API_KEY—Ключ с ollama.com.
OLLAMA_MODELdeepseek-v4-proЛюбая модель вашего тарифа Ollama Cloud.
OLLAMA_VISION_MODELgemma4:31bМодель, которая описывает входящее фото. Текстовая модель обычно картинки не видит, поэтому зрение работает на своей модели и на том же ключе. Пусто = дефолт.
OLLAMA_CONTEXT_WINDOW131072См. предупреждение ниже.
OPENCODE_API_KEY—Ключ с opencode.ai/auth.
OPENCODE_PROTOCOLchat-completionsПротокол текстовой модели Go: chat-completions или responses, по таблице Go. Один ключ и OPENCODE_MODEL; iva config проверяет Responses выбранным протоколом. /model сохраняет выбор протокола. /messages не поддерживается. После ручной правки — iva restart.
OPENCODE_VISION_PROTOCOLchat-completionsОтдельный протокол запасной OPENCODE_VISION_MODEL: chat-completions или responses. Текстовая модель сначала проверяется на зрение своим протоколом. qwen3.7-plus теперь требует /messages: выберите совместимую vision-модель; отказ явно сообщает причину.
OPENCODE_MODELdeepseek-v4-proЛюбая модель Go, bare ID (напр. kimi-k3) — iva config показывает живой список.
OPENCODE_VISION_MODELqwen3.7-plusТо же для OpenCode Go, bare ID. Берите из тех моделей, что реально читают картинки — многие модели Go отвечают на фото 400, а часть подмешивает в описание своё рассуждение.
OPENCODE_CONTEXT_WINDOW131072То же предупреждение.
OPENROUTER_API_KEY—Ключ с openrouter.ai/keys (начинается с sk-or-).
OPENROUTER_MODELopenai/gpt-5.1Слаг модели с openrouter.ai/models, вид vendor/model (напр. anthropic/claude-sonnet-5.5). iva config шлёт живой тест-запрос, чтобы кривой слаг не проскочил.
OPENROUTER_VISION_MODELgoogle/gemini-2.5-flashТо же для OpenRouter — любой слаг, принимающий картинки. iva config его живьём не проверяет.
OPENROUTER_CONTEXT_WINDOW131072То же предупреждение — впишите реальное окно выбранной модели.
CODEX_MODELgpt-5.5Модель вашего тарифа OpenAI. iva config покажет реальный список подписки.
CODEX_CONTEXT_WINDOW272000То же предупреждение — впишите реальное окно выбранной модели.
CLAUDE_MODELclaude-fable-5-1Одна из четырёх: Fable 5.1 (claude-fable-5-1, по умолчанию), Opus 5.5 (claude-opus-5-5), Sonnet 5.5 (claude-sonnet-5-5) или Haiku 5.5 (claude-haiku-5-5). iva config показывает те, что пикер CLI реально отдал.
CLAUDE_CONTEXT_WINDOW1000000То же предупреждение — 1000000 у Fable 5.1, Opus 5.5, Sonnet 5.5 и Haiku 5.5.
CLAUDE_COMMAND(пусто)Путь к бинарю claude или команда с аргументами. Пусто — берётся claude из PATH сервиса.
CLAUDE_SESSION_CWD(включено)Claude Code CLI выполняет все шаги одного диалога в одной приватной папке (<tmp>/iva-cwd-<uid>/<хэш сессии>, права 0700): CLI пишет рабочую папку в каждый запрос, и папка, новая на каждом шаге, заставляла кэш промпта записывать всю историю заново. 0, false, no или off выключает это, и каждый шаг снова идёт в своей временной папке.
CUSTOM_BASE_URL—Обязательна для custom. OpenAI-совместимая база целиком, вместе с суффиксом вида /v1 — та же конвенция, что у https://ollama.com/v1 у Ollama. Пусто — агент останавливается на старте и называет эту переменную, дефолта не выдумывает.
CUSTOM_API_KEY—Необязательна. Пусто = заголовок Authorization не отправляется вовсе, а это то, что обычно и нужно своему серверу. iva doctor её не требует.
CUSTOM_MODEL—Обязательна для custom. Дефолта нет: что отдаёт этот эндпоинт, знаете только вы. Пусто — агент останавливается на старте, чужую модель не подставляет.
CUSTOM_VISION_MODEL(пусто)Необязательна, дефолта нет: модель чата, которая видит картинки, спрашивается напрямую, и сюда вписывать нечего. Пусто оставляет запасной путь на самой модели чата — слепая просто не даст описания. Запасному вызову нужен CUSTOM_API_KEY; без ключа он пропускается.
CUSTOM_CONTEXT_WINDOW131072То же предупреждение — впишите реальное окно выбранной модели.
THINKING_EFFORT(пусто)Усилие размышлений: minimal, low, medium, high, xhigh, max. Пишется командами /model и /think в Telegram (cli.md), не руками. codex получает его нативно; ollama/opencode (chat-completions) шлют low/medium/high по OpenAI-совместимому протоколу, остальное игнорируют; при выборе openrouter или custom визард строку убирает вовсе, а вписанное руками значение там игнорируется.

*_VISION_MODEL — запасной путь, а не основной. На первой входящей картинке Ива одним маленьким запросом спрашивает саму модель чата, принимает ли она картинки. Принимает — картинка идёт прямо ей, пикселями, без пересказа, и vision-модель не зовётся вовсе. Отвечает отказом — картинка уходит в *_VISION_MODEL, и модель получает её описание, как раньше. Ответ помнится до перезапуска процесса: после рестарта и после смены модели вопрос задаётся заново. Следствие смены на модель без зрения: у картинок, присланных раньше, описания не сохранено — при нужде перешлите фото заново.

Ровно эти шесть имён, буква в букву. Любое другое значение, включая опечатку и другой регистр, останавливает агента на старте и печатает список принятых имён, вместо того чтобы запустить Ollama под именем, которого никто не задавал. То же самое скажут iva doctor и экран «📊 Статус» в /menu (troubleshooting.md). Если строки MODEL_PROVIDER нет вовсе, это по-прежнему ollama.

Для custom ничего не угадывается: CUSTOM_BASE_URL и CUSTOM_MODEL — две строки, без которых провайдер не работает, и пустая из них это отказ на старте с именем переменной, а не тихий дефолт. THINKING_EFFORT намеренно не действует на custom: OpenAI-совместимость ничего не обещает про reasoning_effort, и слать его вслепую чужому эндпоинту — риск HTTP 400 на каждом ходу. Полный сценарий: providers.md.

Для codex ключа в .env нет: выполните iva login (по ссылке+коду, годится для headless-VPS) или iva login --browser. OAuth-токен лежит в data/codex-auth.json (chmod 600, в gitignore) и автоматически обновляется до истечения. Полный сценарий: providers.md.

Не завышайте контекстное окно. Ива сжимает разговор между ходами, когда вход хода доходит до 60% этого числа (или до 110 000 токенов, что меньше), а внутри хода страхуется порогом на четверть выше. Поставите больше реального окна модели — компактор включится слишком поздно: запрос переполнится раньше, чем история будет подрезана. Меняете модель — вписывайте её настоящее окно, а не круглое число побольше.

Команда /compact сворачивает свободный разговор с измеренным входом от 30 000 токенов. Ива подтверждает завершение, затем со следующим ответом показывает размер до и после свёртки по первому измеренному входу модели. Во время ответа повторите команду после его завершения. После перезапуска один законченный ход даст новый замер.

Telegram

ПеременнаяПо умолчаниюЗаметки
TELEGRAM_BOT_TOKEN—От @BotFather.
TELEGRAM_BOT_USERNAME—Username вашего бота. Мастер проверяет токен через getMe и определяет его сам.
TELEGRAM_WEBHOOK_SECRET_TOKEN—Общий секрет между long-poll-мостом и локальным вебхуком. Любая длинная случайная строка.
TELEGRAM_ALLOWED_USER_IDS(пусто)Числовые ID пользователей через запятую — кому разрешено говорить с Iva.
TELEGRAM_DIGEST_CHAT_ID—Чат для ночных отчётов памяти и разовых предложений стабильных обновлений. Обычно ваш собственный chat ID. Watch, Brief и провал задания с кнопкой «Починить» идут в личный чат (первый ID из TELEGRAM_ALLOWED_USER_IDS): в них почта и переписка, а кнопка принимается только там.
SUPPORT_CHAT_URL(пусто)Ссылка-приглашение в чат поддержки, куда скилл report-problem предлагает прийти при сбое; пусто - Ива честно скажет, что адрес не настроен.
TELEGRAM_RICH_REPLIESautoauto шлёт ответ в текущий чат rich-сообщением, когда в нём есть таблица, чек-лист, <details> или блочная формула; never оставляет такие ответы на обычном HTML/plain-пути. Любое другое значение останавливает старт. iva post не затронут.

Список разрешённых работает по принципу fail-closed: пустой список — Iva не отвечает никому. Мастер сам подхватывает ваш ID, как только вы напишете боту; или спросите у @userinfobot. Почему fail-closed важен: security.md.

В 10:00 по ASSISTANT_TIMEZONE Iva без обращения к модели проверяет Git upstream. Пока новой стабильной версии MAJOR.MINOR.PATCH нет, сообщений не будет; каждую новую версию Iva предлагает только один раз. Если TELEGRAM_DIGEST_CHAT_ID пуст, используется первый доверенный ID.

Голос

ПеременнаяПо умолчаниюЗаметки
DEEPGRAM_API_KEY—Необязательный. С console.deepgram.com. Расшифровывает голосовые, видеокружки и аудиофайлы; без него записи сохраняются, но не расшифровываются. Мастер даёт пропустить (Enter); добавить потом в /menu → 🎤 Голос или iva config. Бесплатный тариф: providers.md.
DEEPGRAM_LANGUAGEmultimulti сам определяет язык каждого сообщения (ru/uz/en и другие). Фиксируйте один код вроде en, только если автоопределение спотыкается на вашей смеси языков.
DEEPGRAM_KEYTERMS—Необязательный. Имена и термины, которые Deepgram должен писать как у вас, через запятую: OJ,Sonnet,Todoist. Каждое уходит в запрос как keyterm (Keyterm Prompting у nova-3); в запрос идут первые, пока их не больше 50 и вместе не больше 500 знаков: сверх лимита на keyterm Deepgram отказывает всему запросу. В .env помещается только латиница. Keyterm Prompting Deepgram берёт в счёт отдельной поминутной доплатой. Задаётся в /menu → 🎤 Голос.

Поиск

ПеременнаяПо умолчаниюЗаметки
SEARCH_PROVIDERtavilytavily, exa, parallel или brave.
TAVILY_API_KEY EXA_API_KEY PARALLEL_API_KEY BRAVE_API_KEY—Ключ соответствующего провайдера. Ключи могут лежать все сразу; смена провайдера — это только флаг.

Нет ключа у активного провайдера — web_search вернёт понятную ошибку, ничего не упадёт. Бесплатные тарифы и сравнительная таблица: providers.md.

Память

ПеременнаяПо умолчаниюЗаметки
MEMORY_SEARCH_MODEgrepgrep = BM25 поверх встроенного в Node SQLite FTS5 плюс переранжировка по графу. Ноль внешних зависимостей, ноль ключей, работает на сервере за $4. hybrid добавляет векторные эмбеддинги — один внешний ключ.
JINA_API_KEY—Для hybrid. Jina jina-embeddings-v3: политика no-train, хостинг в ЕС.
DEEPINFRA_API_KEY—Для hybrid. Дешевле, отдаёт BAAI/bge-m3. Хватит одного из двух ключей.
MEMORY_EMBED_PROVIDER(авто)Переопределить автовыбор: jina или deepinfra.
MEMORY_EMBED_MODELjina-embeddings-v3Имя модели эмбеддингов.
MEMORY_EMBED_URL—Любой OpenAI-совместимый endpoint эмбеддингов, например локальная Ollama на http://127.0.0.1:11434/v1/embeddings — тогда внешний ключ вообще не нужен.

Гибридный индекс собирает ночной проход Brain; чтобы собрать его прямо сейчас, запустите node --env-file=.env scripts/memory/embed-index.ts. Как поиск устроен на самом деле: memory.md.

Уведомления

То, что Iva говорит сама, живёт в data/settings.json, а не в .env - эти ключи пишет экран 🔔 Уведомления в /menu, а тумблер отчётов читается в конце каждого ночного прогона, ключ proactive — на каждом получасовом тике Watch, Brief и Insight - поэтому тап срабатывает без перезапуска.

КлючПо умолчаниюЗаметки
memoryReports.enabledfalseНочной отчёт памяти (daily 04:00 и weekly пн 04:15) в Telegram. Выключено - vault всё равно пишется.
proactive.enabledtrueWatch, Brief и Insight (Сама пишет). Выключено - нет всех трёх, сбои приходят. Остальное - iva proactive.
proactive.briefTimes["08:30", "14:00"]Обзор дня, HH:00 или HH:30, не больше двух; пусто — обзора нет. Команда /digest даёт Brief руками в любое время.
proactive.insightTimes[]Insight (инсайт): одно время HH:00 или HH:30, лучше HH:30; пусто — выключено. Окно 3 ч в тихих часах — хода нет; и тумблер Инсайт в /menu → Уведомления.
proactive.ceilingTokensPerDay0Ceiling дня для Watch, Brief и Insight в токенах их ходов (iva usage by-source); достигнут — в этот день нет Insight и Brief, Watch сообщает только сбои. 0 — выключен.

Insight (инсайт): раз в день Ива собирает и прогоняет один черновик плагина под то, что вы делаете руками, и спрашивает, ставить ли, - ADR-0022.

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

Система

ПеременнаяПо умолчаниюЗаметки
AGENT_LANGUAGEruen или ru. Язык ответов Iva, локаль дат и какой сид CORE.md берёт init-vault. Кнопка 🌐 Язык в /menu переопределяет его в рантайме через data/settings.json (перечитывается на каждом ходе) и дублирует выбор сюда, так что смена мгновенна — без перезапуска (menu.md).
ASSISTANT_TIMEZONEAsia/AlmatyИмя из базы IANA. Задаёт даты дневных транскриптов, два systemd watchdog-таймера, семь внутрипроцессных eve schedules и дату/время, которые Iva видит на каждом ходе. Экспортируется как TZ.
ASSISTANT_VAULT_DIRvaultЖивая память: отдельный приватный git-репозиторий, открывается в Obsidian.
ASSISTANT_DATA_DIRdataДанные рантайма: tasks.json, лог токенов usage.jsonl.
IVA_PORT8723Порт локального eve-сервера. Немодный нарочно — 3000/8000/8080 на типовом VPS обычно уже заняты docker и компанией. Меняйте через iva config, не руками: systemd-юнит прописывает порт буквально, и они должны совпадать (deploy.md).
ASSISTANT_HOSThttp://127.0.0.1:${IVA_PORT}Где poll-мост и скрипты памяти ищут сервер. Меняйте, только если агент живёт на другом хосте.
ASSISTANT_BEARER(генерируется)Общий секрет для session-маршрутов Eve. Setup/upgrade создают его, локальные клиенты читают автоматически. Не публикуйте.
AGENT_BROWSER_MAX_OUTPUT24000Лимит символов на вывод agent-browser, чтобы один дамп страницы не съел контекстное окно.

OpenCode Responses не отправляет THINKING_EFFORT: контракт reasoning для произвольных моделей Go не доказан; /think не предлагает уровни в этом режиме. Старые установки без обеих переменных сохраняют chat/completions, модели, ключи и данные.

Исходный Markdown ↗