INTEGRITY Dokumentace

Referenční dokumentace API Code Mode

Code Mode publikuje šest vstupních bodů balíčku. Rozhraní API specifická pro daný framework importujte z odpovídajícího vstupního bodu:

Vstupní bod Účel
@cloudflare/codemode Runtime, konektory, exekutor Workers a nástroje nezávislé na frameworku
@cloudflare/codemode/ai nástroje AI SDK a adaptér konektoru
@cloudflare/codemode/mcp Wrappery pro MCP servery
@cloudflare/codemode/tanstack-ai Nástroje a adaptér TanStack AI
@cloudflare/codemode/browser Deskriptor nástroje prohlížeče a spouštěč iframe
@cloudflare/codemode/vite Plugin Vite pro zjišťování konektorů a exporty Worker

@cloudflare/codemode

Hlavní vstupní bod nevyžaduje instalaci volitelných peer dependencies AI SDK, TanStack AI ani Zod.

Sestavení runtime

createCodemodeRuntime()

function createCodemodeRuntime(
	options: CreateCodemodeRuntimeOptions,
): CodemodeRuntimeHandle;

Vytvoří řídicí rovinu na straně hostitele pro pojmenovaný runtime Code Mode.

CreateCodemodeRuntimeOptions má tato pole:

Pole Typ Povinné Popis
ctx DurableObjectState Ano Stav Durable Object, který hostí runtime facet.
connectors CodemodeConnector[] Ano Konektory jsou dostupné jako globální proměnné sandboxu. Názvy konektorů musí být jedinečné a codemode je vyhrazen.
executor Executor Ano Sandbox, který spouští vygenerovaný kód.
name string Ne Identita trvalého runtime. Výchozí hodnota je "default". Platnými znaky jsou písmena, číslice, _, -, a ..
maxExecutions number Ne Záznamy o ukončených bězích uchovávané při zahájení nového běhu. Výchozí hodnota je 50. Běžící a pozastavená spuštění se automaticky neodstraňují.
transformResult TransformResult Ne Přetváří dokončený výsledek vracený modelu. Auditní stopa uchovává nezměněný výsledek.
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>;
}

Metody handle mají tyto efekty:

Metoda Účinek
tool(options?) Vrací nástroj AI SDK poskytnutý modelu. description nahrazuje výchozí popis. connectorHints přidává jednořádkovou nápovědu pro každý konektor při použití výchozího popisu.
execute({ code }) Spustí kód přímo, aniž by přizpůsoboval runtime nástroji AI SDK. Výsledek může být dokončen, pozastaven kvůli schválení nebo může vrátit chybový stav.
search(query) Vyhledává v metodách konektorů a uložených fragmentech kódu bez spouštění kódu v sandboxu.
describe(target) Vrací dokumentaci TypeScript na vyžádání pro konektor, metodu nebo uložený úryvek.
approve({ executionId }) Obnoví pozastavené provedení prostřednictvím replay. Výsledek může dokončit, znovu se pozastavit nebo vrátit chybový stav. Neobnovuje provedení, které nebylo pozastaveno.
reject({ seq, executionId }) Odmítne jednu čekající akci a ukončí spuštění. Vrátí false pokud akce už není nevyřízená. Dřívější akce nevrací zpět.
rollback({ executionId }) Volá dostupné revert funkce v opačném pořadí volání. Chybějící konektory a metody bez revert zůstávají použity. Po selhání se pokusí o pozdější vrácení změn.
pending(executionId?) Vypisuje čekající akce. Bez ID kombinuje akce ze všech pozastavených spuštění.
expirePaused({ maxAgeMs? }) Ukončí zastaralá pozastavená nebo běžící spuštění a vrátí jejich ID. Výchozí stáří je 24 hodin.
executions(limit?) Vrací auditní záznamy, od nejnovějších.
deleteExecution(id) Smaže jeden auditní záznam. Zároveň uvolní prostředky pro neukončené provedení. Vrátí, zda záznam existoval.
pruneExecutions(keep?) Smaže starší ukončené záznamy a vrátí počet smazaných záznamů. Ve výchozím nastavení ponechává 50.
saveSnippet(name, options) Ukládá kód z options.executionId jako opakovaně použitelný úryvek kódu. Přijímá libovolný stav provedení, aplikace by proto měly nejprve ověřit úspěšné dokončení. Nahrazuje položku se stejným názvem.
snippets() Vrací uložené úryvky seřazené podle názvu.
deleteSnippet(name) Smaže snippet a vrátí, zda existoval.

