← Dynamic Workers / dynamic-workers / examples
Пример Code Mode
В этом примере показано, как использовать @cloudflare/codemode ↗ библиотеку с Agents SDK ↗ для создания агента, в котором LLM пишет код, оркестрирующий вызовы инструментов, вместо того чтобы вызывать их по одному. Этот подход называется Code Mode ↗, сокращает расход токенов до 80%, даёт более качественные результаты и не раздувает контекстное окно.
В этом примере показано, как выполнить следующее:
- Определение инструментов в виде обычных функций со схемами Zod
- Используйте
createCodeToolчтобы предоставить LLM ваши инструменты в виде единственного инструмента "написать код" - Используйте
DynamicWorkerExecutorдля безопасного выполнения кода, сгенерированного LLM - Соберите всё это вместе с помощью
AIChatAgentдля обработки чата через WebSocket
Как это работает
Агент использует три компонента из @cloudflare/codemode ↗ библиотека и Agents SDK ↗:
AIChatAgent(@cloudflare/ai-chat), базовый класс вашего агента. Он обрабатывает чат через WebSockets, сохраняет сообщения и вызывает LLM.createCodeTool(@cloudflare/codemode/ai), объединяет ваши инструменты в единыйcodemodeинструмент, принимающий{ code: string }.DynamicWorkerExecutor(@cloudflare/codemode), выполняет код, сгенерированный LLM, в изолированном Dynamic Worker.
Процесс:
- Пользователь отправляет сообщение через WebSocket.
AIChatAgentпередаёт его LLM с единственным доступным инструментом:codemode.- LLM пишет код на JavaScript, например
const projects = await codemode.listProjects(), вместо выполнения отдельных вызовов инструментов. DynamicWorkerExecutorзапускает изолированный Worker и выполняет код. Внутри песочницы,codemode.listProjects()вызывает ваш реальныйlistProjectsреализация.- Результат, любой вывод консоли и ошибки возвращаются в LLM.
- LLM использует результат, чтобы ответить пользователю, либо пишет дополнительный код при необходимости.
DynamicWorkerExecutor
DynamicWorkerExecutor является частью @cloudflare/codemode библиотека. Когда LLM пишет код, который оркестрирует ваши инструменты, этот код должен выполняться в безопасном месте. DynamicWorkerExecutor запускает изолированный Dynamic Worker для каждого выполнения, используя привязку Worker Loader. Внутри песочницы:
- A
codemodeproxy-объект маршрутизирует вызовы вродеcodemode.createTask(...)обратно к вашим реальным реализациям инструментов через Workers RPC - Настройка
globalOutboundкnullблокиfetch(), поэтому код может обращаться к внешнему миру только через ваши инструменты console.logвывод перехватывается и возвращается вместе с результатом- Каждое выполнение получает собственный экземпляр Worker с тайм-аутом 30 секунд
import { DynamicWorkerExecutor } from "@cloudflare/codemode";
const executor = new DynamicWorkerExecutor({
loader: env.LOADER, // WorkerLoader binding from wrangler.jsonc
timeout: 30000, // default: 30s
globalOutbound: null, // null = fetch blocked
});import { DynamicWorkerExecutor } from "@cloudflare/codemode";
const executor = new DynamicWorkerExecutor({
loader: env.LOADER, // WorkerLoader binding from wrangler.jsonc
timeout: 30000, // default: 30s
globalOutbound: null, // null = fetch blocked
});createCodeTool
createCodeTool является частью @cloudflare/codemode. Он принимает ваши инструменты и executor, и возвращает единый AI SDK tool(). Он:
- Генерирует объявления типов TypeScript на основе схем Zod ваших инструментов, чтобы LLM знала, что доступно и как выглядят аргументы.
- Помещает эти типы в описание инструмента, поэтому LLM видит единый инструмент с параметром
{ code: string }и описание, включающее полную типизированную поверхность API. - При выполнении нормализует код LLM (удаляет ограждения markdown, оборачивает отдельные операторы в асинхронные функции, автоматически возвращает последнее выражение), а затем передает его исполнителю.
import { createCodeTool } from "@cloudflare/codemode/ai";
const codemode = createCodeTool({
tools: myTools, // Record<string, tool()> with Zod schemas
executor, // DynamicWorkerExecutor
});
// The LLM sees: one tool called "codemode" with input { code: string }
// The description includes TypeScript types for all your toolsimport { createCodeTool } from "@cloudflare/codemode/ai";
const codemode = createCodeTool({
tools: myTools, // Record<string, tool()> with Zod schemas
executor, // DynamicWorkerExecutor
});
// The LLM sees: one tool called "codemode" with input { code: string }
// The description includes TypeScript types for all your toolsLLM пишет асинхронную стрелочную функцию. createCodeTool нормализует его и передаёт исполнителю. Исполнитель собирает модуль Worker с codemode proxy, выполняет код и возвращает { code, result, logs }.