UNPKG

@llumiverse/common

Version:

Public types, enums and options used by Llumiverse API.

573 lines 19 kB
import type { BedrockOptions } from './options/bedrock.js'; import type { TextFallbackOptions } from './options/fallback.js'; import type { GroqOptions } from './options/groq.js'; import type { OpenAiOptions } from './options/openai.js'; import type { VertexAIOptions } from './options/vertexai.js'; export declare enum Providers { openai = "openai", openai_compatible = "openai_compatible", azure_openai = "azure_openai", azure_foundry = "azure_foundry", huggingface_ie = "huggingface_ie", replicate = "replicate", bedrock = "bedrock", vertexai = "vertexai", togetherai = "togetherai", mistralai = "mistralai", groq = "groq", watsonx = "watsonx", xai = "xai", anthropic = "anthropic" } export interface ProviderParams { id: Providers; name: string; requiresApiKey: boolean; requiresEndpointUrl: boolean; endpointPlaceholder?: string; supportSearch?: boolean; } export declare const ProviderList: Record<Providers, ProviderParams>; export interface EmbeddingsOptions { /** * The text to generate the embeddings for. One of text or image is required. */ text?: string; /** * The image to generate embeddings for */ image?: string; /** * The model to use to generate the embeddings. Optional. */ model?: string; } export interface EmbeddingsResult { /** * The embedding vectors corresponding to the words in the input text. */ values: number[]; /** * The model used to generate the embeddings. */ model: string; /** * Number of tokens of the input text. */ token_count?: number; } export interface ResultValidationError { code: 'validation_error' | 'json_error' | 'content_policy_violation'; message: string; data?: CompletionResult[]; } /** * Context information for LlumiverseError. * Provides details about where and how the error occurred. */ export interface LlumiverseErrorContext { /** The provider that generated the error (e.g., 'openai', 'bedrock', 'vertexai') */ provider: string; /** The model that was being used when the error occurred */ model: string; /** The operation that failed */ operation: 'execute' | 'stream'; } /** * Standardized error class for Llumiverse driver errors. * * Normalizes errors from different LLM providers (OpenAI, Anthropic, Bedrock, VertexAI, etc.) * into a consistent format. The primary value is the `retryable` flag, which enables upstream * consumers to implement smart retry logic. * * @example * ```typescript * try { * const result = await driver.execute(segments, options); * } catch (error) { * if (LlumiverseError.isLlumiverseError(error)) { * console.log(`Provider: ${error.context.provider}`); * console.log(`Model: ${error.context.model}`); * console.log(`Retryable: ${error.retryable}`); * * if (error.retryable) { * // Implement retry logic with exponential backoff * await retryWithBackoff(() => driver.execute(segments, options)); * } else { * // Handle non-retryable error (e.g., invalid API key, malformed request) * logError(error); * } * } * throw error; * } * ``` */ export declare class LlumiverseError extends Error { /** * HTTP status code (e.g., 429, 500) if available. * Undefined if the error doesn't have a numeric status code. */ readonly code?: number; /** * Provider-specific error name/type (e.g., "ThrottlingException", "ValidationException"). * Optional - used to preserve the semantic error type from the provider SDK. */ readonly name: string; /** * Whether this error is retryable. * - True: Definitely retryable (rate limits, timeouts, server errors) * - False: Definitely not retryable (auth failures, invalid requests, malformed schemas) * - Undefined: Unknown retryability - allows consumers to decide default behavior * * When undefined, consumers can choose their retry strategy: * - Conservative: Don't retry unknown errors (avoid spam) * - Resilient: Retry unknown errors (prioritize success) */ readonly retryable?: boolean; /** * Context about where and how the error occurred. * Includes provider, model, operation type. */ readonly context: LlumiverseErrorContext; /** * The original error from the provider SDK. * Preserved for debugging and detailed error inspection. */ readonly originalError: unknown; constructor(message: string, retryable: boolean | undefined, context: LlumiverseErrorContext, originalError: unknown, code?: number, name?: string); /** * Serialize the error to JSON for logging or transmission. * Includes all error properties except the original error object itself. */ toJSON(): Record<string, unknown>; /** * Type guard to check if an error is a LlumiverseError. * Useful for conditional error handling. * * @param error - The error to check * @returns True if the error is a LlumiverseError */ static isLlumiverseError(error: unknown): error is LlumiverseError; } export interface BaseResult { type: "text" | "json" | "image"; value: any; } export interface TextResult extends BaseResult { type: "text"; value: string; } export interface JsonResult extends BaseResult { type: "json"; } export interface ImageResult extends BaseResult { type: "image"; value: string; } /** * @discriminator type */ export type CompletionResult = TextResult | JsonResult | ImageResult; export interface CompletionChunkObject { result: CompletionResult[]; token_usage?: ExecutionTokenUsage; finish_reason?: "stop" | "length" | string; /** * Tool calls returned by the model during streaming. * Each chunk may contain partial tool call information that needs to be aggregated. */ tool_use?: ToolUse[]; } /** * Tool definition for LLM tool use. * The input_schema uses a permissive type to support both: * - AJV's JSONSchemaType<T> for type-safe schema generation * - Plain object schemas for simpler cases */ export interface ToolDefinition { name: string; description?: string; input_schema: { type?: unknown; properties?: Record<string, unknown> | null | undefined; required?: readonly string[] | string[]; additionalProperties?: unknown; [k: string]: unknown; }; } /** * A tool use instance represents a call to a tool. * The id property is used to identify the tool call. */ export interface ToolUse<ParamsT = JSONObject> { id: string; tool_name: string; tool_input: ParamsT | null; /** * Gemini thinking models require thought_signature to be passed back with tool results. * This preserves the model's reasoning state during multi-turn tool use. */ thought_signature?: string; } export interface Completion { result: CompletionResult[]; token_usage?: ExecutionTokenUsage; /** * Contains the tools from which the model awaits information. */ tool_use?: ToolUse[]; /** * The finish reason as reported by the model: stop | length or other model specific values */ finish_reason?: "stop" | "length" | "tool_use" | string; /** * Set only if a result validation error occurred, otherwise if the result is valid the error field is undefined * This can only be set if the result_schema is set and the result could not be parsed as a json or if the result does not match the schema */ error?: ResultValidationError; /** * The original response. Only included if the option include_original_response is set to true and the request is made using execute. Not supported when streaming. */ original_response?: Record<string, any>; /** * The conversation context. This is an opaque structure that can be passed to the next request to restore the context. */ conversation?: unknown; } export interface ExecutionResponse<PromptT = any> extends Completion { prompt: PromptT; /** * The time it took to execute the request in seconds */ execution_time?: number; /** * The number of chunks for streamed executions */ chunks?: number; } export interface CompletionStream<PromptT = any> extends AsyncIterable<string> { completion: ExecutionResponse<PromptT> | undefined; } /** * Minimal logger interface for LLM drivers. * Follows pino v10 signature: supports message-only or object-first (never message-first). * - Message-only: logger.info("message") * - Object-first: logger.info({ data }, "message") * - PREVENTS: logger.info("message", { data }) - compile error (objects not allowed in ...args) * * Additional args must be primitives (string | number | boolean) for string interpolation. */ export interface Logger { debug(msg: string, ...args: (string | number | boolean)[]): void; debug<T>(obj: T, msg?: T extends string ? never : string, ...args: (string | number | boolean)[]): void; info(msg: string, ...args: (string | number | boolean)[]): void; info<T>(obj: T, msg?: T extends string ? never : string, ...args: (string | number | boolean)[]): void; warn(msg: string, ...args: (string | number | boolean)[]): void; warn<T>(obj: T, msg?: T extends string ? never : string, ...args: (string | number | boolean)[]): void; error(msg: string, ...args: (string | number | boolean)[]): void; error<T>(obj: T, msg?: T extends string ? never : string, ...args: (string | number | boolean)[]): void; } export interface DriverOptions { logger?: Logger | "console"; } export type JSONSchemaTypeName = "string" | "number" | "integer" | "boolean" | "object" | "array" | "null" | "any"; export type JSONSchemaType = string | number | boolean | JSONSchemaObject | JSONSchemaArray | null; export interface JSONSchemaObject { [key: string]: JSONSchemaType; } export interface JSONSchemaArray extends Array<JSONSchemaType> { } export interface JSONSchemaProperties { [key: string]: JSONSchema; } export interface JSONSchema { type?: JSONSchemaTypeName | JSONSchemaTypeName[]; description?: string; properties?: JSONSchemaProperties; additionalProperties?: boolean | JSONSchema; required?: string[]; [k: string]: any; } export type PromptFormatter<T = any> = (messages: PromptSegment[], schema?: JSONSchema) => T; export interface PromptOptions { model: string; /** * A custom formatter to use for format the final model prompt from the input prompt segments. * If no one is specified the driver will choose a formatter compatible with the target model */ format?: PromptFormatter; result_schema?: JSONSchema; } export interface StatelessExecutionOptions extends PromptOptions { /** * If set to true the original response from the target LLM will be included in the response under the original_response field. * This is useful for debugging and for some advanced use cases. * It is ignored on streaming requests */ include_original_response?: boolean; model_options?: ModelOptions; /** * @deprecated This is deprecated. Use CompletionResult.type information instead. */ output_modality?: Modalities; } export interface ExecutionOptions extends StatelessExecutionOptions { /** * Available tools for the request */ tools?: ToolDefinition[]; /** * This is an opaque structure that provides a conversation context * Each driver implementation will return a conversation property in the execution response * that can be passed here to restore the context when a new prompt is sent to the model. */ conversation?: unknown | null; /** * Labels for billing attribution and cost tracking. * Passed through to provider APIs that support request-level labels (e.g. Vertex AI). * Keys and values must be lowercase, max 64 characters, containing only letters, numbers, underscores, and dashes. */ labels?: Record<string, string>; /** * Number of turns to keep images in conversation history before stripping them. * - 0 (default): Strip images immediately after each turn * - 1: Keep images for current turn only, strip in next turn * - N: Keep images for N turns before stripping * - undefined: Same as 0, strip immediately * * Images are stripped to prevent JSON.stringify corruption (Uint8Array) and reduce storage bloat (base64). */ stripImagesAfterTurns?: number; /** * Maximum tokens to keep for text content in tool results. * Text exceeding this limit will be truncated with a "[Content truncated...]" marker. * - undefined/0: No text truncation (default) * - N > 0: Truncate text to approximately N tokens (using ~4 chars/token estimate) */ stripTextMaxTokens?: number; /** * Number of turns to keep heartbeat messages before stripping. * - 0: Strip immediately * - 1 (default): Keep for 1 turn then strip * - undefined: Same as 1, strip after 1 turn */ stripHeartbeatsAfterTurns?: number; } export declare enum SharedOptions { max_tokens = "max_tokens", temperature = "temperature", top_p = "top_p", top_k = "top_k", presence_penalty = "presence_penalty", frequency_penalty = "frequency_penalty", stop_sequence = "stop_sequence", effort = "effort", seed = "seed", number_of_images = "number_of_images" } export declare enum OptionType { numeric = "numeric", enum = "enum", boolean = "boolean", string_list = "string_list" } export type ReasoningEffort = "low" | "medium" | "high"; /** * @discriminator _option_id */ export type ModelOptions = TextFallbackOptions | VertexAIOptions | BedrockOptions | OpenAiOptions | GroqOptions; export interface ModelOptionsInfo { options: ModelOptionInfoItem[]; _option_id: string; } export type ModelOptionInfoItem = NumericOptionInfo | EnumOptionInfo | BooleanOptionInfo | StringListOptionInfo; interface OptionInfoPrototype { type: OptionType; name: string; description?: string; refresh?: boolean; } export interface NumericOptionInfo extends OptionInfoPrototype { type: OptionType.numeric; value?: number; min?: number; max?: number; step?: number; integer?: boolean; default?: number; } export interface EnumOptionInfo extends OptionInfoPrototype { type: OptionType.enum; value?: string; enum: Record<string, string>; default?: string; } export interface BooleanOptionInfo extends OptionInfoPrototype { type: OptionType.boolean; value?: boolean; default?: boolean; } export interface StringListOptionInfo extends OptionInfoPrototype { type: OptionType.string_list; value?: string[]; default?: string[]; } export declare enum PromptRole { safety = "safety", system = "system", user = "user", assistant = "assistant", negative = "negative", mask = "mask", /** * Used to send the response of a tool */ tool = "tool" } export interface PromptSegment { role: PromptRole; content: string; /** * The tool use id if the segment is a tool response */ tool_use_id?: string; /** * Gemini thinking models require thought_signature to be passed back with tool results. * This should be copied from the ToolUse.thought_signature when sending tool responses. */ thought_signature?: string; files?: DataSource[]; } export interface ExecutionTokenUsage { prompt?: number; result?: number; total?: number; /** * Number of input tokens read from prompt cache (discounted rate). */ prompt_cached?: number; /** * Number of input tokens written to prompt cache. */ prompt_cache_write?: number; prompt_new?: number; } /** * @deprecated This is deprecated. Use CompletionResult.type information instead. */ export declare enum Modalities { text = "text", image = "image" } /** * Represents the output and input modalities a model can support */ export interface ModelModalities { text?: boolean; image?: boolean; video?: boolean; audio?: boolean; embed?: boolean; } export interface ModelCapabilities { input: ModelModalities; output: ModelModalities; tool_support?: boolean; tool_support_streaming?: boolean; } export interface AIModel<ProviderKeys = string> { id: string; name: string; provider: ProviderKeys; description?: string; version?: string; type?: ModelType; tags?: string[]; owner?: string; status?: AIModelStatus; can_stream?: boolean; is_custom?: boolean; is_multimodal?: boolean; input_modalities?: string[]; output_modalities?: string[]; tool_support?: boolean; environment?: string; } export declare enum AIModelStatus { Available = "available", Pending = "pending", Stopped = "stopped", Unavailable = "unavailable", Unknown = "unknown", Legacy = "legacy" } /** * payload to list available models for an environment * @param environmentId id of the environment * @param query text to search for in model name/description * @param type type of the model * @param tags tags for searching */ export interface ModelSearchPayload { text: string; type?: ModelType; tags?: string[]; owner?: string; } export declare enum ModelType { Classifier = "classifier", Regressor = "regressor", Clustering = "clustering", AnomalyDetection = "anomaly-detection", TimeSeries = "time-series", Text = "text", Image = "image", Audio = "audio", Video = "video", Embedding = "embedding", Chat = "chat", Code = "code", NLP = "nlp", MultiModal = "multi-modal", Test = "test", Other = "other", Unknown = "unknown" } export interface DataSource { name: string; mime_type: string; getStream(): Promise<ReadableStream<Uint8Array | string>>; getURL(): Promise<string>; } export interface TrainingOptions { name: string; model: string; params?: JSONObject; } export interface TrainingPromptOptions { segments: PromptSegment[]; completion: CompletionResult[]; model: string; schema?: JSONSchema; } export declare enum TrainingJobStatus { running = "running", succeeded = "succeeded", failed = "failed", cancelled = "cancelled" } export interface TrainingJob { id: string; status: TrainingJobStatus; details?: string; model?: string; } export type JSONPrimitive = string | number | boolean | null; export type JSONArray = JSONValue[]; export type JSONObject = { [key: string]: JSONValue; }; export type JSONComposite = JSONArray | JSONObject; export type JSONValue = JSONPrimitive | JSONComposite; export {}; //# sourceMappingURL=types.d.ts.map