Typy možností metody jsou:

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 je trvalý facet za runtime handle. Plugin Vite exportuje tuto třídu ze vstupního modulu Workeru. Použijte createCodemodeRuntime() pro kód aplikace místo přímého vytváření facetu.

Hlavní vstupní bod také exportuje tyto konstanty runtime:

Konstanta Hodnota Účel
DEFAULT_MAX_EXECUTIONS 50 Výchozí počet uchovávaných ukončených provedení
DEFAULT_PAUSED_TTL_MS 86400000 Výchozí stáří zastaralého provedení v milisekundách (24 hodin)
MAX_DURABLE_VALUE_BYTES 1000000 Limit délky serializovaného řetězce JavaScript pro jednu trvalou hodnotu

Vstup a výstup nástroje 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>;

Chyby sandboxu a přehrávání používají error výstupní variantu. Nevyvolávají výjimku skrz volání nástroje modelem.

Záznamy o spuštění

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 a updatedAt obsahují milisekundy epochy. Dočasný záznam v protokolu pochází z nástroje konektoru s replay: "reexecute". Jeho výsledek se neukládá a volání se při přehrávání spustí znovu.

Typ rozhodnutí runtime je:

type ToolDecision =
	| { kind: "replay"; result: unknown }
	| { kind: "execute"; seq: number }
	| { kind: "pause"; seq: number };

Sandbox codemode API

runtime.tool() vloží codemode globální proměnnou do generovaného kódu sandboxu.

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>;
};

Metody sandboxu se chovají následovně:

Metoda Popis
search(query) Vyhledává v metodách konektorů a uložených fragmentech kódu. Výsledky jsou seřazeny podle relevance a omezeny na 50.
describe(target) Vrací vygenerovaný TypeScript pro konektor, connector.method, nebo název úryvku.
step(name, fn) Spustí closure jednou a zaznamená jeho výsledek. Replay vrátí zaznamenaný výsledek, aniž by closure spustil znovu.
run(name, input?) Spustí uložený snippet. Chybějící snippet nebo zaznamenaný konektor se vyhodnotí jako objekt s error vlastnost.

Použijte step() kolem nedeterministické práce v sandboxu s vedlejšími efekty, která nepoužívá konektor. Volání konektoru vydávejte postupně, pokud může být provádění pozastaveno. Souběžná volání se mohou ke kurzoru přehrávání dostat v jiném pořadí.

Typy výstupů zjišťování jsou:

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 je true když se metoda konektoru pozastaví před spuštěním. U metod, které nevyžadují schválení, a u fragmentů kódu se vynechává.

Typy snippetů

interface SaveSnippetOptions {
	description?: string;
	inputSchema?: unknown;
	executionId: string;
}

interface Snippet {
	name: string;
	description: string;
	code: string;
	savedAt: number;
	inputSchema?: unknown;
	connectors?: string[];
}

connectors zaznamená každý jmenný prostor nakonfigurovaný v okamžiku spuštění zdrojového provádění. savedAt obsahuje milisekundy epochy. Před voláním saveSnippet(), ověřte, že zdroj ExecutionState.status je completed.

Executor API

Executor

interface Executor {
	execute(
		code: string,
		providersOrFns:
			| ResolvedProvider[]
			| Record<string, (...args: unknown[]) => Promise<unknown>>,
		options?: ExecuteOptions,
	): Promise<ExecuteResult>;
}

Vlastní executory by měly hlásit selhání v ExecuteResult.error místo vyvolání výjimky.

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[];
}

