@localmode/transformers 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/implementations/embedding.ts","../src/implementations/classifier.ts","../src/implementations/zero-shot.ts","../src/implementations/ner.ts","../src/implementations/reranker.ts","../src/implementations/speech-to-text.ts","../src/implementations/image-classifier.ts","../src/implementations/zero-shot-image.ts","../src/implementations/captioner.ts","../src/implementations/segmenter.ts","../src/implementations/object-detector.ts","../src/implementations/image-feature.ts","../src/implementations/image-to-image.ts","../src/implementations/text-to-speech.ts","../src/implementations/translator.ts","../src/implementations/summarizer.ts","../src/implementations/fill-mask.ts","../src/implementations/question-answering.ts","../src/implementations/ocr.ts","../src/implementations/document-qa.ts","../src/provider.ts","../src/utils.ts","../src/models.ts"],"names":["TransformersEmbeddingModel","baseModelId","settings","modelId","lowerModelId","pipeline","env","pipe","options","values","abortSignal","embeddings","totalTokens","value","embeddingData","embedding","createEmbeddingModel","TransformersClassificationModel","texts","startTime","results","text","output","predictions","top","allScores","pred","createClassificationModel","TransformersZeroShotModel","candidateLabels","multiLabel","result","createZeroShotModel","TransformersNERModel","entities","cleanType","createNERModel","TransformersRerankerModel","query","documents","topK","scoredDocs","i","doc","prediction","score","a","b","createRerankerModel","TransformersSpeechToTextModel","samples","sampleRate","buffer","view","writeString","offset","str","sample","blob","url","audio","sum","max","abs","rms","language","task","returnTimestamps","preparedAudio","pipelineOptions","segments","chunk","audioDurationSec","createSpeechToTextModel","TransformersImageClassificationModel","image","images","preparedImage","p","createImageClassificationModel","TransformersZeroShotImageModel","hypothesisTemplate","sorted","createZeroShotImageModel","TransformersCaptionModel","maxLength","captions","caption","createCaptionModel","TransformersSegmentationModel","threshold","masks","seg","maskData","createSegmentationModel","TransformersObjectDetectionModel","objects","det","box","createObjectDetectionModel","TransformersImageFeatureModel","features","featureArray","list","createImageFeatureModel","TransformersImageToImageModel","outputImages","createImageToImageModel","TransformersTextToSpeechModel","audioData","samplingRate","byteRate","dataSize","totalSize","createTextToSpeechModel","TransformersTranslationModel","translations","totalInputTokens","totalOutputTokens","translatedText","createTranslationModel","TransformersSummarizationModel","minLength","summaries","summaryText","createSummarizationModel","TransformersFillMaskModel","allResults","createFillMaskModel","TransformersQuestionAnsweringModel","questions","question","context","answers","createQuestionAnsweringModel","TransformersOCRModel","detectRegions","regions","extractedText","r","createOCRModel","TransformersDocumentQAModel","document","preparedDoc","answer","table","createDocumentQAModel","createTransformers","defaultSettings","modelSettings","transformers","isWebGPUAvailable","gpu","getOptimalDevice","isModelCached","request","preloadModel","progressInfo","clearModelCache","getModelStorageUsage","EMBEDDING_MODELS","CLASSIFICATION_MODELS","ZERO_SHOT_MODELS","NER_MODELS","RERANKER_MODELS","SPEECH_TO_TEXT_MODELS","IMAGE_CLASSIFICATION_MODELS","ZERO_SHOT_IMAGE_MODELS","IMAGE_CAPTION_MODELS","MODELS"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Transformers Embedding Model Implementation\n *\n * Implements EmbeddingModel interface using Transformers.js\n *\n * @packageDocumentation\n */\n\nimport type { EmbeddingModel } from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import to avoid bundling transformers.js if not used\ntype FeatureExtractionPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'feature-extraction'>>\n>;\n\n/**\n * Embedding model implementation using Transformers.js\n */\nexport class TransformersEmbeddingModel implements EmbeddingModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n readonly dimensions: number;\n readonly maxEmbeddingsPerCall = 128;\n readonly supportsParallelCalls = false;\n\n private pipeline: FeatureExtractionPipeline | null = null;\n private loadPromise: Promise<FeatureExtractionPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n // Common embedding dimensions - will be corrected after model loads\n this.dimensions = this.getDimensionsFromModelId(baseModelId);\n }\n\n /**\n * Estimate dimensions from model ID.\n */\n private getDimensionsFromModelId(modelId: string): number {\n const lowerModelId = modelId.toLowerCase();\n\n if (lowerModelId.includes('minilm-l6') || lowerModelId.includes('bge-small')) {\n return 384;\n }\n if (lowerModelId.includes('mpnet') || lowerModelId.includes('bge-base')) {\n return 768;\n }\n if (lowerModelId.includes('e5-large') || lowerModelId.includes('bge-large')) {\n return 1024;\n }\n\n // Default to 384 for unknown models\n return 384;\n }\n\n /**\n * Load the pipeline if not already loaded.\n */\n private async loadPipeline(): Promise<FeatureExtractionPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline, env } = await import('@huggingface/transformers');\n\n // Suppress ONNX runtime warnings about node execution providers\n // These are informational and don't affect functionality\n env.backends.onnx.logSeverityLevel = 3; // Only show errors, suppress warnings\n\n const pipe = await pipeline('feature-extraction', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n async doEmbed(options: {\n values: string[];\n abortSignal?: AbortSignal;\n headers?: Record<string, string>;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n embeddings: Float32Array[];\n usage: { tokens: number };\n response: { id?: string; modelId: string; timestamp: Date };\n }> {\n const { values, abortSignal } = options;\n\n // Check for cancellation\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n // Check again after loading\n abortSignal?.throwIfAborted();\n\n const embeddings: Float32Array[] = [];\n let totalTokens = 0;\n\n // Process each value\n for (const value of values) {\n abortSignal?.throwIfAborted();\n\n // Run the pipeline\n const output = await pipe(value, {\n pooling: 'mean',\n normalize: true,\n });\n\n // Extract the embedding from the output\n // The output is a Tensor, we need to get the data\n const embeddingData = output.data;\n const embedding = new Float32Array(embeddingData as ArrayLike<number>);\n\n embeddings.push(embedding);\n\n // Estimate tokens (rough approximation)\n totalTokens += Math.ceil(value.split(/\\s+/).length * 1.3);\n }\n\n return {\n embeddings,\n usage: { tokens: totalTokens },\n response: {\n modelId: this.modelId,\n timestamp: new Date(),\n },\n };\n }\n}\n\n/**\n * Create an embedding model using Transformers.js\n */\nexport function createEmbeddingModel(\n modelId: string,\n settings?: ModelSettings\n): TransformersEmbeddingModel {\n return new TransformersEmbeddingModel(modelId, settings);\n}\n","/**\n * Transformers Classification Model Implementation\n *\n * Implements ClassificationModel interface using Transformers.js\n *\n * @packageDocumentation\n */\n\nimport type { ClassificationModel, ClassificationResultItem, ClassificationUsage } from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype TextClassificationPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'text-classification'>>\n>;\n\n/**\n * Text classification model implementation using Transformers.js\n */\nexport class TransformersClassificationModel implements ClassificationModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n readonly labels: string[] = [];\n\n private pipeline: TextClassificationPipeline | null = null;\n private loadPromise: Promise<TextClassificationPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n }\n\n private async loadPipeline(): Promise<TextClassificationPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n const pipe = await pipeline('text-classification', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n async doClassify(options: {\n texts: string[];\n abortSignal?: AbortSignal;\n headers?: Record<string, string>;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n results: ClassificationResultItem[];\n usage: ClassificationUsage;\n }> {\n const { texts, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n const results: ClassificationResultItem[] = [];\n let totalTokens = 0;\n\n for (const text of texts) {\n abortSignal?.throwIfAborted();\n\n const output = await pipe(text, { top_k: 5 });\n\n // Output is an array of { label, score }\n const predictions = Array.isArray(output) ? output : [output];\n\n // Get the top prediction\n const top = predictions[0] as { label: string; score: number };\n\n // Build allScores map\n const allScores: Record<string, number> = {};\n for (const pred of predictions as Array<{ label: string; score: number }>) {\n allScores[pred.label] = pred.score;\n }\n\n results.push({\n label: top.label,\n score: top.score,\n allScores,\n });\n\n totalTokens += Math.ceil(text.split(/\\s+/).length * 1.3);\n }\n\n return {\n results,\n usage: {\n inputTokens: totalTokens,\n durationMs: Date.now() - startTime,\n },\n };\n }\n}\n\n/**\n * Create a text classification model using Transformers.js\n */\nexport function createClassificationModel(\n modelId: string,\n settings?: ModelSettings\n): TransformersClassificationModel {\n return new TransformersClassificationModel(modelId, settings);\n}\n\n","/**\n * Transformers Zero-Shot Classification Model Implementation\n *\n * Implements ZeroShotClassificationModel interface using Transformers.js\n *\n * @packageDocumentation\n */\n\nimport type { ZeroShotClassificationModel, ClassificationUsage } from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype ZeroShotClassificationPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'zero-shot-classification'>>\n>;\n\n/**\n * Zero-shot classification model implementation using Transformers.js\n */\nexport class TransformersZeroShotModel implements ZeroShotClassificationModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n\n private pipeline: ZeroShotClassificationPipeline | null = null;\n private loadPromise: Promise<ZeroShotClassificationPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n }\n\n private async loadPipeline(): Promise<ZeroShotClassificationPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n const pipe = await pipeline('zero-shot-classification', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n async doClassifyZeroShot(options: {\n texts: string[];\n candidateLabels: string[];\n multiLabel?: boolean;\n abortSignal?: AbortSignal;\n headers?: Record<string, string>;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n results: Array<{ labels: string[]; scores: number[] }>;\n usage: ClassificationUsage;\n }> {\n const { texts, candidateLabels, multiLabel, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n const results: Array<{ labels: string[]; scores: number[] }> = [];\n let totalTokens = 0;\n\n for (const text of texts) {\n abortSignal?.throwIfAborted();\n\n const output = await pipe(text, candidateLabels, {\n multi_label: multiLabel ?? false,\n });\n\n // Output format: { sequence, labels: string[], scores: number[] }\n const result = output as { sequence: string; labels: string[]; scores: number[] };\n\n results.push({\n labels: result.labels,\n scores: result.scores,\n });\n\n totalTokens += Math.ceil(text.split(/\\s+/).length * 1.3);\n }\n\n return {\n results,\n usage: {\n inputTokens: totalTokens,\n durationMs: Date.now() - startTime,\n },\n };\n }\n}\n\n/**\n * Create a zero-shot classification model using Transformers.js\n */\nexport function createZeroShotModel(\n modelId: string,\n settings?: ModelSettings\n): TransformersZeroShotModel {\n return new TransformersZeroShotModel(modelId, settings);\n}\n\n","/**\n * Transformers NER Model Implementation\n *\n * Implements NERModel interface using Transformers.js\n *\n * @packageDocumentation\n */\n\nimport type { NERModel, NERResultItem, Entity, NERUsage } from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype TokenClassificationPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'token-classification'>>\n>;\n\n/**\n * NER model implementation using Transformers.js\n */\nexport class TransformersNERModel implements NERModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n readonly entityTypes: string[] = ['PERSON', 'ORG', 'LOC', 'MISC'];\n\n private pipeline: TokenClassificationPipeline | null = null;\n private loadPromise: Promise<TokenClassificationPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n }\n\n private async loadPipeline(): Promise<TokenClassificationPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n const pipe = await pipeline('token-classification', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n async doExtract(options: {\n texts: string[];\n abortSignal?: AbortSignal;\n headers?: Record<string, string>;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n results: NERResultItem[];\n usage: NERUsage;\n }> {\n const { texts, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n const results: NERResultItem[] = [];\n let totalTokens = 0;\n\n for (const text of texts) {\n abortSignal?.throwIfAborted();\n\n // Use type assertion for pipeline options as API may vary\n const output = await pipe(text, {\n aggregation_strategy: 'simple',\n } as Record<string, unknown>);\n\n // Output is array of { word, entity, score, start, end, index }\n const entities: Entity[] = [];\n\n const predictions = Array.isArray(output) ? output : [output];\n\n for (const pred of predictions as Array<{\n word: string;\n entity: string;\n entity_group?: string;\n score: number;\n start: number;\n end: number;\n }>) {\n // Handle both 'entity' and 'entity_group' (aggregation mode)\n const entityType = pred.entity_group ?? pred.entity;\n\n // Remove B- or I- prefix if present\n const cleanType = entityType.replace(/^[BI]-/, '');\n\n entities.push({\n text: pred.word,\n type: cleanType,\n start: pred.start,\n end: pred.end,\n score: pred.score,\n });\n }\n\n results.push({ entities });\n\n totalTokens += Math.ceil(text.split(/\\s+/).length * 1.3);\n }\n\n return {\n results,\n usage: {\n inputTokens: totalTokens,\n durationMs: Date.now() - startTime,\n },\n };\n }\n}\n\n/**\n * Create a NER model using Transformers.js\n */\nexport function createNERModel(modelId: string, settings?: ModelSettings): TransformersNERModel {\n return new TransformersNERModel(modelId, settings);\n}\n","/**\n * Transformers Reranker Model Implementation\n *\n * Implements RerankerModel interface using Transformers.js\n *\n * @packageDocumentation\n */\n\nimport type { RerankerModel, RankedDocument, RerankUsage } from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Rerankers typically use text-classification pipeline with query-document pairs\ntype TextClassificationPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'text-classification'>>\n>;\n\n/**\n * Reranker model implementation using Transformers.js\n *\n * Rerankers score query-document pairs for relevance. They're typically\n * used after initial retrieval to improve result quality.\n */\nexport class TransformersRerankerModel implements RerankerModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n\n private pipeline: TextClassificationPipeline | null = null;\n private loadPromise: Promise<TextClassificationPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n }\n\n private async loadPipeline(): Promise<TextClassificationPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n // Rerankers use text-classification pipeline with special input format\n const pipe = await pipeline('text-classification', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n async doRerank(options: {\n query: string;\n documents: string[];\n topK?: number;\n abortSignal?: AbortSignal;\n headers?: Record<string, string>;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n results: RankedDocument[];\n usage: RerankUsage;\n }> {\n const { query, documents, topK, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n // Score each query-document pair\n const scoredDocs: Array<{ index: number; score: number; text: string }> = [];\n let totalTokens = 0;\n\n for (let i = 0; i < documents.length; i++) {\n abortSignal?.throwIfAborted();\n\n const doc = documents[i];\n\n // Create query-document pair input\n // Most rerankers expect: [CLS] query [SEP] document [SEP]\n // Transformers.js handles this when we pass an array pair\n const output = await pipe([query, doc]);\n\n // Get the relevance score\n // For cross-encoders, we typically want the score for the positive class\n const result = Array.isArray(output) ? output[0] : output;\n const prediction = result as { label: string; score: number };\n\n // Some models output logits, some output probabilities\n // We normalize to 0-1 range\n let score = prediction.score;\n\n // If the label indicates this is a \"not relevant\" prediction, invert\n if (\n prediction.label.toLowerCase().includes('not') ||\n prediction.label === 'LABEL_0' ||\n prediction.label === '0'\n ) {\n score = 1 - score;\n }\n\n scoredDocs.push({\n index: i,\n score,\n text: doc,\n });\n\n // Estimate tokens\n totalTokens += Math.ceil((query.split(/\\s+/).length + doc.split(/\\s+/).length) * 1.3);\n }\n\n // Sort by score descending\n scoredDocs.sort((a, b) => b.score - a.score);\n\n // Apply topK if specified\n const results = topK ? scoredDocs.slice(0, topK) : scoredDocs;\n\n return {\n results,\n usage: {\n inputTokens: totalTokens,\n durationMs: Date.now() - startTime,\n },\n };\n }\n}\n\n/**\n * Create a reranker model using Transformers.js\n */\nexport function createRerankerModel(\n modelId: string,\n settings?: ModelSettings\n): TransformersRerankerModel {\n return new TransformersRerankerModel(modelId, settings);\n}\n\n","/**\n * Transformers Speech-to-Text Model Implementation\n *\n * Implements SpeechToTextModel interface using Transformers.js\n *\n * @packageDocumentation\n */\n\nimport type {\n SpeechToTextModel,\n AudioInput,\n TranscriptionSegment,\n AudioUsage,\n} from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype AutomaticSpeechRecognitionPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'automatic-speech-recognition'>>\n>;\n\n/**\n * Speech-to-text model implementation using Transformers.js (Whisper)\n */\nexport class TransformersSpeechToTextModel implements SpeechToTextModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n readonly languages = [\n 'en',\n 'zh',\n 'de',\n 'es',\n 'ru',\n 'ko',\n 'fr',\n 'ja',\n 'pt',\n 'tr',\n 'pl',\n 'ca',\n 'nl',\n 'ar',\n 'sv',\n 'it',\n 'id',\n 'hi',\n 'fi',\n 'vi',\n 'he',\n 'uk',\n 'el',\n 'ms',\n 'cs',\n 'ro',\n 'da',\n 'hu',\n 'ta',\n 'no',\n 'th',\n 'ur',\n 'hr',\n 'bg',\n 'lt',\n 'la',\n 'mi',\n 'ml',\n 'cy',\n 'sk',\n 'te',\n 'fa',\n 'lv',\n 'bn',\n 'sr',\n 'az',\n 'sl',\n 'kn',\n 'et',\n 'mk',\n 'br',\n 'eu',\n 'is',\n 'hy',\n 'ne',\n 'mn',\n 'bs',\n 'kk',\n 'sq',\n 'sw',\n 'gl',\n 'mr',\n 'pa',\n 'si',\n 'km',\n 'sn',\n 'yo',\n 'so',\n 'af',\n 'oc',\n 'ka',\n 'be',\n 'tg',\n 'sd',\n 'gu',\n 'am',\n 'yi',\n 'lo',\n 'uz',\n 'fo',\n 'ht',\n 'ps',\n 'tk',\n 'nn',\n 'mt',\n 'sa',\n 'lb',\n 'my',\n 'bo',\n 'tl',\n 'mg',\n 'as',\n 'tt',\n 'haw',\n 'ln',\n 'ha',\n 'ba',\n 'jw',\n 'su',\n ];\n\n private pipeline: AutomaticSpeechRecognitionPipeline | null = null;\n private loadPromise: Promise<AutomaticSpeechRecognitionPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n }\n\n private async loadPipeline(): Promise<AutomaticSpeechRecognitionPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n const pipe = await pipeline('automatic-speech-recognition', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n // Track object URLs for cleanup\n private objectUrls: string[] = [];\n\n /**\n * Convert Float32Array PCM samples to a WAV blob URL.\n * This ensures transformers.js correctly interprets the audio format.\n */\n private createWavUrl(samples: Float32Array, sampleRate: number = 16000): string {\n const buffer = new ArrayBuffer(44 + samples.length * 2);\n const view = new DataView(buffer);\n\n // WAV header\n const writeString = (offset: number, str: string) => {\n for (let i = 0; i < str.length; i++) {\n view.setUint8(offset + i, str.charCodeAt(i));\n }\n };\n\n writeString(0, 'RIFF');\n view.setUint32(4, 36 + samples.length * 2, true);\n writeString(8, 'WAVE');\n writeString(12, 'fmt ');\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, 1, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, sampleRate * 2, true);\n view.setUint16(32, 2, true);\n view.setUint16(34, 16, true);\n writeString(36, 'data');\n view.setUint32(40, samples.length * 2, true);\n\n // Convert Float32 to Int16\n let offset = 44;\n for (let i = 0; i < samples.length; i++) {\n const sample = Math.max(-1, Math.min(1, samples[i]));\n view.setInt16(offset, sample < 0 ? sample * 0x8000 : sample * 0x7fff, true);\n offset += 2;\n }\n\n const blob = new Blob([buffer], { type: 'audio/wav' });\n const url = URL.createObjectURL(blob);\n this.objectUrls.push(url);\n return url;\n }\n\n /**\n * Convert AudioInput to a format Transformers.js can process.\n * For raw PCM samples, converts to WAV URL to ensure correct interpretation.\n */\n private async prepareAudio(audio: AudioInput): Promise<string> {\n // Float32Array - convert to WAV URL for reliable processing\n if (audio instanceof Float32Array) {\n // Debug: log audio stats\n if (typeof console !== 'undefined') {\n let sum = 0;\n let max = 0;\n for (let i = 0; i < audio.length; i++) {\n sum += audio[i] * audio[i];\n const abs = Math.abs(audio[i]);\n if (abs > max) max = abs;\n }\n const rms = Math.sqrt(sum / audio.length);\n console.log(\n '[STT] Audio stats - samples:',\n audio.length,\n 'RMS:',\n rms.toFixed(4),\n 'Max:',\n max.toFixed(4),\n 'Duration:',\n (audio.length / 16000).toFixed(2) + 's'\n );\n\n if (rms < 0.001) {\n console.warn('[STT] Warning: Audio appears to be nearly silent (RMS < 0.001)');\n }\n }\n\n // Convert to WAV URL - this ensures transformers.js correctly interprets the format\n const url = this.createWavUrl(audio, 16000);\n console.log('[STT] Created WAV URL for pipeline');\n return url;\n }\n\n // For Blob, create an Object URL - transformers.js will fetch and decode it\n // This handles WebM and other formats that AudioContext.decodeAudioData doesn't support\n if (audio instanceof Blob) {\n const url = URL.createObjectURL(audio);\n this.objectUrls.push(url);\n return url;\n }\n\n // For ArrayBuffer, create a Blob URL\n if (audio instanceof ArrayBuffer) {\n const blob = new Blob([audio], { type: 'audio/wav' });\n const url = URL.createObjectURL(blob);\n this.objectUrls.push(url);\n return url;\n }\n\n // If it's a URL string, return as-is\n return audio as string;\n }\n\n /**\n * Cleanup any created Object URLs\n */\n private cleanupObjectUrls(): void {\n for (const url of this.objectUrls) {\n URL.revokeObjectURL(url);\n }\n this.objectUrls = [];\n }\n\n async doTranscribe(options: {\n audio: AudioInput;\n language?: string;\n task?: 'transcribe' | 'translate';\n returnTimestamps?: boolean | 'word';\n abortSignal?: AbortSignal;\n headers?: Record<string, string>;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n text: string;\n segments?: TranscriptionSegment[];\n language?: string;\n usage: AudioUsage;\n }> {\n const { audio, language, task, returnTimestamps, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n const preparedAudio = await this.prepareAudio(audio);\n\n abortSignal?.throwIfAborted();\n\n try {\n // Build pipeline options\n const pipelineOptions: Record<string, unknown> = {\n language: language,\n task: task ?? 'transcribe',\n return_timestamps: returnTimestamps ?? false,\n // Chunk settings to help with short audio\n chunk_length_s: 30,\n stride_length_s: 5,\n };\n\n if (returnTimestamps === 'word') {\n pipelineOptions.return_timestamps = 'word';\n }\n\n console.log('[STT] Pipeline options:', JSON.stringify(pipelineOptions));\n\n const output = await pipe(preparedAudio, pipelineOptions);\n\n console.log('[STT] Raw output:', JSON.stringify(output));\n\n // Output format depends on options\n // Without timestamps: { text: string }\n // With timestamps: { text: string, chunks: Array<{ text, timestamp }> }\n const result = output as {\n text: string;\n chunks?: Array<{ text: string; timestamp: [number, number] }>;\n };\n\n let segments: TranscriptionSegment[] | undefined;\n\n if (result.chunks && result.chunks.length > 0) {\n segments = result.chunks.map((chunk) => ({\n text: chunk.text,\n start: chunk.timestamp[0],\n end: chunk.timestamp[1],\n }));\n }\n\n // Estimate audio duration from segments or from original audio\n let audioDurationSec = 0;\n if (segments && segments.length > 0) {\n audioDurationSec = segments[segments.length - 1].end;\n } else if (audio instanceof Float32Array) {\n // Original audio at 16kHz sample rate\n audioDurationSec = audio.length / 16000;\n }\n\n return {\n text: result.text.trim(),\n segments,\n language,\n usage: {\n audioDurationSec,\n durationMs: Date.now() - startTime,\n },\n };\n } finally {\n // Clean up any Object URLs we created\n this.cleanupObjectUrls();\n }\n }\n}\n\n/**\n * Create a speech-to-text model using Transformers.js\n */\nexport function createSpeechToTextModel(\n modelId: string,\n settings?: ModelSettings\n): TransformersSpeechToTextModel {\n return new TransformersSpeechToTextModel(modelId, settings);\n}\n","/**\n * Transformers Image Classification Model Implementation\n *\n * Implements ImageClassificationModel interface using Transformers.js\n *\n * @packageDocumentation\n */\n\nimport type {\n ImageClassificationModel,\n ImageClassificationResultItem,\n ImageInput,\n VisionUsage,\n} from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype ImageClassificationPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'image-classification'>>\n>;\n\n/**\n * Image classification model implementation using Transformers.js\n */\nexport class TransformersImageClassificationModel implements ImageClassificationModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n\n private pipeline: ImageClassificationPipeline | null = null;\n private loadPromise: Promise<ImageClassificationPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n }\n\n private async loadPipeline(): Promise<ImageClassificationPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n const pipe = await pipeline('image-classification', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n /**\n * Convert ImageInput to a format Transformers.js can process\n */\n private prepareImage(image: ImageInput): string | Blob | ImageData {\n if (typeof image === 'string') {\n // URL or data URL\n return image;\n }\n if (image instanceof Blob) {\n return image;\n }\n if (image instanceof ImageData) {\n return image;\n }\n if (image instanceof ArrayBuffer) {\n // Convert to Blob\n return new Blob([image], { type: 'image/png' });\n }\n return image as string;\n }\n\n async doClassify(options: {\n images: ImageInput[];\n topK?: number;\n abortSignal?: AbortSignal;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n results: ImageClassificationResultItem[][];\n usage: VisionUsage;\n }> {\n const { images, topK = 5, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n const results: ImageClassificationResultItem[][] = [];\n\n for (const image of images) {\n abortSignal?.throwIfAborted();\n\n const preparedImage = this.prepareImage(image);\n // Use type assertion as transformers accepts various image formats\n const output = await pipe(preparedImage as unknown as string, { top_k: topK });\n\n // Output is array of { label, score }\n const predictions = (Array.isArray(output) ? output : [output]) as Array<{\n label: string;\n score: number;\n }>;\n\n results.push(\n predictions.map((p) => ({\n label: p.label,\n score: p.score,\n }))\n );\n }\n\n return {\n results,\n usage: {\n durationMs: Date.now() - startTime,\n },\n };\n }\n}\n\n/**\n * Create an image classification model using Transformers.js\n */\nexport function createImageClassificationModel(\n modelId: string,\n settings?: ModelSettings\n): TransformersImageClassificationModel {\n return new TransformersImageClassificationModel(modelId, settings);\n}\n","/**\n * Transformers Zero-Shot Image Classification Model Implementation\n *\n * Implements ZeroShotImageClassificationModel interface using Transformers.js (CLIP)\n *\n * @packageDocumentation\n */\n\nimport type {\n ZeroShotImageClassificationModel,\n ZeroShotImageClassificationResultItem,\n ImageInput,\n VisionUsage,\n} from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype ZeroShotImageClassificationPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'zero-shot-image-classification'>>\n>;\n\n/**\n * Zero-shot image classification model implementation using Transformers.js (CLIP)\n */\nexport class TransformersZeroShotImageModel implements ZeroShotImageClassificationModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n\n private pipeline: ZeroShotImageClassificationPipeline | null = null;\n private loadPromise: Promise<ZeroShotImageClassificationPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n }\n\n private async loadPipeline(): Promise<ZeroShotImageClassificationPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n const pipe = await pipeline('zero-shot-image-classification', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n /**\n * Convert ImageInput to a format Transformers.js can process\n */\n private prepareImage(image: ImageInput): string | Blob | ImageData {\n if (typeof image === 'string') {\n return image;\n }\n if (image instanceof Blob) {\n return image;\n }\n if (image instanceof ImageData) {\n return image;\n }\n if (image instanceof ArrayBuffer) {\n return new Blob([image], { type: 'image/png' });\n }\n return image as string;\n }\n\n async doClassifyZeroShot(options: {\n images: ImageInput[];\n candidateLabels: string[];\n hypothesisTemplate?: string;\n abortSignal?: AbortSignal;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n results: ZeroShotImageClassificationResultItem[];\n usage: VisionUsage;\n }> {\n const { images, candidateLabels, hypothesisTemplate, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n const results: ZeroShotImageClassificationResultItem[] = [];\n\n for (const image of images) {\n abortSignal?.throwIfAborted();\n\n const preparedImage = this.prepareImage(image);\n\n const pipelineOptions: Record<string, unknown> = {};\n if (hypothesisTemplate) {\n pipelineOptions.hypothesis_template = hypothesisTemplate;\n }\n\n // Use type assertion as transformers accepts various image formats\n const output = await pipe(\n preparedImage as unknown as string,\n candidateLabels,\n pipelineOptions\n );\n\n // Output is array of { label, score } sorted by score descending\n const predictions = (Array.isArray(output) ? output : [output]) as Array<{\n label: string;\n score: number;\n }>;\n\n // Sort by score descending and extract labels/scores\n const sorted = [...predictions].sort((a, b) => b.score - a.score);\n\n results.push({\n labels: sorted.map((p) => p.label),\n scores: sorted.map((p) => p.score),\n });\n }\n\n return {\n results,\n usage: {\n durationMs: Date.now() - startTime,\n },\n };\n }\n}\n\n/**\n * Create a zero-shot image classification model using Transformers.js\n */\nexport function createZeroShotImageModel(\n modelId: string,\n settings?: ModelSettings\n): TransformersZeroShotImageModel {\n return new TransformersZeroShotImageModel(modelId, settings);\n}\n","/**\n * Transformers Image Captioning Model Implementation\n *\n * Implements ImageCaptionModel interface using Transformers.js (BLIP)\n *\n * @packageDocumentation\n */\n\nimport type { ImageCaptionModel, ImageInput, VisionUsage } from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype ImageToTextPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'image-to-text'>>\n>;\n\n/**\n * Image captioning model implementation using Transformers.js (BLIP)\n */\nexport class TransformersCaptionModel implements ImageCaptionModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n\n private pipeline: ImageToTextPipeline | null = null;\n private loadPromise: Promise<ImageToTextPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n }\n\n private async loadPipeline(): Promise<ImageToTextPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n const pipe = await pipeline('image-to-text', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n /**\n * Convert ImageInput to a format Transformers.js can process\n */\n private prepareImage(image: ImageInput): string | Blob | ImageData {\n if (typeof image === 'string') {\n return image;\n }\n if (image instanceof Blob) {\n return image;\n }\n if (image instanceof ImageData) {\n return image;\n }\n if (image instanceof ArrayBuffer) {\n return new Blob([image], { type: 'image/png' });\n }\n return image as string;\n }\n\n async doCaption(options: {\n images: ImageInput[];\n maxLength?: number;\n abortSignal?: AbortSignal;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n captions: string[];\n usage: VisionUsage;\n }> {\n const { images, maxLength, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n const captions: string[] = [];\n\n for (const image of images) {\n abortSignal?.throwIfAborted();\n\n const preparedImage = this.prepareImage(image);\n\n const pipelineOptions: Record<string, unknown> = {};\n if (maxLength) {\n pipelineOptions.max_length = maxLength;\n }\n\n // Use type assertion as transformers accepts various image formats\n const output = await pipe(preparedImage as unknown as string, pipelineOptions);\n\n // Output is array of { generated_text: string }\n const results = Array.isArray(output) ? output : [output];\n const caption = (results[0] as { generated_text: string }).generated_text;\n\n captions.push(caption.trim());\n }\n\n return {\n captions,\n usage: {\n durationMs: Date.now() - startTime,\n },\n };\n }\n}\n\n/**\n * Create an image captioning model using Transformers.js\n */\nexport function createCaptionModel(\n modelId: string,\n settings?: ModelSettings\n): TransformersCaptionModel {\n return new TransformersCaptionModel(modelId, settings);\n}\n","/**\n * Transformers Image Segmentation Model Implementation\n *\n * Implements SegmentationModel interface using Transformers.js\n *\n * @packageDocumentation\n */\n\nimport type {\n SegmentationModel,\n ImageInput,\n VisionUsage,\n SegmentMask,\n} from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype SegmentationPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'image-segmentation'>>\n>;\n\n/**\n * Image segmentation model implementation using Transformers.js\n */\nexport class TransformersSegmentationModel implements SegmentationModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n readonly segmentationType: 'semantic' | 'instance' | 'panoptic' = 'semantic';\n\n private pipeline: SegmentationPipeline | null = null;\n private loadPromise: Promise<SegmentationPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n segmentationType?: 'semantic' | 'instance' | 'panoptic';\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n if (settings.segmentationType) {\n (this as { segmentationType: string }).segmentationType = settings.segmentationType;\n }\n }\n\n private async loadPipeline(): Promise<SegmentationPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n const pipe = await pipeline('image-segmentation', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n private prepareImage(image: ImageInput): string | Blob | ImageData {\n if (typeof image === 'string') {\n return image;\n }\n if (image instanceof Blob) {\n return image;\n }\n if (image instanceof ImageData) {\n return image;\n }\n if (image instanceof ArrayBuffer) {\n return new Blob([image], { type: 'image/png' });\n }\n return image as string;\n }\n\n async doSegment(options: {\n images: ImageInput[];\n threshold?: number;\n abortSignal?: AbortSignal;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n results: Array<{ masks: SegmentMask[] }>;\n usage: VisionUsage;\n }> {\n const { images, threshold = 0.5, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n const results: Array<{ masks: SegmentMask[] }> = [];\n\n for (const image of images) {\n abortSignal?.throwIfAborted();\n\n const preparedImage = this.prepareImage(image);\n const output = await pipe(preparedImage as unknown as string, { threshold });\n\n // Output is array of { label, score, mask (RawImage) }\n const segments = Array.isArray(output) ? output : [output];\n\n const masks: SegmentMask[] = segments.map((seg: Record<string, unknown>) => {\n // The mask is a RawImage, convert to Uint8Array\n const maskData = (seg.mask as { data?: Uint8Array })?.data ?? new Uint8Array(0);\n return {\n label: String(seg.label ?? 'unknown'),\n score: Number(seg.score ?? 0),\n mask: maskData,\n };\n });\n\n results.push({ masks });\n }\n\n return {\n results,\n usage: {\n durationMs: Date.now() - startTime,\n },\n };\n }\n}\n\n/**\n * Create an image segmentation model using Transformers.js\n */\nexport function createSegmentationModel(\n modelId: string,\n settings?: ModelSettings & { segmentationType?: 'semantic' | 'instance' | 'panoptic' }\n): TransformersSegmentationModel {\n return new TransformersSegmentationModel(modelId, settings);\n}\n\n","/**\n * Transformers Object Detection Model Implementation\n *\n * Implements ObjectDetectionModel interface using Transformers.js\n *\n * @packageDocumentation\n */\n\nimport type {\n ObjectDetectionModel,\n ImageInput,\n VisionUsage,\n DetectedObject,\n} from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype ObjectDetectionPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'object-detection'>>\n>;\n\n/**\n * Object detection model implementation using Transformers.js\n */\nexport class TransformersObjectDetectionModel implements ObjectDetectionModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n\n private pipeline: ObjectDetectionPipeline | null = null;\n private loadPromise: Promise<ObjectDetectionPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n }\n\n private async loadPipeline(): Promise<ObjectDetectionPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n const pipe = await pipeline('object-detection', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n private prepareImage(image: ImageInput): string | Blob | ImageData {\n if (typeof image === 'string') {\n return image;\n }\n if (image instanceof Blob) {\n return image;\n }\n if (image instanceof ImageData) {\n return image;\n }\n if (image instanceof ArrayBuffer) {\n return new Blob([image], { type: 'image/png' });\n }\n return image as string;\n }\n\n async doDetect(options: {\n images: ImageInput[];\n threshold?: number;\n abortSignal?: AbortSignal;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n results: Array<{ objects: DetectedObject[] }>;\n usage: VisionUsage;\n }> {\n const { images, threshold = 0.5, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n const results: Array<{ objects: DetectedObject[] }> = [];\n\n for (const image of images) {\n abortSignal?.throwIfAborted();\n\n const preparedImage = this.prepareImage(image);\n const output = await pipe(preparedImage as unknown as string, { threshold });\n\n // Output is array of { label, score, box: { xmin, ymin, xmax, ymax } }\n const detections = (Array.isArray(output) ? output : [output]) as Array<Record<string, unknown>>;\n\n const objects: DetectedObject[] = detections.map((det) => {\n const box = det.box as { xmin: number; ymin: number; xmax: number; ymax: number } | undefined;\n return {\n label: String(det.label ?? 'unknown'),\n score: Number(det.score ?? 0),\n box: box\n ? {\n x: box.xmin,\n y: box.ymin,\n width: box.xmax - box.xmin,\n height: box.ymax - box.ymin,\n }\n : { x: 0, y: 0, width: 0, height: 0 },\n };\n });\n\n results.push({ objects });\n }\n\n return {\n results,\n usage: {\n durationMs: Date.now() - startTime,\n },\n };\n }\n}\n\n/**\n * Create an object detection model using Transformers.js\n */\nexport function createObjectDetectionModel(\n modelId: string,\n settings?: ModelSettings\n): TransformersObjectDetectionModel {\n return new TransformersObjectDetectionModel(modelId, settings);\n}\n\n","/**\n * Transformers Image Feature Extraction Model Implementation\n *\n * Implements ImageFeatureModel interface using Transformers.js (CLIP, DINOv2, etc.)\n *\n * @packageDocumentation\n */\n\nimport type {\n ImageFeatureModel,\n ImageInput,\n VisionUsage,\n} from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype FeatureExtractionPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'image-feature-extraction'>>\n>;\n\n/**\n * Image feature extraction model implementation using Transformers.js\n */\nexport class TransformersImageFeatureModel implements ImageFeatureModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n readonly dimensions: number;\n\n private pipeline: FeatureExtractionPipeline | null = null;\n private loadPromise: Promise<FeatureExtractionPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n dimensions?: number;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n // Default dimensions based on common models\n this.dimensions = settings.dimensions ?? 512;\n }\n\n private async loadPipeline(): Promise<FeatureExtractionPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n const pipe = await pipeline('image-feature-extraction', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n private prepareImage(image: ImageInput): string | Blob | ImageData {\n if (typeof image === 'string') {\n return image;\n }\n if (image instanceof Blob) {\n return image;\n }\n if (image instanceof ImageData) {\n return image;\n }\n if (image instanceof ArrayBuffer) {\n return new Blob([image], { type: 'image/png' });\n }\n return image as string;\n }\n\n async doExtract(options: {\n images: ImageInput[];\n abortSignal?: AbortSignal;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n features: Float32Array[];\n usage: VisionUsage;\n }> {\n const { images, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n const features: Float32Array[] = [];\n\n for (const image of images) {\n abortSignal?.throwIfAborted();\n\n const preparedImage = this.prepareImage(image);\n // Pass options as a plain object with type assertion to handle different transformers.js versions\n const output = await pipe(preparedImage as unknown as string, {\n pool: true,\n } as Record<string, unknown>);\n\n // Output is a Tensor or nested array\n let featureArray: number[];\n if (output && typeof output === 'object' && 'tolist' in output) {\n // It's a Tensor\n const list = (output as { tolist: () => number[][] }).tolist();\n featureArray = Array.isArray(list[0]) ? list[0] : list as unknown as number[];\n } else if (Array.isArray(output)) {\n featureArray = (output as number[]).flat() as number[];\n } else {\n featureArray = [];\n }\n\n features.push(new Float32Array(featureArray));\n }\n\n return {\n features,\n usage: {\n durationMs: Date.now() - startTime,\n },\n };\n }\n}\n\n/**\n * Create an image feature extraction model using Transformers.js\n */\nexport function createImageFeatureModel(\n modelId: string,\n settings?: ModelSettings & { dimensions?: number }\n): TransformersImageFeatureModel {\n return new TransformersImageFeatureModel(modelId, settings);\n}\n\n","/**\n * Transformers Image-to-Image Model Implementation\n *\n * Implements ImageToImageModel interface using Transformers.js (Super Resolution, etc.)\n *\n * @packageDocumentation\n */\n\nimport type {\n ImageToImageModel,\n ImageInput,\n VisionUsage,\n} from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype ImageToImagePipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'image-to-image'>>\n>;\n\n/**\n * Image-to-image model implementation using Transformers.js\n */\nexport class TransformersImageToImageModel implements ImageToImageModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n readonly taskType: 'upscale' | 'style-transfer' | 'inpainting' | 'outpainting' | 'super-resolution';\n\n private pipeline: ImageToImagePipeline | null = null;\n private loadPromise: Promise<ImageToImagePipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n taskType?: 'upscale' | 'style-transfer' | 'inpainting' | 'outpainting' | 'super-resolution';\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n this.taskType = settings.taskType ?? 'super-resolution';\n }\n\n private async loadPipeline(): Promise<ImageToImagePipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n const pipe = await pipeline('image-to-image', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n private prepareImage(image: ImageInput): string | Blob | ImageData {\n if (typeof image === 'string') {\n return image;\n }\n if (image instanceof Blob) {\n return image;\n }\n if (image instanceof ImageData) {\n return image;\n }\n if (image instanceof ArrayBuffer) {\n return new Blob([image], { type: 'image/png' });\n }\n return image as string;\n }\n\n async doTransform(options: {\n images: ImageInput[];\n prompt?: string;\n abortSignal?: AbortSignal;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n images: Blob[];\n usage: VisionUsage;\n }> {\n const { images, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n const outputImages: Blob[] = [];\n\n for (const image of images) {\n abortSignal?.throwIfAborted();\n\n const preparedImage = this.prepareImage(image);\n\n // Image-to-image pipeline returns a RawImage or similar\n const output = await pipe(preparedImage as unknown as string);\n\n // Convert RawImage to Blob\n let blob: Blob;\n if (output && typeof output === 'object') {\n if ('toBlob' in output && typeof output.toBlob === 'function') {\n blob = await output.toBlob();\n } else if (output instanceof Blob) {\n blob = output;\n } else {\n // Fallback: create a simple blob\n blob = new Blob(['transformed image'], { type: 'image/png' });\n }\n } else {\n blob = new Blob(['transformed image'], { type: 'image/png' });\n }\n\n outputImages.push(blob);\n }\n\n return {\n images: outputImages,\n usage: {\n durationMs: Date.now() - startTime,\n },\n };\n }\n}\n\n/**\n * Create an image-to-image model using Transformers.js\n */\nexport function createImageToImageModel(\n modelId: string,\n settings?: ModelSettings & {\n taskType?: 'upscale' | 'style-transfer' | 'inpainting' | 'outpainting' | 'super-resolution';\n }\n): TransformersImageToImageModel {\n return new TransformersImageToImageModel(modelId, settings);\n}\n\n","/**\n * Transformers Text-to-Speech Model Implementation\n *\n * Implements TextToSpeechModel interface using Transformers.js (SpeechT5, etc.)\n *\n * @packageDocumentation\n */\n\nimport type {\n TextToSpeechModel,\n} from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype TTSPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'text-to-speech'>>\n>;\n\n/**\n * Text-to-speech model implementation using Transformers.js\n */\nexport class TransformersTextToSpeechModel implements TextToSpeechModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n readonly sampleRate: number = 16000;\n readonly voices: string[] = [];\n\n private pipeline: TTSPipeline | null = null;\n private loadPromise: Promise<TTSPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n sampleRate?: number;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n if (settings.sampleRate) {\n (this as { sampleRate: number }).sampleRate = settings.sampleRate;\n }\n }\n\n private async loadPipeline(): Promise<TTSPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n const pipe = await pipeline('text-to-speech', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n async doSynthesize(options: {\n text: string;\n voice?: string;\n speed?: number;\n pitch?: number;\n abortSignal?: AbortSignal;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n audio: Blob;\n sampleRate: number;\n usage: {\n characterCount: number;\n durationMs: number;\n };\n }> {\n const { text, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n // Text-to-speech pipeline returns { audio: Float32Array, sampling_rate: number }\n const output = await pipe(text, {} as Record<string, unknown>);\n\n const audioData = (output as { audio: Float32Array }).audio;\n const samplingRate = (output as { sampling_rate: number }).sampling_rate || this.sampleRate;\n\n // Convert Float32Array to WAV Blob\n const wavBlob = this.floatToWav(audioData, samplingRate);\n\n return {\n audio: wavBlob,\n sampleRate: samplingRate,\n usage: {\n characterCount: text.length,\n durationMs: Date.now() - startTime,\n },\n };\n }\n\n /**\n * Convert Float32Array audio data to WAV Blob\n */\n private floatToWav(audioData: Float32Array, sampleRate: number): Blob {\n const numChannels = 1;\n const bitsPerSample = 16;\n const bytesPerSample = bitsPerSample / 8;\n const blockAlign = numChannels * bytesPerSample;\n const byteRate = sampleRate * blockAlign;\n const dataSize = audioData.length * bytesPerSample;\n const headerSize = 44;\n const totalSize = headerSize + dataSize;\n\n const buffer = new ArrayBuffer(totalSize);\n const view = new DataView(buffer);\n\n const writeString = (offset: number, str: string) => {\n for (let i = 0; i < str.length; i++) {\n view.setUint8(offset + i, str.charCodeAt(i));\n }\n };\n\n writeString(0, 'RIFF');\n view.setUint32(4, totalSize - 8, true);\n writeString(8, 'WAVE');\n writeString(12, 'fmt ');\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, numChannels, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, byteRate, true);\n view.setUint16(32, blockAlign, true);\n view.setUint16(34, bitsPerSample, true);\n writeString(36, 'data');\n view.setUint32(40, dataSize, true);\n\n const offset = 44;\n for (let i = 0; i < audioData.length; i++) {\n const sample = Math.max(-1, Math.min(1, audioData[i]));\n view.setInt16(offset + i * 2, sample * 0x7fff, true);\n }\n\n return new Blob([buffer], { type: 'audio/wav' });\n }\n}\n\n/**\n * Create a text-to-speech model using Transformers.js\n */\nexport function createTextToSpeechModel(\n modelId: string,\n settings?: ModelSettings & { sampleRate?: number }\n): TransformersTextToSpeechModel {\n return new TransformersTextToSpeechModel(modelId, settings);\n}\n\n","/**\n * Transformers Translation Model Implementation\n *\n * Implements TranslationModel interface using Transformers.js (opus-mt, nllb, etc.)\n *\n * @packageDocumentation\n */\n\nimport type {\n TranslationModel,\n TranslationUsage,\n} from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype TranslationPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'translation'>>\n>;\n\n/**\n * Translation model implementation using Transformers.js\n */\nexport class TransformersTranslationModel implements TranslationModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n\n private pipeline: TranslationPipeline | null = null;\n private loadPromise: Promise<TranslationPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n }\n\n private async loadPipeline(): Promise<TranslationPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n const pipe = await pipeline('translation', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n async doTranslate(options: {\n texts: string[];\n sourceLanguage?: string;\n targetLanguage?: string;\n abortSignal?: AbortSignal;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n translations: string[];\n detectedLanguage?: string;\n usage: TranslationUsage;\n }> {\n const { texts, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n const translations: string[] = [];\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n\n for (const text of texts) {\n abortSignal?.throwIfAborted();\n\n // Translation pipeline returns { translation_text: string }\n const output = await pipe(text);\n\n let translatedText: string;\n if (Array.isArray(output)) {\n translatedText = (output[0] as { translation_text: string }).translation_text;\n } else {\n translatedText = (output as { translation_text: string }).translation_text;\n }\n\n translations.push(translatedText);\n totalInputTokens += text.split(/\\s+/).length;\n totalOutputTokens += translatedText.split(/\\s+/).length;\n }\n\n return {\n translations,\n usage: {\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n durationMs: Date.now() - startTime,\n },\n };\n }\n}\n\n/**\n * Create a translation model using Transformers.js\n */\nexport function createTranslationModel(\n modelId: string,\n settings?: ModelSettings\n): TransformersTranslationModel {\n return new TransformersTranslationModel(modelId, settings);\n}\n\n","/**\n * Transformers Summarization Model Implementation\n *\n * Implements SummarizationModel interface using Transformers.js (BART, T5, etc.)\n *\n * @packageDocumentation\n */\n\nimport type {\n SummarizationModel,\n SummarizationUsage,\n} from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype SummarizationPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'summarization'>>\n>;\n\n/**\n * Summarization model implementation using Transformers.js\n */\nexport class TransformersSummarizationModel implements SummarizationModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n\n private pipeline: SummarizationPipeline | null = null;\n private loadPromise: Promise<SummarizationPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n }\n\n private async loadPipeline(): Promise<SummarizationPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n const pipe = await pipeline('summarization', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n async doSummarize(options: {\n texts: string[];\n maxLength?: number;\n minLength?: number;\n mode?: 'extractive' | 'abstractive';\n abortSignal?: AbortSignal;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n summaries: string[];\n usage: SummarizationUsage;\n }> {\n const { texts, maxLength, minLength, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n const pipelineOptions: Record<string, unknown> = {};\n if (maxLength !== undefined) {\n pipelineOptions.max_length = maxLength;\n }\n if (minLength !== undefined) {\n pipelineOptions.min_length = minLength;\n }\n\n const summaries: string[] = [];\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n\n for (const text of texts) {\n abortSignal?.throwIfAborted();\n\n // Summarization pipeline returns { summary_text: string }\n const output = await pipe(text, pipelineOptions as unknown as Parameters<typeof pipe>[1]);\n\n let summaryText: string;\n if (Array.isArray(output)) {\n summaryText = (output[0] as { summary_text: string }).summary_text;\n } else {\n summaryText = (output as { summary_text: string }).summary_text;\n }\n\n summaries.push(summaryText);\n totalInputTokens += text.split(/\\s+/).length;\n totalOutputTokens += summaryText.split(/\\s+/).length;\n }\n\n return {\n summaries,\n usage: {\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n durationMs: Date.now() - startTime,\n },\n };\n }\n}\n\n/**\n * Create a summarization model using Transformers.js\n */\nexport function createSummarizationModel(\n modelId: string,\n settings?: ModelSettings\n): TransformersSummarizationModel {\n return new TransformersSummarizationModel(modelId, settings);\n}\n\n","/**\n * Transformers Fill-Mask Model Implementation\n *\n * Implements FillMaskModel interface using Transformers.js (BERT, RoBERTa, etc.)\n *\n * @packageDocumentation\n */\n\nimport type {\n FillMaskModel,\n FillMaskUsage,\n FillMaskPrediction,\n} from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype FillMaskPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'fill-mask'>>\n>;\n\n/**\n * Fill-mask model implementation using Transformers.js\n */\nexport class TransformersFillMaskModel implements FillMaskModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n readonly maskToken: string = '[MASK]';\n\n private pipeline: FillMaskPipeline | null = null;\n private loadPromise: Promise<FillMaskPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n maskToken?: string;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n if (settings.maskToken) {\n (this as { maskToken: string }).maskToken = settings.maskToken;\n }\n }\n\n private async loadPipeline(): Promise<FillMaskPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n const pipe = await pipeline('fill-mask', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n async doFillMask(options: {\n texts: string[];\n topK?: number;\n abortSignal?: AbortSignal;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n results: FillMaskPrediction[][];\n usage: FillMaskUsage;\n }> {\n const { texts, topK = 5, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n const allResults: FillMaskPrediction[][] = [];\n let totalInputTokens = 0;\n\n for (const text of texts) {\n abortSignal?.throwIfAborted();\n\n // Fill-mask pipeline returns array of { token_str, score, ... }\n const output = await pipe(text, { top_k: topK });\n\n const results = (Array.isArray(output) ? output : [output]) as Array<Record<string, unknown>>;\n\n const predictions: FillMaskPrediction[] = results.map((pred) => ({\n token: String(pred.token_str ?? ''),\n score: Number(pred.score ?? 0),\n sequence: String(pred.sequence ?? ''),\n }));\n\n allResults.push(predictions);\n totalInputTokens += text.split(/\\s+/).length;\n }\n\n return {\n results: allResults,\n usage: {\n inputTokens: totalInputTokens,\n durationMs: Date.now() - startTime,\n },\n };\n }\n}\n\n/**\n * Create a fill-mask model using Transformers.js\n */\nexport function createFillMaskModel(\n modelId: string,\n settings?: ModelSettings\n): TransformersFillMaskModel {\n return new TransformersFillMaskModel(modelId, settings);\n}\n\n","/**\n * Transformers Question Answering Model Implementation\n *\n * Implements QuestionAnsweringModel interface using Transformers.js (DistilBERT, RoBERTa, etc.)\n *\n * @packageDocumentation\n */\n\nimport type {\n QuestionAnsweringModel,\n QuestionAnsweringUsage,\n ExtractedAnswer,\n} from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype QAPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'question-answering'>>\n>;\n\n/**\n * Question answering model implementation using Transformers.js\n */\nexport class TransformersQuestionAnsweringModel implements QuestionAnsweringModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n\n private pipeline: QAPipeline | null = null;\n private loadPromise: Promise<QAPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n }\n\n private async loadPipeline(): Promise<QAPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n const pipe = await pipeline('question-answering', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n async doAnswer(options: {\n questions: Array<{ question: string; context: string }>;\n topK?: number;\n abortSignal?: AbortSignal;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n results: ExtractedAnswer[][];\n usage: QuestionAnsweringUsage;\n }> {\n const { questions, topK = 1, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n const allResults: ExtractedAnswer[][] = [];\n let totalInputTokens = 0;\n\n for (const { question, context } of questions) {\n abortSignal?.throwIfAborted();\n\n // Question-answering pipeline returns { answer, score, start, end }\n const output = await pipe(question, context, { top_k: topK });\n\n const results = (Array.isArray(output) ? output : [output]) as Array<Record<string, unknown>>;\n\n const answers: ExtractedAnswer[] = results.map((result) => ({\n answer: String(result.answer ?? ''),\n score: Number(result.score ?? 0),\n start: Number(result.start ?? 0),\n end: Number(result.end ?? 0),\n }));\n\n allResults.push(answers);\n totalInputTokens += question.split(/\\s+/).length + context.split(/\\s+/).length;\n }\n\n return {\n results: allResults,\n usage: {\n inputTokens: totalInputTokens,\n durationMs: Date.now() - startTime,\n },\n };\n }\n}\n\n/**\n * Create a question answering model using Transformers.js\n */\nexport function createQuestionAnsweringModel(\n modelId: string,\n settings?: ModelSettings\n): TransformersQuestionAnsweringModel {\n return new TransformersQuestionAnsweringModel(modelId, settings);\n}\n\n","/**\n * Transformers OCR Model Implementation\n *\n * Implements OCRModel interface using Transformers.js (TrOCR)\n *\n * @packageDocumentation\n */\n\nimport type {\n OCRModel,\n OCRUsage,\n TextRegion,\n ImageInput,\n} from '@localmode/core';\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype ImageToTextPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'image-to-text'>>\n>;\n\n/**\n * OCR model implementation using Transformers.js (TrOCR)\n *\n * Note: TrOCR models are specialized for OCR tasks and provide better\n * accuracy than generic image-to-text models for text extraction.\n */\nexport class TransformersOCRModel implements OCRModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n\n private pipeline: ImageToTextPipeline | null = null;\n private loadPromise: Promise<ImageToTextPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n }\n\n private async loadPipeline(): Promise<ImageToTextPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n // TrOCR uses image-to-text pipeline\n const pipe = await pipeline('image-to-text', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n private prepareImage(image: ImageInput): string | Blob | ImageData {\n if (typeof image === 'string') {\n return image;\n }\n if (image instanceof Blob) {\n return image;\n }\n if (image instanceof ImageData) {\n return image;\n }\n if (image instanceof ArrayBuffer) {\n return new Blob([image], { type: 'image/png' });\n }\n return image as string;\n }\n\n async doOCR(options: {\n images: ImageInput[];\n languages?: string[];\n detectRegions?: boolean;\n abortSignal?: AbortSignal;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n texts: string[];\n regions?: TextRegion[][];\n usage: OCRUsage;\n }> {\n const { images, detectRegions, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n const texts: string[] = [];\n const regions: TextRegion[][] = [];\n\n for (const image of images) {\n abortSignal?.throwIfAborted();\n\n const preparedImage = this.prepareImage(image);\n\n // Image-to-text pipeline returns [{ generated_text: string }]\n const output = await pipe(preparedImage as unknown as string);\n\n const results = Array.isArray(output) ? output : [output];\n const extractedText = results\n .map((r: { generated_text?: string }) => r.generated_text ?? '')\n .join(' ')\n .trim();\n\n texts.push(extractedText);\n\n if (detectRegions) {\n // TrOCR doesn't provide bounding boxes, so we create a single region\n regions.push([\n {\n text: extractedText,\n bbox: { x: 0, y: 0, width: 0, height: 0 }, // No bbox from TrOCR\n confidence: 0.95, // High confidence assumed\n },\n ]);\n }\n }\n\n return {\n texts,\n regions: detectRegions ? regions : undefined,\n usage: {\n durationMs: Date.now() - startTime,\n },\n };\n }\n}\n\n/**\n * Create an OCR model using Transformers.js (TrOCR)\n */\nexport function createOCRModel(\n modelId: string,\n settings?: ModelSettings\n): TransformersOCRModel {\n return new TransformersOCRModel(modelId, settings);\n}\n\n","/**\n * Transformers Document QA Model Implementation\n *\n * Implements DocumentQAModel interface using Transformers.js (Donut, LayoutLM, etc.)\n *\n * @packageDocumentation\n */\n\nimport type {\n DocumentQAModel,\n TableQAModel,\n DocumentQAUsage,\n DocInput,\n TableData,\n} from '@localmode/core';\n\n// Alias for internal use\ntype DocumentInput = DocInput;\nimport type { ModelSettings, TransformersDevice, ModelLoadProgress } from '../types.js';\n\n// Dynamic import types\ntype DocumentQAPipeline = Awaited<\n ReturnType<typeof import('@huggingface/transformers').pipeline<'document-question-answering'>>\n>;\n\n/**\n * Document QA model implementation using Transformers.js\n *\n * Implements both DocumentQAModel and TableQAModel interfaces.\n */\nexport class TransformersDocumentQAModel implements DocumentQAModel, TableQAModel {\n readonly modelId: string;\n readonly provider = 'transformers';\n\n private pipeline: DocumentQAPipeline | null = null;\n private loadPromise: Promise<DocumentQAPipeline> | null = null;\n\n constructor(\n private baseModelId: string,\n private settings: {\n device?: TransformersDevice;\n quantized?: boolean;\n onProgress?: (progress: ModelLoadProgress) => void;\n } = {}\n ) {\n this.modelId = `transformers:${baseModelId}`;\n }\n\n private async loadPipeline(): Promise<DocumentQAPipeline> {\n if (this.pipeline) {\n return this.pipeline;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = (async () => {\n const { pipeline } = await import('@huggingface/transformers');\n\n const pipe = await pipeline('document-question-answering', this.baseModelId, {\n device: this.settings.device ?? 'auto',\n dtype: this.settings.quantized !== false ? 'q8' : 'fp32',\n progress_callback: this.settings.onProgress,\n });\n\n this.pipeline = pipe;\n return pipe;\n })();\n\n return this.loadPromise;\n }\n\n private async prepareDocument(document: DocumentInput): Promise<string | Blob> {\n if (typeof document === 'string') {\n // If it's a URL or path, return as-is\n return document;\n }\n if (document instanceof Blob) {\n return document;\n }\n if (document instanceof ArrayBuffer) {\n return new Blob([document], { type: 'application/pdf' });\n }\n // For ImageData or other types, return as unknown and let the pipeline handle it\n return document as unknown as string;\n }\n\n async doAskDocument(options: {\n document: DocumentInput;\n questions: string[];\n abortSignal?: AbortSignal;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n answers: Array<{ answer: string; score: number }>;\n usage: DocumentQAUsage;\n }> {\n const { document, questions, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n const pipe = await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n const preparedDoc = await this.prepareDocument(document);\n\n const answers: Array<{ answer: string; score: number }> = [];\n\n for (const question of questions) {\n abortSignal?.throwIfAborted();\n\n // Document-question-answering pipeline returns { answer, score, ... }\n const output = await pipe(preparedDoc as unknown as string, question);\n\n const result = Array.isArray(output) ? output[0] : output;\n\n const answer = {\n answer: String((result as Record<string, unknown>).answer ?? ''),\n score: Number((result as Record<string, unknown>).score ?? 0),\n };\n\n answers.push(answer);\n }\n\n return {\n answers,\n usage: {\n durationMs: Date.now() - startTime,\n },\n };\n }\n\n async doAskTable(options: {\n table: TableData;\n questions: string[];\n abortSignal?: AbortSignal;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n answers: Array<{ answer: string; cells?: string[]; aggregator?: string; score: number }>;\n usage: DocumentQAUsage;\n }> {\n const { table, questions, abortSignal } = options;\n const startTime = Date.now();\n\n abortSignal?.throwIfAborted();\n\n // For table QA, we use the question-answering approach with table context\n // Transformers.js doesn't have a dedicated table-qa pipeline,\n // so we convert the table to text and use it as context\n\n // Convert table to text representation (currently unused, for future implementation)\n // const _tableContext = [table.headers.join(' | '), ...table.rows.map((row) => row.join(' | '))].join('\\n');\n void table; // Acknowledge table parameter is received for future use\n\n // Use standard QA pipeline with table as context\n await this.loadPipeline();\n\n abortSignal?.throwIfAborted();\n\n // For table QA, we need to find a way to process it\n // This is a simplified implementation - real table QA would use TAPAS\n const answers: Array<{ answer: string; cells?: string[]; aggregator?: string; score: number }> = questions.map(() => ({\n answer: 'Table QA requires TAPAS model. Please use a dedicated table QA model.',\n score: 0.5,\n }));\n\n return {\n answers,\n usage: {\n durationMs: Date.now() - startTime,\n },\n };\n }\n}\n\n/**\n * Create a document QA model using Transformers.js\n */\nexport function createDocumentQAModel(\n modelId: string,\n settings?: ModelSettings\n): TransformersDocumentQAModel {\n return new TransformersDocumentQAModel(modelId, settings);\n}\n\n","/**\n * Transformers Provider\n *\n * Factory for creating Transformers.js model instances.\n *\n * @packageDocumentation\n */\n\nimport type { TransformersProvider, TransformersProviderSettings, ModelSettings } from './types.js';\nimport {\n // P0/P1 implementations\n createEmbeddingModel,\n createClassificationModel,\n createZeroShotModel,\n createNERModel,\n createRerankerModel,\n createSpeechToTextModel,\n createImageClassificationModel,\n createZeroShotImageModel,\n createCaptionModel,\n // P2 implementations\n createSegmentationModel,\n createObjectDetectionModel,\n createImageFeatureModel,\n createImageToImageModel,\n createTextToSpeechModel,\n createTranslationModel,\n createSummarizationModel,\n createFillMaskModel,\n createQuestionAnsweringModel,\n createOCRModel,\n createDocumentQAModel,\n} from './implementations/index.js';\n\n/**\n * Create a Transformers.js provider with custom settings.\n *\n * @param settings - Provider-level settings that apply to all models\n * @returns A TransformersProvider instance\n *\n * @example Basic usage\n * ```ts\n * import { createTransformers } from '@localmode/transformers';\n *\n * const myTransformers = createTransformers({\n * device: 'webgpu',\n * onProgress: (p) => console.log(`Loading: ${p.progress}%`),\n * });\n *\n * const embedder = myTransformers.embedding('Xenova/all-MiniLM-L6-v2');\n * ```\n *\n * @example With worker\n * ```ts\n * const workerTransformers = createTransformers({\n * useWorker: true,\n * });\n * ```\n */\nexport function createTransformers(settings?: TransformersProviderSettings): TransformersProvider {\n const defaultSettings = {\n device: settings?.device,\n quantized: settings?.quantized ?? true,\n onProgress: settings?.onProgress,\n };\n\n return {\n embedding(modelId: string, modelSettings?: ModelSettings) {\n return createEmbeddingModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n classifier(modelId: string, modelSettings?: ModelSettings) {\n return createClassificationModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n zeroShot(modelId: string, modelSettings?: ModelSettings) {\n return createZeroShotModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n ner(modelId: string, modelSettings?: ModelSettings) {\n return createNERModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n reranker(modelId: string, modelSettings?: ModelSettings) {\n return createRerankerModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n speechToText(modelId: string, modelSettings?: ModelSettings) {\n return createSpeechToTextModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n imageClassifier(modelId: string, modelSettings?: ModelSettings) {\n return createImageClassificationModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n zeroShotImageClassifier(modelId: string, modelSettings?: ModelSettings) {\n return createZeroShotImageModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n captioner(modelId: string, modelSettings?: ModelSettings) {\n return createCaptionModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n // ═══════════════════════════════════════════════════════════════\n // P2 MODEL FACTORIES\n // ═══════════════════════════════════════════════════════════════\n\n segmenter(modelId: string, modelSettings?: ModelSettings) {\n return createSegmentationModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n objectDetector(modelId: string, modelSettings?: ModelSettings) {\n return createObjectDetectionModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n imageFeatures(modelId: string, modelSettings?: ModelSettings) {\n return createImageFeatureModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n imageToImage(modelId: string, modelSettings?: ModelSettings) {\n return createImageToImageModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n textToSpeech(modelId: string, modelSettings?: ModelSettings) {\n return createTextToSpeechModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n translator(modelId: string, modelSettings?: ModelSettings) {\n return createTranslationModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n summarizer(modelId: string, modelSettings?: ModelSettings) {\n return createSummarizationModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n fillMask(modelId: string, modelSettings?: ModelSettings) {\n return createFillMaskModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n questionAnswering(modelId: string, modelSettings?: ModelSettings) {\n return createQuestionAnsweringModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n ocr(modelId: string, modelSettings?: ModelSettings) {\n return createOCRModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n\n documentQA(modelId: string, modelSettings?: ModelSettings) {\n return createDocumentQAModel(modelId, {\n ...defaultSettings,\n ...modelSettings,\n });\n },\n };\n}\n\n/**\n * Default Transformers.js provider instance.\n *\n * Use this for quick access without custom configuration.\n *\n * @example\n * ```ts\n * import { transformers } from '@localmode/transformers';\n * import { embed } from '@localmode/core';\n *\n * const { embedding } = await embed({\n * model: transformers.embedding('Xenova/all-MiniLM-L6-v2'),\n * value: 'Hello world',\n * });\n * ```\n */\nexport const transformers: TransformersProvider = createTransformers();\n\n","/**\n * Transformers Utilities\n *\n * Utility functions for the Transformers.js provider.\n *\n * @packageDocumentation\n */\n\nimport type { ModelLoadProgress } from './types.js';\n\n/**\n * Check if WebGPU is available in the current environment.\n *\n * @returns Promise<boolean> True if WebGPU is available\n *\n * @example\n * ```ts\n * if (await isWebGPUAvailable()) {\n * console.log('Using WebGPU for acceleration');\n * } else {\n * console.log('Falling back to WASM');\n * }\n * ```\n */\nexport async function isWebGPUAvailable(): Promise<boolean> {\n if (typeof navigator === 'undefined' || !('gpu' in navigator)) {\n return false;\n }\n\n try {\n // Type assertion needed as GPU types may not be available in all TypeScript configs\n const gpu = (navigator as Navigator & { gpu?: { requestAdapter(): Promise<unknown> } }).gpu;\n if (!gpu) return false;\n const adapter = await gpu.requestAdapter();\n return adapter !== null;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the optimal device based on environment capabilities.\n *\n * @returns Promise with the recommended device type\n */\nexport async function getOptimalDevice(): Promise<'webgpu' | 'wasm'> {\n if (await isWebGPUAvailable()) {\n return 'webgpu';\n }\n return 'wasm';\n}\n\n/**\n * Check if a model is already cached locally.\n *\n * @param modelId - The model ID to check\n * @returns Promise<boolean> True if the model is cached\n *\n * @example\n * ```ts\n * if (await isModelCached('Xenova/all-MiniLM-L6-v2')) {\n * console.log('Model is ready');\n * } else {\n * console.log('Model will be downloaded on first use');\n * }\n * ```\n */\nexport async function isModelCached(modelId: string): Promise<boolean> {\n // Check if we're in a browser environment with Cache API\n if (typeof caches === 'undefined') {\n return false;\n }\n\n try {\n // Transformers.js uses a specific cache name\n const cache = await caches.open('transformers-cache');\n const keys = await cache.keys();\n\n // Check if any cached resources match this model\n return keys.some((request) => request.url.includes(modelId.replace('/', '%2F')));\n } catch {\n return false;\n }\n}\n\n/**\n * Preload a model to cache it for offline use.\n *\n * This downloads and caches the model without actually using it,\n * allowing for faster subsequent loads.\n *\n * @param modelId - The model ID to preload\n * @param options - Preload options\n *\n * @example\n * ```ts\n * // Preload during app initialization\n * await preloadModel('Xenova/all-MiniLM-L6-v2', {\n * onProgress: (p) => console.log(`${p.progress}%`),\n * });\n * ```\n */\nexport async function preloadModel(\n modelId: string,\n options?: {\n onProgress?: (progress: ModelLoadProgress) => void;\n quantized?: boolean;\n }\n): Promise<void> {\n const { pipeline } = await import('@huggingface/transformers');\n\n // Determine the task type from the model ID\n // This is a heuristic - in practice, users should know which task they need\n let task: string = 'feature-extraction';\n\n if (modelId.toLowerCase().includes('whisper')) {\n task = 'automatic-speech-recognition';\n } else if (modelId.toLowerCase().includes('blip') || modelId.toLowerCase().includes('caption')) {\n task = 'image-to-text';\n } else if (modelId.toLowerCase().includes('clip')) {\n task = 'zero-shot-image-classification';\n } else if (modelId.toLowerCase().includes('vit') || modelId.toLowerCase().includes('resnet')) {\n task = 'image-classification';\n } else if (modelId.toLowerCase().includes('ner') || modelId.toLowerCase().includes('token')) {\n task = 'token-classification';\n } else if (\n modelId.toLowerCase().includes('mnli') ||\n modelId.toLowerCase().includes('nli') ||\n modelId.toLowerCase().includes('bart')\n ) {\n task = 'zero-shot-classification';\n } else if (\n modelId.toLowerCase().includes('sst') ||\n modelId.toLowerCase().includes('sentiment') ||\n modelId.toLowerCase().includes('distilbert')\n ) {\n task = 'text-classification';\n } else if (modelId.toLowerCase().includes('rerank') || modelId.toLowerCase().includes('marco')) {\n task = 'text-classification'; // Rerankers often use text-classification pipeline\n }\n\n // Create pipeline to trigger download\n const progressCallback = options?.onProgress\n ? (progressInfo: {\n status: string;\n name?: string;\n file?: string;\n progress?: number;\n loaded?: number;\n total?: number;\n }) => {\n // Forward all progress events\n options.onProgress?.({\n status: progressInfo.status as ModelLoadProgress['status'],\n name: progressInfo.name,\n file: progressInfo.file,\n progress: progressInfo.progress,\n loaded: progressInfo.loaded,\n total: progressInfo.total,\n });\n }\n : undefined;\n\n // Create pipeline options - use type assertion as API may vary between versions\n const pipelineOptions: Record<string, unknown> = {\n progress_callback: progressCallback,\n };\n\n // Add quantized option if specified\n if (options?.quantized !== undefined) {\n pipelineOptions.dtype = options.quantized ? 'q8' : 'fp32';\n }\n\n await pipeline(task as Parameters<typeof pipeline>[0], modelId, pipelineOptions);\n}\n\n/**\n * Clear all cached models from the browser.\n *\n * @returns Promise<boolean> True if cache was cleared successfully\n */\nexport async function clearModelCache(): Promise<boolean> {\n if (typeof caches === 'undefined') {\n return false;\n }\n\n try {\n return await caches.delete('transformers-cache');\n } catch {\n return false;\n }\n}\n\n/**\n * Get an estimate of cached model storage usage.\n *\n * @returns Promise with storage estimate in bytes\n */\nexport async function getModelStorageUsage(): Promise<number> {\n if (typeof navigator === 'undefined' || !('storage' in navigator)) {\n return 0;\n }\n\n try {\n const estimate = await navigator.storage.estimate();\n return estimate.usage ?? 0;\n } catch {\n return 0;\n }\n}\n","/**\n * Popular Model Constants\n *\n * Pre-defined model IDs for commonly used models.\n *\n * @packageDocumentation\n */\n\n/**\n * Popular embedding models.\n */\nexport const EMBEDDING_MODELS = {\n /** Small, fast, general-purpose embeddings (384 dimensions, ~22MB) */\n ALL_MINILM_L6_V2: 'Xenova/all-MiniLM-L6-v2',\n\n /** Multilingual embeddings for 50+ languages (384 dimensions, ~120MB) */\n PARAPHRASE_MULTILINGUAL_MINILM: 'Xenova/paraphrase-multilingual-MiniLM-L12-v2',\n\n /** Higher quality but larger (768 dimensions, ~420MB) */\n ALL_MPNET_BASE_V2: 'Xenova/all-mpnet-base-v2',\n\n /** BGE embeddings - excellent for RAG (384 dimensions, ~33MB) */\n BGE_SMALL_EN: 'Xenova/bge-small-en-v1.5',\n\n /** BGE base model - better quality (768 dimensions, ~110MB) */\n BGE_BASE_EN: 'Xenova/bge-base-en-v1.5',\n} as const;\n\n/**\n * Popular text classification models.\n */\nexport const CLASSIFICATION_MODELS = {\n /** Fast sentiment analysis (POSITIVE/NEGATIVE) */\n DISTILBERT_SST2: 'Xenova/distilbert-base-uncased-finetuned-sst-2-english',\n\n /** Twitter sentiment (positive/neutral/negative) */\n TWITTER_ROBERTA_SENTIMENT: 'Xenova/twitter-roberta-base-sentiment-latest',\n\n /** Emotion detection */\n DISTILROBERTA_EMOTION: 'Xenova/distilroberta-base-emotion',\n} as const;\n\n/**\n * Popular zero-shot classification models.\n */\nexport const ZERO_SHOT_MODELS = {\n /** BART-based zero-shot classification */\n BART_LARGE_MNLI: 'Xenova/bart-large-mnli',\n\n /** Smaller, faster zero-shot model */\n DISTILBART_MNLI: 'Xenova/distilbart-mnli-12-3',\n} as const;\n\n/**\n * Popular NER (Named Entity Recognition) models.\n */\nexport const NER_MODELS = {\n /** Standard NER: PERSON, ORG, LOC, MISC */\n BERT_BASE_NER: 'Xenova/bert-base-NER',\n\n /** Multilingual NER */\n XLM_ROBERTA_NER: 'Xenova/xlm-roberta-large-finetuned-conll03-english',\n} as const;\n\n/**\n * Popular reranking models.\n */\nexport const RERANKER_MODELS = {\n /** Fast, small reranker (~22MB) */\n MS_MARCO_MINILM_L6: 'Xenova/ms-marco-MiniLM-L-6-v2',\n\n /** Higher quality reranker */\n BGE_RERANKER_BASE: 'Xenova/bge-reranker-base',\n} as const;\n\n/**\n * Popular speech-to-text models.\n */\nexport const SPEECH_TO_TEXT_MODELS = {\n /** Smallest Whisper - fastest, good for short audio (~70MB) */\n WHISPER_TINY: 'Xenova/whisper-tiny',\n\n /** Small Whisper - better accuracy (~240MB) */\n WHISPER_SMALL: 'Xenova/whisper-small',\n\n /** Base Whisper - balanced (~140MB) */\n WHISPER_BASE: 'Xenova/whisper-base',\n\n /** Distilled Whisper - fast and accurate */\n DISTIL_WHISPER_SMALL: 'Xenova/distil-whisper-small.en',\n} as const;\n\n/**\n * Popular image classification models.\n */\nexport const IMAGE_CLASSIFICATION_MODELS = {\n /** ViT base model - ImageNet classes */\n VIT_BASE_PATCH16: 'Xenova/vit-base-patch16-224',\n\n /** Smaller ViT model */\n VIT_SMALL_PATCH16: 'Xenova/vit-small-patch16-224',\n\n /** ResNet alternative */\n RESNET_50: 'Xenova/resnet-50',\n} as const;\n\n/**\n * Popular zero-shot image classification models.\n */\nexport const ZERO_SHOT_IMAGE_MODELS = {\n /** CLIP ViT-Base - versatile zero-shot image classification */\n CLIP_VIT_BASE_PATCH32: 'Xenova/clip-vit-base-patch32',\n\n /** Larger CLIP model with better accuracy */\n CLIP_VIT_LARGE_PATCH14: 'Xenova/clip-vit-large-patch14',\n\n /** SigLIP - improved CLIP variant */\n SIGLIP_BASE_PATCH16: 'Xenova/siglip-base-patch16-224',\n} as const;\n\n/**\n * Popular image captioning models.\n */\nexport const IMAGE_CAPTION_MODELS = {\n /** BLIP base - fast, good quality captions */\n BLIP_BASE: 'Xenova/blip-image-captioning-base',\n\n /** BLIP large - better quality, slower */\n BLIP_LARGE: 'Xenova/blip-image-captioning-large',\n\n /** GIT base - alternative captioning model */\n GIT_BASE: 'Xenova/git-base-coco',\n} as const;\n\n/**\n * All popular models organized by task.\n */\nexport const MODELS = {\n embedding: EMBEDDING_MODELS,\n classification: CLASSIFICATION_MODELS,\n zeroShot: ZERO_SHOT_MODELS,\n ner: NER_MODELS,\n reranker: RERANKER_MODELS,\n speechToText: SPEECH_TO_TEXT_MODELS,\n imageClassification: IMAGE_CLASSIFICATION_MODELS,\n zeroShotImage: ZERO_SHOT_IMAGE_MODELS,\n imageCaption: IMAGE_CAPTION_MODELS,\n} as const;\n\n"]}