Машина и модели
Настройки делятся на две части. Всё, что относится к вам и вашей машине — модели, токены, квоты, — лежит в ~/.jarvis/config.yaml и никуда не коммитится. Всё, что относится к проекту и команде, — в .jarvis/ проекта, об этом на следующей странице.
Если одна и та же настройка есть в обоих местах, побеждает проект: команда решает, по каким правилам идёт работа.
Модели
Модель описывается один раз, а потом получает роли. Подойдёт любой сервер с OpenAI-совместимым API.
models:
flash:
provider: openai-compatible
baseUrl: https://llm.example.com/v1
model: deepseek-flash
auth: { type: bearer, token: keychain:llm }
egress: private # где модель: private — внутри контура, cloud — у внешнего провайдера
quotaPool: main
contextWindow: 128000
maxOutput: 8192
coder:
provider: openai-compatible
baseUrl: https://llm.example.com/v1
model: qwen-coder
auth: { type: bearer, token: keychain:llm }
egress: private
quotaPool: main
contextWindow: 64000
maxOutput: 8192egress обязателен. По нему Jarvis решает, можно ли отправлять этой модели код проекта: конфиденциальный проект (так по умолчанию) работает только с моделями внутри контура.
jarvis models probe <модель> проверяет, что модель умеет на деле: вызывать инструменты, отвечать строгим JSON. Агенту, которому нужны инструменты, модель без них не достанется.
Роли
Агенты не знают о конкретных моделях. Они просят роль, а роль говорит, какие модели и в каком порядке её выполняют:
roles:
research: { models: [flash] } # исследование, требования, спецификация, план
implementation: { models: [coder, flash] } # код, тесты, документация
review: { models: [flash] } # ревью и разбор замечаний
compaction: { models: [flash] } # сжатие длинной истории агентаПорядок — это предпочтение. Если первая модель занята или её квота кончилась, вызов уйдёт следующей из другого пула, если она подходит: разрешена для проекта, умеет нужное и вмещает промпт.
Квоты
Корпоративные шлюзы обычно ограничивают токены за окно времени. Jarvis считает это сам и не выходит за предел:
quotaPools:
main:
window: { minutes: 20 }
limits: { outputTokens: 60000, inputTokens: 400000, requests: 300 }
soft: 0.8 # после 80% окна вызовы идут по одному
unlimited: # часы, когда шлюз не ограничивает
- { from: "22:00", to: "07:00" }
- { days: [sat, sun] }
timezone: Europe/MoscowЕсли вызов не помещается в окно, задача встаёт на паузу и продолжается сама, когда окно освободится или начнутся безлимитные часы. В безлимитные часы лимиты агентов тоже растут, так что ночью задача успевает больше.
jarvis models показывает, сколько окна потрачено в каждом пуле.
Токены
Секреты в YAML запрещены: вместо значения пишется ссылка keychain:имя (связка ключей ОС) или env:ПЕРЕМЕННАЯ.
jarvis auth set llm # спросит значение и положит в связку ключей
jarvis auth status # что есть, без значенийГде связки ключей нет, используется файл с правами только для владельца.
Кто вы
Каждое решение — утверждение, возврат, ответ на вопрос — записывается с автором. По умолчанию это email из git config, его можно задать явно:
actor: { id: me@example.com, display: Анна }Язык
Агенты пишут документы для людей на языке, который вы укажете (language: ru). Код, пути, имена и цитаты из источников остаются как есть. Лучше задать язык в проекте, чтобы он был общим для команды.
Проверить всё сразу
jarvis doctorПокажет всё, что помешает задаче: недоступную модель, токен, которого нет, MCP-сервер, который не отвечает, модель, которую политика данных проекта не разрешает.