Status: research / exploratory industry idea, not deployed. Не зрелый pattern, а кластер схожих идей появившихся в индустрии в 2025. Cloudflare опубликовала blog “Code Mode” (mid-2025), Anthropic — engineering пост “Code Execution with MCP” (4 ноября 2025). Оба тоном investigative / exploratory — “we’ll explore how this can enable…”, “if you implement this approach, we encourage you to share”. Не “вот established pattern, делайте так”.

В BloodGPT не используется. Все 5 production-агентов (mastra) и Никитин FHIR-агент в Realai-plus/fhir-services (feature/medagentbench-agent) — на классическом tool calling (industry-standard парадигма).

Страница фиксирует наш разбор апрель 2026, чтобы при будущих обсуждениях не пересказывать с нуля.

Industry-standard: tool calling (discrete invocations)

Доминирующая парадигма — tool-calling (там полное описание). LLM emit’ит дискретные tool invocations в structured-формате; результаты возвращаются в conversation messages; композиция и фильтрация — в LLM-контексте.

LLM → {"tool": "fhir_search", "args": {"resourceType": "Observation", "patient": "p1"}}
agent ← {entry: [...300 наблюдений, 50KB JSON...]}
LLM → {"tool": "execute_python_code", "args": {"code": "for obs in resources['Observation']:..."}}
agent ← stdout: "5"

Релевантные для контраста издержки: каждый промежуточный результат попадает в LLM context как часть messages. Несколько search’ей = килобайты в context. Длинные результаты приходится cap’ить (Никитин агент cap’ит stdout до 80KB, иначе context взрывается). Это ровно то ограничение, которое code execution-идея пытается обойти.

Emerging idea: code execution (composed orchestration)

Идея — вместо дискретных tool invocations дать LLM типизированный TS-API к тулам, и пусть она пишет одну async-функцию, которая вызывает эти тулы как обычные function calls внутри кода, фильтрует результаты внутри sandbox и возвращает короткий ответ. Композиция и фильтрация внутри code execution, а не в LLM-контексте.

// LLM emit'ит:
const obs = await fhir.search('Observation', { patient: 'p1', code: 'creatinine' });
const elevated = obs.entry.filter(e => e.resource.valueQuantity.value > 1.5);
return elevated.length;

300 наблюдений никогда не попадают в LLM-context — фильтруются в isolate, в context улетает только 5.