Předání záznamu funkce namísto ResolvedProvider[] je zastaralé. Vytváří jednoho poskytovatele s názvem 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 má tato pole:

Pole Typ Povinné Výchozí Popis
loader WorkerLoader Ano , Vazba Worker Loader použitá k vytváření izolovaných Workers.
timeout number Ne 60000 Časový limit spuštění v milisekundách.
globalOutbound Fetcher | null Ne null Politika odchozí sítě. null blokuje přístup. Fetcher přijímá všechny odchozí požadavky.
modules Record<string, string> Ne {} Zdrojový kód modulu klíčovaný podle specifikátoru importu. Vyhrazený executor.js klíč se ignoruje.
bindings Record<string, unknown> Ne {} Doplňkové vazby prostředí vložené do každého sandboxového Workeru.

Executor ověřuje jmenné prostory poskytovatelů a konektorů. Názvy musí být platné identifikátory JavaScriptu, jedinečné a nesmí zastiňovat globální proměnné executoru.

ToolDispatcher

class ToolDispatcher extends RpcTarget {
	constructor(fns: Record<string, (...args: unknown[]) => Promise<unknown>>);
	call(name: string, argsJson?: string): Promise<string>;
}

ToolDispatcher je most Workers RPC, který používá DynamicWorkerExecutor. call() přijímá serializované poziční argumenty a vrací serializovaný výsledek nebo chybovou obálku.

runCode()

function runCode(options: {
	code: string;
	executor: Executor;
	providers: ResolvedProvider[];
	connectors?: ConnectorBinding[];
}): Promise<{ result: unknown; logs?: string[] }>;

Normalizuje a spouští kód. Nástroj ExecuteResult.error způsobí runCode() vyhodit Error který obsahuje zachycený výstup konzole.

Poskytovatelé nástrojů

interface ToolProvider {
	name?: string;
	tools: ToolDescriptors | ToolSet | SimpleToolRecord;
	types?: string;
}

Poskytovatelé nástrojů mají tato pole:

Pole Popis
name Jmenný prostor Sandbox. Výchozí hodnota je codemode.
tools Deskriptory nástrojů, AI SDK ToolSet, nebo záznamy obsahující execute.
types Deklarace TypeScript zobrazené modelu. Pokud je vynecháte, Code Mode je vygeneruje.
function resolveProvider(provider: ToolProvider): ResolvedProvider;

Implementace hlavního vstupního bodu neověřuje vstupy podle schémat. Vylučuje nástroje, jejichž needsApproval je true nebo funkci. Pro trvalé schvalovací postupy použijte runtime konektory.

Základní třídy konektorů

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>;
}

Autoři konektorů implementují nebo přepisují tyto hooky:

Hook Povinné Popis
name() Ano Vrací jedinečný jmenný prostor sandboxu.
instructions() Ne Vrací pokyny ke konektoru zahrnuté v describe().
tools() Ano Vrací záznam nástroje konektoru. Odvozené konektory implementují tento hook.
tool(name, tool) Ne Obaluje přeložený nástroj. Slouží k přidání chování pro schvalování, opakování nebo vracení změn u odvozených nástrojů.
onPassEnd(executionId, status) Ne Uvolní prostředky vázané na jednotlivý průchod. Spouští se po každém průchodu, včetně pozastaveného průchodu.
disposeExecution(executionId, status) Ne Uvolní prostředky vázané na jednotlivé spuštění po ukončeném přechodu. Při pozastavení se nespouští.

Hooky životního cyklu by měly být idempotentní, neměly by se spoléhat na paměť instance a neměly by vyhazovat výjimku. Při ukončovacím průchodu onPassEnd() se spustí před disposeExecution().

Základní třída odvozuje describe(), executeTool(), revertAction(), a getTypeScriptTypes() ze záznamu nástroje. Autoři konektorů nemusí tyto metody implementovat.

