Режим выполнения
Режим выполнения
Режим выполнения — обычный ход работы приложения: агент assistant читает и записывает рабочую папку и итеративно выполняет Python в песочнице чата — «думай и действуй кодом». Отдельных агентов «chat» или «ask» больше нет; легаси-режимы удалены, а устаревший ключ agentMode вычищается из app-settings.json при чтении.
Режим планирования предшествует первому ходу (см. Режим планирования); со второго хода каждое сообщение идёт сразу в выполнение.
Что видит пользователь
- Введите сообщение (опционально с вложениями или
/-командами). - Статус проходит через «Думает…» → «Использует инструмент…», пока агент вызывает инструменты → ответ стримится в чат.
- Если инструменту каталога нужно согласие, появляется диалог подтверждения — см. Подтверждение инструментов. Ход продолжается после выбора.
- Редактирование и повторная отправка ветвят чат: история с этой точки усекается и в интерфейсе, и в зеркале сессии ядра.
Ошибки преобразуются в понятный текст с помощью friendlyError(), например: нехватка памяти, занятый порт модели, «AI не запущен» или внутренняя ошибка со ссылкой на ~/.levpro-ai/logs/.
Поток хода
ai:sendChat
├─ отклонить пути вложений вне {workspace}/uploads
├─ replaceFrom? ─► splice сообщений + syncCoreSessionHistory()
├─ planPending? ─► ERR_PLAN_PENDING
├─ первый обмен? ─► РЕЖИМ ПЛАНИРОВАНИЯ (может не вернуться к выполнению)
├─ prepareMcpForTask() классифицировать задачу → включить серверы каталога
│ └─ набор изменился? ─► requestMcpRestart() (троттлинг)
├─ lc.sendChat({ approveExecution: autoApproveExecution() })
│ └─ approvalDenied? ─► диалог подтверждения ─► повтор с approveExecution=true
├─ сохранить сообщения пользователя и assistant (включая ошибки)
└─ только первый обмен: suggestTitle() → заголовок (или fallback по тексту)
Вложения должны находиться внутри {workspace}/uploads; любой другой путь от рендера отбрасывается и логируется (ERR_INVALID_PATH).
MCP-профиль
В выполнении всегда присутствует сервер файловой системы рабочей папки, плюс серверы каталога, классифицированные под текущую задачу. Полная картина — на странице MCP-серверы; суть:
filesystem(всегда включён,requires_approval: false): корни ограничены рабочей папкой, полный allowlist инструментов чтения/записи/редактирования/поиска/перемещения.list_allowed_directoriesопущен; домашний каталог пользователя никогда не раскрывается.code-sandbox(каталог,requires_approval: true): движок выполнения.context7(каталог,readonly,requires_approval: false): документация и примеры кода библиотек.
Выбор каталога выполняется до хода: локальный llama-server-промпт решает, какие серверы каталога нужны задаче. Результаты кэшируются на 60 секунд на (рабочую папку, хэш задачи, отпечаток каталога). Если классификация не удалась, ход продолжается только с файловым сервером.
Перезапуск ядра при изменении набора
Ядро читает mcp.json только при старте, поэтому при изменении эффективного набора включённых серверов ядро перезапускается. Набор идентифицируется отпечатком (command, args, env, allowlist и флаг подтверждения каждого сервера), так что новый путь песочницы чата тоже вызывает перезапуск. Перезапуски в режиме выполнения троттлятся: не чаще раза в 15 секунд и никогда во время активной генерации.
Код-песочница
Встроенный MCP-сервер code-sandbox реализует цикл итераций. Он выполняет только Python внутри venv, создаваемой в каталоге песочницы.
| Инструмент | Назначение |
|---|---|
execute |
Записать/сохранить Python-скрипт и запустить его интерпретатором песочницы; возвращает stdout / stderr / код выхода. Основной инструмент итераций. |
create_env |
Создать venv песочницы. |
install_library |
pip install в venv. |
remove_library |
pip uninstall из venv. |
lint_errors |
Статическая проверка (py_compile). |
env_status |
Обзор только-чтение: venv, runtimes, установленные пакеты. |
Структура песочницы (корень = LEVPRO_SANDBOX_DIR): venv/, scripts/ (сохранённые перезапускаемые скрипты), output/ (временные файлы).
- Каталог переиспользуется всё время жизни чата и не очищается при старте сервера, поэтому уточняющие вопросы продолжают дорабатывать ту же среду.
- Его расположение и удаление принадлежат Desktop — см. Область чата.
- Вывод
executeограничен (200 КиБ), таймауты шагов ограничены (по умолчанию 30 с, максимум 600 с).
Конфигурация
Ключи конфигурации, значимые для выполнения, в сгенерированном ~/.levpro-ai/config.yaml:
agents:
assistant: # первый → Core default_agent_name
tools: []
prompt_files:
- <системный промпт>
- ~/.levpro-ai/prompts/mcp.md # правила использования MCP приложения
- <instructions.md проекта> # если непустой
inference: { backend: llama }
llama: { models: { main: { … } } }
app:
max_steps: 20
context_token_budget: … # ~60% от контекста, в диапазоне 1500–6000
history_limit: 12
temperature: 0.7
streaming_enabled: true
tool_call_mode: native
mcp: { enabled: true, external_path: ~/.levpro-ai/mcp.json }
memory: { enabled: true, … } # только если установлен local-ai-memory
degradation: { enabled: true }
prompt_files агента assistant состоят из системного промпта, правил использования MCP приложения (~/.levpro-ai/prompts/mcp.md, пишутся ensureMcpPrompt() — карта задача→сервер→инструмент, настроена под Gemma 4) и instructions.md активного проекта, если он непустой, в этом порядке, чтобы инструкции пользователя имели последнее слово. Агент planner не получает mcp.md (политика только-чтения). См. MCP-серверы.
Связанные страницы
- Режим планирования — фаза только-чтения перед первым ходом.
- Область чата — расположение песочницы в зависимости от области чата.
- Подтверждение инструментов — диалог согласия для инструментов каталога.
- MCP-серверы — полный каталог серверов.
- Ядро AI — жизненный цикл процесса ядра.