Прецеденты в индустрии

  • CodeAct paper (Wang et al, ICML 2024, https://arxiv.org/abs/2402.01030) — академическое обоснование. Code-emitting агенты +20% на API-Bank vs tool calling. Самый ранний из формальных источников.
  • Cloudflare “Code Mode” (mid-2025, https://blog.cloudflare.com/code-mode/) — первый коммерческий blog с конкретной реализацией. Используется в Workers + @cloudflare/agents-sdk + Dynamic Worker Loader. Конкретная цифра: Cloudflare API: 1.17M токенов как MCP tools → 1k как typed code (это для их собственного API surface, не universal).
  • Anthropic “Code Execution with MCP” (4 ноября 2025, https://www.anthropic.com/engineering/code-execution-with-mcp) — engineering пост, investigative тон (“explore how… can enable”), не declaration. Конкретная цифра: 150,000 → 2,000 токенов = 98.7% reduction — это для одного специфичного сценария (dynamic tool discovery через filesystem вместо upfront tool definitions), не blanket improvement на любом workflow. Anthropic явно пишет про caveats: “infrastructure complexity”, “security considerations”, “should be weighed against implementation costs”.
  • smolagents (Hugging Face) — code-emitting по дефолту, делегируют sandbox внешним сервисам (E2B / Pyodide).
  • Mastra Code Mode RFC (mastra#11036) — issue открыт, implementation нет, ETA нет.

Терминология не устоялась. Cloudflare называет “Code Mode”, Anthropic — “code execution with MCP”, академически — CodeAct. Я ниже использую “code-emitting” как нейтральное.

Что именно эта идея даёт vs стоит

Потенциальный upside (по claims источников)

  • Промежуточные данные не в context. Filter / map / reduce операции над search results делаются в isolate, LLM “видит” только результат. Главное обоснование Cloudflare и Anthropic.
  • Снятие cap’ов на tool results. В tool calling длинные results приходится обрезать (80KB у Никиты). В code-emitting cap не нужен — данные не возвращаются в context as-is.
  • Меньше LLM round-trips на типичную задачу. Если задача укладывается в одну функцию — один emission вместо 3-5 дискретных tool calls. Не “10x меньше итераций” в общем случае — для multi-stage reasoning всё равно несколько emission’ов.
  • Естественные операции над данными. filter/map/reduce/dataframe-style — на коде проще и надёжнее, чем эмулировать через tool calls.
  • Точность на benchmarks. CodeAct paper показывает +20% на API-Bank; это академический бенчмарк, не наш workload.

Прямые издержки (Anthropic явно упоминает)

  • Sandbox с RPC обратно в host. Это сложнее обычного “subprocess в bwrap”. Код в isolate должен async-вызвать наш handler через RPC, получить data, продолжить. Subprocess-модель (code-execution-sandbox) не подходит — нужен in-process isolate (isolated-vm) или sidecar (workerd) с RPC-bridge. Infrastructure complexity (термин Anthropic).
  • Trust boundary для emitted code. Prompt-injection из data может попасть в emitted code. Sandbox защищает от исполнения, но не от того что код написал не то. Нужна валидация emitted-code или ограничение bindings — отдельная задача. Security considerations (термин Anthropic).
  • Генерация .d.ts из тулов. TypeScript declaration-файлы должны генерироваться из существующих handler’ов / Zod-схем и подаваться LLM как контекст. Своя инфра.
  • Меньше зрелости в frameworks. Mastra ещё не умеет (mastra#11036), OpenAI Assistants и LangChain — тоже нет. Всё своими руками или привязка к Cloudflare ecosystem.
  • Меньше debugging-инструментов. В tool calling каждый шаг = JSON в conversation log, легко replay/diff. В code-emitting — debugging сгенерённого кода сложнее.

Ортогональные axis (не зависят от выбора)

  • Какой LLM — обе работают с frontier-моделями (GPT, Claude, Gemini). Code-emitting слегка лучше у моделей с выраженным coding-bias.
  • Decompose vs single agentagent-vs-workflow. Code-emitting не отменяет workflow-decomposition.
  • Inngest orchestrationinngest. Оборачивает agent loop как step.run, внутри может быть и tool-calling, и code-emitting.

Применимость к BloodGPT

Текущий триггер для разбора — Никитин FHIR-агент. tool calling с пятью тулами, упирается в 80KB cap (для пациентов с большой историей данные режутся, иногда LLM делает несколько search’ей и склеивает part’ами в коде). Гипотетически — code-emitting снял бы cap. Но переход требует ~2 спринта работы (новый sandbox с RPC, генератор bindings, перепроектирование агента); tool calling путь — ~30 LOC (code-execution-sandbox раздел про Mastra LocalSandbox).

Other production-агенты (mastra раздел “Использование в BloodGPT” — survey, patient-summary, health-chat, LOINC, normalization) — tool calling, не делают тяжёлый retrieval. Выигрыш для них меньше (нет 80KB-cap проблемы).

Никто на команде не commit’ил решение делать code-emitting. Идея зафиксирована для понимания landscape, не для немедленного применения.

Авторский контекст (Ильдар, Slack 2026-03-12): идея вписана в более широкую миграцию pipeline на agent-based подход:

Напомню ещё очевидное. У нас там подход еще из 24 года. Мы просто пихаем все что есть в первый промпт. Тогда слово агент было эзотерическим, а tool calling ещё только появился как function calling. Сейчас чтобы ллм показала всю свою мощь очевидно давать им тулы. А если дать ещё правильные тулы, то и результаты будут впечатляющие. Мы пока даже не дали возможность параметры запросить агенту. Собственно для этого мы и хотим работать уже с FHIR — данные аккуратно по коробочкам разложим со стикерами цветными и дадим агенту лапки там ковыряться. А потом может дадим ещё — как вчера подсказал Никита — возможность запускать код. Получится наш маленький Клод код который может все. Главное придумать еще, чтобы это было безопасно.

То есть: code execution для агента — не самоцель и не token-economy upgrade сам по себе, а последний слой в migration “single-prompt → tool-calling agent → agent с code execution”. Ambition — “наш маленький Клод код”; safety — открытая задача (чем и занимается code-execution-sandbox).

Открытые вопросы

  • Реальный token-cost benefit на наших workload’ах — без head-to-head бенчмарка цифры Cloudflare/Anthropic не наши. Carry-over: при первом серьёзном expanded use case Никитиного агента — провести замер.
  • Зрелость инфры — Mastra Code Mode RFC может зарелизиться, тогда барьер входа значимо понизится. Сейчас зрелого framework’а нет.
  • Trust boundary для emitted code — как валидировать сгенерённый код перед exec? Открытый industry-вопрос, у нас тоже не решён.
  • Применимость к non-retrieval агентам — health-chat, survey не выигрывают сильно. Patient-summary (4-фазный agentic loop с FHIR fetchers) — самый близкий по характеру к Никитиному; потенциально применим.

Связано

  • tool-calling — dominant pattern, противоположный полюс контраста; полное описание там
  • code-execution-sandbox — runtime’ы (in-process isolate / sidecar / managed cloud) для исполнения emitted code; связь “что выполняем” ↔ “где выполняем”
  • mastra — текущий agent host BloodGPT, tool calling парадигма; раздел Workspace + Sandbox primitive
  • agent-vs-workflow — ортогональная axis (decompose vs loop)
  • inngest — orchestration слой, ортогонален выбору парадигмы

Источники

Источники: 1 2 3 4 5 6 7 8 9.

Сноски

  1. Anthropic “Code Execution with MCP” (4 ноября 2025, investigative тон, термин их — не “Code Mode”), accessed 2026-05-17, https://www.anthropic.com/engineering/code-execution-with-mcp.

  2. Simon Willison про Anthropic пост, accessed 2026-05-17, https://simonwillison.net/2025/Nov/4/code-execution-with-mcp/.

  3. Cloudflare “Code Mode” (mid-2025, термин их), accessed 2026-05-17, https://blog.cloudflare.com/code-mode/.

  4. Cloudflare Code Mode + MCP (расширение), accessed 2026-05-17, https://blog.cloudflare.com/code-mode-mcp/.

  5. CodeAct paper (Wang et al, ICML 2024), accessed 2026-05-17, https://arxiv.org/abs/2402.01030.

  6. Mastra Code Mode RFC (open), accessed 2026-05-17, https://github.com/mastra-ai/mastra/issues/11036.

  7. Cloudflare Dynamic Workers Open Beta (April 2026), accessed 2026-05-17, https://www.infoq.com/news/2026/04/cloudflare-dynamic-workers-beta/.

  8. smolagents документация (code-emitting по дефолту), accessed 2026-05-17, https://huggingface.co/docs/smolagents.

  9. Slack-тред 2026-04-27 (триггер для разбора, Никита → Ильдар), accessed 2026-05-17, https://realaicorp.slack.com/archives/C094GRT3CBY/p1777316077295729.