Typy nástrojů konektoru

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 výchozí hodnotou je otevřený objekt. requiresApproval: true se pozastaví před spuštěním. replay: "reexecute" vynechá trvalé uložení výsledku a při každém obnovení volání znovu provede. Tyto dvě možnosti nelze kombinovat.

revert poskytuje kompenzaci pro runtime.rollback(). Lze jej použít na jakýkoli nástroj bez ohledu na to, zda vyžaduje schválení.

McpConnector

abstract class McpConnector<
	Env = unknown,
	Props = unknown,
> extends CodemodeConnector<Env, Props> {
	protected abstract createConnection():
		| McpConnectionLike
		| Promise<McpConnectionLike>;
	protected toolName(tool: McpTool): string;
}

McpConnector převádí každý nástroj MCP na metodu konektoru. toolName() má výchozí hodnotu sanitizeToolName(tool.name). Přepište ji, abyste vyřešili kolize v pojmenování.

interface McpConnectionLike {
	name?: string;
	client: Pick<Client, "callTool">;
	instructions?: string;
	tools?: McpTool[];
	fetchTools?: () => Promise<McpTool[]>;
}

Konektor používá tools když toto pole není prázdné. Jinak zavolá fetchTools() pokud je uveden. Chybové výsledky MCP se stanou vyvolanými chybami konektoru. Strukturovaný obsah se vrací před textovým obsahem.

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 vytvoří jednu metodu pro každou operaci OpenAPI. Používá sanitizovaný operationId pokud je přítomen, jinak se vrátí k názvu odvozenému z metody HTTP a cesty. Duplicitní operace a názvy vyhrazené pro request nebo spec se přeskočí.

Každý konektor OpenAPI zpřístupňuje nízkoúrovňové request metodu. exposeSpec() má výchozí hodnotu false. Vraťte true aby zároveň vystavil spec.

type OpenApiRequestOptions = {
	path: string;
	method?: string;
	params?: Record<string, unknown>;
	body?: unknown;
	headers?: Record<string, string>;
};

Odvozené nástroje operací nahrazují parametry cesty. Hodnoty dotazu (query) předávají jako params, hodnoty hlaviček jako headers, a data požadavku JSON jako body.

Typy životního cyklu a popisu konektoru

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>;
};

Nástroje 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() vrátí deklarace pro codemode namespace. Názvy nástrojů se před vygenerováním deklarací očistí. Nepodporovaná schémata se zjednoduší na unknown místo toho, aby generování selhalo.

Nástroje pro kód a výstup

Hlavní vstupní bod poskytuje tyto nástroje pro práci s kódem a výsledky:

Funkce Podpis Chování
sanitizeToolName (name: string) => string Nahrazuje běžné oddělovače, odstraňuje neplatné znaky, doplňuje prefix před názvy začínajícími číslicí a přidává sufix k rezervovaným slovům JavaScriptu.
normalizeCode (code: string) => string Převádí běžné formy výstupu modelu na asynchronní arrow funkci. Zároveň odstraňuje podporované oddělovače bloků kódu Markdown.
truncateResponse (text: string, options?: TruncateOptions) => string Zkrátí text na znakový rozpočet a připojí značku velikosti.
truncateResult (value: unknown, options?: TruncateOptions) => unknown Zachovává malé strukturované hodnoty. Nadměrně velké serializovatelné hodnoty se zkrátí na text JSON.
type TruncateOptions = {
	maxChars?: number;
	maxTokens?: number;
};

Výchozí rozpočet je 6000 odhadovaných tokenů při čtyřech znacích na token. maxChars přepisuje odvozený rozpočet znaků.

@cloudflare/codemode/ai

Tento vstupní bod vyžaduje ai a zod peer závislosti.

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 může obsahovat {{types}}. Code Mode nahradí tento token vygenerovanými deklaracemi. Nezpracovaný záznam nástroje se stane jedním poskytovatelem s názvem codemode. Pole přijímá více jmenných prostorů poskytovatelů.

