Сервер получает от пользователя запрос на выполнение одного или нескольких вызовов инструментов. Дальше в работу включается большая языковая модель — LLM. Она генерирует блок кода на каком-то языке программирования, и этот блок устроен так, что внутри него зашиты все нужные вызовы инструментов.
Сервер запускает этот код-блок в песочнице — sandbox. В процессе исполнения может встретиться отложенный вызов инструмента. Тогда выполнение кода приостанавливается. Сервер отправляет этот вызов клиенту, чтобы тот его выполнил. Когда клиент возвращает результат, сервер подставляет его в код вместо ожидающего вызова и продолжает выполнение с того места, где остановился. В конце сервер возвращает итоговый результат выполнения кода обратно в LLM.
Это всё. Метод завязан на разделение работы между сервером и клиентом: LLM и песочница крутятся на сервере, а часть вызовов инструментов уходит наружу, к клиенту. Код-блок выступает контейнером для всей последовательности вызовов, а pausing и resuming позволяют не рвать поток исполнения и синхронно дожидаться результата от внешней стороны.
Запрос пользователя — входная точка. Генерация кода — связующее звено между LLM и реальным исполнением. Песочница даёт изоляцию для запуска кода. Отложенный вызов — механизм взаимодействия с клиентом. Замена вызова результатом и возобновление — ключевой приём, который делает всю схему рабочей. В конце LLM получает не сырые результаты отдельных вызовов, а финальный ответ уже выполненного кода.
Такой подход позволяет LLM не выполнять инструменты самой и не ждать ответы по частям, а один раз сгенерировать программу, которая уже сама оркеструет все вызовы. Клиент при этом остаётся в курсе происходящего, потому что именно он исполняет отложенные вызовы и возвращает результаты обратно в песочницу.