Под обоими нашими AI-движками лежит один механизм: chat-модель, которой дали инструменты, зовёт их по имени и получает результат обратно в контекст. На нём стоят и Query Engine, и Agent Engine — поэтому харнесс сквозной, не собственность одного модуля и не копия в каждом. Что важно: общее здесь — не цикл. Петля — надстройка Agent Engine; Query Engine петли не крутит вовсе. Общий слой тоньше — это сам tool-calling, а «сколько инструментов и есть ли петля» каждый модуль задаёт сверху.
Харнесс — это chat-client с tool-calling. Он делает ровно три вещи, и больше ничего: даёт модели описания доступных инструментов, ловит запрошенный ею вызов и диспетчит его по имени, возвращает результат инструмента ей в контекст. На этом общий слой кончается.
Модули расходятся ровно по двум осям: набор инструментов и условие остановки. Всё остальное — общий примитив выше. Набор обоих сторон берётся из общего каталога инструментов: чат получает ядро поиска плюс включённые в каталоге пресеты и отвечает после одного раунда, Agent Engine — три ядра KS плюс выбранное владельцем, с петлёй до потолка.
search_knowledge + пресеты из каталога
Ядро поиска плюс включённые админом пресеты; за ход — один раунд, в нём 1..N вызовов параллельно (напр. знания + веб), дальше сразу ответ. Многораундовой петли нет — ход остаётся предсказуемым.
search · graph · sql) + выбор владельца из каталога
Модель сама ведёт ход: думает, выбирает инструмент, читает, повторяет — пока не соберёт ответ или не упрётся в потолок. Это и есть агентный цикл.
Набор KS-инструментов условен по наполнению базы. Обе
колонки выше получают ядро к Knowledge Store, только когда база
непуста. Харнесс читает производное свойство
is_empty и при пустом индексе не вносит KS-инструменты
в схему модели вовсе — единообразно для чата
(search_knowledge) и агента (ядро
search · graph · sql). Это не
третья ось расхождения, а общий фильтр набора: модель без данных не
получает поиска и отвечает из себя. Наполнилась база — инструменты
возвращаются сами, без настройки и рестарта.
Слой тонкий намеренно. Общий примитив не тянет за собой ни петлю, ни права, ни хранение — иначе он перестал бы быть общим. Всё, что специфично, остаётся домом своего модуля и ссылается на харнесс, а не повторяет его.
Харнесс — первый житель сквозного AI-слоя: рядом по природе стоят общий эмбеддер и платформенный prompt — такие же общие AI-механики. Сейчас у каждой свой дом; слой даёт им общий адрес, не переселяя.