openvibe-sdk/agents/loop
Generated at from
openvibe-contracts v0.419.0 and
openvibe-sdk v0.161.0.
From types/agents-loop.d.ts (both). Declarations are shown verbatim.
type LoopRole
export type LoopRole = 'system' | 'user' | 'assistant' | 'tool';interface LoopToolCall
export interface LoopToolCall { id: string; name: string; input: Record<string, unknown>; }interface LoopMessage
export interface LoopMessage {
role: LoopRole;
text?: string;
thinking?: string;
tool_calls?: LoopToolCall[];
tool_call_id?: string;
name?: string;
result?: unknown;
is_error?: boolean;
memo?: boolean;
duration_ms?: number;
artifacts?: unknown[];
stop?: 'stop' | 'tool_use' | 'length' | 'error' | 'aborted';
usage?: { tokens?: number } | null;
cost?: { usd?: number } | null;
error?: string;
/** Kept in the thread, never sent to the model (a card, a note for the UI). */
ui_only?: boolean;
at?: number;
}interface LoopModelTurn
export interface LoopModelTurn {
text?: string;
thinking?: string;
tool_calls?: Array<{ id?: string; name: string; input?: Record<string, unknown> }>;
stop?: 'stop' | 'tool_use' | 'length' | 'error' | 'aborted';
usage?: { tokens?: number };
cost?: { usd?: number };
error?: string;
}interface LoopModelAdapter
export interface LoopModelAdapter {
id?: string;
family?: string;
complete(request: {
messages: LoopMessage[];
tools: LoopTool[];
system?: string;
signal?: AbortSignal;
budgetLeft: { usd?: number; tokens?: number; turns?: number } | null;
onDelta(delta: { text?: string; thinking?: string }): void | Promise<void>;
}): Promise<LoopModelTurn>;
}interface LoopToolResult
export interface LoopToolResult { result?: unknown; is_error?: boolean; terminate?: boolean; cost?: { usd?: number }; artifacts?: unknown[]; }interface LoopTool
export interface LoopTool {
name: string;
description?: string;
inputSchema?: Record<string, unknown>;
run(input: Record<string, unknown>, context: { toolCall: LoopToolCall; signal: AbortSignal; run: unknown; onUpdate(partial: unknown): void }): Promise<LoopToolResult | unknown> | LoopToolResult | unknown;
sequential?: boolean;
idempotent?: boolean;
timeoutMs?: number;
title?: string;
glyph?: string;
prepareInput?(input: Record<string, unknown>): Record<string, unknown>;
}type LoopEvent
export type LoopEvent =
| { type: 'agent_start' }
| { type: 'turn_start' }
| { type: 'message_start' | 'message_end'; message: LoopMessage }
| { type: 'message_update'; message: LoopMessage; delta: { text?: string; thinking?: string } }
| { type: 'tool_start'; toolCall: LoopToolCall }
| { type: 'tool_update'; toolCall: LoopToolCall; partial: unknown }
| { type: 'tool_end'; toolCall: LoopToolCall; result: unknown; isError: boolean; durationMs?: number }
| { type: 'turn_end'; message: LoopMessage; toolResults: LoopMessage[] }
| { type: 'agent_end'; messages: LoopMessage[]; stop: LoopStop; error: string | null };type LoopStop
export type LoopStop = 'done' | 'terminated' | 'budget' | 'turns' | 'aborted' | 'error';interface LoopOptions
export interface LoopOptions {
model: LoopModelAdapter;
tools?: LoopTool[];
system?: string;
messages?: LoopMessage[];
prompts?: LoopMessage[];
budget?: { usd?: number; tokens?: number; turns?: number; steps?: number };
beforeToolCall?(call: { toolCall: LoopToolCall; input: Record<string, unknown>; tool: LoopTool; assistant: LoopMessage; messages: LoopMessage[] }, signal?: AbortSignal): Promise<{ block?: boolean; reason?: string; terminate?: boolean } | void> | { block?: boolean; reason?: string; terminate?: boolean } | void;
afterToolCall?(call: { toolCall: LoopToolCall; input: Record<string, unknown>; tool: LoopTool; assistant: LoopMessage; result: unknown; isError: boolean; messages: LoopMessage[] }, signal?: AbortSignal): Promise<{ result?: unknown; isError?: boolean; terminate?: boolean } | void> | { result?: unknown; isError?: boolean; terminate?: boolean } | void;
transformContext?(messages: LoopMessage[], signal?: AbortSignal): Promise<LoopMessage[]> | LoopMessage[];
steering?(): Promise<LoopMessage[]> | LoopMessage[];
followUp?(): Promise<LoopMessage[]> | LoopMessage[];
finishTurn?(turn: { assistant: LoopMessage; results: LoopMessage[]; messages: LoopMessage[]; added: LoopMessage[]; totals: { tokens: number; usd: number; turns: number; toolCalls: number } }): Promise<{ action?: 'end' | 'continue' } | void> | { action?: 'end' | 'continue' } | void;
onEvent?(event: LoopEvent): void | Promise<void>;
signal?: AbortSignal;
toolExecution?: 'parallel' | 'sequential';
maxTurns?: number;
repeatLimit?: number;
toolTimeoutMs?: number;
toolOutputLimit?: number;
run?: unknown;
}interface LoopResult
export interface LoopResult { messages: LoopMessage[]; stop: LoopStop; error: string | null; usage: { tokens: number }; cost: { usd: number }; turns: number; toolCalls: number; }export export function runLoop(options: LoopOptions): Promise<LoopR
export function runLoop(options: LoopOptions): Promise<LoopResult>;interface StepSinkOptions
export interface StepSinkOptions {
append(step: Record<string, unknown>): unknown;
update?(seq: number, patch: Record<string, unknown>): unknown;
delta?(seq: number, text: string): unknown;
runId?: string | null;
startSeq?: number;
startTurn?: number;
toolTitle?(call: LoopToolCall): string | undefined;
}export export function createStepSink(options: StepSinkOptions): (e
export function createStepSink(options: StepSinkOptions): (event: LoopEvent) => Promise<void>;export export function checkInput(schema: Record<string, unknown> |
export function checkInput(schema: Record<string, unknown> | undefined, value: unknown, at?: string): string | null;export export const STOPS: LoopStop[];
export const STOPS: LoopStop[];export export const DEFAULTS: { maxTurns: number; repeatLimit: numb
export const DEFAULTS: { maxTurns: number; repeatLimit: number; toolTimeoutMs: number; toolOutputLimit: number };