Как устроен помощник
Один ответ помощника это ход (turn). Он идёт в main, говорит с выбранной моделью через AI SDK (ai и @ai-sdk/*)
и меняет граф только через движок команд.
Ход по шагам
- Renderer начинает его.
src/renderer/services/llm/chatService.tsоткрывает ход (startRunилиresumeRunпосле паузы) и отправляет разговор поllm:stream-chatвместе с контекстом хода: режим (спросить, строить или чат), выделение, что на экране и язык. - Main собирает запрос.
src/main/agent/prompt.tsпишет системный запрос из контекста хода, сводки каталога, графа со всеми значениями полей (значения, похожие на ключи, становятся[redacted]; при выключенном «Настройки ▸ Приватность ▸ Отправлять значения полей модели» значения не отправляются) и последних команд человека. История обрезается так, чтобы занять 70 % окна контекста модели (src/shared/agent/contextWindow.ts). Системные сообщения самого renderer заменяются: renderer не видит каталог и журнал действий. - Main предлагает инструменты. Какие, зависит от режима (ниже). При маленьком окне контекста на своём сервере
предлагаются только те, без которых ход не обойдётся (
compactToolNamesвsrc/main/agent/turn.ts). - Модель отвечает и вызывает инструменты.
src/main/llmService.tsпередаёт ответ потоком. Каждый вызов инструмента сверяется со схемой и выполняется в main. - Main передаёт обратно текст, куски
build-stepдля каждого шага сборки и новуюprojectionпосле каждой команды (src/main/agent/streamParts.ts). - Ход заканчивается: модель закончила, человек остановил, случилась ошибка или достигнут лимит шагов. На лимите
шагов приходит кусок
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), поэтому сеть не нужна.