Nástroje, jejichž needsApproval je true nebo funkce jsou vyloučeny. Toto API nepozastavuje běh. Použijte createCodemodeRuntime() a konektory pro trvalé zpracování schvalování.

pomocné nástroje poskytovatele AI SDK

Vstupní bod AI SDK poskytuje tyto pomocné nástroje pro poskytovatele nástrojů:

Export Podpis Popis
aiTools (tools: ToolDescriptors | ToolSet) => ToolProvider Obaluje nástroje AI SDK ve výchozím poskytovateli.
generateTypes (tools: ToolDescriptors | ToolSet, namespace?: string) => string Generuje deklarace ze schémat AI SDK nebo Zod. Výchozí jmenný prostor je codemode.
resolveProvider (provider: ToolProvider) => ResolvedProvider Filtruje nástroje podmíněné schválením, validuje vstup pomocí AI SDK asSchema() pokud jsou k dispozici, a extrahuje spustitelné funkce.
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;
}

Jmenný prostor má výchozí hodnotu tools. Konektor vylučuje nástroje bez execute funkci. needsApproval: true a hodnoty typu funkce needsApproval se mapuje na trvalé schválení konektoru. needsApproval: false se provede bez schválení. Schémata AI SDK ověří vstup před spuštěním.

@cloudflare/codemode/mcp

Tento vstupní bod vyžaduje peer dependencies MCP SDK a Zod.

codeMcpServer()

interface CodeMcpServerOptions {
	server: McpServer;
	executor: Executor;
	description?: string;
}

function codeMcpServer(options: CodeMcpServerOptions): Promise<McpServer>;

Obaluje existující MCP server jedním code nástroj. Wrapper se připojí ke zdrojovému serveru přes transport v paměti, zjistí jeho nástroje a zpřístupní je jako metody na codemode uvnitř exekutoru.

Vlastní popis může obsahovat {{types}}, který wrapper nahradí vygenerovanými deklaracemi TypeScript. Může také obsahovat {{example}}, který wrapper nahradí ukázkovým voláním založeným na prvním upstreamovém nástroji MCP. Vrácené hodnoty MCP se rozbalují v tomto pořadí: kompatibilita toolResult, chyby MCP, structuredContent, obsah, který je celý textový, jinak původní výsledek se smíšeným obsahem.

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;

Vytvoří server MCP se dvěma nástroji:

Nástroj MCP Sandbox API Účel
search codemode.spec() Spustí kód proti dokumentu OpenAPI. Místní $ref hodnoty se přeloží dříve, než kód dokument obdrží.
execute codemode.spec() a codemode.request(options) Spustí kód, který může zkontrolovat dokument a zavolat funkci požadavku poskytnutou hostitelem.

name má výchozí hodnotu openapi. version má výchozí hodnotu 1.0.0. Funkce požadavku na hostiteli udržuje přihlašovací údaje mimo sandbox. Textové odpovědi jsou omezeny na přibližně 6 000 tokenů a při oříznutí obsahují značku zkrácení.

search a execute popisy nástrojů používají pevné ukázkové úryvky. Na rozdíl od codeMcpServer(), tato funkce nepodporuje {{types}} nebo {{example}} zástupné symboly. Volitelný description se připojí k execute popisu nástroje.

@cloudflare/codemode/tanstack-ai

Tento vstupní bod vyžaduje @tanstack/ai a zod peer závislosti.

createCodeTool()

function createCodeTool(options: CreateCodeToolOptions): ServerTool;

Možnosti, CodeInput, a CodeOutput odpovídá /ai vstupní bod. Vrácený ServerTool lze předat do TanStack AI chat().

Nástroje poskytovatele TanStack AI

Vstupní bod TanStack AI poskytuje tyto pomocné nástroje pro poskytovatele nástrojů:

