// LLM Runtime module implements stream behavior. import type { Api, AssistantMessage, AssistantMessageEventStreamContract, Context, Model, ProviderStreamOptions, SimpleStreamOptions, StreamOptions, } from "@openclaw/llm-core"; import { createApiRegistry, type ApiRegistry } from "./api-registry.js"; /** Creates an isolated LLM runtime backed by the supplied provider registry. */ export function createLlmRuntime(registry: ApiRegistry = createApiRegistry()) { function resolveApiProvider(api: Api) { const provider = registry.getApiProvider(api); if (!provider) { throw new Error(`No API provider registered for api: ${api}`); } return provider; } function stream( model: Model, context: Context, options?: ProviderStreamOptions, ): AssistantMessageEventStreamContract { return resolveApiProvider(model.api).stream(model, context, options as StreamOptions); } async function complete( model: Model, context: Context, options?: ProviderStreamOptions, ): Promise { return stream(model, context, options).result(); } function streamSimple( model: Model, context: Context, options?: SimpleStreamOptions, ): AssistantMessageEventStreamContract { return resolveApiProvider(model.api).streamSimple(model, context, options); } async function completeSimple( model: Model, context: Context, options?: SimpleStreamOptions, ): Promise { return streamSimple(model, context, options).result(); } return { registry, stream, complete, streamSimple, completeSimple }; } export type LlmRuntime = ReturnType;