Режим выполнения

Режим выполнения

Режим выполнения — обычный ход работы приложения: агент assistant читает и записывает рабочую папку и итеративно выполняет Python в песочнице чата — «думай и действуй кодом». Отдельных агентов «chat» или «ask» больше нет; легаси-режимы удалены, а устаревший ключ agentMode вычищается из app-settings.json при чтении.

Режим планирования предшествует первому ходу (см. Режим планирования); со второго хода каждое сообщение идёт сразу в выполнение.

Что видит пользователь

  1. Введите сообщение (опционально с вложениями или /-командами).
  2. Статус проходит через «Думает…» → «Использует инструмент…», пока агент вызывает инструменты → ответ стримится в чат.
  3. Если инструменту каталога нужно согласие, появляется диалог подтверждения — см. Подтверждение инструментов. Ход продолжается после выбора.
  4. Редактирование и повторная отправка ветвят чат: история с этой точки усекается и в интерфейсе, и в зеркале сессии ядра.

Ошибки преобразуются в понятный текст с помощью 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-серверы.

Связанные страницы