Export Podpis Popis
tanstackTools (tools: TanStackTool[], name?: string) => ToolProvider Obaluje nástroje TanStack AI v poskytovateli. Pouze nástroje s execute funkce jsou volatelné. Namespace se ve výchozím stavu nastaví na codemode.
generateTypes (tools: TanStackTool[], namespace?: string) => string Převádí podporovaná schémata TanStack AI na JSON Schema a poté generuje deklarace.
resolveProvider (provider: ToolProvider) => ResolvedProvider Určí poskytovatele nezávislého na frameworku bez validace schématu.
normalizeProviders (tools: ToolProviderTools | ToolProvider[]) => ToolProvider[] Převádí surové nástroje na jednoprvkové pole providerů.

Tento vstupní bod také exportuje DEFAULT_DESCRIPTION. tanstackTools() vyloučí nástroje s needsApproval: true nebo hodnotou funkce needsApproval. Nástroje s needsApproval: false zůstávají volatelné.

@cloudflare/codemode/browser

Vstupní bod pro prohlížeč používá API prohlížeče a obyčejné JSON Schema. Nevyžaduje AI SDK ani Zod.

createBrowserCodeTool()

function createBrowserCodeTool(
	options: CreateBrowserCodeToolOptions,
): BrowserCodeToolDescriptor;

interface CreateBrowserCodeToolOptions {
	tools:
		| JsonSchemaExecutableToolDescriptor[]
		| JsonSchemaExecutableToolDescriptors;
	executor?: Executor;
	description?: string;
}

Nástroje v podobě pole musí obsahovat name. Nástroje ve tvaru objektu používají jako název každý klíč záznamu. Executor jako výchozí hodnotu použije nový IframeSandboxExecutor.

tools možnost také přijímá deskriptory s needsApproval?: boolean | ((...args: unknown[]) => unknown). Nástroje s needsApproval: true nebo hodnotou funkce needsApproval jsou vyloučeny. Nástroje s needsApproval: false zůstávají volatelné. JSON Schema přispívá deklaracemi určenými pro model, ale neprovádí ověřování za běhu.

interface JsonSchemaExecutableToolDescriptor extends JsonSchemaToolDescriptor {
	name?: string;
	execute: (args: Record<string, unknown>) => Promise<unknown>;
}

type JsonSchemaExecutableToolDescriptors = Record<
	string,
	JsonSchemaExecutableToolDescriptor
>;

Vrácený deskriptor má tento tvar:

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 přijímá tyto možnosti:

Pole Výchozí Popis
timeout 30000 Maximální doba běhu v milisekundách. Nemůže přerušit synchronní smyčku, která blokuje event loop prohlížeče.
csp default-src 'none'; script-src 'unsafe-inline' 'unsafe-eval'; Content Security Policy uplatněná na dokument iframe sandboxu.

Každé spuštění vytvoří skrytý iframe s sandbox="allow-scripts". Volání nástrojů překračují hranici iframe prostřednictvím zpráv vázaných na nonce postMessage zprávy. Iframe se po úspěchu, chybě nebo vypršení časového limitu odstraní.

Tento vstupní bod také exportuje na frameworku nezávislý Executor, ExecuteResult, a ResolvedProvider typy. Znovu exportuje JsonSchemaToolDescriptor a JsonSchemaToolDescriptors.

@cloudflare/codemode/vite

Vstupní bod Vite má jeden výchozí export:

function codemodeVitePlugin(): Plugin;

Plugin připojuje export { CodemodeRuntime } from "@cloudflare/codemode" do vstupního modulu Workeru (src/server.ts, src/index.ts, nebo src/worker.ts). Díky tomu je tato součást runtimu dostupná jako ctx.exports.CodemodeRuntime, který createCodemodeRuntime() vyžaduje.

Plugin ponechá vstupní modul beze změny, pokud už exportuje CodemodeRuntime. Třídy konektoru nepotřebují žádný speciální název souboru ani syntaxi importu: importujte je běžně a předejte instance runtime.

Bez pluginu přidejte export ručně:

export { CodemodeRuntime } from "@cloudflare/codemode";

Import konektoru může směřovat na jeden soubor konektoru nebo na adresář. Import adresáře reexportuje každý odpovídající soubor konektoru v daném adresáři.