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.