@just-every/ensemble
Version:
LLM provider abstraction layer with unified streaming interface
660 lines • 23.2 kB
TypeScript
export type ToolParameterType = 'string' | 'number' | 'boolean' | 'object' | 'array' | 'null';
export interface ToolParameter {
type?: ToolParameterType;
description?: string | (() => string);
enum?: string[] | (() => Promise<string[]>);
items?: ToolParameter | {
type: ToolParameterType;
enum?: string[] | (() => Promise<string[]>);
};
properties?: Record<string, ToolParameter>;
required?: string[];
optional?: boolean;
minItems?: number;
additionalProperties?: boolean;
default?: unknown;
minimum?: number;
maximum?: number;
minLength?: number;
maxLength?: number;
pattern?: string;
}
export type ExecutableFunction = (...args: unknown[]) => Promise<string> | string;
export interface ToolFunction {
function: ExecutableFunction;
definition: ToolDefinition;
injectAgentId?: boolean;
injectAbortSignal?: boolean;
}
export interface ToolDefinition {
type: 'function';
function: {
name: string;
description: string;
parameters: {
type: 'object';
properties: Record<string, ToolParameter>;
required: string[];
};
};
}
export interface ResponseJSONSchema {
name: string;
schema: Record<string, unknown>;
type: 'json_schema';
description?: string;
strict?: boolean | null;
}
export interface ModelSettings {
temperature?: number;
top_p?: number;
top_k?: number;
max_tokens?: number;
stop_sequence?: string;
seed?: number;
text?: {
format: string;
};
tool_choice?: 'auto' | 'none' | 'required' | {
type: string;
function: {
name: string;
};
};
sequential_tools?: boolean;
json_schema?: ResponseJSONSchema;
}
export interface ToolCall {
id: string;
type: 'function';
call_id?: string;
function: {
name: string;
arguments: string;
arguments_formatted?: string;
};
}
export interface ToolCallResult {
toolCall: ToolCall;
id: string;
call_id: string;
output?: string;
error?: string;
}
export interface ToolCallHandler {
onToolCall?: (toolCall: ToolCall) => void;
onToolResult?: (toolCall: ToolCall, result: string) => void;
}
export interface ResponseContentText {
type: 'input_text';
text: string;
}
export interface ResponseContentImage {
type: 'input_image';
detail: 'high' | 'low' | 'auto';
file_id?: string;
image_url?: string;
}
export interface ResponseContentFileInput {
type: 'input_file';
file_data?: string;
file_id?: string;
filename?: string;
}
export type ResponseContent = string | Array<ResponseContentText | ResponseContentImage | ResponseContentFileInput>;
export type ResponseInput = Array<ResponseInputItem>;
export type ResponseInputItem = ResponseInputMessage | ResponseThinkingMessage | ResponseOutputMessage | ResponseInputFunctionCall | ResponseInputFunctionCallOutput;
export interface ResponseBaseMessage {
type: string;
id?: string;
model?: string;
timestamp?: number;
}
export interface ResponseInputMessage extends ResponseBaseMessage {
type: 'message';
name?: string;
content: ResponseContent;
role: 'user' | 'system' | 'developer';
status?: 'in_progress' | 'completed' | 'incomplete';
}
export interface ResponseThinkingMessage extends ResponseBaseMessage {
type: 'thinking';
content: ResponseContent;
signature?: ResponseContent;
thinking_id?: string;
role: 'assistant';
status?: 'in_progress' | 'completed' | 'incomplete';
}
export interface ResponseOutputMessage extends ResponseBaseMessage {
id?: string;
type: 'message';
content: ResponseContent;
role: 'assistant';
status: 'in_progress' | 'completed' | 'incomplete';
}
export interface ResponseInputFunctionCall extends ResponseBaseMessage {
type: 'function_call';
call_id: string;
name: string;
arguments: string;
id?: string;
status?: 'in_progress' | 'completed' | 'incomplete';
}
export interface ResponseInputFunctionCallOutput extends ResponseBaseMessage {
type: 'function_call_output';
call_id: string;
name?: string;
output: string;
id?: string;
status?: 'in_progress' | 'completed' | 'incomplete';
}
export type StreamEventType = 'connected' | 'command_start' | 'command_done' | 'project_create' | 'project_update' | 'process_start' | 'process_running' | 'process_updated' | 'process_done' | 'process_failed' | 'process_waiting' | 'process_terminated' | 'message_start' | 'message_delta' | 'message_complete' | 'audio_stream' | 'tool_start' | 'tool_delta' | 'tool_done' | 'file_start' | 'file_delta' | 'file_complete' | 'cost_update' | 'system_status' | 'system_update' | 'quota_update' | 'screenshot' | 'design_grid' | 'console' | 'error' | 'response_output' | 'tool_wait_start' | 'tool_waiting' | 'tool_wait_complete' | 'task_wait_start' | 'task_waiting' | 'task_wait_complete' | 'task_complete' | 'task_fatal_error' | 'git_pull_request' | 'stream_end' | 'agent_start' | 'agent_status' | 'agent_done';
export interface StreamEventBase {
type: StreamEventType;
timestamp?: string;
agent?: AgentExportDefinition;
}
export interface MessageEventBase extends StreamEventBase {
type: StreamEventType;
content: string;
message_id: string;
order?: number;
thinking_content?: string;
thinking_signature?: string;
}
export interface MessageEvent extends MessageEventBase {
type: 'message_start' | 'message_delta' | 'message_complete';
}
export interface FileEvent extends StreamEventBase {
type: 'file_start' | 'file_delta' | 'file_complete';
message_id: string;
mime_type?: string;
data_format: 'base64';
data: string;
order?: number;
}
export interface ToolEvent extends StreamEventBase {
type: 'tool_start' | 'tool_delta' | 'tool_done';
tool_call: ToolCall;
result?: {
call_id: string;
output: string;
error?: string;
};
}
export interface ErrorEvent extends StreamEventBase {
type: 'error';
error: string;
}
export interface TaskEvent extends StreamEventBase {
type: 'task_complete' | 'task_fatal_error';
result: string;
finalState?: {
metaFrequency?: string;
thoughtDelay?: string;
disabledModels?: string[];
modelScores?: Record<string, number>;
messages?: ResponseInput;
};
}
export interface CostUpdateEvent extends StreamEventBase {
type: 'cost_update';
usage: ModelUsage;
thought_delay?: number;
}
export interface ResponseOutputEvent extends StreamEventBase {
type: 'response_output';
message: ResponseInputItem;
}
export interface AgentStartEvent extends StreamEventBase {
type: 'agent_start';
agent: AgentExportDefinition;
request_id?: string;
input?: string;
}
export interface AgentStatusEvent extends StreamEventBase {
type: 'agent_status';
agent: AgentExportDefinition;
request_id?: string;
status?: string;
}
export interface AgentDoneEvent extends StreamEventBase {
type: 'agent_done';
agent: AgentExportDefinition;
request_id?: string;
request_cost?: number;
request_duration?: number;
duration_with_tools?: number;
}
export type AgentEvent = AgentStartEvent | AgentStatusEvent | AgentDoneEvent;
export type ProviderStreamEvent = StreamEventBase | MessageEvent | FileEvent | ToolEvent | ErrorEvent | CostUpdateEvent | ResponseOutputEvent | AgentEvent;
export interface ModelProvider {
provider_id: string;
createResponseStream(messages: ResponseInput, model: string, agent: AgentDefinition): AsyncGenerator<ProviderStreamEvent>;
createEmbedding?(input: string | string[], model: string, opts?: EmbedOpts): Promise<number[] | number[][]>;
createImage?(prompt: string, model?: string, opts?: ImageGenerationOpts): Promise<string[]>;
createVoice?(text: string, model: string, opts?: VoiceGenerationOpts): Promise<ReadableStream<Uint8Array> | ArrayBuffer>;
createTranscription?(audio: TranscriptionAudioSource, agent: AgentDefinition, model: string, opts?: TranscriptionOpts): AsyncGenerator<TranscriptionEvent>;
createLiveSession?(config: LiveConfig, agent: AgentDefinition, model: string, opts?: LiveOptions): Promise<LiveSession>;
}
export interface LiveSession {
sessionId: string;
sendAudio(audio: LiveAudioBlob): Promise<void>;
sendText(text: string, role?: 'user' | 'assistant'): Promise<void>;
sendToolResponse(toolResults: ToolCallResult[]): Promise<void>;
getEventStream(): AsyncIterable<LiveEvent>;
close(): Promise<void>;
isActive(): boolean;
}
export type ModelClassID = 'standard' | 'mini' | 'reasoning' | 'reasoning_mini' | 'monologue' | 'metacognition' | 'code' | 'writing' | 'summary' | 'vision' | 'vision_mini' | 'long' | 'image_generation' | 'embedding' | 'voice' | 'transcription';
export type ModelProviderID = 'openai' | 'anthropic' | 'google' | 'xai' | 'deepseek' | 'openrouter' | 'elevenlabs' | 'test';
export interface TieredPrice {
threshold_tokens: number;
price_below_threshold_per_million: number;
price_above_threshold_per_million: number;
}
export interface TimeBasedPrice {
peak_price_per_million: number;
off_peak_price_per_million: number;
peak_utc_start_hour: number;
peak_utc_start_minute: number;
peak_utc_end_hour: number;
peak_utc_end_minute: number;
}
export interface ModalityPrice {
text?: number | TieredPrice | TimeBasedPrice;
audio?: number | TieredPrice | TimeBasedPrice;
video?: number | TieredPrice | TimeBasedPrice;
image?: number | TieredPrice | TimeBasedPrice;
}
export interface ModelCost {
input_per_million?: number | TieredPrice | TimeBasedPrice | ModalityPrice;
output_per_million?: number | TieredPrice | TimeBasedPrice | ModalityPrice;
cached_input_per_million?: number | TieredPrice | TimeBasedPrice;
per_image?: number;
}
export interface ModelFeatures {
context_length?: number;
input_modality?: ('text' | 'image' | 'audio' | 'video')[];
output_modality?: ('text' | 'image' | 'audio' | 'embedding')[];
tool_use?: boolean;
simulate_tools?: boolean;
streaming?: boolean;
json_output?: boolean;
max_output_tokens?: number;
reasoning_output?: boolean;
input_token_limit?: number;
}
export interface ModelEntry {
id: string;
aliases?: string[];
provider: ModelProviderID;
cost: ModelCost;
features: ModelFeatures;
class?: string;
description?: string;
rate_limit_fallback?: string;
openrouter_id?: string;
embedding?: boolean;
dim?: number;
score?: number;
scores?: {
monologue?: number;
code?: number;
reasoning?: number;
};
}
export interface ModelUsage {
model?: string;
cost?: number;
input_tokens?: number;
output_tokens?: number;
total_tokens?: number;
cached_tokens?: number;
image_count?: number;
metadata?: Record<string, unknown>;
timestamp?: Date;
isFreeTierUsage?: boolean;
input_modality?: 'text' | 'audio' | 'video' | 'image';
output_modality?: 'text' | 'audio' | 'video' | 'image';
}
export interface ModelClass {
models: string[];
random?: boolean;
}
export interface ModelSpecificQuota {
model: string;
dailyTokenLimit: number;
dailyTokensUsed: number;
dailyRequestLimit: number;
dailyRequestsUsed: number;
rateLimit?: {
requestsPerMinute: number;
tokensPerMinute: number;
};
lastResetDate?: Date;
}
export interface ProviderQuota {
provider: ModelProviderID;
creditBalance?: number;
creditLimit?: number;
info?: Record<string, unknown>;
models: Record<string, ModelSpecificQuota>;
lastResetDate?: Date;
}
export interface EnsembleLogger {
log_llm_request(agentId: string, providerName: string, model: string, requestData: unknown, timestamp?: Date): string;
log_llm_response(requestId: string | undefined, responseData: unknown, timestamp?: Date): void;
log_llm_error(requestId: string | undefined, errorData: unknown, timestamp?: Date): void;
}
export interface ExtractBase64ImageResult {
found: boolean;
originalContent: string;
replaceContent: string;
image_id: string | null;
images: Record<string, string>;
}
export interface EmbedOpts {
taskType?: string;
dimensions?: number;
normalize?: boolean;
}
export interface ImageGenerationOpts {
n?: number;
size?: 'square' | 'landscape' | 'portrait' | '1024x1024' | '1536x1024' | '1024x1536' | '1792x1024' | '1024x1792' | '512x512' | '256x256';
quality?: 'standard' | 'hd' | 'low' | 'medium' | 'high';
style?: 'vivid' | 'natural';
response_format?: 'url' | 'b64_json';
source_images?: string | string[];
mask?: string;
}
export interface VoiceGenerationOpts {
voice?: 'alloy' | 'echo' | 'fable' | 'onyx' | 'nova' | 'shimmer' | 'rachel' | 'domi' | 'bella' | 'antoni' | 'elli' | 'josh' | 'arnold' | 'adam' | 'sam' | 'george' | string;
speed?: number;
response_format?: 'mp3' | 'opus' | 'aac' | 'flac' | 'wav' | 'pcm' | 'mp3_low' | 'mp3_high' | 'pcm_16000' | 'pcm_22050' | 'pcm_24000' | 'pcm_44100' | 'ulaw';
stream?: boolean;
voice_settings?: {
stability?: number;
similarity_boost?: number;
style?: number;
use_speaker_boost?: boolean;
speed?: number;
};
affect?: string;
instructions?: string;
}
export type WorkerFunction = (...args: any[]) => AgentDefinition;
export interface AgentExportDefinition {
agent_id?: string;
name?: string;
parent_id?: string;
model?: string;
modelClass?: string;
cwd?: string;
modelScores?: Record<string, number>;
disabledModels?: string[];
}
export interface AgentDefinition {
agent_id?: string;
name?: string;
description?: string;
instructions?: string;
parent_id?: string;
workers?: WorkerFunction[];
tools?: ToolFunction[];
model?: string;
modelClass?: ModelClassID;
modelSettings?: ModelSettings;
intelligence?: 'low' | 'standard' | 'high';
maxToolCalls?: number;
maxToolCallRoundsPerTurn?: number;
verifier?: AgentDefinition;
maxVerificationAttempts?: number;
args?: any;
jsonSchema?: ResponseJSONSchema;
historyThread?: ResponseInput | undefined;
cwd?: string;
modelScores?: Record<string, number>;
disabledModels?: string[];
getTools?: () => Promise<ToolFunction[]>;
onToolCall?: (toolCall: ToolCall) => Promise<void>;
processToolCall?: (toolCalls: ToolCall[]) => Promise<Record<string, any>>;
onToolResult?: (toolCallResult: ToolCallResult) => Promise<void>;
onToolError?: (toolCallResult: ToolCallResult) => Promise<void>;
onRequest?: (agent: AgentDefinition, messages: ResponseInput) => Promise<[any, ResponseInput]>;
onResponse?: (message: ResponseOutputMessage) => Promise<void>;
onThinking?: (message: ResponseThinkingMessage) => Promise<void>;
onToolEvent?: (event: ProviderStreamEvent) => void | Promise<void>;
params?: ToolParameterMap;
processParams?: (agent: AgentDefinition, params: Record<string, any>) => Promise<{
prompt: string;
intelligence?: 'low' | 'standard' | 'high';
}>;
abortSignal?: AbortSignal;
retryOptions?: {
maxRetries?: number;
initialDelay?: number;
maxDelay?: number;
backoffMultiplier?: number;
additionalRetryableErrors?: string[];
additionalRetryableStatusCodes?: number[];
onRetry?: (error: any, attempt: number) => void;
};
}
export interface ToolParameter {
type?: ToolParameterType;
description?: string | (() => string);
enum?: string[] | (() => Promise<string[]>);
items?: ToolParameter | {
type: ToolParameterType;
enum?: string[] | (() => Promise<string[]>);
};
properties?: Record<string, ToolParameter>;
required?: string[];
optional?: boolean;
minItems?: number;
additionalProperties?: boolean;
default?: unknown;
minimum?: number;
maximum?: number;
minLength?: number;
maxLength?: number;
pattern?: string;
}
export type ToolParameterMap = Record<string, string | ToolParameter>;
export interface TranscriptionOpts {
audioFormat?: {
sampleRate?: number;
channels?: number;
encoding?: 'pcm' | 'opus' | 'flac';
};
realtimeInputConfig?: any;
speechConfig?: any;
bufferConfig?: {
chunkSize?: number;
flushInterval?: number;
};
stream?: boolean;
prompt?: string;
language?: string;
vad?: boolean;
noiseReduction?: 'near_field' | 'far_field' | null;
}
export type TranscriptionAudioSource = ReadableStream<Uint8Array> | AsyncIterable<Uint8Array> | (() => AsyncIterable<Uint8Array>) | ArrayBuffer | Uint8Array;
export type TranscriptionEventType = 'transcription_start' | 'transcription_turn_delta' | 'transcription_turn_start' | 'transcription_turn_complete' | 'transcription_complete' | 'error';
export interface TranscriptionEventBase {
type: TranscriptionEventType;
timestamp: string;
agent?: AgentExportDefinition;
}
export interface TranscriptionStartEvent extends TranscriptionEventBase {
type: 'transcription_start';
format: string;
language?: string;
audioFormat?: TranscriptionOpts['audioFormat'];
}
export interface TranscriptionTurnDeltaEvent extends TranscriptionEventBase {
type: 'transcription_turn_delta';
delta: string;
partial?: boolean;
}
export interface TranscriptionTurnEvent extends TranscriptionEventBase {
type: 'transcription_turn_start' | 'transcription_turn_complete';
text?: string;
}
export interface TranscriptionCompleteEvent extends TranscriptionEventBase {
type: 'transcription_complete';
text?: string;
duration?: number;
}
export interface TranscriptionErrorEvent extends TranscriptionEventBase {
type: 'error';
error: string;
}
export type TranscriptionEvent = TranscriptionStartEvent | TranscriptionTurnDeltaEvent | TranscriptionTurnEvent | TranscriptionCompleteEvent | TranscriptionErrorEvent;
export type LiveResponseModality = 'TEXT' | 'AUDIO';
export interface LiveVoiceConfig {
voiceName?: string;
}
export interface LiveSpeechConfig {
voiceConfig?: {
prebuiltVoiceConfig?: LiveVoiceConfig;
};
languageCode?: string;
}
export interface LiveVADConfig {
disabled?: boolean;
startOfSpeechSensitivity?: 'START_SENSITIVITY_LOW' | 'START_SENSITIVITY_MEDIUM' | 'START_SENSITIVITY_HIGH';
endOfSpeechSensitivity?: 'END_SENSITIVITY_LOW' | 'END_SENSITIVITY_MEDIUM' | 'END_SENSITIVITY_HIGH';
prefixPaddingMs?: number;
silenceDurationMs?: number;
}
export interface LiveRealtimeInputConfig {
automaticActivityDetection?: LiveVADConfig;
}
export interface LiveConfig {
responseModalities: [LiveResponseModality];
speechConfig?: LiveSpeechConfig;
realtimeInputConfig?: LiveRealtimeInputConfig;
outputAudioTranscription?: boolean | Record<string, never>;
inputAudioTranscription?: boolean | Record<string, never>;
tools?: Array<{
functionDeclarations?: ToolDefinition['function'][];
codeExecution?: boolean | Record<string, never>;
googleSearch?: boolean | Record<string, never>;
}>;
mediaResolution?: 'MEDIA_RESOLUTION_LOW' | 'MEDIA_RESOLUTION_MEDIUM' | 'MEDIA_RESOLUTION_HIGH';
enableAffectiveDialog?: boolean;
proactivity?: {
proactiveAudio?: boolean;
};
}
export interface LiveOptions {
messageHistory?: ResponseInput;
abortSignal?: AbortSignal;
sequentialTools?: boolean;
maxToolCalls?: number;
maxToolCallRoundsPerTurn?: number;
apiVersion?: string;
}
export interface LiveAudioBlob {
data: string;
mimeType: string;
}
export type LiveEventType = 'live_start' | 'live_ready' | 'audio_input' | 'audio_output' | 'text_delta' | 'message_delta' | 'tool_start' | 'tool_call' | 'tool_result' | 'tool_done' | 'turn_start' | 'turn_complete' | 'interrupted' | 'transcription_input' | 'transcription_output' | 'cost_update' | 'error' | 'live_end';
export interface LiveEventBase {
type: LiveEventType;
timestamp: string;
}
export interface LiveStartEvent extends LiveEventBase {
type: 'live_start';
sessionId: string;
config: LiveConfig;
}
export interface LiveReadyEvent extends LiveEventBase {
type: 'live_ready';
}
export interface LiveAudioInputEvent extends LiveEventBase {
type: 'audio_input';
size: number;
}
export interface LiveAudioOutputEvent extends LiveEventBase {
type: 'audio_output';
data: string;
format?: {
sampleRate: number;
channels: number;
encoding: string;
};
}
export interface LiveTextDeltaEvent extends LiveEventBase {
type: 'text_delta';
delta: string;
}
export interface LiveMessageDeltaEvent extends LiveEventBase {
type: 'message_delta';
delta: string;
}
export interface LiveTurnStartEvent extends LiveEventBase {
type: 'turn_start';
role: 'user' | 'model';
}
export interface LiveTurnCompleteEvent extends LiveEventBase {
type: 'turn_complete';
role: 'user' | 'model';
message?: ResponseInputMessage | ResponseOutputMessage;
}
export interface LiveInterruptedEvent extends LiveEventBase {
type: 'interrupted';
cancelledToolCalls?: string[];
}
export interface LiveTranscriptionInputEvent extends LiveEventBase {
type: 'transcription_input';
text: string;
}
export interface LiveTranscriptionOutputEvent extends LiveEventBase {
type: 'transcription_output';
text: string;
}
export interface LiveToolStartEvent extends LiveEventBase {
type: 'tool_start';
toolCall: ToolCall;
}
export interface LiveToolCallEvent extends LiveEventBase {
type: 'tool_call';
toolCalls: ToolCall[];
}
export interface LiveToolResultEvent extends LiveEventBase {
type: 'tool_result';
toolCallResult: ToolCallResult;
}
export interface LiveToolDoneEvent extends LiveEventBase {
type: 'tool_done';
totalCalls: number;
}
export interface LiveCostUpdateEvent extends LiveEventBase {
type: 'cost_update';
usage: {
inputTokens: number;
outputTokens: number;
totalTokens: number;
inputCost?: number;
outputCost?: number;
totalCost?: number;
};
}
export interface LiveErrorEvent extends LiveEventBase {
type: 'error';
error: string;
code?: string;
recoverable?: boolean;
}
export interface LiveEndEvent extends LiveEventBase {
type: 'live_end';
reason?: string;
duration?: number;
totalTokens?: number;
totalCost?: number;
}
export type LiveEvent = LiveStartEvent | LiveReadyEvent | LiveAudioInputEvent | LiveAudioOutputEvent | LiveTextDeltaEvent | LiveMessageDeltaEvent | LiveTurnStartEvent | LiveTurnCompleteEvent | LiveInterruptedEvent | LiveTranscriptionInputEvent | LiveTranscriptionOutputEvent | LiveToolStartEvent | LiveToolCallEvent | LiveToolResultEvent | LiveToolDoneEvent | LiveCostUpdateEvent | LiveErrorEvent | LiveEndEvent;
//# sourceMappingURL=types.d.ts.map