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 agent — agent-vs-workflow. Code-emitting не отменяет workflow-decomposition.
- Inngest orchestration — inngest. Оборачивает 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 слой, ортогонален выбору парадигмы
Источники
Сноски
-
Anthropic “Code Execution with MCP” (4 ноября 2025, investigative тон, термин их — не “Code Mode”), accessed 2026-05-17, https://www.anthropic.com/engineering/code-execution-with-mcp. ↩
-
Simon Willison про Anthropic пост, accessed 2026-05-17, https://simonwillison.net/2025/Nov/4/code-execution-with-mcp/. ↩
-
Cloudflare “Code Mode” (mid-2025, термин их), accessed 2026-05-17, https://blog.cloudflare.com/code-mode/. ↩
-
Cloudflare Code Mode + MCP (расширение), accessed 2026-05-17, https://blog.cloudflare.com/code-mode-mcp/. ↩
-
CodeAct paper (Wang et al, ICML 2024), accessed 2026-05-17, https://arxiv.org/abs/2402.01030. ↩
-
Mastra Code Mode RFC (open), accessed 2026-05-17, https://github.com/mastra-ai/mastra/issues/11036. ↩
-
Cloudflare Dynamic Workers Open Beta (April 2026), accessed 2026-05-17, https://www.infoq.com/news/2026/04/cloudflare-dynamic-workers-beta/. ↩
-
smolagents документация (code-emitting по дефолту), accessed 2026-05-17, https://huggingface.co/docs/smolagents. ↩
-
Slack-тред 2026-04-27 (триггер для разбора, Никита → Ильдар), accessed 2026-05-17, https://realaicorp.slack.com/archives/C094GRT3CBY/p1777316077295729. ↩