Skip to main content

Engine Interface

This page describes the current engine contract.

Why this exists​

The engine boundary is what lets the same operator model work with different runtimes.

How it works​

Current engine interface:

export interface OperatorEngine<TCapabilities extends CapabilityMap = CapabilityMap> {
run(
input: EngineRunInput<
CapabilityOutputUnion<TCapabilities>,
CapabilityContextUnion<TCapabilities>,
CapabilityRuntimeUnion<TCapabilities>
>,
): Promise<CapabilityOutputUnion<TCapabilities>>;
}

Current engine run input:

type EngineRunInput<
TOutput,
TContext = Record<string, unknown>,
TRuntime = Record<string, unknown>,
> = {
goal: string;
capability: CapabilityDefinition<TOutput, TContext, TRuntime>;
context?: TContext;
runtime?: TRuntime;
attempt: number;
trace: ExecutionTrace<TOutput>;
};

Example​

const browserEngine: OperatorEngine<BrowserCapabilities> = {
async run(input) {
await input.runtime.page.goto(input.context.url, {
waitUntil: "domcontentloaded",
});

return {
title: await input.runtime.page.title(),
url: input.runtime.page.url(),
sourceURL: input.runtime.page.url(),
};
},
};

Notes​

Common confusion

The engine interface describes execution behavior. Runtime objects provide the resources that behavior uses.