Как устроен помощник

Один ответ помощника это ход (turn). Он идёт в main, говорит с выбранной моделью через AI SDK (ai и @ai-sdk/*) и меняет граф только через движок команд.

Ход по шагам

  1. Renderer начинает его. src/renderer/services/llm/chatService.ts открывает ход (startRun или resumeRun после паузы) и отправляет разговор по llm:stream-chat вместе с контекстом хода: режим (спросить, строить или чат), выделение, что на экране и язык.
  2. Main собирает запрос. src/main/agent/prompt.ts пишет системный запрос из контекста хода, сводки каталога, графа со всеми значениями полей (значения, похожие на ключи, становятся [redacted]; при выключенном «Настройки ▸ Приватность ▸ Отправлять значения полей модели» значения не отправляются) и последних команд человека. История обрезается так, чтобы занять 70 % окна контекста модели (src/shared/agent/contextWindow.ts). Системные сообщения самого renderer заменяются: renderer не видит каталог и журнал действий.
  3. Main предлагает инструменты. Какие, зависит от режима (ниже). При маленьком окне контекста на своём сервере предлагаются только те, без которых ход не обойдётся (compactToolNames в src/main/agent/turn.ts).
  4. Модель отвечает и вызывает инструменты. src/main/llmService.ts передаёт ответ потоком. Каждый вызов инструмента сверяется со схемой и выполняется в main.
  5. Main передаёт обратно текст, куски build-step для каждого шага сборки и новую projection после каждой команды (src/main/agent/streamParts.ts).
  6. Ход заканчивается: модель закончила, человек остановил, случилась ошибка или достигнут лимит шагов. На лимите шагов приходит кусок turn-paused, и ход остаётся на паузе до «Продолжить»; иначе ход закрывается (а его новые ноды раскладываются).

Инструменты

ГруппаИнструментыКогда
ЧтениеgetGraph, searchNodeTypes, describeNodeType, findInstalledModels, describeModel, checkGraph, searchWeb, fetchPageВ каждом ходе. searchWeb и fetchPage только если разрешены в «Настройки ▸ Помощник».
ЗнанияexplainВ каждом ходе: пишет объяснение ноды, связи или графа.
ПредложенияproposeNode, proposeConnection, proposeParameter, proposeSubgraphВ ходах «спросить» и чата: серые черновики, которые человек принимает или нет.
СборкаaddNode, connectNodes, setParameter, removeNode, createSubgraph, insertSubgraph, annotateNode, setComponentDocumentation, setProcessВ ходах «строить» и в чате, если в «Настройки ▸ Помощник ▸ Когда я прошу изменение» выбрано «Строить сразу». Каждый вызов это команда с actor: 'ai'.

Списки лежат в src/shared/contracts/agentTools.ts; схемы и описания в src/main/agent/toolSpecs.ts и src/shared/commands/toolSpecs.ts; инструменты чтения в src/main/agent/tools.ts, сборки в src/main/agent/buildTools.ts. Как добавить свой: Как добавить инструмент помощнику.

Черновики

Инструмент предложения пишет черновик (src/main/proposals/): серую ноду, связь или значение на холсте. Человек принимает его, и тогда он применяется обычной командой, или отклоняет. Черновик устаревает, когда удалены ноды, для которых он сделан, или открыт другой граф.

Поиск и страницы

src/main/agent/web.ts. Облачная модель со своим поиском (OpenAI, Anthropic, Google) ищет на стороне поставщика. Иначе searchWeb спрашивает HTML-страницу DuckDuckGo из main. fetchPage открывает только публичные адреса http и https на портах 80 и 443 и никогда адрес этого компьютера, локальной сети, адрес ComfyUI или MCP-сервера; страница читается до предела размера, её текст обрезается до предела длины и передаётся модели как данные, с пометкой, если был обрезан.

Ошибки

Неудачный ход становится одним видом ошибки (src/shared/agent/turnError.ts, providerErrors.ts) с одним предложением для человека (src/renderer/services/llm/turnErrorText.ts). Собственные слова сервера остаются доступны в «Что ответил сервер». Неудачные ответы

Журнал общения с моделью

src/main/trace/modelTrace.ts записывает каждый ход в logs/model/: что отправлено, каждый шаг и вызов инструмента, ошибки сервера, токены и время, тела запросов и ответов без заголовков. Каждая строка проходит то же скрытие секретов, что и основной журнал. Окно для чтения: src/renderer/components/log/.

Тесты

tests/unit/agent/, tests/integration/chatToGraph.test.ts, chatRunLifecycle.test.ts и e2e-тесты assistant-runs, step-checkpoint, strict-chat-to-graph и model-log используют модель с заготовленными ответами (src/main/testLLMTransport.ts), поэтому сеть не нужна.

См. также

Страница перенесена из wiki репозитория приложения (docs/wiki/dev/Assistant-Internals.ru.md, ревизия b8e3f71). То же руководство встроено в приложение: «Справка ▸ Руководство».

Чтобы обновить её, выполните npm run import, а затем npm run build в папке сайта.