← Agent Engine

Tool-calling харнесс

общий слой · Query Engine + Agent Engine

Под обоими нашими AI-движками лежит один механизм: chat-модель, которой дали инструменты, зовёт их по имени и получает результат обратно в контекст. На нём стоят и Query Engine, и Agent Engine — поэтому харнесс сквозной, не собственность одного модуля и не копия в каждом. Что важно: общее здесь — не цикл. Петля — надстройка Agent Engine; Query Engine петли не крутит вовсе. Общий слой тоньше — это сам tool-calling, а «сколько инструментов и есть ли петля» каждый модуль задаёт сверху.

Общий примитив: модель ↔ инструмент ↔ контекст

Харнесс — это chat-client с tool-calling. Он делает ровно три вещи, и больше ничего: даёт модели описания доступных инструментов, ловит запрошенный ею вызов и диспетчит его по имени, возвращает результат инструмента ей в контекст. На этом общий слой кончается.

AI chat-модель в руках — описания инструментов
──▶ просит вызов по имени + аргументы
диспетч по имени исполняет нужный инструмент
──▶ результат как данные, не команда
контекст накопление хода
↻ модель читает результат и решает дальше — сколько раз повторить, задаёт модуль сверху, не харнесс
Описания инструментов
модель получает, что ей доступно и как звать; сам набор — параметр модуля, а его источник — каталог инструментов.
Диспетч по имени
запрошенный вызов сопоставляется обработчику по имени и исполняется; имена и тела инструментов — у модуля.
Накопление контекста
результат возвращается в окно модели как данные; на нём она строит следующий шаг или финальный ответ.
Один харнесс — две параметризации

Модули расходятся ровно по двум осям: набор инструментов и условие остановки. Всё остальное — общий примитив выше. Набор обоих сторон берётся из общего каталога инструментов: чат получает ядро поиска плюс включённые в каталоге пресеты и отвечает после одного раунда, Agent Engine — три ядра KS плюс выбранное владельцем, с петлёй до потолка.

Query Engine → граница
набор ядро search_knowledge + пресеты из каталога
остановка один раунд (1..N параллельно), затем ответ — петли нет

Ядро поиска плюс включённые админом пресеты; за ход — один раунд, в нём 1..N вызовов параллельно (напр. знания + веб), дальше сразу ответ. Многораундовой петли нет — ход остаётся предсказуемым.

общий примитив
набор 3 ядра KS (search · graph · sql) + выбор владельца из каталога
остановка потолок итераций — петля есть

Модель сама ведёт ход: думает, выбирает инструмент, читает, повторяет — пока не соберёт ответ или не упрётся в потолок. Это и есть агентный цикл.

Набор KS-инструментов условен по наполнению базы. Обе колонки выше получают ядро к Knowledge Store, только когда база непуста. Харнесс читает производное свойство is_empty и при пустом индексе не вносит KS-инструменты в схему модели вовсе — единообразно для чата (search_knowledge) и агента (ядро search · graph · sql). Это не третья ось расхождения, а общий фильтр набора: модель без данных не получает поиска и отвечает из себя. Наполнилась база — инструменты возвращаются сами, без настройки и рестарта.

Граница слоя: что общее, что нет

Слой тонкий намеренно. Общий примитив не тянет за собой ни петлю, ни права, ни хранение — иначе он перестал бы быть общим. Всё, что специфично, остаётся домом своего модуля и ссылается на харнесс, а не повторяет его.

Делит харнесс
  • chat-client с tool-calling
  • диспетч вызова по имени
  • накопление результата в контексте
Остаётся в Agent Engine
Остаётся в Query Engine
  • поисковый маршрут (5 шагов)
  • условие «один раунд, без петли»
  • упаковка контекста и цитирование

Харнесс — первый житель сквозного AI-слоя: рядом по природе стоят общий эмбеддер и платформенный prompt — такие же общие AI-механики. Сейчас у каждой свой дом; слой даёт им общий адрес, не переселяя.