← Создание агентов на Cloudflare / agents / tools / codemode
Справочник по API Code Mode
Code Mode публикует шесть точек входа пакета. Импортируйте API, специфичные для конкретного фреймворка, из соответствующей точки входа:
| Точка входа | Назначение |
|---|---|
@cloudflare/codemode |
Runtime, коннекторы, исполнитель Workers и утилиты, независимые от фреймворка |
@cloudflare/codemode/ai |
Инструменты AI SDK и адаптер коннектора |
@cloudflare/codemode/mcp |
Обёртки серверов Model Context Protocol (MCP) |
@cloudflare/codemode/tanstack-ai |
Инструменты и адаптер TanStack AI |
@cloudflare/codemode/browser |
Дескриптор инструмента браузера и executor iframe |
@cloudflare/codemode/vite |
Плагин Vite для обнаружения коннекторов и экспортов Worker |
@cloudflare/codemode
Основная точка входа не требует установки опциональных peer dependencies AI SDK, TanStack AI или Zod.
Построение runtime
createCodemodeRuntime()
function createCodemodeRuntime(
options: CreateCodemodeRuntimeOptions,
): CodemodeRuntimeHandle;Создаёт плоскость управления на стороне хоста для именованного рантайма Code Mode.
CreateCodemodeRuntimeOptions содержит следующие поля:
| Поле | Тип | Обязательный | Описание |
|---|---|---|---|
ctx |
DurableObjectState |
Да | Состояние Durable Object, которое размещает грань рантайма. |
connectors |
CodemodeConnector[] |
Да | Коннекторы доступны как глобальные объекты sandbox. Имена коннекторов должны быть уникальными, и codemode зарезервирован. |
executor |
Executor |
Да | Sandbox, который выполняет сгенерированный код. |
name |
string |
Нет | Идентичность устойчивого рантайма. По умолчанию: "default". Допустимые символы: буквы, цифры, _, -, а также .. |
maxExecutions |
number |
Нет | Терминальные записи, сохраняемые при запуске нового прогона. По умолчанию 50. Выполняющиеся и приостановленные запуски не удаляются автоматически. |
transformResult |
TransformResult |
Нет | Преобразует завершённый результат, возвращаемый модели. Журнал аудита сохраняет неизменённый результат. |
interface CodemodeRuntimeHandle {
tool(
options?: CodemodeRuntimeToolOptions,
): Tool<ProxyToolInput, ProxyToolOutput>;
execute(input: ProxyToolInput): Promise<ProxyToolOutput>;
search(query: string): Promise<SearchOutput>;
describe(target: string): Promise<DescribeOutput>;
approve(options: CodemodeApproveOptions): Promise<ProxyToolOutput>;
reject(options: CodemodeRejectOptions): Promise<boolean>;
rollback(options: CodemodeRollbackOptions): Promise<void>;
pending(executionId?: string): Promise<PendingAction[]>;
expirePaused(options?: CodemodeExpireOptions): Promise<string[]>;
executions(limit?: number): Promise<ExecutionState[]>;
deleteExecution(id: string): Promise<boolean>;
pruneExecutions(keep?: number): Promise<number>;
saveSnippet(name: string, options: SaveSnippetOptions): Promise<Snippet>;
snippets(): Promise<Snippet[]>;
deleteSnippet(name: string): Promise<boolean>;
}Методы handle имеют следующие эффекты:
| Метод | Эффект |
|---|---|
tool(options?) |
Возвращает инструмент AI SDK, переданный модели. description заменяет описание по умолчанию. connectorHints добавляет однострочную подсказку для каждого коннектора при использовании описания по умолчанию. |
execute({ code }) |
Выполняет код напрямую, не адаптируя runtime под инструмент AI SDK. Результат может завершиться, приостановиться для получения подтверждения или вернуть статус ошибки. |
search(query) |
Выполняет поиск по методам коннекторов и сохранённым фрагментам кода без выполнения кода в sandbox. |
describe(target) |
Возвращает документацию TypeScript по требованию для коннектора, метода или сохранённого snippet. |
approve({ executionId }) |
Возобновляет приостановленное выполнение через replay. Результат может завершиться, снова приостановиться или вернуть статус ошибки. Он не восстанавливает выполнение, которое не было приостановлено. |
reject({ seq, executionId }) |
Отклоняет одно ожидающее действие и завершает выполнение. Возвращает false если действие больше не ожидает выполнения. Более ранние действия при этом не откатываются. |
rollback({ executionId }) |
Вызывает доступные revert функции в обратном порядке вызова. Отсутствующие коннекторы и методы без revert остаются применёнными. После сбоя предпринимается попытка отката позже. |
pending(executionId?) |
Выводит список ожидающих действий. Если ID не указан, объединяются действия из всех приостановленных выполнений. |
expirePaused({ maxAgeMs? }) |
Завершает устаревшие приостановленные или выполняющиеся запуски и возвращает их ID. Значение по умолчанию: 24 часа. |
executions(limit?) |
Возвращает записи аудита, начиная с самых новых. |
deleteExecution(id) |
Удаляет одну запись аудита. Также освобождает ресурсы для нетерминального выполнения. Возвращает, существовала ли запись. |
pruneExecutions(keep?) |
Удаляет более старые терминальные записи и возвращает количество удалённых. По умолчанию сохраняет 50. |
saveSnippet(name, options) |
Сохраняет код из options.executionId как переиспользуемый фрагмент кода. Он принимает любой статус выполнения, поэтому приложениям следует сначала проверить успешное завершение. Заменяет запись с тем же именем. |
snippets() |
Возвращает сохранённые snippets, упорядоченные по имени. |
deleteSnippet(name) |
Удаляет сниппет и возвращает, существовал ли он. |
Типы параметров метода:
type CodemodeRuntimeToolOptions = {
description?: string;
connectorHints?: Record<string, string>;
};
type CodemodeApproveOptions = { executionId: string };
type CodemodeRejectOptions = { seq: number; executionId: string };
type CodemodeRollbackOptions = { executionId: string };
type CodemodeExpireOptions = { maxAgeMs?: number };CodemodeRuntime
class CodemodeRuntime extends DurableObject<unknown> {
constructor(ctx: DurableObjectState, env: unknown);
}CodemodeRuntime это постоянная грань за runtime handle. Плагин Vite экспортирует этот класс из точки входа Worker. Используйте createCodemodeRuntime() для кода приложения вместо прямого создания грани.
Основная точка входа также экспортирует следующие константы runtime:
| Константа | Значение | Назначение |
|---|---|---|
DEFAULT_MAX_EXECUTIONS |
50 |
Количество хранимых терминальных выполнений по умолчанию |
DEFAULT_PAUSED_TTL_MS |
86400000 |
Возраст устаревшего выполнения по умолчанию в миллисекундах (24 часа) |
MAX_DURABLE_VALUE_BYTES |
1000000 |
Ограничение длины сериализованной строки JavaScript для одного устойчивого значения |
Ввод и вывод инструмента runtime
type ProxyToolInput = { code: string };
type ProxyToolOutput =
| {
status: "completed";
executionId: string;
result: unknown;
logs?: string[];
}
| {
status: "paused";
executionId: string;
pending: PendingAction[];
}
| {
status: "error";
executionId: string;
error: string;
logs?: string[];
};
type TransformResult = (result: unknown) => unknown | Promise<unknown>;Ошибки песочницы и воспроизведения используют error вариант вывода. Они не пробрасывают исключение через вызов инструмента моделью.
Записи выполнения
type ExecutionStatus =
| "running"
| "paused"
| "completed"
| "error"
| "rejected"
| "rolled_back";
type ExecutionState = {
id: string;
code: string;
status: ExecutionStatus;
log: ToolLogEntry[];
result?: unknown;
error?: string;
logs?: string[];
connectors?: string[];
createdAt: number;
updatedAt: number;
};
type ToolLogEntry = {
seq: number;
connector: string;
method: string;
args: unknown;
result?: unknown;
requiresApproval: boolean;
ephemeral?: boolean;
state: "executing" | "applied" | "pending" | "reverted" | "error";
};
type PendingAction = {
executionId: string;
seq: number;
connector: string;
method: string;
args: unknown;
};createdAt и updatedAt содержат миллисекунды эпохи. Временная запись в журнале поступает от инструмента коннектора с replay: "reexecute". Его результат не сохраняется, и вызов выполняется заново при воспроизведении.
Тип решения runtime:
type ToolDecision =
| { kind: "replay"; result: unknown }
| { kind: "execute"; seq: number }
| { kind: "pause"; seq: number };Sandbox codemode API
runtime.tool() внедряет codemode глобальную переменную в сгенерированный код песочницы.
declare const codemode: {
search(query: string): Promise<SearchOutput>;
describe(target: string): Promise<DescribeOutput>;
step<T>(name: string, fn: () => T | Promise<T>): Promise<T>;
run(name: string, input?: unknown): Promise<unknown>;
};Методы sandbox ведут себя следующим образом:
| Метод | Описание |
|---|---|
search(query) |
Выполняет поиск по методам коннекторов и сохранённым фрагментам кода. Результаты ранжируются и ограничиваются 50. |
describe(target) |
Возвращает сгенерированный TypeScript для коннектора, connector.method, либо название фрагмента. |
step(name, fn) |
Выполняет closure один раз и записывает его результат. Повторное воспроизведение возвращает записанный результат без повторного выполнения closure. |
run(name, input?) |
Выполняет сохранённый сниппет. Отсутствующий сниппет или записанный коннектор преобразуется в объект с error свойство. |
Используйте step() вокруг недетерминированной работы в песочнице с побочными эффектами, которая не использует коннектор. Выполняйте вызовы коннектора последовательно, если выполнение может приостанавливаться. Одновременные вызовы могут достичь курсора воспроизведения в другом порядке.
Типы выходных данных обнаружения:
type SearchResult = {
path: string;
connector: string;
method: string;
description?: string;
requiresApproval?: boolean;
kind: "method" | "snippet";
score: number;
};
type SearchOutput = {
results: SearchResult[];
total: number;
truncated: boolean;
};
type DescribeOutput = {
path: string;
description?: string;
requiresApproval?: boolean;
types: string;
kind: "connector" | "method" | "snippet";
};requiresApproval это true когда метод коннектора приостанавливается перед выполнением. Он опускается для методов, не требующих подтверждения, и для сниппетов.
Типы snippet
interface SaveSnippetOptions {
description?: string;
inputSchema?: unknown;
executionId: string;
}
interface Snippet {
name: string;
description: string;
code: string;
savedAt: number;
inputSchema?: unknown;
connectors?: string[];
}connectors записывает каждое пространство имён, настроенное на момент запуска исходного выполнения. savedAt содержит миллисекунды эпохи. Перед вызовом saveSnippet(), убедитесь, что источник ExecutionState.status это completed.
Executor API
Executor
interface Executor {
execute(
code: string,
providersOrFns:
| ResolvedProvider[]
| Record<string, (...args: unknown[]) => Promise<unknown>>,
options?: ExecuteOptions,
): Promise<ExecuteResult>;
}Пользовательские исполнители должны сообщать о сбоях в ExecuteResult.error вместо генерации исключения.
interface ExecuteResult {
result: unknown;
error?: string;
logs?: string[];
}
interface ResolvedProvider {
name: string;
fns: Record<string, (...args: unknown[]) => Promise<unknown>>;
prelude?: string;
}
interface ConnectorBinding {
name: string;
binding: {
callTool(method: string, args: unknown): Promise<unknown>;
};
}
interface ExecuteOptions {
connectors?: ConnectorBinding[];
}Передача записи функции вместо ResolvedProvider[] устарел. Он создаёт один провайдер с именем codemode.
DynamicWorkerExecutor
class DynamicWorkerExecutor implements Executor {
constructor(options: DynamicWorkerExecutorOptions);
execute(
code: string,
providersOrFns:
| ResolvedProvider[]
| Record<string, (...args: unknown[]) => Promise<unknown>>,
options?: ExecuteOptions,
): Promise<ExecuteResult>;
}DynamicWorkerExecutorOptions содержит следующие поля:
| Поле | Тип | Обязательный | По умолчанию | Описание |
|---|---|---|---|---|
loader |
WorkerLoader |
Да | , | Привязка Worker Loader используется для создания изолированных Worker. |
timeout |
number |
Нет | 60000 |
Тайм-аут выполнения в миллисекундах. |
globalOutbound |
Fetcher | null |
Нет | null |
Политика исходящего сетевого трафика. null блокирует доступ. Fetcher получает все исходящие запросы. |
modules |
Record<string, string> |
Нет | {} |
Исходный код модулей, индексированный по спецификатору импорта. Зарезервированный executor.js ключ игнорируется. |
bindings |
Record<string, unknown> |
Нет | {} |
Дополнительные привязки окружения, внедряемые в каждый sandbox Worker. |
Executor проверяет пространства имён provider и коннектора. Имена должны быть допустимыми идентификаторами JavaScript, уникальными и не должны перекрывать глобальные переменные executor.
ToolDispatcher
class ToolDispatcher extends RpcTarget {
constructor(fns: Record<string, (...args: unknown[]) => Promise<unknown>>);
call(name: string, argsJson?: string): Promise<string>;
}ToolDispatcher это мост Workers RPC, который использует DynamicWorkerExecutor. call() принимает сериализованные позиционные аргументы и возвращает сериализованный результат либо обёртку с ошибкой.
runCode()
function runCode(options: {
code: string;
executor: Executor;
providers: ResolvedProvider[];
connectors?: ConnectorBinding[];
}): Promise<{ result: unknown; logs?: string[] }>;Нормализует и выполняет код. Компонент ExecuteResult.error приводит к runCode() выбросить Error который включает перехваченный вывод консоли.
Провайдеры инструментов
interface ToolProvider {
name?: string;
tools: ToolDescriptors | ToolSet | SimpleToolRecord;
types?: string;
}У провайдеров инструментов есть следующие поля:
| Поле | Описание |
|---|---|
name |
Пространство имён Sandbox. По умолчанию используется codemode. |
tools |
Дескрипторы инструментов, AI SDK ToolSet, либо записи, содержащие execute. |
types |
Объявления TypeScript, показываемые модели. Code Mode генерирует их, если они не указаны. |
function resolveProvider(provider: ToolProvider): ResolvedProvider;Реализация main-entry не валидирует входные данные по схемам. Она исключает инструменты, чьи needsApproval это true или функцию. Для устойчивых сценариев подтверждения используйте runtime коннекторы.
Базовые классы коннекторов
CodemodeConnector
abstract class CodemodeConnector<
Env = unknown,
Props = unknown,
> extends WorkerEntrypoint<Env, Props> {
constructor(ctx: DurableObjectState | ExecutionContext, env: Env);
abstract name(): string;
protected instructions(): string | undefined;
protected abstract tools(): ConnectorTools | Promise<ConnectorTools>;
protected tool(name: string, tool: ConnectorTool): ConnectorTool;
describe(): Promise<ConnectorDescription>;
executeTool(
method: string,
args: unknown,
ctx?: ToolExecuteContext,
): Promise<unknown>;
revertAction(
method: string,
args: unknown,
result: unknown,
ctx?: ToolExecuteContext,
): Promise<boolean>;
onPassEnd(executionId: string, status: PassEndStatus): Promise<void>;
disposeExecution(
executionId: string,
status: ExecutionEndStatus,
): Promise<void>;
getTypeScriptTypes(): Promise<string>;
}Авторы коннекторов реализуют или переопределяют следующие хуки:
| Хук | Обязательный | Описание |
|---|---|---|
name() |
Да | Возвращает уникальное пространство имён sandbox. |
instructions() |
Нет | Возвращает рекомендации коннектора, включённые в describe(). |
tools() |
Да | Возвращает запись инструмента коннектора. Производные коннекторы реализуют этот хук. |
tool(name, tool) |
Нет | Декорирует разрешённый инструмент. Используйте его, чтобы добавить производным инструментам поведение подтверждения, повторного выполнения или отката. |
onPassEnd(executionId, status) |
Нет | Освобождает ресурсы, выделенные под конкретный проход. Запускается после каждого прохода, включая приостановленный проход. |
disposeExecution(executionId, status) |
Нет | Освобождает ресурсы, выделенные под конкретное выполнение, после конечного перехода. При приостановке не запускается. |
Хуки жизненного цикла должны быть идемпотентными, не должны полагаться на память экземпляра и не должны выбрасывать исключения. При терминальном проходе onPassEnd() выполняется перед disposeExecution().
Базовый класс выводит describe(), executeTool(), revertAction(), а также getTypeScriptTypes() из записи инструмента. Авторам коннекторов не нужно реализовывать эти методы.
Типы инструментов коннектора
type ConnectorTool = {
description?: string;
inputSchema?: JSONSchema7;
outputSchema?: JSONSchema7;
requiresApproval?: boolean;
replay?: "log" | "reexecute";
execute: (
args: unknown,
ctx?: ToolExecuteContext,
) => Promise<unknown> | unknown;
revert?: (
args: unknown,
result: unknown,
ctx?: ToolExecuteContext,
) => Promise<void> | void;
};
type ConnectorTools = Record<string, ConnectorTool>;
type ToolExecuteContext = { executionId: string };inputSchema по умолчанию используется открытый объект. requiresApproval: true приостанавливается перед выполнением. replay: "reexecute" пропускает устойчивое хранение результата и повторно выполняет вызов при каждом возобновлении. Эти два параметра нельзя комбинировать.
revert предоставляет компенсацию для runtime.rollback(). Это может применяться к любому инструменту, независимо от того, требует ли он подтверждения.
McpConnector
abstract class McpConnector<
Env = unknown,
Props = unknown,
> extends CodemodeConnector<Env, Props> {
protected abstract createConnection():
| McpConnectionLike
| Promise<McpConnectionLike>;
protected toolName(tool: McpTool): string;
}McpConnector преобразует каждый инструмент MCP в метод коннектора. toolName() по умолчанию равно sanitizeToolName(tool.name). Переопределите его, чтобы устранить конфликты имён.
interface McpConnectionLike {
name?: string;
client: Pick<Client, "callTool">;
instructions?: string;
tools?: McpTool[];
fetchTools?: () => Promise<McpTool[]>;
}Коннектор использует tools когда этот массив не пуст. В противном случае он вызывает fetchTools() когда оно указано. Результаты с ошибкой MCP преобразуются в выброшенные ошибки коннектора. Структурированное содержимое возвращается раньше текстового содержимого.
OpenApiConnector
abstract class OpenApiConnector<
Env = unknown,
Props = unknown,
> extends CodemodeConnector<Env, Props> {
protected abstract spec():
| Record<string, unknown>
| Promise<Record<string, unknown>>;
protected abstract request(options: OpenApiRequestOptions): Promise<unknown>;
protected exposeSpec(): boolean;
}OpenApiConnector создаёт один метод для каждой операции OpenAPI. Он использует очищенное operationId когда оно присутствует, а затем использует имя на основе метода и пути HTTP. Повторяющиеся операции и имена, зарезервированные для request или spec пропускаются.
Каждый OpenAPI-коннектор предоставляет низкоуровневый request метод. exposeSpec() по умолчанию равно false. Верните true чтобы также предоставить spec.
type OpenApiRequestOptions = {
path: string;
method?: string;
params?: Record<string, unknown>;
body?: unknown;
headers?: Record<string, string>;
};Производные инструменты операций подставляют параметры пути. Значения запроса они передают как params, значения заголовков как headers, и данные запроса JSON как body.
Жизненный цикл коннектора и типы описаний
type ExecutionEndStatus = "completed" | "error" | "rejected" | "rolled_back";
type PassEndStatus = ExecutionEndStatus | "paused";
type ToolAnnotations = {
requiresApproval?: boolean;
replay?: "log" | "reexecute";
};
type ConnectorDescription = {
name: string;
instructions?: string;
descriptors: JsonSchemaToolDescriptors;
annotations?: Record<string, ToolAnnotations>;
};Утилиты JSON Schema
interface JsonSchemaToolDescriptor {
description?: string;
inputSchema: JSONSchema7;
outputSchema?: JSONSchema7;
}
type JsonSchemaToolDescriptors = Record<string, JsonSchemaToolDescriptor>;
function generateTypesFromJsonSchema(tools: JsonSchemaToolDescriptors): string;
function jsonSchemaToType(schema: JSONSchema7, typeName: string): string;generateTypesFromJsonSchema() возвращает объявления для codemode пространство имён. Имена инструментов очищаются перед генерацией деклараций. Неподдерживаемые схемы понижаются до unknown вместо того чтобы прерывать генерацию с ошибкой.
Утилиты для кода и вывода
Основная точка входа предоставляет следующие утилиты для работы с кодом и результатами:
| Функция | Подпись | Поведение |
|---|---|---|
sanitizeToolName |
(name: string) => string |
Заменяет распространённые разделители, удаляет недопустимые символы, добавляет префикс к именам, начинающимся с цифры, и добавляет суффикс к зарезервированным словам JavaScript. |
normalizeCode |
(code: string) => string |
Преобразует распространённые формы вывода модели в асинхронную стрелочную функцию. Также удаляет поддерживаемые ограничители кода Markdown. |
truncateResponse |
(text: string, options?: TruncateOptions) => string |
Обрезает текст до лимита символов и добавляет маркер размера. |
truncateResult |
(value: unknown, options?: TruncateOptions) => unknown |
Сохраняет небольшие структурированные значения. Слишком большие сериализуемые значения превращаются в усечённый текст JSON. |
type TruncateOptions = {
maxChars?: number;
maxTokens?: number;
};Бюджет по умолчанию составляет 6000 приблизительное количество токенов из расчёта четыре символа на токен. maxChars переопределяет вычисленный бюджет символов.
@cloudflare/codemode/ai
Эта точка входа требует ai и zod peer-зависимости.
createCodeTool()
function createCodeTool(
options: CreateCodeToolOptions,
): Tool<CodeInput, CodeOutput>;
interface CreateCodeToolOptions {
tools: ToolProviderTools | ToolProvider[];
executor: Executor;
description?: string;
}
type CodeInput = { code: string };
type CodeOutput = { result: unknown; logs?: string[] };description может содержать {{types}}. Code Mode заменяет этот токен сгенерированными объявлениями. Необработанная запись инструмента превращается в одного провайдера с именем codemode. Массив принимает несколько пространств имён провайдеров.
Инструменты, у которых needsApproval это true или функция, исключаются. Этот API не приостанавливает выполнение. Используйте createCodemodeRuntime() и коннекторы для устойчивой обработки подтверждений.
Утилиты провайдера AI SDK
Точка входа AI SDK предоставляет следующие утилиты провайдера инструментов:
| Экспорт | Подпись | Описание |
|---|---|---|
aiTools |
(tools: ToolDescriptors | ToolSet) => ToolProvider |
Оборачивает инструменты AI SDK в провайдере по умолчанию. |
generateTypes |
(tools: ToolDescriptors | ToolSet, namespace?: string) => string |
Генерирует объявления на основе схем AI SDK или Zod. Пространство имён по умолчанию: codemode. |
resolveProvider |
(provider: ToolProvider) => ResolvedProvider |
Фильтрует инструменты, требующие подтверждения, проверяет входные данные с помощью AI SDK asSchema() когда доступно, и извлекает исполняемые функции. |
interface ToolDescriptor {
description?: string;
inputSchema: ZodType;
outputSchema?: ZodType;
execute?: (args: unknown) => Promise<unknown>;
}
type ToolDescriptors = Record<string, ToolDescriptor>;ToolSetConnector
class ToolSetConnector extends CodemodeConnector {
constructor(
ctx: DurableObjectState | ExecutionContext,
options: ToolSetConnectorOptions,
);
}
function toolSetConnector(
ctx: DurableObjectState | ExecutionContext,
options: ToolSetConnectorOptions,
): ToolSetConnector;
interface ToolSetConnectorOptions {
name?: string;
instructions?: string;
tools: ToolSet;
}Пространство имён по умолчанию принимает значение tools. Коннектор исключает инструменты без execute функцию. needsApproval: true и содержащие функции needsApproval сопоставляется с постоянным одобрением коннектора. needsApproval: false выполняется без одобрения. Схемы AI SDK проверяют входные данные перед выполнением.
@cloudflare/codemode/mcp
Эта точка входа требует peer-зависимости MCP SDK и Zod.
codeMcpServer()
interface CodeMcpServerOptions {
server: McpServer;
executor: Executor;
description?: string;
}
function codeMcpServer(options: CodeMcpServerOptions): Promise<McpServer>;Оборачивает существующий MCP-сервер одним code инструмент. Wrapper подключается к исходному серверу через транспорт в памяти, обнаруживает его инструменты и предоставляет их как методы на codemode внутри экзекьютора.
Пользовательское описание может содержать {{types}}, которую обёртка заменяет сгенерированными объявлениями TypeScript. Она также может содержать {{example}}, которую обёртка заменяет примером вызова на основе первого вышестоящего MCP-инструмента. Возвращённые значения MCP разворачиваются в следующем порядке: совместимость toolResult, ошибки MCP, structuredContent, контент, полностью состоящий из текста, иначе исходный результат со смешанным контентом.
openApiMcpServer()
interface OpenApiMcpServerOptions {
spec: Record<string, unknown>;
executor: Executor;
request: (options: RequestOptions) => Promise<unknown>;
name?: string;
version?: string;
description?: string;
}
interface RequestOptions {
method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
path: string;
query?: Record<string, string | number | boolean | undefined>;
body?: unknown;
contentType?: string;
rawBody?: boolean;
}
function openApiMcpServer(options: OpenApiMcpServerOptions): McpServer;Создаёт MCP-сервер с двумя инструментами:
| MCP-инструмент | Sandbox API | Назначение |
|---|---|---|
search |
codemode.spec() |
Выполняет код над документом OpenAPI. Локальный $ref значения разрешаются до того, как код получает документ. |
execute |
codemode.spec() и codemode.request(options) |
Выполняет код, который может анализировать документ и вызывать предоставленную хостом функцию запроса. |
name по умолчанию равно openapi. version по умолчанию равно 1.0.0. Функция запроса хоста хранит учётные данные вне песочницы. Текстовые ответы ограничены примерно 6000 токенов и включают маркер усечения при обрезке.
search и execute описания инструментов используют фиксированные примеры сниппетов. В отличие от codeMcpServer(), эта функция не поддерживает {{types}} или {{example}} плейсхолдеры. Необязательный description добавляется к execute описания инструмента.
@cloudflare/codemode/tanstack-ai
Эта точка входа требует @tanstack/ai и zod peer-зависимости.
createCodeTool()
function createCodeTool(options: CreateCodeToolOptions): ServerTool;Параметры, CodeInput, а также CodeOutput соответствуют /ai точки входа. Возвращаемый ServerTool можно передать в TanStack AI chat().
Утилиты провайдера TanStack AI
Точка входа TanStack AI предоставляет следующие утилиты для провайдеров инструментов:
| Экспорт | Подпись | Описание |
|---|---|---|
tanstackTools |
(tools: TanStackTool[], name?: string) => ToolProvider |
Оборачивает инструменты TanStack AI в провайдере. Только инструменты, имеющие execute функции можно вызывать. Пространство имён по умолчанию: codemode. |
generateTypes |
(tools: TanStackTool[], namespace?: string) => string |
Преобразует поддерживаемые схемы TanStack AI в JSON Schema, а затем генерирует объявления. |
resolveProvider |
(provider: ToolProvider) => ResolvedProvider |
Разрешает провайдера, не зависящего от фреймворка, без проверки схемы. |
normalizeProviders |
(tools: ToolProviderTools | ToolProvider[]) => ToolProvider[] |
Преобразует необработанные инструменты в массив провайдера из одного элемента. |
Эта точка входа также экспортирует DEFAULT_DESCRIPTION. tanstackTools() исключает инструменты с needsApproval: true или значение-функция needsApproval. Инструменты с needsApproval: false остаются вызываемыми.
@cloudflare/codemode/browser
Точка входа для браузера использует API браузера и обычный JSON Schema. Она не требует AI SDK или Zod.
createBrowserCodeTool()
function createBrowserCodeTool(
options: CreateBrowserCodeToolOptions,
): BrowserCodeToolDescriptor;
interface CreateBrowserCodeToolOptions {
tools:
| JsonSchemaExecutableToolDescriptor[]
| JsonSchemaExecutableToolDescriptors;
executor?: Executor;
description?: string;
}Инструменты в форме массива должны включать name. Инструменты в форме объекта используют каждый ключ записи как имя. По умолчанию executor использует новый IframeSandboxExecutor.
tools опция также принимает дескрипторы с needsApproval?: boolean | ((...args: unknown[]) => unknown). Инструменты с needsApproval: true или значение-функция needsApproval исключаются. Инструменты с needsApproval: false остаются вызываемыми. JSON Schema добавляет декларации, ориентированные на модель, но не выполняет проверку во время выполнения.
interface JsonSchemaExecutableToolDescriptor extends JsonSchemaToolDescriptor {
name?: string;
execute: (args: Record<string, unknown>) => Promise<unknown>;
}
type JsonSchemaExecutableToolDescriptors = Record<
string,
JsonSchemaExecutableToolDescriptor
>;Возвращаемый дескриптор имеет такую структуру:
interface BrowserCodeToolDescriptor {
name: string;
description: string;
inputSchema: {
type: "object";
properties: {
code: { type: "string"; description: string };
};
required: ["code"];
};
outputSchema: {
type: "object";
properties: {
result: { description: string };
logs: {
type: "array";
items: { type: "string" };
description: string;
};
};
required: ["result"];
};
execute(args: CodeInput): Promise<CodeOutput>;
}IframeSandboxExecutor
class IframeSandboxExecutor implements Executor {
constructor(options?: IframeSandboxExecutorOptions);
execute(
code: string,
providersOrFns:
| ResolvedProvider[]
| Record<string, (...args: unknown[]) => Promise<unknown>>,
): Promise<ExecuteResult>;
}
interface IframeSandboxExecutorOptions {
timeout?: number;
csp?: string;
}Executor iframe принимает следующие параметры:
| Поле | По умолчанию | Описание |
|---|---|---|
timeout |
30000 |
Максимальное время выполнения в миллисекундах. Оно не может прервать синхронный цикл, блокирующий event loop браузера. |
csp |
default-src 'none'; script-src 'unsafe-inline' 'unsafe-eval'; |
Политика Content Security Policy, применяемая к документу iframe в sandbox. |
Каждое выполнение создаёт скрытый iframe с sandbox="allow-scripts". Вызовы инструментов пересекают границу iframe через привязанные к nonce postMessage сообщения. Iframe удаляется после успешного завершения, ошибки или тайм-аута.
Эта точка входа также экспортирует независимый от фреймворка Executor, ExecuteResult, а также ResolvedProvider типы. Он повторно экспортирует JsonSchemaToolDescriptor и JsonSchemaToolDescriptors.
@cloudflare/codemode/vite
Точка входа Vite имеет один экспорт по умолчанию:
function codemodeVitePlugin(): Plugin;Плагин добавляет export { CodemodeRuntime } from "@cloudflare/codemode" в точку входа Worker (src/server.ts, src/index.ts, или src/worker.ts). Благодаря этому грань рантайма доступна как ctx.exports.CodemodeRuntime, который createCodemodeRuntime() требует.
Плагин не изменяет входной модуль, если тот уже экспортирует CodemodeRuntime. Классы коннекторов не требуют специального имени файла или синтаксиса импорта: импортируйте их как обычно и передавайте экземпляры в среду выполнения.
Без плагина добавьте export вручную:
export { CodemodeRuntime } from "@cloudflare/codemode";Импорт коннектора может указывать на один файл коннектора или на директорию. Импорт директории повторно экспортирует каждый подходящий файл коннектора внутри этой директории.