INTEGRITY Документация

Справочник по 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";

Импорт коннектора может указывать на один файл коннектора или на директорию. Импорт директории повторно экспортирует каждый подходящий файл коннектора внутри этой директории.