import type { ModelPool } from '#package/pool.js' import type { ModelStore } from '#package/store.js' import type { Logger } from '#package/lib/logger.js' import type { StableDiffusionSamplingMethod } from '#package/engines/stable-diffusion-cpp/types.js' import { AssistantMessage, ChatMessage, CompletionFinishReason, ToolDefinition } from '#package/types/chat.js' import { Image, Audio, ModelConfig, TaskArgs, ChatCompletionTaskArgs, TextCompletionTaskArgs, EmbeddingTaskArgs, ImageToTextTaskArgs, SpeechToTextTaskArgs, TextToSpeechTaskArgs, TextToImageTaskArgs, ImageToImageTaskArgs, ObjectDetectionTaskArgs, TextClassificationTaskArgs, } from '#package/types/index.js' export interface TextCompletionParamsBase { temperature?: number maxTokens?: number seed?: number stop?: string[] repeatPenalty?: number repeatPenaltyNum?: number frequencyPenalty?: number presencePenalty?: number grammar?: string topP?: number minP?: number topK?: number tokenBias?: Record } export interface TextCompletionParams extends TextCompletionParamsBase { model: string prompt: string } export interface ChatCompletionParams extends TextCompletionParamsBase { model: string messages: ChatMessage[] grammar?: string tools?: { definitions: Record documentParams?: boolean maxParallelCalls?: number } } export interface TextEmbeddingInput { type: 'text' content: string } export interface ImageEmbeddingInput { type: 'image' content: Image } export type EmbeddingInput = TextEmbeddingInput | ImageEmbeddingInput | string export interface EmbeddingParams { model: string input: EmbeddingInput | EmbeddingInput[] dimensions?: number pooling?: 'cls' | 'mean' } export interface ImageToTextParams { model: string image: Image prompt?: string maxTokens?: number } export interface StableDiffusionParams { negativePrompt?: string guidance?: number styleRatio?: number strength?: number sampleSteps?: number batchCount?: number samplingMethod?: StableDiffusionSamplingMethod cfgScale?: number controlStrength?: number } export interface TextToImageParams extends StableDiffusionParams { model: string prompt: string width?: number height?: number seed?: number } export interface ImageToImageParams extends StableDiffusionParams { model: string image: Image prompt: string width?: number height?: number seed?: number } export interface ObjectDetectionParams { model: string image: Image threshold?: number labels?: string[] } export interface TextClassificationParams { model: string input: string | string[] hypothesisTemplate?: string threshold?: number topK?: number labels?: string[] } export interface SpeechToTextParams { model: string audio: Audio language?: string prompt?: string maxTokens?: number } export interface TextToSpeechParams { model: string text: string voice?: string } export type InferenceParams = | TextCompletionParams | ChatCompletionParams | EmbeddingParams | ImageToTextParams | SpeechToTextParams | TextToSpeechParams | TextToImageParams | ImageToImageParams | ObjectDetectionParams export interface EngineContext { config: TModelConfig meta?: TModelMeta log: Logger } export interface FileDownloadProgress { file: string loadedBytes: number totalBytes: number } export interface EngineStartContext { pool: ModelPool store: ModelStore } export interface EngineTaskContext extends EngineContext { instance: TModelInstance } export interface EngineTextCompletionTaskContext< TModelInstance = unknown, TModelConfig = ModelConfig, TModelMeta = unknown, > extends EngineTaskContext { resetContext?: boolean } export interface ModelEngine< TModelInstance = unknown, TModelConfig extends ModelConfig = ModelConfig, TModelMeta = unknown, > { autoGpu?: boolean start?: (ctx: EngineStartContext) => Promise prepareModel: ( ctx: EngineContext, onProgress?: (progress: FileDownloadProgress) => void, signal?: AbortSignal, ) => Promise createInstance: (ctx: EngineContext, signal?: AbortSignal) => Promise disposeInstance: (instance: TModelInstance) => Promise processChatCompletionTask?: ( task: ChatCompletionTaskArgs, ctx: EngineTextCompletionTaskContext, signal?: AbortSignal, ) => Promise processTextCompletionTask?: ( task: TextCompletionTaskArgs, ctx: EngineTextCompletionTaskContext, signal?: AbortSignal, ) => Promise processEmbeddingTask?: ( task: EmbeddingTaskArgs, ctx: EngineTaskContext, signal?: AbortSignal, ) => Promise processImageToTextTask?: ( task: ImageToTextTaskArgs, ctx: EngineTaskContext, signal?: AbortSignal, ) => Promise processSpeechToTextTask?: ( task: SpeechToTextTaskArgs, ctx: EngineTaskContext, signal?: AbortSignal, ) => Promise processTextToSpeechTask?: ( task: TextToSpeechTaskArgs, ctx: EngineTaskContext, signal?: AbortSignal, ) => Promise processTextToImageTask?: ( task: TextToImageTaskArgs, ctx: EngineTaskContext, signal?: AbortSignal, ) => Promise processImageToImageTask?: ( task: ImageToImageTaskArgs, ctx: EngineTaskContext, signal?: AbortSignal, ) => Promise processObjectDetectionTask?: ( task: ObjectDetectionTaskArgs, ctx: EngineTaskContext, signal?: AbortSignal, ) => Promise processTextClassificationTask?: ( task: TextClassificationTaskArgs, ctx: EngineTaskContext, signal?: AbortSignal, ) => Promise } export type TaskProcessorName = keyof Omit export type TaskProcessor = ( task: TaskArgs, ctx: EngineTaskContext, signal?: AbortSignal, ) => Promise export interface EmbeddingTaskResult { embeddings: Float32Array[] inputTokens: number } export interface ChatCompletionTaskResult { message: AssistantMessage finishReason: CompletionFinishReason promptTokens: number completionTokens: number contextTokens: number } export interface TextCompletionTaskResult { text: string finishReason: CompletionFinishReason promptTokens: number completionTokens: number contextTokens: number } export interface ImageToTextTaskResult { text: string } export interface TextToImageTaskResult { images: Image[] seed: number } export interface ImageToImageTaskResult { images: Image[] seed: number } export interface SpeechToTextTaskResult { text: string } export interface TextToSpeechTaskResult { audio: Audio } export interface ObjectDetectionResult { label: string score: number // labels: Array<{ name: string; score: number }> box: { x: number y: number width: number height: number } } export interface ObjectDetectionTaskResult { detections: ObjectDetectionResult[] } export interface TextClassificationResult { labels: Array<{ name: string; score: number }> } export interface TextClassificationTaskResult { classifications: TextClassificationResult[] } export type TaskResult = | ChatCompletionTaskResult | TextCompletionTaskResult | EmbeddingTaskResult | ImageToTextTaskResult | SpeechToTextTaskResult | TextToSpeechTaskResult | TextToImageTaskResult | ImageToImageTaskResult | ObjectDetectionTaskResult | TextClassificationTaskResult