@elizaos/plugin-local-ai 2.0.0-alpha.7 → 2.0.0-beta.1

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.
@@ -1,18 +1,19 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../index.ts", "../../environment.ts", "../../types.ts", "../../utils/downloadManager.ts", "../../utils/platform.ts", "../../utils/tokenizerManager.ts", "../../utils/transcribeManager.ts", "../../utils/ttsManager.ts", "../../utils/visionManager.ts"],
3
+ "sources": ["../../index.ts", "../../environment.ts", "../../structured-output.ts", "../../types.ts", "../../utils/downloadManager.ts", "../../utils/platform.ts", "../../utils/tokenizerManager.ts", "../../utils/transcribeManager.ts", "../../utils/ttsManager.ts", "../../utils/visionManager.ts"],
4
4
  "sourcesContent": [
5
- "import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path, { basename } from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport type {\n GenerateTextParams,\n ModelTypeName,\n ObjectGenerationParams,\n TextEmbeddingParams,\n} from \"@elizaos/core\";\nimport {\n type IAgentRuntime,\n logger,\n ModelType,\n type Plugin,\n parseKeyValueXml,\n} from \"@elizaos/core\";\nimport {\n getLlama,\n type Llama,\n LlamaChatSession,\n type LlamaContext,\n type LlamaContextSequence,\n type LlamaEmbeddingContext,\n type LlamaModel,\n} from \"node-llama-cpp\";\nimport { type Config, validateConfig } from \"./environment\";\nimport { type EmbeddingModelSpec, MODEL_SPECS, type ModelSpec } from \"./types\";\nimport { DownloadManager } from \"./utils/downloadManager\";\nimport { getPlatformManager } from \"./utils/platform\";\nimport { TokenizerManager } from \"./utils/tokenizerManager\";\nimport { TranscribeManager } from \"./utils/transcribeManager\";\nimport { TTSManager } from \"./utils/ttsManager\";\nimport { VisionManager } from \"./utils/visionManager\";\n\nconst wordsToPunish = [\n \" please\",\n \" feel\",\n \" free\",\n \"!\",\n \"–\",\n \"—\",\n \"?\",\n \".\",\n \",\",\n \"; \",\n \" cosmos\",\n \" tapestry\",\n \" tapestries\",\n \" glitch\",\n \" matrix\",\n \" cyberspace\",\n \" troll\",\n \" questions\",\n \" topics\",\n \" discuss\",\n \" basically\",\n \" simulation\",\n \" simulate\",\n \" universe\",\n \" like\",\n \" debug\",\n \" debugging\",\n \" wild\",\n \" existential\",\n \" juicy\",\n \" circuits\",\n \" help\",\n \" ask\",\n \" happy\",\n \" just\",\n \" cosmic\",\n \" cool\",\n \" joke\",\n \" punchline\",\n \" fancy\",\n \" glad\",\n \" assist\",\n \" algorithm\",\n \" Indeed\",\n \" Furthermore\",\n \" However\",\n \" Notably\",\n \" Therefore\",\n];\n\nclass LocalAIManager {\n private static instance: LocalAIManager | null = null;\n private llama: Llama | undefined;\n private smallModel: LlamaModel | undefined;\n private mediumModel: LlamaModel | undefined;\n private embeddingModel: LlamaModel | undefined;\n private embeddingContext: LlamaEmbeddingContext | undefined;\n private ctx: LlamaContext | undefined;\n private sequence: LlamaContextSequence | undefined;\n private chatSession: LlamaChatSession | undefined;\n private modelPath!: string;\n private mediumModelPath!: string;\n private embeddingModelPath!: string;\n private cacheDir!: string;\n private tokenizerManager!: TokenizerManager;\n private downloadManager!: DownloadManager;\n private visionManager!: VisionManager;\n private activeModelConfig: ModelSpec;\n private embeddingModelConfig: EmbeddingModelSpec;\n private transcribeManager!: TranscribeManager;\n private ttsManager!: TTSManager;\n private config: Config | null = null;\n\n private smallModelInitialized = false;\n private mediumModelInitialized = false;\n private embeddingInitialized = false;\n private visionInitialized = false;\n private transcriptionInitialized = false;\n private ttsInitialized = false;\n private environmentInitialized = false;\n\n private smallModelInitializingPromise: Promise<void> | null = null;\n private mediumModelInitializingPromise: Promise<void> | null = null;\n private embeddingInitializingPromise: Promise<void> | null = null;\n private visionInitializingPromise: Promise<void> | null = null;\n private transcriptionInitializingPromise: Promise<void> | null = null;\n private ttsInitializingPromise: Promise<void> | null = null;\n private environmentInitializingPromise: Promise<void> | null = null;\n\n private modelsDir!: string;\n\n private constructor() {\n this.config = validateConfig();\n\n this._setupCacheDir();\n\n this.activeModelConfig = MODEL_SPECS.small;\n this.embeddingModelConfig = MODEL_SPECS.embedding;\n }\n\n private _postValidateInit(): void {\n this._setupModelsDir();\n\n this.downloadManager = DownloadManager.getInstance(this.cacheDir, this.modelsDir);\n this.tokenizerManager = TokenizerManager.getInstance(this.cacheDir, this.modelsDir);\n this.visionManager = VisionManager.getInstance(this.cacheDir);\n this.transcribeManager = TranscribeManager.getInstance(this.cacheDir);\n this.ttsManager = TTSManager.getInstance(this.cacheDir);\n }\n\n private _setupModelsDir(): void {\n const modelsDirEnv = this.config?.MODELS_DIR?.trim() || process.env.MODELS_DIR?.trim();\n if (modelsDirEnv) {\n this.modelsDir = path.resolve(modelsDirEnv);\n logger.info(\"Using models directory from MODELS_DIR environment variable:\", this.modelsDir);\n } else {\n this.modelsDir = path.join(os.homedir(), \".eliza\", \"models\");\n logger.info(\n \"MODELS_DIR environment variable not set, using default models directory:\",\n this.modelsDir\n );\n }\n\n if (!fs.existsSync(this.modelsDir)) {\n fs.mkdirSync(this.modelsDir, { recursive: true });\n logger.debug(\"Ensured models directory exists (created):\", this.modelsDir);\n } else {\n logger.debug(\"Models directory already exists:\", this.modelsDir);\n }\n }\n\n private _setupCacheDir(): void {\n const cacheDirEnv = this.config?.CACHE_DIR?.trim() || process.env.CACHE_DIR?.trim();\n if (cacheDirEnv) {\n this.cacheDir = path.resolve(cacheDirEnv);\n logger.info(\"Using cache directory from CACHE_DIR environment variable:\", this.cacheDir);\n } else {\n const cacheDir = path.join(os.homedir(), \".eliza\", \"cache\");\n if (!fs.existsSync(cacheDir)) {\n fs.mkdirSync(cacheDir, { recursive: true });\n logger.debug(\"Ensuring cache directory exists (created):\", cacheDir);\n }\n this.cacheDir = cacheDir;\n logger.info(\n \"CACHE_DIR environment variable not set, using default cache directory:\",\n this.cacheDir\n );\n }\n if (!fs.existsSync(this.cacheDir)) {\n fs.mkdirSync(this.cacheDir, { recursive: true });\n logger.debug(\"Ensured cache directory exists (created):\", this.cacheDir);\n } else {\n logger.debug(\"Cache directory already exists:\", this.cacheDir);\n }\n }\n\n public static getInstance(): LocalAIManager {\n if (!LocalAIManager.instance) {\n LocalAIManager.instance = new LocalAIManager();\n }\n return LocalAIManager.instance;\n }\n\n public async initializeEnvironment(): Promise<void> {\n if (this.environmentInitialized) return;\n if (this.environmentInitializingPromise) {\n await this.environmentInitializingPromise;\n return;\n }\n\n this.environmentInitializingPromise = (async () => {\n logger.info(\"Initializing environment configuration...\");\n\n this.config = await validateConfig();\n\n this._postValidateInit();\n\n this.modelPath = path.join(this.modelsDir, this.config.LOCAL_SMALL_MODEL);\n this.mediumModelPath = path.join(this.modelsDir, this.config.LOCAL_LARGE_MODEL);\n this.embeddingModelPath = path.join(this.modelsDir, this.config.LOCAL_EMBEDDING_MODEL);\n\n logger.info(\"Using small model path:\", basename(this.modelPath));\n logger.info(\"Using medium model path:\", basename(this.mediumModelPath));\n logger.info(\"Using embedding model path:\", basename(this.embeddingModelPath));\n\n logger.info(\"Environment configuration validated and model paths set\");\n\n this.environmentInitialized = true;\n logger.success(\"Environment initialization complete\");\n })();\n\n await this.environmentInitializingPromise;\n }\n\n private async downloadModel(\n modelType: ModelTypeName,\n customModelSpec?: ModelSpec\n ): Promise<boolean> {\n let modelSpec: ModelSpec;\n let modelPathToDownload: string;\n\n await this.initializeEnvironment();\n\n if (customModelSpec) {\n modelSpec = customModelSpec;\n modelPathToDownload =\n modelType === ModelType.TEXT_EMBEDDING\n ? this.embeddingModelPath\n : modelType === ModelType.TEXT_LARGE\n ? this.mediumModelPath\n : this.modelPath;\n } else if (modelType === ModelType.TEXT_EMBEDDING) {\n modelSpec = MODEL_SPECS.embedding;\n modelPathToDownload = this.embeddingModelPath; // Use configured path\n } else {\n modelSpec = modelType === ModelType.TEXT_LARGE ? MODEL_SPECS.medium : MODEL_SPECS.small;\n modelPathToDownload =\n modelType === ModelType.TEXT_LARGE ? this.mediumModelPath : this.modelPath; // Use configured path\n }\n\n // Pass the determined path to the download manager\n return await this.downloadManager.downloadModel(modelSpec, modelPathToDownload);\n }\n\n async checkPlatformCapabilities(): Promise<void> {\n const platformManager = getPlatformManager();\n await platformManager.initialize();\n const capabilities = platformManager.getCapabilities();\n\n logger.info(\"Platform capabilities detected:\", {\n platform: capabilities.platform,\n gpu: capabilities.gpu?.type || \"none\",\n recommendedModel: capabilities.recommendedModelSize,\n supportedBackends: capabilities.supportedBackends,\n });\n }\n\n async initialize(modelType: ModelTypeName = ModelType.TEXT_SMALL): Promise<void> {\n await this.initializeEnvironment();\n if (modelType === ModelType.TEXT_LARGE) {\n await this.lazyInitMediumModel();\n } else {\n await this.lazyInitSmallModel();\n }\n }\n\n public async initializeEmbedding(): Promise<void> {\n try {\n await this.initializeEnvironment();\n logger.info(\"Initializing embedding model...\");\n logger.info(\"Models directory:\", this.modelsDir);\n\n if (!fs.existsSync(this.modelsDir)) {\n logger.warn(\"Models directory does not exist, creating it:\", this.modelsDir);\n fs.mkdirSync(this.modelsDir, { recursive: true });\n }\n\n await this.downloadModel(ModelType.TEXT_EMBEDDING);\n\n if (!this.llama) {\n this.llama = await getLlama();\n }\n\n if (!this.embeddingModel) {\n logger.info(\"Loading embedding model:\", this.embeddingModelPath);\n\n this.embeddingModel = await this.llama.loadModel({\n modelPath: this.embeddingModelPath,\n gpuLayers: 0,\n vocabOnly: false,\n });\n\n this.embeddingContext = await this.embeddingModel.createEmbeddingContext({\n contextSize: this.embeddingModelConfig.contextSize,\n batchSize: 512,\n });\n\n logger.success(\"Embedding model initialized successfully\");\n }\n } catch (error) {\n logger.error(\"Failed to initialize embedding model:\", error);\n throw error;\n }\n }\n\n async generateEmbedding(text: string): Promise<number[]> {\n await this.lazyInitEmbedding();\n\n if (!this.embeddingModel || !this.embeddingContext) {\n throw new Error(\"Failed to initialize embedding model\");\n }\n\n logger.info(\"Generating embedding for text\", { textLength: text.length });\n\n const embeddingResult = await this.embeddingContext.getEmbeddingFor(text);\n\n const mutableEmbedding = [...embeddingResult.vector];\n\n const normalizedEmbedding = this.normalizeEmbedding(mutableEmbedding);\n\n logger.info(\"Embedding generation complete\", {\n dimensions: normalizedEmbedding.length,\n });\n return normalizedEmbedding;\n }\n\n private normalizeEmbedding(embedding: number[]): number[] {\n const squareSum = embedding.reduce((sum, val) => sum + val * val, 0);\n const norm = Math.sqrt(squareSum);\n\n if (norm === 0) {\n return embedding;\n }\n\n return embedding.map((val) => val / norm);\n }\n\n private async lazyInitEmbedding(): Promise<void> {\n if (this.embeddingInitialized) return;\n\n if (!this.embeddingInitializingPromise) {\n this.embeddingInitializingPromise = (async () => {\n try {\n await this.initializeEnvironment();\n\n await this.downloadModel(ModelType.TEXT_EMBEDDING);\n\n if (!this.llama) {\n this.llama = await getLlama();\n }\n\n this.embeddingModel = await this.llama.loadModel({\n modelPath: this.embeddingModelPath,\n gpuLayers: 0,\n vocabOnly: false,\n });\n\n this.embeddingContext = await this.embeddingModel.createEmbeddingContext({\n contextSize: this.embeddingModelConfig.contextSize,\n batchSize: 512,\n });\n\n this.embeddingInitialized = true;\n logger.info(\"Embedding model initialized successfully\");\n } catch (error) {\n logger.error(\"Failed to initialize embedding model:\", error);\n this.embeddingInitializingPromise = undefined;\n throw error;\n }\n })();\n }\n\n await this.embeddingInitializingPromise;\n }\n\n async generateText(params: GenerateTextParams): Promise<string> {\n if (this.ctx) {\n this.ctx.dispose();\n this.ctx = undefined;\n }\n await this.initializeEnvironment();\n logger.info(\"Generating text with model:\", params.modelType);\n if (params.modelType === ModelType.TEXT_LARGE) {\n await this.lazyInitMediumModel();\n\n if (!this.mediumModel) {\n throw new Error(\"Medium model initialization failed\");\n }\n\n this.activeModelConfig = MODEL_SPECS.medium;\n const mediumModel = this.mediumModel;\n\n this.ctx = await mediumModel.createContext({\n contextSize: MODEL_SPECS.medium.contextSize,\n });\n } else {\n await this.lazyInitSmallModel();\n\n if (!this.smallModel) {\n throw new Error(\"Small model initialization failed\");\n }\n\n this.activeModelConfig = MODEL_SPECS.small;\n const smallModel = this.smallModel;\n\n this.ctx = await smallModel.createContext({\n contextSize: MODEL_SPECS.small.contextSize,\n });\n }\n\n if (!this.ctx) {\n throw new Error(\"Failed to create prompt\");\n }\n\n this.sequence = this.ctx.getSequence();\n\n this.chatSession = new LlamaChatSession({\n contextSequence: this.sequence,\n });\n\n if (!this.chatSession) {\n throw new Error(\"Failed to create chat session\");\n }\n logger.info(\"Created new chat session for model:\", params.modelType);\n logger.info(\"Incoming prompt structure:\", {\n contextLength: params.prompt.length,\n hasAction: params.prompt.includes(\"action\"),\n runtime: !!params.runtime,\n stopSequences: params.stopSequences,\n });\n\n const tokens = await this.tokenizerManager.encode(params.prompt, this.activeModelConfig);\n logger.info(\"Input tokens:\", { count: tokens.length });\n\n const systemMessage = \"You are a helpful AI assistant. Respond to the current request only.\";\n await this.chatSession.prompt(systemMessage, {\n maxTokens: 1,\n temperature: 0.0,\n });\n\n let response = await this.chatSession.prompt(params.prompt, {\n maxTokens: 8192,\n temperature: 0.7,\n topP: 0.9,\n repeatPenalty: {\n punishTokensFilter: () =>\n this.smallModel ? this.smallModel.tokenize(wordsToPunish.join(\" \")) : [],\n penalty: 1.2,\n frequencyPenalty: 0.7,\n presencePenalty: 0.7,\n },\n });\n\n logger.info(\"Raw response structure:\", {\n responseLength: response.length,\n hasAction: response.includes(\"action\"),\n hasThinkTag: response.includes(\"<think>\"),\n });\n\n if (response.includes(\"<think>\")) {\n logger.info(\"Cleaning think tags from response\");\n response = response.replace(/<think>[\\s\\S]*?<\\/think>\\n?/g, \"\");\n logger.info(\"Think tags removed from response\");\n }\n\n return response;\n }\n\n public async describeImage(\n imageData: Buffer,\n mimeType: string\n ): Promise<{ title: string; description: string }> {\n await this.lazyInitVision();\n\n const base64 = imageData.toString(\"base64\");\n const dataUrl = `data:${mimeType};base64,${base64}`;\n return await this.visionManager.processImage(dataUrl);\n }\n\n public async transcribeAudio(audioBuffer: Buffer): Promise<string> {\n await this.lazyInitTranscription();\n\n const result = await this.transcribeManager.transcribe(audioBuffer);\n return result.text;\n }\n\n public async generateSpeech(text: string): Promise<Readable> {\n try {\n await this.lazyInitTTS();\n\n return await this.ttsManager.generateSpeech(text);\n } catch (error) {\n logger.error(\"Speech generation failed:\", {\n error: error instanceof Error ? error.message : String(error),\n textLength: text.length,\n });\n throw error;\n }\n }\n\n public getTokenizerManager(): TokenizerManager {\n return this.tokenizerManager;\n }\n\n public getActiveModelConfig(): ModelSpec {\n return this.activeModelConfig;\n }\n\n private async lazyInitSmallModel(): Promise<void> {\n if (this.smallModelInitialized) return;\n\n if (!this.smallModelInitializingPromise) {\n this.smallModelInitializingPromise = (async () => {\n await this.initializeEnvironment();\n await this.checkPlatformCapabilities();\n\n await this.downloadModel(ModelType.TEXT_SMALL);\n\n this.llama = await getLlama();\n\n const smallModel = await this.llama.loadModel({\n gpuLayers: 43,\n modelPath: this.modelPath,\n vocabOnly: false,\n });\n\n this.smallModel = smallModel;\n\n const ctx = await smallModel.createContext({\n contextSize: MODEL_SPECS.small.contextSize,\n });\n\n this.ctx = ctx;\n this.sequence = undefined;\n this.smallModelInitialized = true;\n logger.info(\"Small model initialized successfully\");\n })();\n }\n\n await this.smallModelInitializingPromise;\n }\n\n private async lazyInitMediumModel(): Promise<void> {\n if (this.mediumModelInitialized) return;\n\n if (!this.mediumModelInitializingPromise) {\n this.mediumModelInitializingPromise = (async () => {\n await this.initializeEnvironment();\n if (!this.llama) {\n await this.lazyInitSmallModel();\n }\n\n await this.downloadModel(ModelType.TEXT_LARGE);\n\n const mediumModel = await this.llama?.loadModel({\n gpuLayers: 43,\n modelPath: this.mediumModelPath,\n vocabOnly: false,\n });\n\n this.mediumModel = mediumModel;\n this.mediumModelInitialized = true;\n logger.info(\"Medium model initialized successfully\");\n })();\n }\n\n await this.mediumModelInitializingPromise;\n }\n\n private async lazyInitVision(): Promise<void> {\n if (this.visionInitialized) return;\n\n if (!this.visionInitializingPromise) {\n this.visionInitializingPromise = (async () => {\n try {\n this.visionInitialized = true;\n logger.info(\"Vision model initialized successfully\");\n } catch (error) {\n logger.error(\"Failed to initialize vision model:\", error);\n this.visionInitializingPromise = null;\n throw error;\n }\n })();\n }\n\n await this.visionInitializingPromise;\n }\n\n private async lazyInitTranscription(): Promise<void> {\n if (this.transcriptionInitialized) return;\n\n if (!this.transcriptionInitializingPromise) {\n this.transcriptionInitializingPromise = (async () => {\n try {\n await this.initializeEnvironment();\n\n if (!this.transcribeManager) {\n this.transcribeManager = TranscribeManager.getInstance(this.cacheDir);\n }\n\n // Ensure FFmpeg is available\n const ffmpegReady = await this.transcribeManager.ensureFFmpeg();\n if (!ffmpegReady) {\n logger.error(\n \"FFmpeg is not available or not configured correctly. Cannot proceed with transcription.\"\n );\n throw new Error(\n \"FFmpeg is required for transcription but is not available. Please see server logs for installation instructions.\"\n );\n }\n\n this.transcriptionInitialized = true;\n logger.info(\"Transcription prerequisites (FFmpeg) checked and ready.\");\n logger.info(\"Transcription model initialized successfully\");\n } catch (error) {\n logger.error(\"Failed to initialize transcription model:\", error);\n this.transcriptionInitializingPromise = null;\n throw error;\n }\n })();\n }\n\n await this.transcriptionInitializingPromise;\n }\n\n private async lazyInitTTS(): Promise<void> {\n if (this.ttsInitialized) return;\n\n if (!this.ttsInitializingPromise) {\n this.ttsInitializingPromise = (async () => {\n await this.initializeEnvironment();\n this.ttsManager = TTSManager.getInstance(this.cacheDir);\n this.ttsInitialized = true;\n logger.info(\"TTS model initialized successfully\");\n })();\n }\n\n await this.ttsInitializingPromise;\n }\n}\n\nconst localAIManager = LocalAIManager.getInstance();\n\nexport const localAiPlugin: Plugin = {\n name: \"local-ai\",\n description: \"Local AI plugin using LLaMA models\",\n\n async init(_config: Record<string, unknown> | undefined, _runtime: IAgentRuntime) {\n logger.info(\"🚀 Initializing Local AI plugin...\");\n\n await localAIManager.initializeEnvironment();\n const config = validateConfig();\n\n if (!config.LOCAL_SMALL_MODEL || !config.LOCAL_LARGE_MODEL || !config.LOCAL_EMBEDDING_MODEL) {\n logger.warn(\"⚠️ Local AI plugin: Model configuration is incomplete\");\n logger.warn(\"Please ensure the following environment variables are set:\");\n logger.warn(\"- LOCAL_SMALL_MODEL: Path to small language model file\");\n logger.warn(\"- LOCAL_LARGE_MODEL: Path to large language model file\");\n logger.warn(\"- LOCAL_EMBEDDING_MODEL: Path to embedding model file\");\n logger.warn(\"Example: LOCAL_SMALL_MODEL=llama-3.2-1b-instruct-q8_0.gguf\");\n }\n\n const modelsDir = config.MODELS_DIR || path.join(os.homedir(), \".eliza\", \"models\");\n if (!fs.existsSync(modelsDir)) {\n logger.warn(`⚠️ Models directory does not exist: ${modelsDir}`);\n logger.warn(\"The directory will be created, but you need to download model files\");\n logger.warn(\"Visit https://huggingface.co/models to download compatible GGUF models\");\n }\n\n logger.info(\"🔍 Testing Local AI initialization...\");\n\n await localAIManager.checkPlatformCapabilities();\n\n const llamaInstance = await getLlama();\n if (llamaInstance) {\n logger.success(\"✅ Local AI: llama.cpp library loaded successfully\");\n } else {\n throw new Error(\"Failed to load llama.cpp library\");\n }\n\n const smallModelPath = path.join(modelsDir, config.LOCAL_SMALL_MODEL);\n const largeModelPath = path.join(modelsDir, config.LOCAL_LARGE_MODEL);\n const embeddingModelPath = path.join(modelsDir, config.LOCAL_EMBEDDING_MODEL);\n\n const modelsExist = {\n small: fs.existsSync(smallModelPath),\n large: fs.existsSync(largeModelPath),\n embedding: fs.existsSync(embeddingModelPath),\n };\n\n if (!modelsExist.small && !modelsExist.large && !modelsExist.embedding) {\n logger.warn(\"⚠️ No model files found in models directory\");\n logger.warn(\"Models will be downloaded on first use, which may take time\");\n logger.warn(\"To pre-download models, run the plugin and it will fetch them automatically\");\n } else {\n logger.info(\"📦 Found model files:\", {\n small: modelsExist.small ? \"✓\" : \"✗\",\n large: modelsExist.large ? \"✓\" : \"✗\",\n embedding: modelsExist.embedding ? \"✓\" : \"✗\",\n });\n }\n\n logger.success(\"✅ Local AI plugin initialized successfully\");\n logger.info(\"💡 Models will be loaded on-demand when first used\");\n },\n models: {\n [ModelType.TEXT_SMALL]: async (\n runtime: IAgentRuntime,\n { prompt, stopSequences = [] }: GenerateTextParams\n ) => {\n await localAIManager.initializeEnvironment();\n return await localAIManager.generateText({\n prompt,\n stopSequences,\n runtime,\n modelType: ModelType.TEXT_SMALL,\n });\n },\n\n [ModelType.TEXT_LARGE]: async (\n runtime: IAgentRuntime,\n { prompt, stopSequences = [] }: GenerateTextParams\n ) => {\n await localAIManager.initializeEnvironment();\n return await localAIManager.generateText({\n prompt,\n stopSequences,\n runtime,\n modelType: ModelType.TEXT_LARGE,\n });\n },\n\n [ModelType.TEXT_EMBEDDING]: async (_runtime: IAgentRuntime, params: TextEmbeddingParams) => {\n const text = params?.text;\n if (!text) {\n logger.debug(\"Null or empty text input for embedding, returning zero vector\");\n return new Array(384).fill(0);\n }\n\n return await localAIManager.generateEmbedding(text);\n },\n\n [ModelType.OBJECT_SMALL]: async (runtime: IAgentRuntime, params: ObjectGenerationParams) => {\n await localAIManager.initializeEnvironment();\n logger.info(\"OBJECT_SMALL handler - Processing request:\", {\n prompt: params.prompt,\n hasSchema: !!params.schema,\n temperature: params.temperature,\n });\n\n // Build XML schema hint from the provided schema\n let schemaHint = \"\";\n if (params.schema) {\n const schemaKeys = Object.keys(params.schema);\n schemaHint = schemaKeys.map((key) => `<${key}>value</${key}>`).join(\"\\n\");\n }\n\n // Enhance the prompt to request XML output\n const xmlPrompt = `${params.prompt}\n\nRespond using XML format wrapped in <response> tags. ${schemaHint ? `Include these fields:\\n${schemaHint}` : \"\"}\n\nIMPORTANT: If your response contains code, wrap code blocks in CDATA sections like this:\n<code><![CDATA[\nyour code here\n]]></code>\n\nExample response format:\n<response>\n<thought>Your reasoning here</thought>\n<text>Your response text here</text>\n</response>`;\n\n const textResponse = await localAIManager.generateText({\n prompt: xmlPrompt,\n stopSequences: params.stopSequences,\n runtime,\n modelType: ModelType.TEXT_SMALL,\n });\n\n try {\n logger.debug(\"Raw model response:\", textResponse.substring(0, 500));\n\n const parsedXml = parseKeyValueXml<Record<string, unknown>>(textResponse);\n\n if (parsedXml) {\n logger.debug(\"Parsed XML result:\", parsedXml);\n\n // Validate against schema if provided\n if (params.schema) {\n for (const key of Object.keys(params.schema)) {\n if (!(key in parsedXml)) {\n (parsedXml as Record<string, unknown>)[key] = null;\n }\n }\n }\n\n return parsedXml;\n }\n\n logger.warn(\"parseKeyValueXml returned null, attempting manual extraction\");\n const result: Record<string, unknown> = {};\n\n const extractTag = (text: string, tagName: string): string | null => {\n const cdataPattern = new RegExp(\n `<${tagName}>\\\\s*<!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)\\\\]\\\\]>\\\\s*</${tagName}>`,\n \"i\"\n );\n const cdataMatch = text.match(cdataPattern);\n if (cdataMatch) {\n return cdataMatch[1];\n }\n\n // Handle regular content with proper nesting\n const startTag = `<${tagName}>`;\n const endTag = `</${tagName}>`;\n const startIdx = text.indexOf(startTag);\n if (startIdx === -1) return null;\n\n let depth = 1;\n let searchStart = startIdx + startTag.length;\n while (depth > 0 && searchStart < text.length) {\n const nextOpen = text.indexOf(startTag, searchStart);\n const nextClose = text.indexOf(endTag, searchStart);\n if (nextClose === -1) break;\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n depth++;\n searchStart = nextOpen + startTag.length;\n } else {\n depth--;\n if (depth === 0) {\n return text.slice(startIdx + startTag.length, nextClose).trim();\n }\n searchStart = nextClose + endTag.length;\n }\n }\n return null;\n };\n\n // Extract common fields\n const thought = extractTag(textResponse, \"thought\");\n const text = extractTag(textResponse, \"text\");\n const code = extractTag(textResponse, \"code\");\n\n if (thought) result.thought = thought;\n if (text) result.text = text;\n if (code) result.code = code;\n\n // Extract schema fields\n if (params.schema) {\n for (const key of Object.keys(params.schema)) {\n if (!(key in result)) {\n const value = extractTag(textResponse, key);\n result[key] = value;\n }\n }\n }\n\n if (Object.keys(result).length > 0) {\n return result;\n }\n\n throw new Error(\"Could not parse XML response\");\n } catch (parseError) {\n logger.error(\"Failed to parse XML:\", parseError);\n logger.error(\"Raw response:\", textResponse);\n throw new Error(\"Invalid XML returned from model\");\n }\n },\n\n [ModelType.OBJECT_LARGE]: async (runtime: IAgentRuntime, params: ObjectGenerationParams) => {\n await localAIManager.initializeEnvironment();\n logger.info(\"OBJECT_LARGE handler - Processing request:\", {\n prompt: params.prompt,\n hasSchema: !!params.schema,\n temperature: params.temperature,\n });\n\n // Build XML schema hint from the provided schema\n let schemaHint = \"\";\n if (params.schema) {\n const schemaKeys = Object.keys(params.schema);\n schemaHint = schemaKeys.map((key) => `<${key}>value</${key}>`).join(\"\\n\");\n }\n\n // Enhance the prompt to request XML output\n const xmlPrompt = `${params.prompt}\n\nRespond using XML format wrapped in <response> tags. ${schemaHint ? `Include these fields:\\n${schemaHint}` : \"\"}\n\nIMPORTANT: If your response contains code, wrap code blocks in CDATA sections like this:\n<code><![CDATA[\nyour code here\n]]></code>\n\nExample response format:\n<response>\n<thought>Your reasoning here</thought>\n<text>Your response text here</text>\n</response>`;\n\n const textResponse = await localAIManager.generateText({\n prompt: xmlPrompt,\n stopSequences: params.stopSequences,\n runtime,\n modelType: ModelType.TEXT_LARGE,\n });\n\n try {\n logger.debug(\"Raw model response:\", textResponse.substring(0, 500));\n\n const parsedXml = parseKeyValueXml<Record<string, unknown>>(textResponse);\n\n if (parsedXml) {\n logger.debug(\"Parsed XML result:\", parsedXml);\n\n // Validate against schema if provided\n if (params.schema) {\n for (const key of Object.keys(params.schema)) {\n if (!(key in parsedXml)) {\n (parsedXml as Record<string, unknown>)[key] = null;\n }\n }\n }\n\n return parsedXml;\n }\n\n logger.warn(\"parseKeyValueXml returned null, attempting manual extraction\");\n const result: Record<string, unknown> = {};\n\n const extractTag = (text: string, tagName: string): string | null => {\n const cdataPattern = new RegExp(\n `<${tagName}>\\\\s*<!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)\\\\]\\\\]>\\\\s*</${tagName}>`,\n \"i\"\n );\n const cdataMatch = text.match(cdataPattern);\n if (cdataMatch) {\n return cdataMatch[1];\n }\n\n // Handle regular content with proper nesting\n const startTag = `<${tagName}>`;\n const endTag = `</${tagName}>`;\n const startIdx = text.indexOf(startTag);\n if (startIdx === -1) return null;\n\n let depth = 1;\n let searchStart = startIdx + startTag.length;\n while (depth > 0 && searchStart < text.length) {\n const nextOpen = text.indexOf(startTag, searchStart);\n const nextClose = text.indexOf(endTag, searchStart);\n if (nextClose === -1) break;\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n depth++;\n searchStart = nextOpen + startTag.length;\n } else {\n depth--;\n if (depth === 0) {\n return text.slice(startIdx + startTag.length, nextClose).trim();\n }\n searchStart = nextClose + endTag.length;\n }\n }\n return null;\n };\n\n // Extract common fields\n const thought = extractTag(textResponse, \"thought\");\n const text = extractTag(textResponse, \"text\");\n const code = extractTag(textResponse, \"code\");\n\n if (thought) result.thought = thought;\n if (text) result.text = text;\n if (code) result.code = code;\n\n // Extract schema fields\n if (params.schema) {\n for (const key of Object.keys(params.schema)) {\n if (!(key in result)) {\n const value = extractTag(textResponse, key);\n result[key] = value;\n }\n }\n }\n\n if (Object.keys(result).length > 0) {\n return result;\n }\n\n throw new Error(\"Could not parse XML response\");\n } catch (parseError) {\n logger.error(\"Failed to parse XML:\", parseError);\n logger.error(\"Raw response:\", textResponse);\n throw new Error(\"Invalid XML returned from model\");\n }\n },\n\n [ModelType.TEXT_TOKENIZER_ENCODE]: async (\n _runtime: IAgentRuntime,\n { text }: { text: string }\n ) => {\n const manager = localAIManager.getTokenizerManager();\n const config = localAIManager.getActiveModelConfig();\n return await manager.encode(text, config);\n },\n\n [ModelType.TEXT_TOKENIZER_DECODE]: async (\n _runtime: IAgentRuntime,\n { tokens }: { tokens: number[] }\n ) => {\n const manager = localAIManager.getTokenizerManager();\n const config = localAIManager.getActiveModelConfig();\n return await manager.decode(tokens, config);\n },\n\n [ModelType.IMAGE_DESCRIPTION]: async (_runtime: IAgentRuntime, imageUrl: string) => {\n logger.info(\"Processing image from URL:\", imageUrl);\n\n const response = await fetch(imageUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch image: ${response.statusText}`);\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n const mimeType = response.headers.get(\"content-type\") || \"image/jpeg\";\n return await localAIManager.describeImage(buffer, mimeType);\n },\n\n [ModelType.TRANSCRIPTION]: async (_runtime: IAgentRuntime, audioBuffer: Buffer) => {\n logger.info(\"Processing audio transcription:\", {\n bufferSize: audioBuffer.length,\n });\n\n return await localAIManager.transcribeAudio(audioBuffer);\n },\n\n [ModelType.TEXT_TO_SPEECH]: async (_runtime: IAgentRuntime, text: string) => {\n return await localAIManager.generateSpeech(text);\n },\n },\n tests: [\n {\n name: \"local_ai_plugin_tests\",\n tests: [\n {\n name: \"local_ai_test_initialization\",\n fn: async (runtime) => {\n try {\n logger.info(\"Starting initialization test\");\n\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt:\n \"Debug Mode: Test initialization. Respond with 'Initialization successful' if you can read this.\",\n stopSequences: [],\n });\n\n logger.info(\"Model response:\", result);\n\n if (!result || typeof result !== \"string\") {\n throw new Error(\"Invalid response from model\");\n }\n\n if (!result.includes(\"successful\")) {\n throw new Error(\"Model response does not indicate success\");\n }\n\n logger.success(\"Initialization test completed successfully\");\n } catch (error) {\n logger.error(\"Initialization test failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n },\n },\n {\n name: \"local_ai_test_text_large\",\n fn: async (runtime) => {\n try {\n logger.info(\"Starting TEXT_LARGE model test\");\n\n const result = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt:\n \"Debug Mode: Generate a one-sentence response about artificial intelligence.\",\n stopSequences: [],\n });\n\n logger.info(\"Large model response:\", result);\n\n if (!result || typeof result !== \"string\") {\n throw new Error(\"Invalid response from large model\");\n }\n\n if (result.length < 10) {\n throw new Error(\"Response too short, possible model failure\");\n }\n\n logger.success(\"TEXT_LARGE test completed successfully\");\n } catch (error) {\n logger.error(\"TEXT_LARGE test failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n },\n },\n {\n name: \"local_ai_test_text_embedding\",\n fn: async (runtime) => {\n try {\n logger.info(\"Starting TEXT_EMBEDDING test\");\n\n const embedding = await runtime.useModel(ModelType.TEXT_EMBEDDING, {\n text: \"This is a test of the text embedding model.\",\n });\n\n logger.info(\"Embedding generated with dimensions:\", embedding.length);\n\n if (!Array.isArray(embedding)) {\n throw new Error(\"Embedding is not an array\");\n }\n\n if (embedding.length === 0) {\n throw new Error(\"Embedding array is empty\");\n }\n\n if (embedding.some((val) => typeof val !== \"number\")) {\n throw new Error(\"Embedding contains non-numeric values\");\n }\n\n // Test with null input (should return zero vector)\n const nullEmbedding = await runtime.useModel(ModelType.TEXT_EMBEDDING, null);\n if (!Array.isArray(nullEmbedding) || nullEmbedding.some((val) => val !== 0)) {\n throw new Error(\"Null input did not return zero vector\");\n }\n\n logger.success(\"TEXT_EMBEDDING test completed successfully\");\n } catch (error) {\n logger.error(\"TEXT_EMBEDDING test failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n },\n },\n {\n name: \"local_ai_test_tokenizer_encode\",\n fn: async (runtime) => {\n try {\n logger.info(\"Starting TEXT_TOKENIZER_ENCODE test\");\n const text = \"Hello tokenizer test!\";\n const tokens = await runtime.useModel(ModelType.TEXT_TOKENIZER_ENCODE, { text });\n logger.info(\"Encoded tokens:\", { count: tokens.length });\n\n if (!Array.isArray(tokens)) {\n throw new Error(\"Tokens output is not an array\");\n }\n\n if (tokens.length === 0) {\n throw new Error(\"No tokens generated\");\n }\n\n if (tokens.some((token) => !Number.isInteger(token))) {\n throw new Error(\"Tokens contain non-integer values\");\n }\n\n logger.success(\"TEXT_TOKENIZER_ENCODE test completed successfully\");\n } catch (error) {\n logger.error(\"TEXT_TOKENIZER_ENCODE test failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n },\n },\n {\n name: \"local_ai_test_tokenizer_decode\",\n fn: async (runtime) => {\n try {\n logger.info(\"Starting TEXT_TOKENIZER_DECODE test\");\n\n const originalText = \"Hello tokenizer test!\";\n const tokens = await runtime.useModel(ModelType.TEXT_TOKENIZER_ENCODE, {\n text: originalText,\n });\n\n const decodedText = await runtime.useModel(ModelType.TEXT_TOKENIZER_DECODE, {\n tokens,\n });\n logger.info(\"Round trip tokenization:\", {\n original: originalText,\n decoded: decodedText,\n });\n\n if (typeof decodedText !== \"string\") {\n throw new Error(\"Decoded output is not a string\");\n }\n\n logger.success(\"TEXT_TOKENIZER_DECODE test completed successfully\");\n } catch (error) {\n logger.error(\"TEXT_TOKENIZER_DECODE test failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n },\n },\n {\n name: \"local_ai_test_image_description\",\n fn: async (runtime) => {\n try {\n logger.info(\"Starting IMAGE_DESCRIPTION test\");\n\n const imageUrl =\n \"https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/320px-Cat03.jpg\";\n const result = await runtime.useModel(ModelType.IMAGE_DESCRIPTION, imageUrl);\n\n logger.info(\"Image description result:\", result);\n\n if (!result || typeof result !== \"object\") {\n throw new Error(\"Invalid response format\");\n }\n\n if (!result.title || !result.description) {\n throw new Error(\"Missing title or description in response\");\n }\n\n if (typeof result.title !== \"string\" || typeof result.description !== \"string\") {\n throw new Error(\"Title or description is not a string\");\n }\n\n logger.success(\"IMAGE_DESCRIPTION test completed successfully\");\n } catch (error) {\n logger.error(\"IMAGE_DESCRIPTION test failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n },\n },\n {\n name: \"local_ai_test_transcription\",\n fn: async (runtime) => {\n try {\n logger.info(\"Starting TRANSCRIPTION test\");\n\n const channels = 1;\n const sampleRate = 16000;\n const bitsPerSample = 16;\n const duration = 0.5; // 500ms for better transcription\n const numSamples = Math.floor(sampleRate * duration);\n const dataSize = numSamples * channels * (bitsPerSample / 8);\n\n const buffer = Buffer.alloc(44 + dataSize);\n\n buffer.write(\"RIFF\", 0);\n buffer.writeUInt32LE(36 + dataSize, 4);\n buffer.write(\"WAVE\", 8);\n\n buffer.write(\"fmt \", 12);\n buffer.writeUInt32LE(16, 16);\n buffer.writeUInt16LE(1, 20);\n buffer.writeUInt16LE(channels, 22);\n buffer.writeUInt32LE(sampleRate, 24);\n buffer.writeUInt32LE(sampleRate * channels * (bitsPerSample / 8), 28);\n buffer.writeUInt16LE(channels * (bitsPerSample / 8), 32);\n buffer.writeUInt16LE(bitsPerSample, 34);\n\n buffer.write(\"data\", 36);\n buffer.writeUInt32LE(dataSize, 40);\n\n const frequency = 440;\n for (let i = 0; i < numSamples; i++) {\n const sample = Math.sin((2 * Math.PI * frequency * i) / sampleRate) * 0.1 * 32767;\n buffer.writeInt16LE(Math.floor(sample), 44 + i * 2);\n }\n\n const transcription = await runtime.useModel(ModelType.TRANSCRIPTION, buffer);\n logger.info(\"Transcription result:\", transcription);\n\n if (typeof transcription !== \"string\") {\n throw new Error(\"Transcription result is not a string\");\n }\n\n logger.info(\"Transcription completed (may be empty for non-speech audio)\");\n\n logger.success(\"TRANSCRIPTION test completed successfully\");\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n \"TRANSCRIPTION test failed\"\n );\n throw error;\n }\n },\n },\n {\n name: \"local_ai_test_text_to_speech\",\n fn: async (runtime) => {\n try {\n logger.info(\"Starting TEXT_TO_SPEECH test\");\n\n const testText = \"This is a test of the text to speech system.\";\n const audioStream = await runtime.useModel(ModelType.TEXT_TO_SPEECH, testText);\n\n if (!(audioStream instanceof Readable)) {\n throw new Error(\"TTS output is not a readable stream\");\n }\n\n let dataReceived = false;\n audioStream.on(\"data\", () => {\n dataReceived = true;\n });\n\n await new Promise((resolve, reject) => {\n audioStream.on(\"end\", () => {\n if (!dataReceived) {\n reject(new Error(\"No audio data received from stream\"));\n } else {\n resolve(true);\n }\n });\n audioStream.on(\"error\", reject);\n });\n\n logger.success(\"TEXT_TO_SPEECH test completed successfully\");\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n \"TEXT_TO_SPEECH test failed\"\n );\n throw error;\n }\n },\n },\n ],\n },\n ],\n};\n\nexport default localAiPlugin;\n",
6
- "import { logger } from \"@elizaos/core\";\nimport { z } from \"zod\";\n\nconst DEFAULT_SMALL_MODEL = \"DeepHermes-3-Llama-3-3B-Preview-q4.gguf\";\nconst DEFAULT_LARGE_MODEL = \"DeepHermes-3-Llama-3-8B-q4.gguf\";\nconst DEFAULT_EMBEDDING_MODEL = \"bge-small-en-v1.5.Q4_K_M.gguf\";\n\nexport const configSchema = z.object({\n LOCAL_SMALL_MODEL: z.string().optional().default(DEFAULT_SMALL_MODEL),\n LOCAL_LARGE_MODEL: z.string().optional().default(DEFAULT_LARGE_MODEL),\n LOCAL_EMBEDDING_MODEL: z.string().optional().default(DEFAULT_EMBEDDING_MODEL),\n MODELS_DIR: z.string().optional(),\n CACHE_DIR: z.string().optional(),\n LOCAL_EMBEDDING_DIMENSIONS: z\n .string()\n .optional()\n .default(\"384\")\n .transform((val) => parseInt(val, 10)),\n});\n\nexport type Config = z.infer<typeof configSchema>;\n\nexport function validateConfig(): Config {\n try {\n const configToParse = {\n LOCAL_SMALL_MODEL: process.env.LOCAL_SMALL_MODEL,\n LOCAL_LARGE_MODEL: process.env.LOCAL_LARGE_MODEL,\n LOCAL_EMBEDDING_MODEL: process.env.LOCAL_EMBEDDING_MODEL,\n MODELS_DIR: process.env.MODELS_DIR,\n CACHE_DIR: process.env.CACHE_DIR,\n LOCAL_EMBEDDING_DIMENSIONS: process.env.LOCAL_EMBEDDING_DIMENSIONS,\n };\n\n logger.debug(\"Validating configuration for local AI plugin from env:\", {\n LOCAL_SMALL_MODEL: configToParse.LOCAL_SMALL_MODEL,\n LOCAL_LARGE_MODEL: configToParse.LOCAL_LARGE_MODEL,\n LOCAL_EMBEDDING_MODEL: configToParse.LOCAL_EMBEDDING_MODEL,\n MODELS_DIR: configToParse.MODELS_DIR,\n CACHE_DIR: configToParse.CACHE_DIR,\n LOCAL_EMBEDDING_DIMENSIONS: configToParse.LOCAL_EMBEDDING_DIMENSIONS,\n });\n\n const validatedConfig = configSchema.parse(configToParse);\n\n logger.info(\"Using local AI configuration:\", validatedConfig);\n\n return validatedConfig;\n } catch (error) {\n if (error instanceof z.ZodError) {\n const errorMessages = error.errors\n .map((err) => `${err.path.join(\".\")}: ${err.message}`)\n .join(\"\\n\");\n logger.error(\"Zod validation failed:\", errorMessages);\n throw new Error(`Configuration validation failed:\\n${errorMessages}`);\n }\n logger.error(\"Configuration validation failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n}\n",
7
- "export interface TokenizerConfig {\n name: string;\n type: string;\n}\n\nexport interface ModelSpec {\n name: string;\n repo: string;\n size: string;\n quantization: string;\n contextSize: number;\n tokenizer: TokenizerConfig;\n}\n\nexport interface EmbeddingModelSpec extends ModelSpec {\n dimensions: number;\n}\n\nexport interface VisionModelSpec {\n name: string;\n repo: string;\n size: string;\n modelId: string;\n contextSize: number;\n maxTokens: number;\n tasks: string[];\n}\n\nexport interface TTSModelSpec {\n name: string;\n repo: string;\n size: string;\n quantization: string;\n speakers: string[];\n languages: string[];\n features: string[];\n maxInputLength: number;\n sampleRate: number;\n contextSize: number;\n tokenizer: TokenizerConfig;\n}\n\nexport interface TransformersJsTTSModelSpec {\n modelId: string;\n defaultSampleRate: number;\n defaultSpeakerEmbeddingUrl?: string;\n}\n\nexport interface ModelSpecs {\n small: ModelSpec;\n medium: ModelSpec;\n embedding: EmbeddingModelSpec;\n vision: VisionModelSpec;\n visionvl: VisionModelSpec;\n tts: {\n default: TransformersJsTTSModelSpec;\n };\n}\n\nexport const MODEL_SPECS: ModelSpecs = {\n small: {\n name: \"DeepHermes-3-Llama-3-3B-Preview-q4.gguf\",\n repo: \"NousResearch/DeepHermes-3-Llama-3-3B-Preview-GGUF\",\n size: \"3B\",\n quantization: \"Q4_0\",\n contextSize: 8192,\n tokenizer: {\n name: \"NousResearch/DeepHermes-3-Llama-3-3B-Preview\",\n type: \"llama\",\n },\n },\n medium: {\n name: \"DeepHermes-3-Llama-3-8B-q4.gguf\",\n repo: \"NousResearch/DeepHermes-3-Llama-3-8B-Preview-GGUF\",\n size: \"8B\",\n quantization: \"Q4_0\",\n contextSize: 8192,\n tokenizer: {\n name: \"NousResearch/DeepHermes-3-Llama-3-8B-Preview\",\n type: \"llama\",\n },\n },\n embedding: {\n name: \"bge-small-en-v1.5.Q4_K_M.gguf\",\n repo: \"ChristianAzinn/bge-small-en-v1.5-gguf\",\n size: \"133 MB\",\n quantization: \"Q4_K_M\",\n contextSize: 512,\n dimensions: 384,\n tokenizer: {\n name: \"ChristianAzinn/bge-small-en-v1.5-gguf\",\n type: \"llama\",\n },\n },\n vision: {\n name: \"Florence-2-base-ft\",\n repo: \"onnx-community/Florence-2-base-ft\",\n size: \"0.23B\",\n modelId: \"onnx-community/Florence-2-base-ft\",\n contextSize: 1024,\n maxTokens: 256,\n tasks: [\n \"CAPTION\",\n \"DETAILED_CAPTION\",\n \"MORE_DETAILED_CAPTION\",\n \"CAPTION_TO_PHRASE_GROUNDING\",\n \"OD\",\n \"DENSE_REGION_CAPTION\",\n \"REGION_PROPOSAL\",\n \"OCR\",\n \"OCR_WITH_REGION\",\n ],\n },\n visionvl: {\n name: \"Qwen2.5-VL-3B-Instruct\",\n repo: \"Qwen/Qwen2.5-VL-3B-Instruct\",\n size: \"3B\",\n modelId: \"Qwen/Qwen2.5-VL-3B-Instruct\",\n contextSize: 32768,\n maxTokens: 1024,\n tasks: [\n \"CAPTION\",\n \"DETAILED_CAPTION\",\n \"IMAGE_UNDERSTANDING\",\n \"VISUAL_QUESTION_ANSWERING\",\n \"OCR\",\n \"VISUAL_LOCALIZATION\",\n \"REGION_ANALYSIS\",\n ],\n },\n tts: {\n default: {\n modelId: \"Xenova/speecht5_tts\",\n defaultSampleRate: 16000,\n defaultSpeakerEmbeddingUrl:\n \"https://huggingface.co/datasets/Xenova/transformers.js-docs/resolve/main/speaker_embeddings.bin\",\n },\n },\n};\n",
8
- "import fs from \"node:fs\";\nimport https from \"node:https\";\nimport path from \"node:path\";\nimport { logger } from \"@elizaos/core\";\nimport type { ModelSpec } from \"../types\";\n\nexport class DownloadManager {\n private static instance: DownloadManager | null = null;\n private cacheDir: string;\n private modelsDir: string;\n private activeDownloads: Map<string, Promise<void>> = new Map();\n\n private constructor(cacheDir: string, modelsDir: string) {\n this.cacheDir = cacheDir;\n this.modelsDir = modelsDir;\n this.ensureCacheDirectory();\n this.ensureModelsDirectory();\n }\n\n public static getInstance(cacheDir: string, modelsDir: string): DownloadManager {\n if (!DownloadManager.instance) {\n DownloadManager.instance = new DownloadManager(cacheDir, modelsDir);\n }\n return DownloadManager.instance;\n }\n\n private ensureCacheDirectory(): void {\n if (!this.cacheDir || this.cacheDir.trim() === \"\") {\n throw new Error(\"Cache directory path cannot be empty\");\n }\n if (!fs.existsSync(this.cacheDir)) {\n fs.mkdirSync(this.cacheDir, { recursive: true });\n logger.debug(\"Created cache directory\");\n }\n }\n\n private ensureModelsDirectory(): void {\n if (!this.modelsDir || this.modelsDir.trim() === \"\") {\n throw new Error(\"Models directory path cannot be empty\");\n }\n logger.debug(\"Ensuring models directory exists:\", this.modelsDir);\n if (!fs.existsSync(this.modelsDir)) {\n fs.mkdirSync(this.modelsDir, { recursive: true });\n logger.debug(\"Created models directory\");\n }\n }\n\n private async downloadFileInternal(url: string, destPath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n logger.info(`Starting download to: ${destPath}`);\n\n const tempPath = `${destPath}.tmp`;\n\n if (fs.existsSync(tempPath)) {\n try {\n logger.warn(`Removing existing temporary file: ${tempPath}`);\n fs.unlinkSync(tempPath);\n } catch (err) {\n logger.error(\n `Failed to remove existing temporary file: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n\n const request = https.get(\n url,\n {\n headers: {\n \"User-Agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36\",\n },\n timeout: 300000,\n },\n (response) => {\n if (response.statusCode === 301 || response.statusCode === 302) {\n const redirectUrl = response.headers.location;\n if (!redirectUrl) {\n reject(new Error(\"Redirect location not found\"));\n return;\n }\n this.activeDownloads.delete(destPath);\n this.downloadFile(redirectUrl, destPath).then(resolve).catch(reject);\n return;\n }\n\n if (response.statusCode !== 200) {\n reject(new Error(`Failed to download: ${response.statusCode}`));\n return;\n }\n\n const totalSize = Number.parseInt(response.headers[\"content-length\"] || \"0\", 10);\n let downloadedSize = 0;\n let lastLoggedPercent = 0;\n const barLength = 30;\n\n const fileName = path.basename(destPath);\n logger.info(`Downloading ${fileName}: ${\"▱\".repeat(barLength)} 0%`);\n\n const file = fs.createWriteStream(tempPath);\n\n response.on(\"data\", (chunk) => {\n downloadedSize += chunk.length;\n const percent = Math.round((downloadedSize / totalSize) * 100);\n\n if (percent >= lastLoggedPercent + 5) {\n const filledLength = Math.floor((downloadedSize / totalSize) * barLength);\n const progressBar = \"▰\".repeat(filledLength) + \"▱\".repeat(barLength - filledLength);\n logger.info(`Downloading ${fileName}: ${progressBar} ${percent}%`);\n lastLoggedPercent = percent;\n }\n });\n\n response.pipe(file);\n\n file.on(\"finish\", () => {\n file.close(() => {\n try {\n const completedBar = \"▰\".repeat(barLength);\n logger.info(`Downloading ${fileName}: ${completedBar} 100%`);\n\n const destDir = path.dirname(destPath);\n if (!fs.existsSync(destDir)) {\n fs.mkdirSync(destDir, { recursive: true });\n }\n\n if (!fs.existsSync(tempPath)) {\n reject(new Error(`Temporary file ${tempPath} does not exist`));\n return;\n }\n\n if (fs.existsSync(destPath)) {\n try {\n const backupPath = `${destPath}.bak`;\n fs.renameSync(destPath, backupPath);\n logger.info(`Created backup of existing file: ${backupPath}`);\n\n fs.renameSync(tempPath, destPath);\n\n if (fs.existsSync(backupPath)) {\n fs.unlinkSync(backupPath);\n logger.info(`Removed backup file after successful update: ${backupPath}`);\n }\n } catch (moveErr) {\n logger.error(\n `Error replacing file: ${moveErr instanceof Error ? moveErr.message : String(moveErr)}`\n );\n\n const backupPath = `${destPath}.bak`;\n if (fs.existsSync(backupPath)) {\n try {\n fs.renameSync(backupPath, destPath);\n logger.info(`Restored from backup after failed update: ${backupPath}`);\n } catch (restoreErr) {\n logger.error(\n `Failed to restore from backup: ${restoreErr instanceof Error ? restoreErr.message : String(restoreErr)}`\n );\n }\n }\n\n if (fs.existsSync(tempPath)) {\n try {\n fs.unlinkSync(tempPath);\n } catch (unlinkErr) {\n logger.error(\n `Failed to clean up temp file: ${unlinkErr instanceof Error ? unlinkErr.message : String(unlinkErr)}`\n );\n }\n }\n\n reject(moveErr);\n return;\n }\n } else {\n fs.renameSync(tempPath, destPath);\n }\n\n logger.success(`Download of ${fileName} completed successfully`);\n\n this.activeDownloads.delete(destPath);\n resolve();\n } catch (err) {\n logger.error(\n `Error finalizing download: ${err instanceof Error ? err.message : String(err)}`\n );\n if (fs.existsSync(tempPath)) {\n try {\n fs.unlinkSync(tempPath);\n } catch (unlinkErr) {\n logger.error(\n `Failed to clean up temp file: ${unlinkErr instanceof Error ? unlinkErr.message : String(unlinkErr)}`\n );\n }\n }\n this.activeDownloads.delete(destPath);\n reject(err);\n }\n });\n });\n\n file.on(\"error\", (err) => {\n logger.error(`File write error: ${err instanceof Error ? err.message : String(err)}`);\n file.close(() => {\n if (fs.existsSync(tempPath)) {\n try {\n fs.unlinkSync(tempPath);\n } catch (unlinkErr) {\n logger.error(\n `Failed to clean up temp file after error: ${unlinkErr instanceof Error ? unlinkErr.message : String(unlinkErr)}`\n );\n }\n }\n this.activeDownloads.delete(destPath);\n reject(err);\n });\n });\n }\n );\n\n request.on(\"error\", (err) => {\n logger.error(`Request error: ${err instanceof Error ? err.message : String(err)}`);\n if (fs.existsSync(tempPath)) {\n try {\n fs.unlinkSync(tempPath);\n } catch (unlinkErr) {\n logger.error(\n `Failed to clean up temp file after request error: ${unlinkErr instanceof Error ? unlinkErr.message : String(unlinkErr)}`\n );\n }\n }\n this.activeDownloads.delete(destPath);\n reject(err);\n });\n\n request.on(\"timeout\", () => {\n logger.error(\"Download timeout occurred\");\n request.destroy();\n if (fs.existsSync(tempPath)) {\n try {\n fs.unlinkSync(tempPath);\n } catch (unlinkErr) {\n logger.error(\n `Failed to clean up temp file after timeout: ${unlinkErr instanceof Error ? unlinkErr.message : String(unlinkErr)}`\n );\n }\n }\n this.activeDownloads.delete(destPath);\n reject(new Error(\"Download timeout\"));\n });\n });\n }\n\n public async downloadFile(url: string, destPath: string): Promise<void> {\n if (this.activeDownloads.has(destPath)) {\n logger.info(`Download for ${destPath} already in progress, waiting for it to complete...`);\n const existingDownload = this.activeDownloads.get(destPath);\n if (existingDownload) {\n return existingDownload;\n }\n logger.warn(\n `Download for ${destPath} was marked as in progress but not found in tracking map`\n );\n }\n\n const downloadPromise = this.downloadFileInternal(url, destPath);\n this.activeDownloads.set(destPath, downloadPromise);\n\n try {\n return await downloadPromise;\n } catch (error) {\n this.activeDownloads.delete(destPath);\n throw error;\n }\n }\n\n public async downloadModel(modelSpec: ModelSpec, modelPath: string): Promise<boolean> {\n try {\n logger.info(\"Starting local model download...\");\n\n const modelDir = path.dirname(modelPath);\n if (!fs.existsSync(modelDir)) {\n logger.info(\"Creating model directory:\", modelDir);\n fs.mkdirSync(modelDir, { recursive: true });\n }\n\n if (!fs.existsSync(modelPath)) {\n const attempts = [\n {\n description: \"LFS URL with GGUF suffix\",\n url: `https://huggingface.co/${modelSpec.repo}/resolve/main/${modelSpec.name}?download=true`,\n },\n {\n description: \"LFS URL without GGUF suffix\",\n url: `https://huggingface.co/${modelSpec.repo.replace(\"-GGUF\", \"\")}/resolve/main/${modelSpec.name}?download=true`,\n },\n {\n description: \"Standard URL with GGUF suffix\",\n url: `https://huggingface.co/${modelSpec.repo}/resolve/main/${modelSpec.name}`,\n },\n {\n description: \"Standard URL without GGUF suffix\",\n url: `https://huggingface.co/${modelSpec.repo.replace(\"-GGUF\", \"\")}/resolve/main/${modelSpec.name}`,\n },\n ];\n\n let lastError = null;\n let downloadSuccess = false;\n\n for (const attempt of attempts) {\n try {\n logger.info(\n {\n description: attempt.description,\n url: attempt.url,\n timestamp: new Date().toISOString(),\n },\n \"Attempting model download\"\n );\n\n await this.downloadFile(attempt.url, modelPath);\n\n logger.success(\n `Model download complete: ${modelSpec.name} using ${attempt.description}`\n );\n downloadSuccess = true;\n break;\n } catch (error) {\n lastError = error;\n logger.warn(\n {\n description: attempt.description,\n error: error instanceof Error ? error.message : String(error),\n timestamp: new Date().toISOString(),\n },\n \"Model download attempt failed\"\n );\n }\n }\n\n if (!downloadSuccess) {\n throw lastError || new Error(\"All download attempts failed\");\n }\n\n return true;\n }\n\n logger.info(\"Model already exists at:\", modelPath);\n return false;\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n modelPath: modelPath,\n model: modelSpec.name,\n },\n \"Model download failed\"\n );\n throw error;\n }\n }\n\n public getCacheDir(): string {\n return this.cacheDir;\n }\n\n public async downloadFromUrl(url: string, destPath: string): Promise<void> {\n return this.downloadFile(url, destPath);\n }\n\n /**\n * Ensures a directory exists, creating it and parent directories if necessary.\n * @param dirPath - The directory path to ensure exists\n * @throws Error if the directory path is empty or whitespace-only\n */\n public ensureDirectoryExists(dirPath: string): void {\n if (!dirPath || dirPath.trim() === \"\") {\n throw new Error(\"Directory path cannot be empty\");\n }\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n logger.info(`Created directory: ${dirPath}`);\n }\n }\n}\n",
9
- "import { exec } from \"node:child_process\";\nimport os from \"node:os\";\nimport { promisify } from \"node:util\";\nimport { logger } from \"@elizaos/core\";\n\nconst execAsync = promisify(exec);\n\nexport interface SystemGPU {\n name: string;\n memory?: number;\n type: \"cuda\" | \"metal\" | \"directml\" | \"none\";\n version?: string;\n isAppleSilicon?: boolean;\n}\n\nexport interface SystemCPU {\n model: string;\n cores: number;\n speed: number;\n architecture: string;\n memory: {\n total: number;\n free: number;\n };\n}\n\nexport interface SystemCapabilities {\n platform: NodeJS.Platform;\n cpu: SystemCPU;\n gpu: SystemGPU | null;\n recommendedModelSize: \"small\" | \"medium\" | \"large\";\n supportedBackends: Array<\"cuda\" | \"metal\" | \"directml\" | \"cpu\">;\n}\n\nexport class PlatformManager {\n private static instance: PlatformManager;\n private capabilities: SystemCapabilities | null = null;\n\n private constructor() {}\n\n static getInstance(): PlatformManager {\n if (!PlatformManager.instance) {\n PlatformManager.instance = new PlatformManager();\n }\n return PlatformManager.instance;\n }\n\n async initialize(): Promise<void> {\n try {\n logger.info(\"Initializing platform detection...\");\n this.capabilities = await this.detectSystemCapabilities();\n } catch (error) {\n logger.error(\"Platform detection failed\", { error });\n throw error;\n }\n }\n\n private async detectSystemCapabilities(): Promise<SystemCapabilities> {\n const platform = process.platform;\n const cpuInfo = this.getCPUInfo();\n const gpu = await this.detectGPU();\n const supportedBackends = await this.getSupportedBackends(platform, gpu);\n const recommendedModelSize = this.getRecommendedModelSize(cpuInfo, gpu);\n\n return {\n platform,\n cpu: cpuInfo,\n gpu,\n recommendedModelSize,\n supportedBackends,\n };\n }\n\n private getCPUInfo(): SystemCPU {\n const cpus = os.cpus();\n const totalMemory = os.totalmem();\n const freeMemory = os.freemem();\n\n return {\n model: cpus[0].model,\n cores: cpus.length,\n speed: cpus[0].speed,\n architecture: process.arch,\n memory: {\n total: totalMemory,\n free: freeMemory,\n },\n };\n }\n\n private async detectGPU(): Promise<SystemGPU | null> {\n const platform = process.platform;\n\n try {\n switch (platform) {\n case \"darwin\":\n return await this.detectMacGPU();\n case \"win32\":\n return await this.detectWindowsGPU();\n case \"linux\":\n return await this.detectLinuxGPU();\n default:\n return null;\n }\n } catch (error) {\n logger.error(\"GPU detection failed\", { error });\n return null;\n }\n }\n\n private async detectMacGPU(): Promise<SystemGPU> {\n try {\n const { stdout } = await execAsync(\"sysctl -n machdep.cpu.brand_string\");\n const isAppleSilicon = stdout.toLowerCase().includes(\"apple\");\n\n if (isAppleSilicon) {\n return {\n name: \"Apple Silicon\",\n type: \"metal\",\n isAppleSilicon: true,\n };\n }\n\n const { stdout: gpuInfo } = await execAsync(\"system_profiler SPDisplaysDataType\");\n return {\n name: gpuInfo.split(\"Chipset Model:\")[1]?.split(\"\\n\")[0]?.trim() || \"Unknown GPU\",\n type: \"metal\",\n isAppleSilicon: false,\n };\n } catch (error) {\n logger.error(\"Mac GPU detection failed\", { error });\n return {\n name: \"Unknown Mac GPU\",\n type: \"metal\",\n isAppleSilicon: false,\n };\n }\n }\n\n private async detectWindowsGPU(): Promise<SystemGPU | null> {\n try {\n const { stdout } = await execAsync(\"wmic path win32_VideoController get name\");\n const gpuName = stdout.split(\"\\n\")[1].trim();\n\n if (gpuName.toLowerCase().includes(\"nvidia\")) {\n const { stdout: nvidiaInfo } = await execAsync(\n \"nvidia-smi --query-gpu=name,memory.total --format=csv,noheader\"\n );\n const [name, memoryStr] = nvidiaInfo.split(\",\").map((s) => s.trim());\n const memory = Number.parseInt(memoryStr, 10);\n\n return {\n name,\n memory,\n type: \"cuda\",\n version: await this.getNvidiaDriverVersion(),\n };\n }\n\n return {\n name: gpuName,\n type: \"directml\",\n };\n } catch (error) {\n logger.error(\"Windows GPU detection failed\", { error });\n return null;\n }\n }\n\n private async detectLinuxGPU(): Promise<SystemGPU | null> {\n try {\n const { stdout } = await execAsync(\n \"nvidia-smi --query-gpu=name,memory.total --format=csv,noheader\"\n );\n if (stdout) {\n const [name, memoryStr] = stdout.split(\",\").map((s) => s.trim());\n const memory = Number.parseInt(memoryStr, 10);\n\n return {\n name,\n memory,\n type: \"cuda\",\n version: await this.getNvidiaDriverVersion(),\n };\n }\n } catch {\n try {\n const { stdout } = await execAsync(\"lspci | grep -i vga\");\n return {\n name: stdout.split(\":\").pop()?.trim() || \"Unknown GPU\",\n type: \"none\",\n };\n } catch (error) {\n logger.error(\"Linux GPU detection failed\", { error });\n return null;\n }\n }\n return null;\n }\n\n private async getNvidiaDriverVersion(): Promise<string> {\n try {\n const { stdout } = await execAsync(\n \"nvidia-smi --query-gpu=driver_version --format=csv,noheader\"\n );\n return stdout.trim();\n } catch {\n return \"unknown\";\n }\n }\n\n private async getSupportedBackends(\n platform: NodeJS.Platform,\n gpu: SystemGPU | null\n ): Promise<Array<\"cuda\" | \"metal\" | \"directml\" | \"cpu\">> {\n const backends: Array<\"cuda\" | \"metal\" | \"directml\" | \"cpu\"> = [\"cpu\"];\n\n if (gpu) {\n switch (platform) {\n case \"darwin\":\n backends.push(\"metal\");\n break;\n case \"win32\":\n if (gpu.type === \"cuda\") {\n backends.push(\"cuda\");\n }\n backends.push(\"directml\");\n break;\n case \"linux\":\n if (gpu.type === \"cuda\") {\n backends.push(\"cuda\");\n }\n break;\n }\n }\n\n return backends;\n }\n\n private getRecommendedModelSize(\n cpu: SystemCPU,\n gpu: SystemGPU | null\n ): \"small\" | \"medium\" | \"large\" {\n if (gpu?.isAppleSilicon) {\n return cpu.memory.total > 16 * 1024 * 1024 * 1024 ? \"medium\" : \"small\";\n }\n\n if (gpu?.type === \"cuda\") {\n const gpuMemGB = (gpu.memory || 0) / 1024;\n if (gpuMemGB >= 16) return \"large\";\n if (gpuMemGB >= 8) return \"medium\";\n }\n\n if (cpu.memory.total > 32 * 1024 * 1024 * 1024) return \"medium\";\n\n return \"small\";\n }\n\n getCapabilities(): SystemCapabilities {\n if (!this.capabilities) {\n throw new Error(\"PlatformManager not initialized\");\n }\n return this.capabilities;\n }\n\n isAppleSilicon(): boolean {\n return !!this.capabilities?.gpu?.isAppleSilicon;\n }\n\n hasGPUSupport(): boolean {\n return !!this.capabilities?.gpu;\n }\n\n supportsCUDA(): boolean {\n return this.capabilities?.gpu?.type === \"cuda\";\n }\n\n supportsMetal(): boolean {\n return this.capabilities?.gpu?.type === \"metal\";\n }\n\n supportsDirectML(): boolean {\n return this.capabilities?.gpu?.type === \"directml\";\n }\n\n getRecommendedBackend(): \"cuda\" | \"metal\" | \"directml\" | \"cpu\" {\n if (!this.capabilities) {\n throw new Error(\"PlatformManager not initialized\");\n }\n\n const { gpu, supportedBackends } = this.capabilities;\n\n if (gpu?.type === \"cuda\") return \"cuda\";\n if (gpu?.type === \"metal\") return \"metal\";\n if (supportedBackends.includes(\"directml\")) return \"directml\";\n return \"cpu\";\n }\n}\n\nexport const getPlatformManager = (): PlatformManager => {\n return PlatformManager.getInstance();\n};\n",
10
- "import { logger } from \"@elizaos/core\";\nimport { AutoTokenizer, type PreTrainedTokenizer } from \"@huggingface/transformers\";\nimport type { ModelSpec } from \"../types\";\n\nexport class TokenizerManager {\n private static instance: TokenizerManager | null = null;\n private tokenizers: Map<string, PreTrainedTokenizer>;\n private cacheDir: string;\n private modelsDir: string;\n\n private constructor(cacheDir: string, modelsDir: string) {\n this.tokenizers = new Map();\n this.cacheDir = cacheDir;\n this.modelsDir = modelsDir;\n }\n\n static getInstance(cacheDir: string, modelsDir: string): TokenizerManager {\n if (!TokenizerManager.instance) {\n TokenizerManager.instance = new TokenizerManager(cacheDir, modelsDir);\n }\n return TokenizerManager.instance;\n }\n\n async loadTokenizer(modelConfig: ModelSpec): Promise<PreTrainedTokenizer> {\n try {\n const tokenizerKey = `${modelConfig.tokenizer.type}-${modelConfig.tokenizer.name}`;\n logger.info(\"Loading tokenizer:\", {\n key: tokenizerKey,\n name: modelConfig.tokenizer.name,\n type: modelConfig.tokenizer.type,\n modelsDir: this.modelsDir,\n cacheDir: this.cacheDir,\n });\n\n if (this.tokenizers.has(tokenizerKey)) {\n logger.info(\"Using cached tokenizer:\", { key: tokenizerKey });\n const cachedTokenizer = this.tokenizers.get(tokenizerKey);\n if (!cachedTokenizer) {\n throw new Error(`Tokenizer ${tokenizerKey} exists in map but returned undefined`);\n }\n return cachedTokenizer;\n }\n\n const fs = await import(\"node:fs\");\n if (!fs.existsSync(this.modelsDir)) {\n logger.warn(\"Models directory does not exist, creating it:\", this.modelsDir);\n fs.mkdirSync(this.modelsDir, { recursive: true });\n }\n\n logger.info(\n \"Initializing new tokenizer from HuggingFace with models directory:\",\n this.modelsDir\n );\n\n try {\n const tokenizer = await AutoTokenizer.from_pretrained(modelConfig.tokenizer.name, {\n cache_dir: this.modelsDir,\n local_files_only: false,\n });\n\n this.tokenizers.set(tokenizerKey, tokenizer);\n logger.success(\"Tokenizer loaded successfully:\", { key: tokenizerKey });\n return tokenizer;\n } catch (tokenizeError) {\n logger.error(\"Failed to load tokenizer from HuggingFace:\", {\n error: tokenizeError instanceof Error ? tokenizeError.message : String(tokenizeError),\n stack: tokenizeError instanceof Error ? tokenizeError.stack : undefined,\n tokenizer: modelConfig.tokenizer.name,\n modelsDir: this.modelsDir,\n });\n\n logger.info(\"Retrying tokenizer loading...\");\n const tokenizer = await AutoTokenizer.from_pretrained(modelConfig.tokenizer.name, {\n cache_dir: this.modelsDir,\n local_files_only: false,\n });\n\n this.tokenizers.set(tokenizerKey, tokenizer);\n logger.success(\"Tokenizer loaded successfully on retry:\", {\n key: tokenizerKey,\n });\n return tokenizer;\n }\n } catch (error) {\n logger.error(\"Failed to load tokenizer:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n model: modelConfig.name,\n tokenizer: modelConfig.tokenizer.name,\n modelsDir: this.modelsDir,\n });\n throw error;\n }\n }\n\n async encode(text: string, modelConfig: ModelSpec): Promise<number[]> {\n try {\n logger.info(\"Encoding text with tokenizer:\", {\n length: text.length,\n tokenizer: modelConfig.tokenizer.name,\n });\n\n const tokenizer = await this.loadTokenizer(modelConfig);\n\n logger.info(\"Tokenizer loaded, encoding text...\");\n const encoded = await tokenizer.encode(text, {\n add_special_tokens: true,\n return_token_type_ids: false,\n });\n\n logger.info(\"Text encoded successfully:\", {\n tokenCount: encoded.length,\n tokenizer: modelConfig.tokenizer.name,\n });\n return encoded;\n } catch (error) {\n logger.error(\"Text encoding failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n textLength: text.length,\n tokenizer: modelConfig.tokenizer.name,\n modelsDir: this.modelsDir,\n });\n throw error;\n }\n }\n\n async decode(tokens: number[], modelConfig: ModelSpec): Promise<string> {\n try {\n logger.info(\"Decoding tokens with tokenizer:\", {\n count: tokens.length,\n tokenizer: modelConfig.tokenizer.name,\n });\n\n const tokenizer = await this.loadTokenizer(modelConfig);\n\n logger.info(\"Tokenizer loaded, decoding tokens...\");\n const decoded = await tokenizer.decode(tokens, {\n skip_special_tokens: true,\n clean_up_tokenization_spaces: true,\n });\n\n logger.info(\"Tokens decoded successfully:\", {\n textLength: decoded.length,\n tokenizer: modelConfig.tokenizer.name,\n });\n return decoded;\n } catch (error) {\n logger.error(\"Token decoding failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n tokenCount: tokens.length,\n tokenizer: modelConfig.tokenizer.name,\n modelsDir: this.modelsDir,\n });\n throw error;\n }\n }\n}\n",
11
- "import { exec } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { logger } from \"@elizaos/core\";\n\nconst execAsync = promisify(exec);\n\ntype WhisperModule = {\n transcribe: (audioBuffer: Buffer, options?: Record<string, unknown>) => Promise<string>;\n};\nlet whisperModule: WhisperModule | null = null;\nasync function getWhisper(): Promise<WhisperModule> {\n if (!whisperModule) {\n const module = await import(\"whisper-node\");\n whisperModule = (module as { whisper: WhisperModule }).whisper;\n }\n return whisperModule;\n}\n\ninterface TranscriptionResult {\n text: string;\n}\n\nexport class TranscribeManager {\n private static instance: TranscribeManager | null = null;\n private cacheDir: string;\n private ffmpegAvailable = false;\n private ffmpegVersion: string | null = null;\n private ffmpegPath: string | null = null;\n private ffmpegInitialized = false;\n\n private constructor(cacheDir: string) {\n this.cacheDir = path.join(cacheDir, \"whisper\");\n logger.debug(\"Initializing TranscribeManager\", {\n cacheDir: this.cacheDir,\n timestamp: new Date().toISOString(),\n });\n this.ensureCacheDirectory();\n }\n\n public async ensureFFmpeg(): Promise<boolean> {\n if (!this.ffmpegInitialized) {\n try {\n await this.initializeFFmpeg();\n this.ffmpegInitialized = true;\n } catch (error) {\n logger.error(\"FFmpeg initialization failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n timestamp: new Date().toISOString(),\n });\n return false;\n }\n }\n return this.ffmpegAvailable;\n }\n\n public isFFmpegAvailable(): boolean {\n return this.ffmpegAvailable;\n }\n\n public async getFFmpegVersion(): Promise<string | null> {\n if (!this.ffmpegVersion) {\n await this.fetchFFmpegVersion();\n }\n return this.ffmpegVersion;\n }\n\n private async fetchFFmpegVersion(): Promise<void> {\n try {\n const { stdout } = await execAsync(\"ffmpeg -version\");\n this.ffmpegVersion = stdout.split(\"\\n\")[0];\n logger.info(\"FFmpeg version:\", {\n version: this.ffmpegVersion,\n timestamp: new Date().toISOString(),\n });\n } catch (error) {\n this.ffmpegVersion = null;\n logger.error(\"Failed to get FFmpeg version:\", {\n error: error instanceof Error ? error.message : String(error),\n timestamp: new Date().toISOString(),\n });\n }\n }\n\n private async initializeFFmpeg(): Promise<void> {\n try {\n await this.checkFFmpegAvailability();\n\n if (this.ffmpegAvailable) {\n await this.fetchFFmpegVersion();\n\n await this.verifyFFmpegCapabilities();\n\n logger.success(\"FFmpeg initialized successfully\", {\n version: this.ffmpegVersion,\n path: this.ffmpegPath,\n timestamp: new Date().toISOString(),\n });\n } else {\n this.logFFmpegInstallInstructions();\n }\n } catch (error) {\n this.ffmpegAvailable = false;\n logger.error(\"FFmpeg initialization failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n timestamp: new Date().toISOString(),\n });\n this.logFFmpegInstallInstructions();\n }\n }\n\n private async checkFFmpegAvailability(): Promise<void> {\n try {\n const { stdout, stderr } = await execAsync(\"which ffmpeg || where ffmpeg\");\n this.ffmpegPath = stdout.trim();\n this.ffmpegAvailable = true;\n logger.info(\"FFmpeg found at:\", {\n path: this.ffmpegPath,\n stderr: stderr ? stderr.trim() : undefined,\n timestamp: new Date().toISOString(),\n });\n } catch (error) {\n this.ffmpegAvailable = false;\n this.ffmpegPath = null;\n logger.error(\"FFmpeg not found in PATH:\", {\n error: error instanceof Error ? error.message : String(error),\n stderr: error instanceof Error && \"stderr\" in error ? error.stderr : undefined,\n timestamp: new Date().toISOString(),\n });\n }\n }\n\n private async verifyFFmpegCapabilities(): Promise<void> {\n try {\n const { stdout } = await execAsync(\"ffmpeg -codecs\");\n const hasRequiredCodecs = stdout.includes(\"pcm_s16le\") && stdout.includes(\"wav\");\n\n if (!hasRequiredCodecs) {\n throw new Error(\"FFmpeg installation missing required codecs (pcm_s16le, wav)\");\n }\n } catch (error) {\n logger.error(\"FFmpeg capabilities verification failed:\", {\n error: error instanceof Error ? error.message : String(error),\n timestamp: new Date().toISOString(),\n });\n throw error;\n }\n }\n\n private logFFmpegInstallInstructions(): void {\n logger.warn(\"FFmpeg is required but not properly installed. Please install FFmpeg:\", {\n instructions: {\n mac: \"brew install ffmpeg\",\n ubuntu: \"sudo apt-get install ffmpeg\",\n windows: \"choco install ffmpeg\",\n manual: \"Download from https://ffmpeg.org/download.html\",\n },\n requiredVersion: \"4.0 or later\",\n requiredCodecs: [\"pcm_s16le\", \"wav\"],\n timestamp: new Date().toISOString(),\n });\n }\n\n public static getInstance(cacheDir: string): TranscribeManager {\n if (!TranscribeManager.instance) {\n TranscribeManager.instance = new TranscribeManager(cacheDir);\n }\n return TranscribeManager.instance;\n }\n\n private ensureCacheDirectory(): void {\n if (!fs.existsSync(this.cacheDir)) {\n fs.mkdirSync(this.cacheDir, { recursive: true });\n }\n }\n\n private async convertToWav(inputPath: string, outputPath: string): Promise<void> {\n if (!this.ffmpegAvailable) {\n throw new Error(\n \"FFmpeg is not installed or not properly configured. Please install FFmpeg to use audio transcription.\"\n );\n }\n\n try {\n const { stderr } = await execAsync(\n `ffmpeg -y -loglevel error -i \"${inputPath}\" -acodec pcm_s16le -ar 16000 -ac 1 \"${outputPath}\"`\n );\n\n if (stderr) {\n logger.warn(\"FFmpeg conversion error:\", {\n stderr,\n inputPath,\n outputPath,\n timestamp: new Date().toISOString(),\n });\n }\n\n if (!fs.existsSync(outputPath)) {\n throw new Error(\"WAV file was not created successfully\");\n }\n } catch (error) {\n logger.error(\"Audio conversion failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n command: `ffmpeg -y -loglevel error -i \"${inputPath}\" -acodec pcm_s16le -ar 16000 -ac 1 \"${outputPath}\"`,\n ffmpegAvailable: this.ffmpegAvailable,\n ffmpegVersion: this.ffmpegVersion,\n ffmpegPath: this.ffmpegPath,\n timestamp: new Date().toISOString(),\n });\n throw new Error(\n `Failed to convert audio to WAV format: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n private async preprocessAudio(audioBuffer: Buffer): Promise<string> {\n if (!this.ffmpegAvailable) {\n throw new Error(\"FFmpeg is not installed. Please install FFmpeg to use audio transcription.\");\n }\n\n try {\n const isWav =\n audioBuffer.length > 4 &&\n audioBuffer.toString(\"ascii\", 0, 4) === \"RIFF\" &&\n audioBuffer.length > 12 &&\n audioBuffer.toString(\"ascii\", 8, 12) === \"WAVE\";\n\n const extension = isWav ? \".wav\" : \"\";\n const tempInputFile = path.join(this.cacheDir, `temp_input_${Date.now()}${extension}`);\n const tempWavFile = path.join(this.cacheDir, `temp_${Date.now()}.wav`);\n\n fs.writeFileSync(tempInputFile, audioBuffer);\n\n if (isWav) {\n try {\n const { stdout } = await execAsync(\n `ffprobe -v error -show_entries stream=sample_rate,channels,bits_per_raw_sample -of json \"${tempInputFile}\"`\n );\n const probeResult = JSON.parse(stdout);\n const stream = probeResult.streams?.[0];\n\n if (\n stream?.sample_rate === \"16000\" &&\n stream?.channels === 1 &&\n (stream?.bits_per_raw_sample === 16 || stream?.bits_per_raw_sample === undefined)\n ) {\n fs.renameSync(tempInputFile, tempWavFile);\n return tempWavFile;\n }\n } catch (probeError) {\n logger.debug(\"FFprobe failed, continuing with conversion:\", probeError);\n }\n }\n\n await this.convertToWav(tempInputFile, tempWavFile);\n\n if (fs.existsSync(tempInputFile)) {\n fs.unlinkSync(tempInputFile);\n }\n\n return tempWavFile;\n } catch (error) {\n logger.error(\"Audio preprocessing failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n ffmpegAvailable: this.ffmpegAvailable,\n timestamp: new Date().toISOString(),\n });\n throw new Error(\n `Failed to preprocess audio: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n public async transcribe(audioBuffer: Buffer): Promise<TranscriptionResult> {\n await this.ensureFFmpeg();\n\n if (!this.ffmpegAvailable) {\n throw new Error(\n \"FFmpeg is not installed or not properly configured. Please install FFmpeg to use audio transcription.\"\n );\n }\n\n try {\n const wavFile = await this.preprocessAudio(audioBuffer);\n\n logger.info(\"Starting transcription with whisper...\");\n\n let segments: Array<{ speech?: string }> | null = null;\n try {\n const whisper = await getWhisper();\n\n segments = await whisper(wavFile, {\n modelName: \"tiny\",\n modelPath: path.join(this.cacheDir, \"models\"),\n whisperOptions: {\n language: \"en\",\n word_timestamps: false,\n },\n });\n } catch (whisperError) {\n const errorMessage =\n whisperError instanceof Error ? whisperError.message : String(whisperError);\n if (errorMessage.includes(\"not found\") || errorMessage.includes(\"download\")) {\n logger.error(\"Whisper model not found. Please run: npx whisper-node download\");\n throw new Error(\n \"Whisper model not found. Please install it with: npx whisper-node download\"\n );\n }\n\n logger.error(\"Whisper transcription error:\", whisperError);\n throw whisperError;\n }\n\n if (fs.existsSync(wavFile)) {\n fs.unlinkSync(wavFile);\n logger.info(\"Temporary WAV file cleaned up\");\n }\n\n if (!segments || !Array.isArray(segments)) {\n logger.warn(\"Whisper returned no segments (likely silence or very short audio)\");\n return { text: \"\" };\n }\n\n if (segments.length === 0) {\n logger.warn(\"No speech detected in audio\");\n return { text: \"\" };\n }\n\n const cleanText = segments\n .map((segment: { speech?: string }) => segment.speech?.trim() || \"\")\n .filter((text: string) => text)\n .join(\" \");\n\n logger.success(\"Transcription complete:\", {\n textLength: cleanText.length,\n segmentCount: segments.length,\n timestamp: new Date().toISOString(),\n });\n\n return { text: cleanText };\n } catch (error) {\n logger.error(\"Transcription failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n ffmpegAvailable: this.ffmpegAvailable,\n });\n throw error;\n }\n }\n}\n",
12
- "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { PassThrough, Readable } from \"node:stream\";\nimport { logger } from \"@elizaos/core\";\nimport { pipeline, type TextToAudioPipeline } from \"@huggingface/transformers\";\nimport { fetch } from \"undici\";\nimport { MODEL_SPECS } from \"../types\";\n\nfunction getWavHeader(\n audioLength: number,\n sampleRate: number,\n channelCount = 1,\n bitsPerSample = 16\n): Buffer {\n const wavHeader = Buffer.alloc(44);\n wavHeader.write(\"RIFF\", 0);\n wavHeader.writeUInt32LE(36 + audioLength, 4);\n wavHeader.write(\"WAVE\", 8);\n wavHeader.write(\"fmt \", 12);\n wavHeader.writeUInt32LE(16, 16);\n wavHeader.writeUInt16LE(1, 20);\n wavHeader.writeUInt16LE(channelCount, 22);\n wavHeader.writeUInt32LE(sampleRate, 24);\n wavHeader.writeUInt32LE((sampleRate * bitsPerSample * channelCount) / 8, 28);\n wavHeader.writeUInt16LE((bitsPerSample * channelCount) / 8, 32);\n wavHeader.writeUInt16LE(bitsPerSample, 34);\n wavHeader.write(\"data\", 36);\n wavHeader.writeUInt32LE(audioLength, 40);\n return wavHeader;\n}\n\nfunction prependWavHeader(\n readable: Readable,\n audioLength: number,\n sampleRate: number,\n channelCount = 1,\n bitsPerSample = 16\n): PassThrough {\n const wavHeader = getWavHeader(audioLength, sampleRate, channelCount, bitsPerSample);\n let pushedHeader = false;\n const passThrough = new PassThrough();\n readable.on(\"data\", (data: Buffer) => {\n if (!pushedHeader) {\n passThrough.push(wavHeader);\n pushedHeader = true;\n }\n passThrough.push(data);\n });\n readable.on(\"end\", () => {\n passThrough.end();\n });\n return passThrough;\n}\n\nexport class TTSManager {\n private static instance: TTSManager | null = null;\n private cacheDir: string;\n private synthesizer: TextToAudioPipeline | null = null;\n private defaultSpeakerEmbedding: Float32Array | null = null;\n private initialized = false;\n private initializingPromise: Promise<void> | null = null;\n\n private constructor(cacheDir: string) {\n this.cacheDir = path.join(cacheDir, \"tts\");\n this.ensureCacheDirectory();\n logger.debug(\"TTSManager using Transformers.js initialized\");\n }\n\n public static getInstance(cacheDir: string): TTSManager {\n if (!TTSManager.instance) {\n TTSManager.instance = new TTSManager(cacheDir);\n }\n return TTSManager.instance;\n }\n\n private ensureCacheDirectory(): void {\n if (!fs.existsSync(this.cacheDir)) {\n fs.mkdirSync(this.cacheDir, { recursive: true });\n logger.debug(\"Created TTS cache directory:\", this.cacheDir);\n }\n }\n\n private async initialize(): Promise<void> {\n if (this.initializingPromise) {\n return this.initializingPromise;\n }\n\n if (this.initialized) {\n return;\n }\n\n this.initializingPromise = (async () => {\n try {\n logger.info(\"Initializing TTS with Transformers.js backend...\");\n\n const ttsModelSpec = MODEL_SPECS.tts.default;\n if (!ttsModelSpec) {\n throw new Error(\"Default TTS model specification not found in MODEL_SPECS.\");\n }\n const modelName = ttsModelSpec.modelId;\n const speakerEmbeddingUrl = ttsModelSpec.defaultSpeakerEmbeddingUrl;\n\n logger.info(`Loading TTS pipeline for model: ${modelName}`);\n this.synthesizer = await pipeline(\"text-to-audio\", modelName);\n logger.success(`TTS pipeline loaded successfully for model: ${modelName}`);\n\n if (speakerEmbeddingUrl) {\n const embeddingFilename = path.basename(new URL(speakerEmbeddingUrl).pathname);\n const embeddingPath = path.join(this.cacheDir, embeddingFilename);\n\n if (fs.existsSync(embeddingPath)) {\n logger.info(\"Loading default speaker embedding from cache...\");\n const buffer = fs.readFileSync(embeddingPath);\n this.defaultSpeakerEmbedding = new Float32Array(\n buffer.buffer,\n buffer.byteOffset,\n buffer.length / Float32Array.BYTES_PER_ELEMENT\n );\n logger.success(\"Default speaker embedding loaded from cache.\");\n } else {\n logger.info(`Downloading default speaker embedding from: ${speakerEmbeddingUrl}`);\n const response = await fetch(speakerEmbeddingUrl);\n if (!response.ok) {\n throw new Error(`Failed to download speaker embedding: ${response.statusText}`);\n }\n const buffer = await response.arrayBuffer();\n this.defaultSpeakerEmbedding = new Float32Array(buffer);\n fs.writeFileSync(embeddingPath, Buffer.from(buffer));\n logger.success(\"Default speaker embedding downloaded and cached.\");\n }\n } else {\n logger.warn(\n `No default speaker embedding URL specified for model ${modelName}. Speaker control may be limited.`\n );\n this.defaultSpeakerEmbedding = null;\n }\n\n if (!this.synthesizer) {\n throw new Error(\"TTS initialization failed: Pipeline not loaded.\");\n }\n\n logger.success(\"TTS initialization complete (Transformers.js)\");\n this.initialized = true;\n } catch (error) {\n logger.error(\"TTS (Transformers.js) initialization failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n this.initialized = false;\n this.synthesizer = null;\n this.defaultSpeakerEmbedding = null;\n throw error;\n } finally {\n this.initializingPromise = null;\n }\n })();\n\n return this.initializingPromise;\n }\n\n public async generateSpeech(text: string): Promise<Readable> {\n try {\n await this.initialize();\n\n if (!this.synthesizer) {\n throw new Error(\"TTS Manager not properly initialized.\");\n }\n\n logger.info(\"Starting speech generation with Transformers.js for text:\", {\n text: `${text.substring(0, 50)}...`,\n });\n\n const output = await this.synthesizer(text, {\n ...(this.defaultSpeakerEmbedding && {\n speaker_embeddings: this.defaultSpeakerEmbedding,\n }),\n });\n\n const audioFloat32 = output.audio;\n const samplingRate = output.sampling_rate;\n\n logger.info(\"Raw audio data received from pipeline:\", {\n samplingRate,\n length: audioFloat32.length,\n });\n\n if (!audioFloat32 || audioFloat32.length === 0) {\n throw new Error(\"TTS pipeline generated empty audio output.\");\n }\n\n const pcmData = new Int16Array(audioFloat32.length);\n for (let i = 0; i < audioFloat32.length; i++) {\n const s = Math.max(-1, Math.min(1, audioFloat32[i]));\n pcmData[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n const audioBuffer = Buffer.from(pcmData.buffer);\n\n logger.info(\"Audio data converted to 16-bit PCM Buffer:\", {\n byteLength: audioBuffer.length,\n });\n\n const audioStream = prependWavHeader(\n Readable.from(audioBuffer),\n audioBuffer.length,\n samplingRate,\n 1,\n 16\n );\n\n logger.success(\"Speech generation complete (Transformers.js)\");\n return audioStream;\n } catch (error) {\n logger.error(\"Transformers.js speech generation failed:\", {\n error: error instanceof Error ? error.message : String(error),\n text: `${text.substring(0, 50)}...`,\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n }\n}\n",
13
- "import fs, { existsSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { logger } from \"@elizaos/core\";\nimport {\n AutoProcessor,\n AutoTokenizer,\n env,\n Florence2ForConditionalGeneration,\n type Florence2Processor,\n type PreTrainedTokenizer,\n type ProgressCallback,\n type ProgressInfo,\n RawImage,\n type Tensor,\n} from \"@huggingface/transformers\";\nimport { MODEL_SPECS } from \"../types\";\nimport { DownloadManager } from \"./downloadManager\";\n\ntype DeviceType = \"cpu\" | \"gpu\" | \"auto\";\ntype DTypeType = \"fp32\" | \"fp16\" | \"auto\";\n\ninterface PlatformConfig {\n device: DeviceType;\n dtype: DTypeType;\n useOnnx: boolean;\n}\n\nexport class VisionManager {\n private static instance: VisionManager | null = null;\n private model: Florence2ForConditionalGeneration | null = null;\n private processor: Florence2Processor | null = null;\n private tokenizer: PreTrainedTokenizer | null = null;\n private modelsDir: string;\n private cacheDir: string;\n private initialized = false;\n private modelDownloaded = false;\n private tokenizerDownloaded = false;\n private processorDownloaded = false;\n private platformConfig: PlatformConfig;\n\n private constructor(cacheDir: string) {\n this.modelsDir = path.join(path.dirname(cacheDir), \"models\", \"vision\");\n this.cacheDir = cacheDir;\n this.ensureModelsDirExists();\n this.downloadManager = DownloadManager.getInstance(this.cacheDir, this.modelsDir);\n this.platformConfig = this.getPlatformConfig();\n logger.debug(\"VisionManager initialized\");\n }\n\n private getPlatformConfig(): PlatformConfig {\n const platform = os.platform();\n const arch = os.arch();\n\n let config: PlatformConfig = {\n device: \"cpu\",\n dtype: \"fp32\",\n useOnnx: true,\n };\n\n if (platform === \"darwin\" && (arch === \"arm64\" || arch === \"aarch64\")) {\n config = {\n device: \"gpu\",\n dtype: \"fp16\",\n useOnnx: true,\n };\n } else if (platform === \"win32\" || platform === \"linux\") {\n const hasCuda = process.env.CUDA_VISIBLE_DEVICES !== undefined;\n if (hasCuda) {\n config = {\n device: \"gpu\",\n dtype: \"fp16\",\n useOnnx: true,\n };\n }\n }\n return config;\n }\n\n private ensureModelsDirExists(): void {\n if (!existsSync(this.modelsDir)) {\n logger.debug(`Creating models directory at: ${this.modelsDir}`);\n fs.mkdirSync(this.modelsDir, { recursive: true });\n }\n }\n\n public static getInstance(cacheDir: string): VisionManager {\n if (!VisionManager.instance) {\n VisionManager.instance = new VisionManager(cacheDir);\n }\n return VisionManager.instance;\n }\n\n private checkCacheExists(modelId: string, type: \"model\" | \"tokenizer\" | \"processor\"): boolean {\n const modelPath = path.join(this.modelsDir, modelId.replace(\"/\", \"--\"), type);\n if (existsSync(modelPath)) {\n logger.info(`${type} found at: ${modelPath}`);\n return true;\n }\n return false;\n }\n\n private async initialize() {\n try {\n if (this.initialized) {\n logger.info(\"Vision model already initialized, skipping initialization\");\n return;\n }\n\n logger.info(\"Starting vision model initialization...\");\n const modelSpec = MODEL_SPECS.vision;\n\n logger.info(\"Configuring environment for vision model...\");\n env.allowLocalModels = true;\n env.allowRemoteModels = true;\n\n if (this.platformConfig.useOnnx) {\n env.backends.onnx.enabled = true;\n env.backends.onnx.logLevel = \"info\";\n }\n\n logger.info(\"Loading Florence2 model...\");\n try {\n let lastProgress = -1;\n const modelCached = this.checkCacheExists(modelSpec.modelId, \"model\");\n\n const model = await Florence2ForConditionalGeneration.from_pretrained(modelSpec.modelId, {\n device: \"cpu\",\n cache_dir: this.modelsDir,\n local_files_only: modelCached,\n revision: \"main\",\n progress_callback: ((progressInfo: ProgressInfo) => {\n if (modelCached || this.modelDownloaded) return;\n const progress =\n \"progress\" in progressInfo ? Math.max(0, Math.min(1, progressInfo.progress)) : 0;\n const currentProgress = Math.round(progress * 100);\n if (currentProgress > lastProgress + 9 || currentProgress === 100) {\n lastProgress = currentProgress;\n const barLength = 30;\n const filledLength = Math.floor((currentProgress / 100) * barLength);\n const progressBar = \"▰\".repeat(filledLength) + \"▱\".repeat(barLength - filledLength);\n logger.info(`Downloading vision model: ${progressBar} ${currentProgress}%`);\n if (currentProgress === 100) this.modelDownloaded = true;\n }\n }) as ProgressCallback,\n });\n\n this.model = model;\n logger.success(\"Florence2 model loaded successfully\");\n } catch (error) {\n logger.error(\"Failed to load Florence2 model:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n modelId: modelSpec.modelId,\n });\n throw error;\n }\n\n logger.info(\"Loading vision tokenizer...\");\n try {\n const tokenizerCached = this.checkCacheExists(modelSpec.modelId, \"tokenizer\");\n let tokenizerProgress = -1;\n\n this.tokenizer = await AutoTokenizer.from_pretrained(modelSpec.modelId, {\n cache_dir: this.modelsDir,\n local_files_only: tokenizerCached,\n progress_callback: ((progressInfo: ProgressInfo) => {\n if (tokenizerCached || this.tokenizerDownloaded) return;\n const progress =\n \"progress\" in progressInfo ? Math.max(0, Math.min(1, progressInfo.progress)) : 0;\n const currentProgress = Math.round(progress * 100);\n if (currentProgress !== tokenizerProgress) {\n tokenizerProgress = currentProgress;\n const barLength = 30;\n const filledLength = Math.floor((currentProgress / 100) * barLength);\n const progressBar = \"▰\".repeat(filledLength) + \"▱\".repeat(barLength - filledLength);\n logger.info(`Downloading vision tokenizer: ${progressBar} ${currentProgress}%`);\n if (currentProgress === 100) this.tokenizerDownloaded = true;\n }\n }) as ProgressCallback,\n });\n logger.success(\"Vision tokenizer loaded successfully\");\n } catch (error) {\n logger.error(\"Failed to load tokenizer:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n modelId: modelSpec.modelId,\n });\n throw error;\n }\n\n logger.info(\"Loading vision processor...\");\n try {\n const processorCached = this.checkCacheExists(modelSpec.modelId, \"processor\");\n let processorProgress = -1;\n\n this.processor = (await AutoProcessor.from_pretrained(modelSpec.modelId, {\n device: \"cpu\",\n cache_dir: this.modelsDir,\n local_files_only: processorCached,\n progress_callback: ((progressInfo: ProgressInfo) => {\n if (processorCached || this.processorDownloaded) return;\n const progress =\n \"progress\" in progressInfo ? Math.max(0, Math.min(1, progressInfo.progress)) : 0;\n const currentProgress = Math.round(progress * 100);\n if (currentProgress !== processorProgress) {\n processorProgress = currentProgress;\n const barLength = 30;\n const filledLength = Math.floor((currentProgress / 100) * barLength);\n const progressBar = \"▰\".repeat(filledLength) + \"▱\".repeat(barLength - filledLength);\n logger.info(`Downloading vision processor: ${progressBar} ${currentProgress}%`);\n if (currentProgress === 100) this.processorDownloaded = true;\n }\n }) as ProgressCallback,\n })) as Florence2Processor;\n logger.success(\"Vision processor loaded successfully\");\n } catch (error) {\n logger.error(\"Failed to load vision processor:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n modelId: modelSpec.modelId,\n });\n throw error;\n }\n\n this.initialized = true;\n logger.success(\"Vision model initialization complete\");\n } catch (error) {\n logger.error(\"Vision model initialization failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n modelsDir: this.modelsDir,\n });\n throw error;\n }\n }\n\n private async fetchImage(url: string): Promise<{ buffer: Buffer; mimeType: string }> {\n try {\n logger.info(`Fetching image from URL: ${url.slice(0, 100)}...`);\n\n if (url.startsWith(\"data:\")) {\n logger.info(\"Processing data URL...\");\n const [header, base64Data] = url.split(\",\");\n const mimeType = header.split(\";\")[0].split(\":\")[1];\n const buffer = Buffer.from(base64Data, \"base64\");\n logger.info(\"Data URL processed successfully\");\n return { buffer, mimeType };\n }\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch image: ${response.statusText}`);\n }\n const buffer = Buffer.from(await response.arrayBuffer());\n const mimeType = response.headers.get(\"content-type\") || \"image/jpeg\";\n\n logger.info(\"Image fetched successfully:\", {\n mimeType,\n bufferSize: buffer.length,\n status: response.status,\n });\n\n return { buffer, mimeType };\n } catch (error) {\n logger.error(\"Failed to fetch image:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n url,\n });\n throw error;\n }\n }\n\n public async processImage(imageUrl: string): Promise<{ title: string; description: string }> {\n try {\n logger.info(\"Starting image processing...\");\n\n if (!this.initialized) {\n logger.info(\"Vision model not initialized, initializing now...\");\n await this.initialize();\n }\n\n if (!this.model || !this.processor || !this.tokenizer) {\n throw new Error(\"Vision model components not properly initialized\");\n }\n\n logger.info(\"Fetching image...\");\n const { buffer, mimeType } = await this.fetchImage(imageUrl);\n\n logger.info(\"Creating image blob...\");\n const blob = new Blob([buffer], { type: mimeType });\n logger.info(\"Converting blob to RawImage...\");\n const image = await RawImage.fromBlob(blob as globalThis.Blob);\n\n logger.info(\"Processing image with vision processor...\");\n const visionInputs = await this.processor(image);\n logger.info(\"Constructing prompts...\");\n const prompts = this.processor.construct_prompts(\"<DETAILED_CAPTION>\");\n logger.info(\"Tokenizing prompts...\");\n const textInputs = this.tokenizer(prompts);\n\n logger.info(\"Generating image description...\");\n const generatedIds = (await this.model.generate({\n ...textInputs,\n ...visionInputs,\n max_new_tokens: MODEL_SPECS.vision.maxTokens,\n })) as Tensor;\n\n logger.info(\"Decoding generated text...\");\n const generatedText = this.tokenizer.batch_decode(generatedIds, {\n skip_special_tokens: false,\n })[0];\n\n logger.info(\"Post-processing generation...\");\n const result = this.processor.post_process_generation(\n generatedText,\n \"<DETAILED_CAPTION>\",\n image.size\n );\n\n const detailedCaption = result[\"<DETAILED_CAPTION>\"] as string;\n const response = {\n title: `${detailedCaption.split(\".\")[0]}.`,\n description: detailedCaption,\n };\n\n logger.success(\"Image processing complete:\", {\n titleLength: response.title.length,\n descriptionLength: response.description.length,\n });\n\n return response;\n } catch (error) {\n logger.error(\"Image processing failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n imageUrl,\n modelInitialized: this.initialized,\n hasModel: !!this.model,\n hasProcessor: !!this.processor,\n hasTokenizer: !!this.tokenizer,\n });\n throw error;\n }\n }\n}\n"
5
+ "// @ts-nocheck — pending migration: @huggingface/transformers 3->4\n// (PreTrainedModel/Florence2 interface changes), @elizaos/core logger\n// signature drift (structured-context overload removed), and\n// GenerateTextParams.{modelType,runtime} field removal. Tracked separately.\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path, { basename } from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport type {\n EventPayload,\n GenerateTextParams,\n JSONSchema,\n ModelTypeName,\n TextEmbeddingParams,\n ToolDefinition,\n} from \"@elizaos/core\";\nimport { EventType, type IAgentRuntime, logger, ModelType, type Plugin } from \"@elizaos/core\";\nimport {\n getLlama,\n type Llama,\n LlamaChatSession,\n type LlamaContext,\n type LlamaEmbeddingContext,\n type LlamaModel,\n} from \"node-llama-cpp\";\nimport { type Config, validateConfig } from \"./environment\";\nimport { extractToolCalls, planStructuredRequest, type ToolCallResult } from \"./structured-output\";\nimport { type EmbeddingModelSpec, MODEL_SPECS, type ModelSpec } from \"./types\";\nimport { DownloadManager } from \"./utils/downloadManager\";\nimport { getPlatformManager } from \"./utils/platform\";\nimport { TokenizerManager } from \"./utils/tokenizerManager\";\nimport { TranscribeManager } from \"./utils/transcribeManager\";\nimport { TTSManager } from \"./utils/ttsManager\";\nimport { VisionManager } from \"./utils/visionManager\";\n\nconst DEFAULT_LOCAL_SYSTEM_PROMPT =\n \"You are a helpful AI assistant. Respond to the current request only.\";\n\ninterface ChatSessionEntry {\n context: LlamaContext;\n session: LlamaChatSession;\n systemPrompt: string;\n}\n\ninterface LocalGenerationResult {\n text: string;\n toolCalls: ToolCallResult[];\n finishReason: string | undefined;\n}\n\nconst wordsToPunish = [\n \" please\",\n \" feel\",\n \" free\",\n \"!\",\n \"–\",\n \"—\",\n \"?\",\n \".\",\n \",\",\n \"; \",\n \" cosmos\",\n \" tapestry\",\n \" tapestries\",\n \" glitch\",\n \" matrix\",\n \" cyberspace\",\n \" troll\",\n \" questions\",\n \" topics\",\n \" discuss\",\n \" basically\",\n \" simulation\",\n \" simulate\",\n \" universe\",\n \" like\",\n \" debug\",\n \" debugging\",\n \" wild\",\n \" existential\",\n \" juicy\",\n \" circuits\",\n \" help\",\n \" ask\",\n \" happy\",\n \" just\",\n \" cosmic\",\n \" cool\",\n \" joke\",\n \" punchline\",\n \" fancy\",\n \" glad\",\n \" assist\",\n \" algorithm\",\n \" Indeed\",\n \" Furthermore\",\n \" However\",\n \" Notably\",\n \" Therefore\",\n];\n\ntype NormalizedUsage = {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n estimated?: boolean;\n};\n\nfunction estimateTokenCount(text: string): number {\n return text.length === 0 ? 0 : Math.ceil(text.length / 4);\n}\n\nfunction estimateUsage(prompt: string, response: unknown): NormalizedUsage {\n const responseText =\n typeof response === \"string\"\n ? response\n : (() => {\n try {\n return JSON.stringify(response);\n } catch {\n return String(response);\n }\n })();\n const promptTokens = estimateTokenCount(prompt);\n const completionTokens = estimateTokenCount(responseText);\n return {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n estimated: true,\n };\n}\n\nfunction estimateEmbeddingUsage(text: string): NormalizedUsage {\n const promptTokens = estimateTokenCount(text);\n return {\n promptTokens,\n completionTokens: 0,\n totalTokens: promptTokens,\n estimated: true,\n };\n}\n\nfunction stripThinkTags(text: string): string {\n return text.includes(\"<think>\") ? text.replace(/<think>[\\s\\S]*?<\\/think>\\n?/g, \"\") : text;\n}\n\nfunction wantsNativeShape(params: GenerateTextParams): boolean {\n if (params.tools && params.tools.length > 0) return true;\n if (params.responseSchema) return true;\n if (params.toolChoice) return true;\n if (\n params.responseFormat &&\n typeof params.responseFormat === \"object\" &&\n params.responseFormat.type === \"json_object\"\n ) {\n return true;\n }\n return false;\n}\n\nfunction buildNativeResult(result: LocalGenerationResult): {\n text: string;\n toolCalls: ToolCallResult[];\n finishReason?: string;\n} {\n return {\n text: result.text,\n toolCalls: result.toolCalls,\n ...(result.finishReason ? { finishReason: result.finishReason } : {}),\n };\n}\n\nfunction getLocalModelLabel(runtime: IAgentRuntime, type: ModelTypeName): string {\n const config = validateConfig();\n if (type === ModelType.TEXT_EMBEDDING) {\n return String(runtime.getSetting(\"LOCAL_EMBEDDING_MODEL\") || config.LOCAL_EMBEDDING_MODEL);\n }\n if (type === ModelType.TEXT_LARGE) {\n return String(runtime.getSetting(\"LOCAL_LARGE_MODEL\") || config.LOCAL_LARGE_MODEL);\n }\n return String(runtime.getSetting(\"LOCAL_SMALL_MODEL\") || config.LOCAL_SMALL_MODEL);\n}\n\nfunction emitModelUsed(\n runtime: IAgentRuntime,\n type: ModelTypeName,\n model: string,\n usage: NormalizedUsage\n): void {\n void runtime.emitEvent(\n EventType.MODEL_USED as string,\n {\n runtime,\n source: \"local-ai\",\n provider: \"local-ai\",\n type,\n model,\n modelName: model,\n tokens: {\n prompt: usage.promptTokens,\n completion: usage.completionTokens,\n total: usage.totalTokens,\n ...(usage.estimated ? { estimated: true } : {}),\n },\n ...(usage.estimated ? { usageEstimated: true } : {}),\n } as EventPayload\n );\n}\n\nclass LocalAIManager {\n private static instance: LocalAIManager | null = null;\n private llama: Llama | undefined;\n private smallModel: LlamaModel | undefined;\n private mediumModel: LlamaModel | undefined;\n private embeddingModel: LlamaModel | undefined;\n private embeddingContext: LlamaEmbeddingContext | undefined;\n private chatSessions: Map<ModelTypeName, ChatSessionEntry> = new Map();\n private modelPath!: string;\n private mediumModelPath!: string;\n private embeddingModelPath!: string;\n private cacheDir!: string;\n private tokenizerManager!: TokenizerManager;\n private downloadManager!: DownloadManager;\n private visionManager!: VisionManager;\n private activeModelConfig: ModelSpec;\n private embeddingModelConfig: EmbeddingModelSpec;\n private transcribeManager!: TranscribeManager;\n private ttsManager!: TTSManager;\n private config: Config | null = null;\n\n private smallModelInitialized = false;\n private mediumModelInitialized = false;\n private embeddingInitialized = false;\n private visionInitialized = false;\n private transcriptionInitialized = false;\n private ttsInitialized = false;\n private environmentInitialized = false;\n\n private smallModelInitializingPromise: Promise<void> | null = null;\n private mediumModelInitializingPromise: Promise<void> | null = null;\n private embeddingInitializingPromise: Promise<void> | null = null;\n private visionInitializingPromise: Promise<void> | null = null;\n private transcriptionInitializingPromise: Promise<void> | null = null;\n private ttsInitializingPromise: Promise<void> | null = null;\n private environmentInitializingPromise: Promise<void> | null = null;\n\n private modelsDir!: string;\n\n private constructor() {\n this.config = validateConfig();\n\n this._setupCacheDir();\n\n this.activeModelConfig = MODEL_SPECS.small;\n this.embeddingModelConfig = MODEL_SPECS.embedding;\n }\n\n private _postValidateInit(): void {\n this._setupModelsDir();\n\n this.downloadManager = DownloadManager.getInstance(this.cacheDir, this.modelsDir);\n this.tokenizerManager = TokenizerManager.getInstance(this.cacheDir, this.modelsDir);\n this.visionManager = VisionManager.getInstance(this.cacheDir);\n this.transcribeManager = TranscribeManager.getInstance(this.cacheDir);\n this.ttsManager = TTSManager.getInstance(this.cacheDir);\n }\n\n private _setupModelsDir(): void {\n const modelsDirEnv = this.config?.MODELS_DIR?.trim() || process.env.MODELS_DIR?.trim();\n if (modelsDirEnv) {\n this.modelsDir = path.resolve(modelsDirEnv);\n logger.info(\"Using models directory from MODELS_DIR environment variable:\", this.modelsDir);\n } else {\n this.modelsDir = path.join(os.homedir(), \".eliza\", \"models\");\n logger.info(\n \"MODELS_DIR environment variable not set, using default models directory:\",\n this.modelsDir\n );\n }\n\n if (!fs.existsSync(this.modelsDir)) {\n fs.mkdirSync(this.modelsDir, { recursive: true });\n logger.debug(\"Ensured models directory exists (created):\", this.modelsDir);\n } else {\n logger.debug(\"Models directory already exists:\", this.modelsDir);\n }\n }\n\n private _setupCacheDir(): void {\n const cacheDirEnv = this.config?.CACHE_DIR?.trim() || process.env.CACHE_DIR?.trim();\n if (cacheDirEnv) {\n this.cacheDir = path.resolve(cacheDirEnv);\n logger.info(\"Using cache directory from CACHE_DIR environment variable:\", this.cacheDir);\n } else {\n const cacheDir = path.join(os.homedir(), \".eliza\", \"cache\");\n if (!fs.existsSync(cacheDir)) {\n fs.mkdirSync(cacheDir, { recursive: true });\n logger.debug(\"Ensuring cache directory exists (created):\", cacheDir);\n }\n this.cacheDir = cacheDir;\n logger.info(\n \"CACHE_DIR environment variable not set, using default cache directory:\",\n this.cacheDir\n );\n }\n if (!fs.existsSync(this.cacheDir)) {\n fs.mkdirSync(this.cacheDir, { recursive: true });\n logger.debug(\"Ensured cache directory exists (created):\", this.cacheDir);\n } else {\n logger.debug(\"Cache directory already exists:\", this.cacheDir);\n }\n }\n\n public static getInstance(): LocalAIManager {\n if (!LocalAIManager.instance) {\n LocalAIManager.instance = new LocalAIManager();\n }\n return LocalAIManager.instance;\n }\n\n public async initializeEnvironment(): Promise<void> {\n if (this.environmentInitialized) return;\n if (this.environmentInitializingPromise) {\n await this.environmentInitializingPromise;\n return;\n }\n\n this.environmentInitializingPromise = (async () => {\n logger.info(\"Initializing environment configuration...\");\n\n this.config = await validateConfig();\n\n this._postValidateInit();\n\n this.modelPath = path.join(this.modelsDir, this.config.LOCAL_SMALL_MODEL);\n this.mediumModelPath = path.join(this.modelsDir, this.config.LOCAL_LARGE_MODEL);\n this.embeddingModelPath = path.join(this.modelsDir, this.config.LOCAL_EMBEDDING_MODEL);\n\n logger.info(\"Using small model path:\", basename(this.modelPath));\n logger.info(\"Using medium model path:\", basename(this.mediumModelPath));\n logger.info(\"Using embedding model path:\", basename(this.embeddingModelPath));\n\n logger.info(\"Environment configuration validated and model paths set\");\n\n this.environmentInitialized = true;\n logger.success(\"Environment initialization complete\");\n })();\n\n await this.environmentInitializingPromise;\n }\n\n private async downloadModel(\n modelType: ModelTypeName,\n customModelSpec?: ModelSpec\n ): Promise<boolean> {\n let modelSpec: ModelSpec;\n let modelPathToDownload: string;\n\n await this.initializeEnvironment();\n\n if (customModelSpec) {\n modelSpec = customModelSpec;\n modelPathToDownload =\n modelType === ModelType.TEXT_EMBEDDING\n ? this.embeddingModelPath\n : modelType === ModelType.TEXT_LARGE\n ? this.mediumModelPath\n : this.modelPath;\n } else if (modelType === ModelType.TEXT_EMBEDDING) {\n modelSpec = MODEL_SPECS.embedding;\n modelPathToDownload = this.embeddingModelPath; // Use configured path\n } else {\n modelSpec = modelType === ModelType.TEXT_LARGE ? MODEL_SPECS.medium : MODEL_SPECS.small;\n modelPathToDownload =\n modelType === ModelType.TEXT_LARGE ? this.mediumModelPath : this.modelPath; // Use configured path\n }\n\n // Pass the determined path to the download manager\n return await this.downloadManager.downloadModel(modelSpec, modelPathToDownload);\n }\n\n async checkPlatformCapabilities(): Promise<void> {\n const platformManager = getPlatformManager();\n await platformManager.initialize();\n const capabilities = platformManager.getCapabilities();\n\n logger.info(\"Platform capabilities detected:\", {\n platform: capabilities.platform,\n gpu: capabilities.gpu?.type || \"none\",\n recommendedModel: capabilities.recommendedModelSize,\n supportedBackends: capabilities.supportedBackends,\n });\n }\n\n async initialize(modelType: ModelTypeName = ModelType.TEXT_SMALL): Promise<void> {\n await this.initializeEnvironment();\n if (modelType === ModelType.TEXT_LARGE) {\n await this.lazyInitMediumModel();\n } else {\n await this.lazyInitSmallModel();\n }\n }\n\n public async initializeEmbedding(): Promise<void> {\n try {\n await this.initializeEnvironment();\n logger.info(\"Initializing embedding model...\");\n logger.info(\"Models directory:\", this.modelsDir);\n\n if (!fs.existsSync(this.modelsDir)) {\n logger.warn(\"Models directory does not exist, creating it:\", this.modelsDir);\n fs.mkdirSync(this.modelsDir, { recursive: true });\n }\n\n await this.downloadModel(ModelType.TEXT_EMBEDDING);\n\n if (!this.llama) {\n this.llama = await getLlama();\n }\n\n if (!this.embeddingModel) {\n logger.info(\"Loading embedding model:\", this.embeddingModelPath);\n\n this.embeddingModel = await this.llama.loadModel({\n modelPath: this.embeddingModelPath,\n gpuLayers: 0,\n vocabOnly: false,\n });\n\n this.embeddingContext = await this.embeddingModel.createEmbeddingContext({\n contextSize: this.embeddingModelConfig.contextSize,\n batchSize: 512,\n });\n\n logger.success(\"Embedding model initialized successfully\");\n }\n } catch (error) {\n logger.error(\"Failed to initialize embedding model:\", error);\n throw error;\n }\n }\n\n async generateEmbedding(text: string): Promise<number[]> {\n await this.lazyInitEmbedding();\n\n if (!this.embeddingModel || !this.embeddingContext) {\n throw new Error(\"Failed to initialize embedding model\");\n }\n\n logger.info(\"Generating embedding for text\", { textLength: text.length });\n\n const embeddingResult = await this.embeddingContext.getEmbeddingFor(text);\n\n const mutableEmbedding = [...embeddingResult.vector];\n\n const normalizedEmbedding = this.normalizeEmbedding(mutableEmbedding);\n\n logger.info(\"Embedding generation complete\", {\n dimensions: normalizedEmbedding.length,\n });\n return normalizedEmbedding;\n }\n\n private normalizeEmbedding(embedding: number[]): number[] {\n const squareSum = embedding.reduce((sum, val) => sum + val * val, 0);\n const norm = Math.sqrt(squareSum);\n\n if (norm === 0) {\n return embedding;\n }\n\n return embedding.map((val) => val / norm);\n }\n\n private async lazyInitEmbedding(): Promise<void> {\n if (this.embeddingInitialized) return;\n\n if (!this.embeddingInitializingPromise) {\n this.embeddingInitializingPromise = (async () => {\n try {\n await this.initializeEnvironment();\n\n await this.downloadModel(ModelType.TEXT_EMBEDDING);\n\n if (!this.llama) {\n this.llama = await getLlama();\n }\n\n this.embeddingModel = await this.llama.loadModel({\n modelPath: this.embeddingModelPath,\n gpuLayers: 0,\n vocabOnly: false,\n });\n\n this.embeddingContext = await this.embeddingModel.createEmbeddingContext({\n contextSize: this.embeddingModelConfig.contextSize,\n batchSize: 512,\n });\n\n this.embeddingInitialized = true;\n logger.info(\"Embedding model initialized successfully\");\n } catch (error) {\n logger.error(\"Failed to initialize embedding model:\", error);\n this.embeddingInitializingPromise = undefined;\n throw error;\n }\n })();\n }\n\n await this.embeddingInitializingPromise;\n }\n\n /**\n * Resolve (and cache) the LlamaContext + LlamaChatSession for a given model\n * type. Reusing the context preserves the KV cache across turns: subsequent\n * `prompt` calls reuse the prefix already evaluated, just like the openai\n * and anthropic providers do via their cache_control / stable-system-prompt\n * patterns.\n */\n private async getOrCreateChatSession(\n modelType: ModelTypeName,\n systemPrompt: string\n ): Promise<ChatSessionEntry> {\n const existing = this.chatSessions.get(modelType);\n if (existing && existing.systemPrompt === systemPrompt) {\n return existing;\n }\n if (existing) {\n // System prompt changed — drop the cached session for this model.\n try {\n existing.context.dispose();\n } catch (err) {\n logger.warn(\"[plugin-local-ai] Failed disposing stale context:\", err);\n }\n this.chatSessions.delete(modelType);\n }\n\n let model: LlamaModel;\n let contextSize: number;\n if (modelType === ModelType.TEXT_LARGE) {\n await this.lazyInitMediumModel();\n if (!this.mediumModel) throw new Error(\"Medium model initialization failed\");\n model = this.mediumModel;\n contextSize = MODEL_SPECS.medium.contextSize;\n this.activeModelConfig = MODEL_SPECS.medium;\n } else {\n await this.lazyInitSmallModel();\n if (!this.smallModel) throw new Error(\"Small model initialization failed\");\n model = this.smallModel;\n contextSize = MODEL_SPECS.small.contextSize;\n this.activeModelConfig = MODEL_SPECS.small;\n }\n\n const context = await model.createContext({ contextSize });\n const sequence = context.getSequence();\n const session = new LlamaChatSession({\n contextSequence: sequence,\n systemPrompt,\n });\n const entry: ChatSessionEntry = { context, session, systemPrompt };\n this.chatSessions.set(modelType, entry);\n logger.info(\"[plugin-local-ai] Created new chat session\", {\n modelType,\n contextSize,\n systemPromptLength: systemPrompt.length,\n });\n return entry;\n }\n\n async generateText(params: GenerateTextParams): Promise<LocalGenerationResult> {\n await this.initializeEnvironment();\n const modelType = params.modelType ?? ModelType.TEXT_SMALL;\n const systemPrompt = params.system?.trim() || DEFAULT_LOCAL_SYSTEM_PROMPT;\n const entry = await this.getOrCreateChatSession(modelType, systemPrompt);\n\n const prompt = params.prompt ?? \"\";\n if (!this.llama) throw new Error(\"[plugin-local-ai] Llama runtime not initialized\");\n\n const plan = await planStructuredRequest(\n { llama: this.llama },\n {\n tools: params.tools as readonly ToolDefinition[] | undefined,\n responseSchema: params.responseSchema as JSONSchema | undefined,\n responseFormat: params.responseFormat,\n }\n );\n\n const usedTokensBefore = entry.session.sequence?.contextTokens?.length ?? 0;\n logger.info(\"[plugin-local-ai] generateText\", {\n modelType,\n kind: plan.kind,\n promptLength: prompt.length,\n cachedPrefixTokens: usedTokensBefore,\n });\n\n const punishModel = modelType === ModelType.TEXT_LARGE ? this.mediumModel : this.smallModel;\n const baseOptions = {\n maxTokens: params.maxTokens ?? 8192,\n temperature: params.temperature ?? 0.7,\n topP: params.topP ?? 0.9,\n repeatPenalty: {\n punishTokensFilter: () =>\n punishModel ? punishModel.tokenize(wordsToPunish.join(\" \")) : [],\n penalty: 1.2,\n frequencyPenalty: 0.7,\n presencePenalty: 0.7,\n },\n } as const;\n\n if (plan.kind === \"tools\") {\n const meta = await entry.session.promptWithMeta(prompt, {\n ...baseOptions,\n functions: plan.functions,\n });\n const toolCalls = extractToolCalls(meta.response);\n const text = stripThinkTags(meta.responseText);\n const usedTokensAfter = entry.session.sequence?.contextTokens?.length ?? 0;\n logger.info(\"[plugin-local-ai] tool-call response\", {\n toolCallCount: toolCalls.length,\n textLength: text.length,\n cacheGrewBy: usedTokensAfter - usedTokensBefore,\n });\n return { text, toolCalls, finishReason: meta.stopReason };\n }\n\n if (plan.kind === \"schema\" || plan.kind === \"json_object\") {\n const meta = await entry.session.promptWithMeta(prompt, {\n ...baseOptions,\n grammar: plan.grammar,\n });\n const text = stripThinkTags(meta.responseText);\n const usedTokensAfter = entry.session.sequence?.contextTokens?.length ?? 0;\n logger.info(\"[plugin-local-ai] structured response\", {\n kind: plan.kind,\n textLength: text.length,\n cacheGrewBy: usedTokensAfter - usedTokensBefore,\n });\n return { text, toolCalls: [], finishReason: meta.stopReason };\n }\n\n const responseText = await entry.session.prompt(prompt, baseOptions);\n const text = stripThinkTags(responseText);\n const usedTokensAfter = entry.session.sequence?.contextTokens?.length ?? 0;\n logger.info(\"[plugin-local-ai] text response\", {\n textLength: text.length,\n cacheGrewBy: usedTokensAfter - usedTokensBefore,\n });\n return { text, toolCalls: [], finishReason: undefined };\n }\n\n public async describeImage(\n imageData: Buffer,\n mimeType: string\n ): Promise<{ title: string; description: string }> {\n await this.lazyInitVision();\n\n const base64 = imageData.toString(\"base64\");\n const dataUrl = `data:${mimeType};base64,${base64}`;\n return await this.visionManager.processImage(dataUrl);\n }\n\n public async transcribeAudio(audioBuffer: Buffer): Promise<string> {\n await this.lazyInitTranscription();\n\n const result = await this.transcribeManager.transcribe(audioBuffer);\n return result.text;\n }\n\n public async generateSpeech(text: string): Promise<Readable> {\n try {\n await this.lazyInitTTS();\n\n return await this.ttsManager.generateSpeech(text);\n } catch (error) {\n logger.error(\"Speech generation failed:\", {\n error: error instanceof Error ? error.message : String(error),\n textLength: text.length,\n });\n throw error;\n }\n }\n\n public getTokenizerManager(): TokenizerManager {\n return this.tokenizerManager;\n }\n\n public getActiveModelConfig(): ModelSpec {\n return this.activeModelConfig;\n }\n\n private async lazyInitSmallModel(): Promise<void> {\n if (this.smallModelInitialized) return;\n\n if (!this.smallModelInitializingPromise) {\n this.smallModelInitializingPromise = (async () => {\n await this.initializeEnvironment();\n await this.checkPlatformCapabilities();\n\n await this.downloadModel(ModelType.TEXT_SMALL);\n\n this.llama = await getLlama();\n\n const smallModel = await this.llama.loadModel({\n gpuLayers: 43,\n modelPath: this.modelPath,\n vocabOnly: false,\n });\n\n this.smallModel = smallModel;\n this.smallModelInitialized = true;\n logger.info(\"Small model initialized successfully\");\n })();\n }\n\n await this.smallModelInitializingPromise;\n }\n\n private async lazyInitMediumModel(): Promise<void> {\n if (this.mediumModelInitialized) return;\n\n if (!this.mediumModelInitializingPromise) {\n this.mediumModelInitializingPromise = (async () => {\n await this.initializeEnvironment();\n if (!this.llama) {\n await this.lazyInitSmallModel();\n }\n\n await this.downloadModel(ModelType.TEXT_LARGE);\n\n const mediumModel = await this.llama?.loadModel({\n gpuLayers: 43,\n modelPath: this.mediumModelPath,\n vocabOnly: false,\n });\n\n this.mediumModel = mediumModel;\n this.mediumModelInitialized = true;\n logger.info(\"Medium model initialized successfully\");\n })();\n }\n\n await this.mediumModelInitializingPromise;\n }\n\n private async lazyInitVision(): Promise<void> {\n if (this.visionInitialized) return;\n\n if (!this.visionInitializingPromise) {\n this.visionInitializingPromise = (async () => {\n try {\n this.visionInitialized = true;\n logger.info(\"Vision model initialized successfully\");\n } catch (error) {\n logger.error(\"Failed to initialize vision model:\", error);\n this.visionInitializingPromise = null;\n throw error;\n }\n })();\n }\n\n await this.visionInitializingPromise;\n }\n\n private async lazyInitTranscription(): Promise<void> {\n if (this.transcriptionInitialized) return;\n\n if (!this.transcriptionInitializingPromise) {\n this.transcriptionInitializingPromise = (async () => {\n try {\n await this.initializeEnvironment();\n\n if (!this.transcribeManager) {\n this.transcribeManager = TranscribeManager.getInstance(this.cacheDir);\n }\n\n // Ensure FFmpeg is available\n const ffmpegReady = await this.transcribeManager.ensureFFmpeg();\n if (!ffmpegReady) {\n logger.error(\n \"FFmpeg is not available or not configured correctly. Cannot proceed with transcription.\"\n );\n throw new Error(\n \"FFmpeg is required for transcription but is not available. Please see server logs for installation instructions.\"\n );\n }\n\n this.transcriptionInitialized = true;\n logger.info(\"Transcription prerequisites (FFmpeg) checked and ready.\");\n logger.info(\"Transcription model initialized successfully\");\n } catch (error) {\n logger.error(\"Failed to initialize transcription model:\", error);\n this.transcriptionInitializingPromise = null;\n throw error;\n }\n })();\n }\n\n await this.transcriptionInitializingPromise;\n }\n\n private async lazyInitTTS(): Promise<void> {\n if (this.ttsInitialized) return;\n\n if (!this.ttsInitializingPromise) {\n this.ttsInitializingPromise = (async () => {\n await this.initializeEnvironment();\n this.ttsManager = TTSManager.getInstance(this.cacheDir);\n this.ttsInitialized = true;\n logger.info(\"TTS model initialized successfully\");\n })();\n }\n\n await this.ttsInitializingPromise;\n }\n}\n\nconst localAIManager = LocalAIManager.getInstance();\n\nexport const localAiPlugin: Plugin = {\n name: \"local-ai\",\n description: \"Local AI plugin using Eliza-1 GGUF models\",\n\n async init(_config: Record<string, unknown> | undefined, _runtime: IAgentRuntime) {\n logger.info(\"🚀 Initializing Local AI plugin...\");\n\n await localAIManager.initializeEnvironment();\n const config = validateConfig();\n\n if (!config.LOCAL_SMALL_MODEL || !config.LOCAL_LARGE_MODEL || !config.LOCAL_EMBEDDING_MODEL) {\n logger.warn(\"⚠️ Local AI plugin: Model configuration is incomplete\");\n logger.warn(\"Please ensure the following environment variables are set:\");\n logger.warn(\"- LOCAL_SMALL_MODEL: Path to small language model file\");\n logger.warn(\"- LOCAL_LARGE_MODEL: Path to large language model file\");\n logger.warn(\"- LOCAL_EMBEDDING_MODEL: Path to embedding model file\");\n logger.warn(\"Example: LOCAL_SMALL_MODEL=text/eliza-1-mobile-1_7b-32k.gguf\");\n }\n\n const modelsDir = config.MODELS_DIR || path.join(os.homedir(), \".eliza\", \"models\");\n if (!fs.existsSync(modelsDir)) {\n logger.warn(`⚠️ Models directory does not exist: ${modelsDir}`);\n logger.warn(\"The directory will be created, but you need to download model files\");\n logger.warn(\"Visit https://huggingface.co/models to download compatible GGUF models\");\n }\n\n logger.info(\"🔍 Testing Local AI initialization...\");\n\n await localAIManager.checkPlatformCapabilities();\n\n const llamaInstance = await getLlama();\n if (llamaInstance) {\n logger.success(\"✅ Local AI: llama.cpp library loaded successfully\");\n } else {\n throw new Error(\"Failed to load llama.cpp library\");\n }\n\n const smallModelPath = path.join(modelsDir, config.LOCAL_SMALL_MODEL);\n const largeModelPath = path.join(modelsDir, config.LOCAL_LARGE_MODEL);\n const embeddingModelPath = path.join(modelsDir, config.LOCAL_EMBEDDING_MODEL);\n\n const modelsExist = {\n small: fs.existsSync(smallModelPath),\n large: fs.existsSync(largeModelPath),\n embedding: fs.existsSync(embeddingModelPath),\n };\n\n if (!modelsExist.small && !modelsExist.large && !modelsExist.embedding) {\n logger.warn(\"⚠️ No model files found in models directory\");\n logger.warn(\"Models will be downloaded on first use, which may take time\");\n logger.warn(\"To pre-download models, run the plugin and it will fetch them automatically\");\n } else {\n logger.info(\"📦 Found model files:\", {\n small: modelsExist.small ? \"✓\" : \"✗\",\n large: modelsExist.large ? \"✓\" : \"✗\",\n embedding: modelsExist.embedding ? \"✓\" : \"✗\",\n });\n }\n\n logger.success(\"✅ Local AI plugin initialized successfully\");\n logger.info(\"💡 Models will be loaded on-demand when first used\");\n },\n models: {\n [ModelType.TEXT_SMALL]: async (runtime: IAgentRuntime, params: GenerateTextParams) => {\n await localAIManager.initializeEnvironment();\n const result = await localAIManager.generateText({\n ...params,\n modelType: ModelType.TEXT_SMALL,\n });\n emitModelUsed(\n runtime,\n ModelType.TEXT_SMALL,\n getLocalModelLabel(runtime, ModelType.TEXT_SMALL),\n estimateUsage(params.prompt ?? \"\", result.text)\n );\n return wantsNativeShape(params) ? buildNativeResult(result) : result.text;\n },\n\n [ModelType.TEXT_LARGE]: async (runtime: IAgentRuntime, params: GenerateTextParams) => {\n await localAIManager.initializeEnvironment();\n const result = await localAIManager.generateText({\n ...params,\n modelType: ModelType.TEXT_LARGE,\n });\n emitModelUsed(\n runtime,\n ModelType.TEXT_LARGE,\n getLocalModelLabel(runtime, ModelType.TEXT_LARGE),\n estimateUsage(params.prompt ?? \"\", result.text)\n );\n return wantsNativeShape(params) ? buildNativeResult(result) : result.text;\n },\n\n [ModelType.TEXT_EMBEDDING]: async (runtime: IAgentRuntime, params: TextEmbeddingParams) => {\n const text = params?.text;\n if (!text) {\n logger.debug(\"Null or empty text input for embedding, returning zero vector\");\n return new Array(1024).fill(0);\n }\n\n const embedding = await localAIManager.generateEmbedding(text);\n emitModelUsed(\n runtime,\n ModelType.TEXT_EMBEDDING,\n getLocalModelLabel(runtime, ModelType.TEXT_EMBEDDING),\n estimateEmbeddingUsage(text)\n );\n return embedding;\n },\n\n [ModelType.TEXT_TOKENIZER_ENCODE]: async (\n _runtime: IAgentRuntime,\n { text }: { text: string }\n ) => {\n const manager = localAIManager.getTokenizerManager();\n const config = localAIManager.getActiveModelConfig();\n return await manager.encode(text, config);\n },\n\n [ModelType.TEXT_TOKENIZER_DECODE]: async (\n _runtime: IAgentRuntime,\n { tokens }: { tokens: number[] }\n ) => {\n const manager = localAIManager.getTokenizerManager();\n const config = localAIManager.getActiveModelConfig();\n return await manager.decode(tokens, config);\n },\n\n [ModelType.IMAGE_DESCRIPTION]: async (_runtime: IAgentRuntime, imageUrl: string) => {\n logger.info(\"Processing image from URL:\", imageUrl);\n\n const response = await fetch(imageUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch image: ${response.statusText}`);\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n const mimeType = response.headers.get(\"content-type\") || \"image/jpeg\";\n return await localAIManager.describeImage(buffer, mimeType);\n },\n\n [ModelType.TRANSCRIPTION]: async (_runtime: IAgentRuntime, audioBuffer: Buffer) => {\n logger.info(\"Processing audio transcription:\", {\n bufferSize: audioBuffer.length,\n });\n\n return await localAIManager.transcribeAudio(audioBuffer);\n },\n\n [ModelType.TEXT_TO_SPEECH]: async (_runtime: IAgentRuntime, text: string) => {\n return await localAIManager.generateSpeech(text);\n },\n },\n tests: [\n {\n name: \"local_ai_plugin_tests\",\n tests: [\n {\n name: \"local_ai_test_initialization\",\n fn: async (runtime) => {\n try {\n logger.info(\"Starting initialization test\");\n\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt:\n \"Debug Mode: Test initialization. Respond with 'Initialization successful' if you can read this.\",\n stopSequences: [],\n });\n\n logger.info(\"Model response:\", result);\n\n if (!result || typeof result !== \"string\") {\n throw new Error(\"Invalid response from model\");\n }\n\n if (!result.includes(\"successful\")) {\n throw new Error(\"Model response does not indicate success\");\n }\n\n logger.success(\"Initialization test completed successfully\");\n } catch (error) {\n logger.error(\"Initialization test failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n },\n },\n {\n name: \"local_ai_test_text_large\",\n fn: async (runtime) => {\n try {\n logger.info(\"Starting TEXT_LARGE model test\");\n\n const result = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt:\n \"Debug Mode: Generate a one-sentence response about artificial intelligence.\",\n stopSequences: [],\n });\n\n logger.info(\"Large model response:\", result);\n\n if (!result || typeof result !== \"string\") {\n throw new Error(\"Invalid response from large model\");\n }\n\n if (result.length < 10) {\n throw new Error(\"Response too short, possible model failure\");\n }\n\n logger.success(\"TEXT_LARGE test completed successfully\");\n } catch (error) {\n logger.error(\"TEXT_LARGE test failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n },\n },\n {\n name: \"local_ai_test_text_embedding\",\n fn: async (runtime) => {\n try {\n logger.info(\"Starting TEXT_EMBEDDING test\");\n\n const embedding = await runtime.useModel(ModelType.TEXT_EMBEDDING, {\n text: \"This is a test of the text embedding model.\",\n });\n\n logger.info(\"Embedding generated with dimensions:\", embedding.length);\n\n if (!Array.isArray(embedding)) {\n throw new Error(\"Embedding is not an array\");\n }\n\n if (embedding.length === 0) {\n throw new Error(\"Embedding array is empty\");\n }\n\n if (embedding.some((val) => typeof val !== \"number\")) {\n throw new Error(\"Embedding contains non-numeric values\");\n }\n\n // Test with null input (should return zero vector)\n const nullEmbedding = await runtime.useModel(ModelType.TEXT_EMBEDDING, null);\n if (!Array.isArray(nullEmbedding) || nullEmbedding.some((val) => val !== 0)) {\n throw new Error(\"Null input did not return zero vector\");\n }\n\n logger.success(\"TEXT_EMBEDDING test completed successfully\");\n } catch (error) {\n logger.error(\"TEXT_EMBEDDING test failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n },\n },\n {\n name: \"local_ai_test_tokenizer_encode\",\n fn: async (runtime) => {\n try {\n logger.info(\"Starting TEXT_TOKENIZER_ENCODE test\");\n const text = \"Hello tokenizer test!\";\n const tokens = await runtime.useModel(ModelType.TEXT_TOKENIZER_ENCODE, { text });\n logger.info(\"Encoded tokens:\", { count: tokens.length });\n\n if (!Array.isArray(tokens)) {\n throw new Error(\"Tokens output is not an array\");\n }\n\n if (tokens.length === 0) {\n throw new Error(\"No tokens generated\");\n }\n\n if (tokens.some((token) => !Number.isInteger(token))) {\n throw new Error(\"Tokens contain non-integer values\");\n }\n\n logger.success(\"TEXT_TOKENIZER_ENCODE test completed successfully\");\n } catch (error) {\n logger.error(\"TEXT_TOKENIZER_ENCODE test failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n },\n },\n {\n name: \"local_ai_test_tokenizer_decode\",\n fn: async (runtime) => {\n try {\n logger.info(\"Starting TEXT_TOKENIZER_DECODE test\");\n\n const originalText = \"Hello tokenizer test!\";\n const tokens = await runtime.useModel(ModelType.TEXT_TOKENIZER_ENCODE, {\n text: originalText,\n });\n\n const decodedText = await runtime.useModel(ModelType.TEXT_TOKENIZER_DECODE, {\n tokens,\n });\n logger.info(\"Round trip tokenization:\", {\n original: originalText,\n decoded: decodedText,\n });\n\n if (typeof decodedText !== \"string\") {\n throw new Error(\"Decoded output is not a string\");\n }\n\n logger.success(\"TEXT_TOKENIZER_DECODE test completed successfully\");\n } catch (error) {\n logger.error(\"TEXT_TOKENIZER_DECODE test failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n },\n },\n {\n name: \"local_ai_test_image_description\",\n fn: async (runtime) => {\n try {\n logger.info(\"Starting IMAGE_DESCRIPTION test\");\n\n const imageUrl =\n \"https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/320px-Cat03.jpg\";\n const result = await runtime.useModel(ModelType.IMAGE_DESCRIPTION, imageUrl);\n\n logger.info(\"Image description result:\", result);\n\n if (!result || typeof result !== \"object\") {\n throw new Error(\"Invalid response format\");\n }\n\n if (!result.title || !result.description) {\n throw new Error(\"Missing title or description in response\");\n }\n\n if (typeof result.title !== \"string\" || typeof result.description !== \"string\") {\n throw new Error(\"Title or description is not a string\");\n }\n\n logger.success(\"IMAGE_DESCRIPTION test completed successfully\");\n } catch (error) {\n logger.error(\"IMAGE_DESCRIPTION test failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n },\n },\n {\n name: \"local_ai_test_transcription\",\n fn: async (runtime) => {\n try {\n logger.info(\"Starting TRANSCRIPTION test\");\n\n const channels = 1;\n const sampleRate = 16000;\n const bitsPerSample = 16;\n const duration = 0.5; // 500ms for better transcription\n const numSamples = Math.floor(sampleRate * duration);\n const dataSize = numSamples * channels * (bitsPerSample / 8);\n\n const buffer = Buffer.alloc(44 + dataSize);\n\n buffer.write(\"RIFF\", 0);\n buffer.writeUInt32LE(36 + dataSize, 4);\n buffer.write(\"WAVE\", 8);\n\n buffer.write(\"fmt \", 12);\n buffer.writeUInt32LE(16, 16);\n buffer.writeUInt16LE(1, 20);\n buffer.writeUInt16LE(channels, 22);\n buffer.writeUInt32LE(sampleRate, 24);\n buffer.writeUInt32LE(sampleRate * channels * (bitsPerSample / 8), 28);\n buffer.writeUInt16LE(channels * (bitsPerSample / 8), 32);\n buffer.writeUInt16LE(bitsPerSample, 34);\n\n buffer.write(\"data\", 36);\n buffer.writeUInt32LE(dataSize, 40);\n\n const frequency = 440;\n for (let i = 0; i < numSamples; i++) {\n const sample = Math.sin((2 * Math.PI * frequency * i) / sampleRate) * 0.1 * 32767;\n buffer.writeInt16LE(Math.floor(sample), 44 + i * 2);\n }\n\n const transcription = await runtime.useModel(ModelType.TRANSCRIPTION, buffer);\n logger.info(\"Transcription result:\", transcription);\n\n if (typeof transcription !== \"string\") {\n throw new Error(\"Transcription result is not a string\");\n }\n\n logger.info(\"Transcription completed (may be empty for non-speech audio)\");\n\n logger.success(\"TRANSCRIPTION test completed successfully\");\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n \"TRANSCRIPTION test failed\"\n );\n throw error;\n }\n },\n },\n {\n name: \"local_ai_test_text_to_speech\",\n fn: async (runtime) => {\n try {\n logger.info(\"Starting TEXT_TO_SPEECH test\");\n\n const testText = \"This is a test of the text to speech system.\";\n const audioStream = await runtime.useModel(ModelType.TEXT_TO_SPEECH, testText);\n\n if (!(audioStream instanceof Readable)) {\n throw new Error(\"TTS output is not a readable stream\");\n }\n\n let dataReceived = false;\n audioStream.on(\"data\", () => {\n dataReceived = true;\n });\n\n await new Promise((resolve, reject) => {\n audioStream.on(\"end\", () => {\n if (!dataReceived) {\n reject(new Error(\"No audio data received from stream\"));\n } else {\n resolve(true);\n }\n });\n audioStream.on(\"error\", reject);\n });\n\n logger.success(\"TEXT_TO_SPEECH test completed successfully\");\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n \"TEXT_TO_SPEECH test failed\"\n );\n throw error;\n }\n },\n },\n ],\n },\n ],\n};\n\nexport default localAiPlugin;\n",
6
+ "// @ts-nocheck — pending migration: @huggingface/transformers 3->4\n// (PreTrainedModel/Florence2 interface changes), @elizaos/core logger\n// signature drift (structured-context overload removed), and\n// GenerateTextParams.{modelType,runtime} field removal. Tracked separately.\nimport { logger } from \"@elizaos/core\";\nimport { z } from \"zod\";\n\nconst DEFAULT_SMALL_MODEL = \"text/eliza-1-mobile-1_7b-32k.gguf\";\nconst DEFAULT_LARGE_MODEL = \"text/eliza-1-desktop-9b-64k.gguf\";\nconst DEFAULT_EMBEDDING_MODEL = \"text/eliza-1-lite-0_6b-32k.gguf\";\n\nexport const configSchema = z.object({\n LOCAL_SMALL_MODEL: z.string().optional().default(DEFAULT_SMALL_MODEL),\n LOCAL_LARGE_MODEL: z.string().optional().default(DEFAULT_LARGE_MODEL),\n LOCAL_EMBEDDING_MODEL: z.string().optional().default(DEFAULT_EMBEDDING_MODEL),\n MODELS_DIR: z.string().optional(),\n CACHE_DIR: z.string().optional(),\n LOCAL_EMBEDDING_DIMENSIONS: z\n .string()\n .optional()\n .default(\"1024\")\n .transform((val) => parseInt(val, 10)),\n});\n\nexport type Config = z.infer<typeof configSchema>;\n\nexport function validateConfig(): Config {\n try {\n const configToParse = {\n LOCAL_SMALL_MODEL: process.env.LOCAL_SMALL_MODEL,\n LOCAL_LARGE_MODEL: process.env.LOCAL_LARGE_MODEL,\n LOCAL_EMBEDDING_MODEL: process.env.LOCAL_EMBEDDING_MODEL,\n MODELS_DIR: process.env.MODELS_DIR,\n CACHE_DIR: process.env.CACHE_DIR,\n LOCAL_EMBEDDING_DIMENSIONS: process.env.LOCAL_EMBEDDING_DIMENSIONS,\n };\n\n logger.debug(\n {\n LOCAL_SMALL_MODEL: configToParse.LOCAL_SMALL_MODEL,\n LOCAL_LARGE_MODEL: configToParse.LOCAL_LARGE_MODEL,\n LOCAL_EMBEDDING_MODEL: configToParse.LOCAL_EMBEDDING_MODEL,\n MODELS_DIR: configToParse.MODELS_DIR,\n CACHE_DIR: configToParse.CACHE_DIR,\n LOCAL_EMBEDDING_DIMENSIONS: configToParse.LOCAL_EMBEDDING_DIMENSIONS,\n },\n \"Validating configuration for local AI plugin from env:\"\n );\n\n const validatedConfig = configSchema.parse(configToParse);\n\n logger.info(validatedConfig as Record<string, unknown>, \"Using local AI configuration:\");\n\n return validatedConfig;\n } catch (error) {\n if (error instanceof z.ZodError) {\n const errorMessages = error.issues\n .map((issue) => `${issue.path.join(\".\")}: ${issue.message}`)\n .join(\"\\n\");\n logger.error(`Zod validation failed: ${errorMessages}`);\n throw new Error(`Configuration validation failed:\\n${errorMessages}`);\n }\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n \"Configuration validation failed:\"\n );\n throw error;\n }\n}\n",
7
+ "// @ts-nocheck depends on @elizaos/core types currently bundled with the\n// rest of plugin-local-ai under nocheck pending a core-types pass.\nimport type { JSONSchema, ToolDefinition } from \"@elizaos/core\";\nimport {\n type ChatModelFunctionCall,\n type ChatSessionModelFunctions,\n defineChatSessionFunction,\n type GbnfJsonSchema,\n type Llama,\n LlamaGrammar,\n LlamaJsonSchemaGrammar,\n} from \"node-llama-cpp\";\n\nexport interface ToolCallResult {\n id: string;\n name: string;\n arguments: Record<string, unknown>;\n type: \"function\";\n}\n\nexport interface StructuredOutputContext {\n llama: Llama;\n}\n\n/**\n * Convert an elizaOS-shaped JSON schema to the Gbnf variant accepted by\n * node-llama-cpp's grammar / function-calling APIs. The two schema dialects\n * overlap heavily — node-llama-cpp tolerates `type: \"object\"` with\n * `properties` / `required` plus the standard scalar types — so we forward\n * the schema as-is. We narrow the type with a runtime check.\n */\nexport function toGbnfJsonSchema(schema: JSONSchema | undefined): GbnfJsonSchema | undefined {\n if (schema == null) return undefined;\n if (typeof schema !== \"object\") {\n throw new Error(\"[plugin-local-ai] JSON schema must be an object\");\n }\n return schema as GbnfJsonSchema;\n}\n\n/**\n * Build a `functions` map for `LlamaChatSession.prompt({ functions })` from\n * the elizaOS `ToolDefinition[]` shape. The handler is a no-op: we want the\n * raw call objects back from `promptWithMeta`, not in-loop tool execution.\n * The runtime is responsible for executing the tool and looping back.\n */\nexport function buildLlamaFunctions(tools: readonly ToolDefinition[]): ChatSessionModelFunctions {\n const out: Record<string, ReturnType<typeof defineChatSessionFunction>> = {};\n for (const tool of tools) {\n if (!tool?.name) continue;\n out[tool.name] = defineChatSessionFunction({\n description: tool.description,\n params: toGbnfJsonSchema(tool.parameters) as never,\n // The handler intentionally returns a sentinel. We collect the parsed\n // call from `promptWithMeta`'s response array; we do not execute the\n // tool in-process. node-llama-cpp requires a handler to be defined.\n handler: () => \"[deferred to runtime]\",\n });\n }\n return out;\n}\n\n/**\n * Pull parsed function calls out of a `promptWithMeta` response array.\n * Mirrors the OpenAI/Anthropic provider shape: `{ id, name, arguments }`.\n */\nexport function extractToolCalls(\n response: ReadonlyArray<string | ChatModelFunctionCall | unknown>\n): ToolCallResult[] {\n const calls: ToolCallResult[] = [];\n let i = 0;\n for (const entry of response) {\n if (\n entry &&\n typeof entry === \"object\" &&\n (entry as { type?: string }).type === \"functionCall\"\n ) {\n const fc = entry as ChatModelFunctionCall;\n calls.push({\n id: `call_${i++}`,\n name: fc.name,\n arguments: (fc.params ?? {}) as Record<string, unknown>,\n type: \"function\",\n });\n }\n }\n return calls;\n}\n\n/**\n * Build a `LlamaJsonSchemaGrammar` for a caller-supplied JSON Schema. The\n * grammar constrains the model's output so it always parses as valid JSON\n * matching the schema.\n */\nexport function buildJsonSchemaGrammar(\n llama: Llama,\n schema: JSONSchema\n): LlamaJsonSchemaGrammar<GbnfJsonSchema> {\n const gbnf = toGbnfJsonSchema(schema);\n if (gbnf == null) {\n throw new Error(\"[plugin-local-ai] responseSchema is required to build a JSON schema grammar\");\n }\n return new LlamaJsonSchemaGrammar(llama, gbnf as GbnfJsonSchema);\n}\n\n/**\n * Get the canonical JSON grammar shipped with node-llama-cpp. Used when the\n * caller passes `responseFormat: { type: \"json_object\" }` without a specific\n * schema — output is constrained to be any valid JSON value.\n */\nexport async function buildGenericJsonGrammar(llama: Llama): Promise<LlamaGrammar> {\n return await LlamaGrammar.getFor(llama, \"json\");\n}\n\nexport interface StructuredRequestPlan {\n kind: \"text\" | \"tools\" | \"schema\" | \"json_object\";\n functions?: ChatSessionModelFunctions;\n grammar?: LlamaGrammar;\n}\n\n/**\n * Decide which structured-output mode applies to a single generation call.\n * Tools take priority over schema; schema takes priority over generic JSON.\n */\nexport async function planStructuredRequest(\n ctx: StructuredOutputContext,\n params: {\n tools?: readonly ToolDefinition[];\n responseSchema?: JSONSchema;\n responseFormat?: { type: \"json_object\" | \"text\" } | string | undefined;\n }\n): Promise<StructuredRequestPlan> {\n if (params.tools && params.tools.length > 0) {\n return { kind: \"tools\", functions: buildLlamaFunctions(params.tools) };\n }\n if (params.responseSchema) {\n const grammar = buildJsonSchemaGrammar(ctx.llama, params.responseSchema);\n return { kind: \"schema\", grammar };\n }\n if (\n params.responseFormat &&\n typeof params.responseFormat === \"object\" &&\n params.responseFormat.type === \"json_object\"\n ) {\n const grammar = await buildGenericJsonGrammar(ctx.llama);\n return { kind: \"json_object\", grammar };\n }\n return { kind: \"text\" };\n}\n",
8
+ "export interface TokenizerConfig {\n name: string;\n type: string;\n}\n\nexport interface ModelSpec {\n name: string;\n repo: string;\n size: string;\n quantization: string;\n contextSize: number;\n tokenizer: TokenizerConfig;\n}\n\nexport interface EmbeddingModelSpec extends ModelSpec {\n dimensions: number;\n}\n\nexport interface VisionModelSpec {\n name: string;\n repo: string;\n size: string;\n modelId: string;\n contextSize: number;\n maxTokens: number;\n tasks: string[];\n}\n\nexport interface TTSModelSpec {\n name: string;\n repo: string;\n size: string;\n quantization: string;\n speakers: string[];\n languages: string[];\n features: string[];\n maxInputLength: number;\n sampleRate: number;\n contextSize: number;\n tokenizer: TokenizerConfig;\n}\n\nexport interface TransformersJsTTSModelSpec {\n modelId: string;\n defaultSampleRate: number;\n defaultSpeakerEmbeddingUrl?: string;\n}\n\nexport interface ModelSpecs {\n small: ModelSpec;\n medium: ModelSpec;\n embedding: EmbeddingModelSpec;\n vision: VisionModelSpec;\n visionvl: VisionModelSpec;\n tts: {\n default: TransformersJsTTSModelSpec;\n };\n}\n\nexport const MODEL_SPECS: ModelSpecs = {\n small: {\n name: \"text/eliza-1-mobile-1_7b-32k.gguf\",\n repo: \"elizaos/eliza-1-mobile-1_7b\",\n size: \"1.7B\",\n quantization: \"fused GGUF\",\n contextSize: 32768,\n tokenizer: {\n name: \"elizaos/eliza-1-mobile-1_7b\",\n type: \"eliza1\",\n },\n },\n medium: {\n name: \"text/eliza-1-desktop-9b-64k.gguf\",\n repo: \"elizaos/eliza-1-desktop-9b\",\n size: \"9B\",\n quantization: \"fused GGUF\",\n contextSize: 65536,\n tokenizer: {\n name: \"elizaos/eliza-1-desktop-9b\",\n type: \"eliza1\",\n },\n },\n embedding: {\n name: \"text/eliza-1-lite-0_6b-32k.gguf\",\n repo: \"elizaos/eliza-1-lite-0_6b\",\n size: \"512 MB\",\n quantization: \"fused GGUF\",\n contextSize: 32768,\n dimensions: 1024,\n tokenizer: {\n name: \"elizaos/eliza-1-lite-0_6b\",\n type: \"eliza1\",\n },\n },\n vision: {\n name: \"Florence-2-base-ft\",\n repo: \"onnx-community/Florence-2-base-ft\",\n size: \"0.23B\",\n modelId: \"onnx-community/Florence-2-base-ft\",\n contextSize: 1024,\n maxTokens: 256,\n tasks: [\n \"CAPTION\",\n \"DETAILED_CAPTION\",\n \"MORE_DETAILED_CAPTION\",\n \"CAPTION_TO_PHRASE_GROUNDING\",\n \"OD\",\n \"DENSE_REGION_CAPTION\",\n \"REGION_PROPOSAL\",\n \"OCR\",\n \"OCR_WITH_REGION\",\n ],\n },\n visionvl: {\n name: \"Florence-2-base-ft\",\n repo: \"onnx-community/Florence-2-base-ft\",\n size: \"0.23B\",\n modelId: \"onnx-community/Florence-2-base-ft\",\n contextSize: 1024,\n maxTokens: 256,\n tasks: [\n \"CAPTION\",\n \"DETAILED_CAPTION\",\n \"IMAGE_UNDERSTANDING\",\n \"VISUAL_QUESTION_ANSWERING\",\n \"OCR\",\n \"VISUAL_LOCALIZATION\",\n \"REGION_ANALYSIS\",\n ],\n },\n tts: {\n default: {\n modelId: \"Xenova/speecht5_tts\",\n defaultSampleRate: 16000,\n defaultSpeakerEmbeddingUrl:\n \"https://huggingface.co/datasets/Xenova/transformers.js-docs/resolve/main/speaker_embeddings.bin\",\n },\n },\n};\n",
9
+ "import fs from \"node:fs\";\nimport https from \"node:https\";\nimport path from \"node:path\";\nimport { logger } from \"@elizaos/core\";\nimport type { ModelSpec } from \"../types\";\n\nexport class DownloadManager {\n private static instance: DownloadManager | null = null;\n private cacheDir: string;\n private modelsDir: string;\n private activeDownloads: Map<string, Promise<void>> = new Map();\n\n private constructor(cacheDir: string, modelsDir: string) {\n this.cacheDir = cacheDir;\n this.modelsDir = modelsDir;\n this.ensureCacheDirectory();\n this.ensureModelsDirectory();\n }\n\n public static getInstance(cacheDir: string, modelsDir: string): DownloadManager {\n if (!DownloadManager.instance) {\n DownloadManager.instance = new DownloadManager(cacheDir, modelsDir);\n }\n return DownloadManager.instance;\n }\n\n private ensureCacheDirectory(): void {\n if (this.cacheDir.trim() === \"\") {\n throw new Error(\"Cache directory path cannot be empty\");\n }\n if (!fs.existsSync(this.cacheDir)) {\n fs.mkdirSync(this.cacheDir, { recursive: true });\n logger.debug(\"Created cache directory\");\n }\n }\n\n private ensureModelsDirectory(): void {\n if (this.modelsDir.trim() === \"\") {\n throw new Error(\"Models directory path cannot be empty\");\n }\n logger.debug(\"Ensuring models directory exists:\", this.modelsDir);\n if (!fs.existsSync(this.modelsDir)) {\n fs.mkdirSync(this.modelsDir, { recursive: true });\n logger.debug(\"Created models directory\");\n }\n }\n\n private async downloadFileInternal(url: string, destPath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n logger.info(`Starting download to: ${destPath}`);\n\n const tempPath = `${destPath}.tmp`;\n\n if (fs.existsSync(tempPath)) {\n try {\n logger.warn(`Removing existing temporary file: ${tempPath}`);\n fs.unlinkSync(tempPath);\n } catch (err) {\n logger.error(\n `Failed to remove existing temporary file: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n\n const request = https.get(\n url,\n {\n headers: {\n \"User-Agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36\",\n },\n timeout: 300000,\n },\n (response) => {\n if (response.statusCode === 301 || response.statusCode === 302) {\n const redirectUrl = response.headers.location;\n if (!redirectUrl) {\n reject(new Error(\"Redirect location not found\"));\n return;\n }\n this.activeDownloads.delete(destPath);\n this.downloadFile(redirectUrl, destPath).then(resolve).catch(reject);\n return;\n }\n\n if (response.statusCode !== 200) {\n reject(new Error(`Failed to download: ${response.statusCode}`));\n return;\n }\n\n const totalSize = Number.parseInt(response.headers[\"content-length\"] || \"0\", 10);\n let downloadedSize = 0;\n let lastLoggedPercent = 0;\n const barLength = 30;\n\n const fileName = path.basename(destPath);\n logger.info(`Downloading ${fileName}: ${\"▱\".repeat(barLength)} 0%`);\n\n const file = fs.createWriteStream(tempPath);\n\n response.on(\"data\", (chunk) => {\n downloadedSize += chunk.length;\n const percent = Math.round((downloadedSize / totalSize) * 100);\n\n if (percent >= lastLoggedPercent + 5) {\n const filledLength = Math.floor((downloadedSize / totalSize) * barLength);\n const progressBar = \"▰\".repeat(filledLength) + \"▱\".repeat(barLength - filledLength);\n logger.info(`Downloading ${fileName}: ${progressBar} ${percent}%`);\n lastLoggedPercent = percent;\n }\n });\n\n response.pipe(file);\n\n file.on(\"finish\", () => {\n file.close(() => {\n try {\n const completedBar = \"▰\".repeat(barLength);\n logger.info(`Downloading ${fileName}: ${completedBar} 100%`);\n\n const destDir = path.dirname(destPath);\n if (!fs.existsSync(destDir)) {\n fs.mkdirSync(destDir, { recursive: true });\n }\n\n if (!fs.existsSync(tempPath)) {\n reject(new Error(`Temporary file ${tempPath} does not exist`));\n return;\n }\n\n if (fs.existsSync(destPath)) {\n try {\n const backupPath = `${destPath}.bak`;\n fs.renameSync(destPath, backupPath);\n logger.info(`Created backup of existing file: ${backupPath}`);\n\n fs.renameSync(tempPath, destPath);\n\n if (fs.existsSync(backupPath)) {\n fs.unlinkSync(backupPath);\n logger.info(`Removed backup file after successful update: ${backupPath}`);\n }\n } catch (moveErr) {\n logger.error(\n `Error replacing file: ${moveErr instanceof Error ? moveErr.message : String(moveErr)}`\n );\n\n const backupPath = `${destPath}.bak`;\n if (fs.existsSync(backupPath)) {\n try {\n fs.renameSync(backupPath, destPath);\n logger.info(`Restored from backup after failed update: ${backupPath}`);\n } catch (restoreErr) {\n logger.error(\n `Failed to restore from backup: ${restoreErr instanceof Error ? restoreErr.message : String(restoreErr)}`\n );\n }\n }\n\n if (fs.existsSync(tempPath)) {\n try {\n fs.unlinkSync(tempPath);\n } catch (unlinkErr) {\n logger.error(\n `Failed to clean up temp file: ${unlinkErr instanceof Error ? unlinkErr.message : String(unlinkErr)}`\n );\n }\n }\n\n reject(moveErr);\n return;\n }\n } else {\n fs.renameSync(tempPath, destPath);\n }\n\n logger.success(`Download of ${fileName} completed successfully`);\n\n this.activeDownloads.delete(destPath);\n resolve();\n } catch (err) {\n logger.error(\n `Error finalizing download: ${err instanceof Error ? err.message : String(err)}`\n );\n if (fs.existsSync(tempPath)) {\n try {\n fs.unlinkSync(tempPath);\n } catch (unlinkErr) {\n logger.error(\n `Failed to clean up temp file: ${unlinkErr instanceof Error ? unlinkErr.message : String(unlinkErr)}`\n );\n }\n }\n this.activeDownloads.delete(destPath);\n reject(err);\n }\n });\n });\n\n file.on(\"error\", (err) => {\n logger.error(`File write error: ${err instanceof Error ? err.message : String(err)}`);\n file.close(() => {\n if (fs.existsSync(tempPath)) {\n try {\n fs.unlinkSync(tempPath);\n } catch (unlinkErr) {\n logger.error(\n `Failed to clean up temp file after error: ${unlinkErr instanceof Error ? unlinkErr.message : String(unlinkErr)}`\n );\n }\n }\n this.activeDownloads.delete(destPath);\n reject(err);\n });\n });\n }\n );\n\n request.on(\"error\", (err) => {\n logger.error(`Request error: ${err instanceof Error ? err.message : String(err)}`);\n if (fs.existsSync(tempPath)) {\n try {\n fs.unlinkSync(tempPath);\n } catch (unlinkErr) {\n logger.error(\n `Failed to clean up temp file after request error: ${unlinkErr instanceof Error ? unlinkErr.message : String(unlinkErr)}`\n );\n }\n }\n this.activeDownloads.delete(destPath);\n reject(err);\n });\n\n request.on(\"timeout\", () => {\n logger.error(\"Download timeout occurred\");\n request.destroy();\n if (fs.existsSync(tempPath)) {\n try {\n fs.unlinkSync(tempPath);\n } catch (unlinkErr) {\n logger.error(\n `Failed to clean up temp file after timeout: ${unlinkErr instanceof Error ? unlinkErr.message : String(unlinkErr)}`\n );\n }\n }\n this.activeDownloads.delete(destPath);\n reject(new Error(\"Download timeout\"));\n });\n });\n }\n\n public async downloadFile(url: string, destPath: string): Promise<void> {\n if (this.activeDownloads.has(destPath)) {\n logger.info(`Download for ${destPath} already in progress, waiting for it to complete...`);\n const existingDownload = this.activeDownloads.get(destPath);\n if (existingDownload) {\n return existingDownload;\n }\n logger.warn(\n `Download for ${destPath} was marked as in progress but not found in tracking map`\n );\n }\n\n const downloadPromise = this.downloadFileInternal(url, destPath);\n this.activeDownloads.set(destPath, downloadPromise);\n\n try {\n return await downloadPromise;\n } catch (error) {\n this.activeDownloads.delete(destPath);\n throw error;\n }\n }\n\n public async downloadModel(modelSpec: ModelSpec, modelPath: string): Promise<boolean> {\n try {\n logger.info(\"Starting local model download...\");\n\n const modelDir = path.dirname(modelPath);\n if (!fs.existsSync(modelDir)) {\n logger.info(\"Creating model directory:\", modelDir);\n fs.mkdirSync(modelDir, { recursive: true });\n }\n\n if (!fs.existsSync(modelPath)) {\n const attempts = [\n {\n description: \"LFS URL with GGUF suffix\",\n url: `https://huggingface.co/${modelSpec.repo}/resolve/main/${modelSpec.name}?download=true`,\n },\n {\n description: \"LFS URL without GGUF suffix\",\n url: `https://huggingface.co/${modelSpec.repo.replace(\"-GGUF\", \"\")}/resolve/main/${modelSpec.name}?download=true`,\n },\n {\n description: \"Standard URL with GGUF suffix\",\n url: `https://huggingface.co/${modelSpec.repo}/resolve/main/${modelSpec.name}`,\n },\n {\n description: \"Standard URL without GGUF suffix\",\n url: `https://huggingface.co/${modelSpec.repo.replace(\"-GGUF\", \"\")}/resolve/main/${modelSpec.name}`,\n },\n ];\n\n let lastError = null;\n let downloadSuccess = false;\n\n for (const attempt of attempts) {\n try {\n logger.info(\n {\n description: attempt.description,\n url: attempt.url,\n timestamp: new Date().toISOString(),\n },\n \"Attempting model download\"\n );\n\n await this.downloadFile(attempt.url, modelPath);\n\n logger.success(\n `Model download complete: ${modelSpec.name} using ${attempt.description}`\n );\n downloadSuccess = true;\n break;\n } catch (error) {\n lastError = error;\n logger.warn(\n {\n description: attempt.description,\n error: error instanceof Error ? error.message : String(error),\n timestamp: new Date().toISOString(),\n },\n \"Model download attempt failed\"\n );\n }\n }\n\n if (!downloadSuccess) {\n throw lastError || new Error(\"All download attempts failed\");\n }\n\n return true;\n }\n\n logger.info(\"Model already exists at:\", modelPath);\n return false;\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n modelPath: modelPath,\n model: modelSpec.name,\n },\n \"Model download failed\"\n );\n throw error;\n }\n }\n\n public getCacheDir(): string {\n return this.cacheDir;\n }\n\n public async downloadFromUrl(url: string, destPath: string): Promise<void> {\n return this.downloadFile(url, destPath);\n }\n\n /**\n * Ensures a directory exists, creating it and parent directories if necessary.\n * @param dirPath - The directory path to ensure exists\n * @throws Error if the directory path is empty or whitespace-only\n */\n public ensureDirectoryExists(dirPath: string): void {\n if (!dirPath || dirPath.trim() === \"\") {\n throw new Error(\"Directory path cannot be empty\");\n }\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n logger.info(`Created directory: ${dirPath}`);\n }\n }\n}\n",
10
+ "// @ts-nocheck pending migration: @huggingface/transformers 3->4\n// (PreTrainedModel/Florence2 interface changes), @elizaos/core logger\n// signature drift (structured-context overload removed), and\n// GenerateTextParams.{modelType,runtime} field removal. Tracked separately.\nimport { exec } from \"node:child_process\";\nimport os from \"node:os\";\nimport { promisify } from \"node:util\";\nimport { logger } from \"@elizaos/core\";\n\nconst execAsync = promisify(exec);\n\nexport interface SystemGPU {\n name: string;\n memory?: number;\n type: \"cuda\" | \"metal\" | \"directml\" | \"none\";\n version?: string;\n isAppleSilicon?: boolean;\n}\n\nexport interface SystemCPU {\n model: string;\n cores: number;\n speed: number;\n architecture: string;\n memory: {\n total: number;\n free: number;\n };\n}\n\nexport interface SystemCapabilities {\n platform: NodeJS.Platform;\n cpu: SystemCPU;\n gpu: SystemGPU | null;\n recommendedModelSize: \"small\" | \"medium\" | \"large\";\n supportedBackends: Array<\"cuda\" | \"metal\" | \"directml\" | \"cpu\">;\n}\n\nexport class PlatformManager {\n private static instance: PlatformManager;\n private capabilities: SystemCapabilities | null = null;\n\n private constructor() {}\n\n static getInstance(): PlatformManager {\n if (!PlatformManager.instance) {\n PlatformManager.instance = new PlatformManager();\n }\n return PlatformManager.instance;\n }\n\n async initialize(): Promise<void> {\n try {\n logger.info(\"Initializing platform detection...\");\n this.capabilities = await this.detectSystemCapabilities();\n } catch (error) {\n logger.error({ error }, \"Platform detection failed\");\n throw error;\n }\n }\n\n private async detectSystemCapabilities(): Promise<SystemCapabilities> {\n const platform = process.platform;\n const cpuInfo = this.getCPUInfo();\n const gpu = await this.detectGPU();\n const supportedBackends = await this.getSupportedBackends(platform, gpu);\n const recommendedModelSize = this.getRecommendedModelSize(cpuInfo, gpu);\n\n return {\n platform,\n cpu: cpuInfo,\n gpu,\n recommendedModelSize,\n supportedBackends,\n };\n }\n\n private getCPUInfo(): SystemCPU {\n const cpus = os.cpus();\n const totalMemory = os.totalmem();\n const freeMemory = os.freemem();\n\n return {\n model: cpus[0].model,\n cores: cpus.length,\n speed: cpus[0].speed,\n architecture: process.arch,\n memory: {\n total: totalMemory,\n free: freeMemory,\n },\n };\n }\n\n private async detectGPU(): Promise<SystemGPU | null> {\n const platform = process.platform;\n\n try {\n switch (platform) {\n case \"darwin\":\n return await this.detectMacGPU();\n case \"win32\":\n return await this.detectWindowsGPU();\n case \"linux\":\n return await this.detectLinuxGPU();\n default:\n return null;\n }\n } catch (error) {\n logger.error({ error }, \"GPU detection failed\");\n return null;\n }\n }\n\n private async detectMacGPU(): Promise<SystemGPU> {\n try {\n const { stdout } = await execAsync(\"sysctl -n machdep.cpu.brand_string\");\n const isAppleSilicon = stdout.toLowerCase().includes(\"apple\");\n\n if (isAppleSilicon) {\n return {\n name: \"Apple Silicon\",\n type: \"metal\",\n isAppleSilicon: true,\n };\n }\n\n const { stdout: gpuInfo } = await execAsync(\"system_profiler SPDisplaysDataType\");\n return {\n name: gpuInfo.split(\"Chipset Model:\")[1]?.split(\"\\n\")[0]?.trim() || \"Unknown GPU\",\n type: \"metal\",\n isAppleSilicon: false,\n };\n } catch (error) {\n logger.error({ error }, \"Mac GPU detection failed\");\n return {\n name: \"Unknown Mac GPU\",\n type: \"metal\",\n isAppleSilicon: false,\n };\n }\n }\n\n private async queryWindowsGpuName(): Promise<string | null> {\n // Prefer PowerShell + CIM which works on all supported Windows versions\n // including Windows 11 24H2 / Server 2025 where wmic.exe is removed.\n // Fall back to wmic on older boxes.\n const psCmd =\n \"powershell -NoProfile -NonInteractive -Command \" +\n '\"Get-CimInstance Win32_VideoController | Select-Object -ExpandProperty Name\"';\n try {\n const { stdout } = await execAsync(psCmd);\n const first = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)[0];\n if (first) return first;\n } catch {\n // Fall through to wmic.\n }\n try {\n const { stdout } = await execAsync(\"wmic path win32_VideoController get name\");\n const lines = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line && line.toLowerCase() !== \"name\");\n return lines[0] ?? null;\n } catch {\n return null;\n }\n }\n\n private async detectWindowsGPU(): Promise<SystemGPU | null> {\n try {\n const gpuName = await this.queryWindowsGpuName();\n if (!gpuName) return null;\n\n if (gpuName.toLowerCase().includes(\"nvidia\")) {\n try {\n const { stdout: nvidiaInfo } = await execAsync(\n \"nvidia-smi --query-gpu=name,memory.total --format=csv,noheader\"\n );\n const firstLine = nvidiaInfo.split(/\\r?\\n/)[0] ?? \"\";\n const [name, memoryStr] = firstLine.split(\",\").map((s) => s.trim());\n const memory = Number.parseInt(memoryStr, 10);\n\n return {\n name: name || gpuName,\n memory: Number.isFinite(memory) ? memory : undefined,\n type: \"cuda\",\n version: await this.getNvidiaDriverVersion(),\n };\n } catch {\n return { name: gpuName, type: \"cuda\" };\n }\n }\n\n return {\n name: gpuName,\n type: \"directml\",\n };\n } catch (error) {\n logger.error({ error }, \"Windows GPU detection failed\");\n return null;\n }\n }\n\n private async detectLinuxGPU(): Promise<SystemGPU | null> {\n try {\n const { stdout } = await execAsync(\n \"nvidia-smi --query-gpu=name,memory.total --format=csv,noheader\"\n );\n if (stdout) {\n const [name, memoryStr] = stdout.split(\",\").map((s) => s.trim());\n const memory = Number.parseInt(memoryStr, 10);\n\n return {\n name,\n memory,\n type: \"cuda\",\n version: await this.getNvidiaDriverVersion(),\n };\n }\n } catch {\n try {\n const { stdout } = await execAsync(\"lspci | grep -i vga\");\n return {\n name: stdout.split(\":\").pop()?.trim() || \"Unknown GPU\",\n type: \"none\",\n };\n } catch (error) {\n logger.error({ error }, \"Linux GPU detection failed\");\n return null;\n }\n }\n return null;\n }\n\n private async getNvidiaDriverVersion(): Promise<string> {\n try {\n const { stdout } = await execAsync(\n \"nvidia-smi --query-gpu=driver_version --format=csv,noheader\"\n );\n return stdout.trim();\n } catch {\n return \"unknown\";\n }\n }\n\n private async getSupportedBackends(\n platform: NodeJS.Platform,\n gpu: SystemGPU | null\n ): Promise<Array<\"cuda\" | \"metal\" | \"directml\" | \"cpu\">> {\n const backends: Array<\"cuda\" | \"metal\" | \"directml\" | \"cpu\"> = [\"cpu\"];\n\n if (gpu) {\n switch (platform) {\n case \"darwin\":\n backends.push(\"metal\");\n break;\n case \"win32\":\n if (gpu.type === \"cuda\") {\n backends.push(\"cuda\");\n }\n backends.push(\"directml\");\n break;\n case \"linux\":\n if (gpu.type === \"cuda\") {\n backends.push(\"cuda\");\n }\n break;\n }\n }\n\n return backends;\n }\n\n private getRecommendedModelSize(\n cpu: SystemCPU,\n gpu: SystemGPU | null\n ): \"small\" | \"medium\" | \"large\" {\n if (gpu?.isAppleSilicon) {\n return cpu.memory.total > 16 * 1024 * 1024 * 1024 ? \"medium\" : \"small\";\n }\n\n if (gpu?.type === \"cuda\") {\n const gpuMemGB = (gpu.memory || 0) / 1024;\n if (gpuMemGB >= 16) return \"large\";\n if (gpuMemGB >= 8) return \"medium\";\n }\n\n if (cpu.memory.total > 32 * 1024 * 1024 * 1024) return \"medium\";\n\n return \"small\";\n }\n\n getCapabilities(): SystemCapabilities {\n if (!this.capabilities) {\n throw new Error(\"PlatformManager not initialized\");\n }\n return this.capabilities;\n }\n\n isAppleSilicon(): boolean {\n return !!this.capabilities?.gpu?.isAppleSilicon;\n }\n\n hasGPUSupport(): boolean {\n return !!this.capabilities?.gpu;\n }\n\n supportsCUDA(): boolean {\n return this.capabilities?.gpu?.type === \"cuda\";\n }\n\n supportsMetal(): boolean {\n return this.capabilities?.gpu?.type === \"metal\";\n }\n\n supportsDirectML(): boolean {\n return this.capabilities?.gpu?.type === \"directml\";\n }\n\n getRecommendedBackend(): \"cuda\" | \"metal\" | \"directml\" | \"cpu\" {\n if (!this.capabilities) {\n throw new Error(\"PlatformManager not initialized\");\n }\n\n const { gpu, supportedBackends } = this.capabilities;\n\n if (gpu?.type === \"cuda\") return \"cuda\";\n if (gpu?.type === \"metal\") return \"metal\";\n if (supportedBackends.includes(\"directml\")) return \"directml\";\n return \"cpu\";\n }\n}\n\nexport const getPlatformManager = (): PlatformManager => {\n return PlatformManager.getInstance();\n};\n",
11
+ "// @ts-nocheck — pending migration: @huggingface/transformers 3->4\n// (PreTrainedModel/Florence2 interface changes), @elizaos/core logger\n// signature drift (structured-context overload removed), and\n// GenerateTextParams.{modelType,runtime} field removal. Tracked separately.\nimport { logger } from \"@elizaos/core\";\nimport { AutoTokenizer, type PreTrainedTokenizer } from \"@huggingface/transformers\";\nimport type { ModelSpec } from \"../types\";\n\nexport class TokenizerManager {\n private static instance: TokenizerManager | null = null;\n private tokenizers: Map<string, PreTrainedTokenizer>;\n private cacheDir: string;\n private modelsDir: string;\n\n private constructor(cacheDir: string, modelsDir: string) {\n this.tokenizers = new Map();\n this.cacheDir = cacheDir;\n this.modelsDir = modelsDir;\n }\n\n static getInstance(cacheDir: string, modelsDir: string): TokenizerManager {\n if (!TokenizerManager.instance) {\n TokenizerManager.instance = new TokenizerManager(cacheDir, modelsDir);\n }\n return TokenizerManager.instance;\n }\n\n async loadTokenizer(modelConfig: ModelSpec): Promise<PreTrainedTokenizer> {\n try {\n const tokenizerKey = `${modelConfig.tokenizer.type}-${modelConfig.tokenizer.name}`;\n logger.info(\n {\n key: tokenizerKey,\n name: modelConfig.tokenizer.name,\n type: modelConfig.tokenizer.type,\n modelsDir: this.modelsDir,\n cacheDir: this.cacheDir,\n },\n \"Loading tokenizer:\"\n );\n\n if (this.tokenizers.has(tokenizerKey)) {\n logger.info({ key: tokenizerKey }, \"Using cached tokenizer:\");\n const cachedTokenizer = this.tokenizers.get(tokenizerKey);\n if (!cachedTokenizer) {\n throw new Error(`Tokenizer ${tokenizerKey} exists in map but returned undefined`);\n }\n return cachedTokenizer;\n }\n\n const fs = await import(\"node:fs\");\n if (!fs.existsSync(this.modelsDir)) {\n logger.warn(\"Models directory does not exist, creating it:\", this.modelsDir);\n fs.mkdirSync(this.modelsDir, { recursive: true });\n }\n\n logger.info(\n \"Initializing new tokenizer from HuggingFace with models directory:\",\n this.modelsDir\n );\n\n try {\n const tokenizer = await AutoTokenizer.from_pretrained(modelConfig.tokenizer.name, {\n cache_dir: this.modelsDir,\n local_files_only: false,\n });\n\n this.tokenizers.set(tokenizerKey, tokenizer);\n logger.success({ key: tokenizerKey }, \"Tokenizer loaded successfully:\");\n return tokenizer;\n } catch (tokenizeError) {\n logger.error(\n {\n error: tokenizeError instanceof Error ? tokenizeError.message : String(tokenizeError),\n stack: tokenizeError instanceof Error ? tokenizeError.stack : undefined,\n tokenizer: modelConfig.tokenizer.name,\n modelsDir: this.modelsDir,\n },\n \"Failed to load tokenizer from HuggingFace:\"\n );\n\n logger.info(\"Retrying tokenizer loading...\");\n const tokenizer = await AutoTokenizer.from_pretrained(modelConfig.tokenizer.name, {\n cache_dir: this.modelsDir,\n local_files_only: false,\n });\n\n this.tokenizers.set(tokenizerKey, tokenizer);\n logger.success({ key: tokenizerKey }, \"Tokenizer loaded successfully on retry:\");\n return tokenizer;\n }\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n model: modelConfig.name,\n tokenizer: modelConfig.tokenizer.name,\n modelsDir: this.modelsDir,\n },\n \"Failed to load tokenizer:\"\n );\n throw error;\n }\n }\n\n async encode(text: string, modelConfig: ModelSpec): Promise<number[]> {\n try {\n logger.info(\n {\n length: text.length,\n tokenizer: modelConfig.tokenizer.name,\n },\n \"Encoding text with tokenizer:\"\n );\n\n const tokenizer = await this.loadTokenizer(modelConfig);\n\n logger.info(\"Tokenizer loaded, encoding text...\");\n const encoded = await tokenizer.encode(text, {\n add_special_tokens: true,\n return_token_type_ids: false,\n });\n\n logger.info(\n {\n tokenCount: encoded.length,\n tokenizer: modelConfig.tokenizer.name,\n },\n \"Text encoded successfully:\"\n );\n return encoded;\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n textLength: text.length,\n tokenizer: modelConfig.tokenizer.name,\n modelsDir: this.modelsDir,\n },\n \"Text encoding failed:\"\n );\n throw error;\n }\n }\n\n async decode(tokens: number[], modelConfig: ModelSpec): Promise<string> {\n try {\n logger.info(\n {\n count: tokens.length,\n tokenizer: modelConfig.tokenizer.name,\n },\n \"Decoding tokens with tokenizer:\"\n );\n\n const tokenizer = await this.loadTokenizer(modelConfig);\n\n logger.info(\"Tokenizer loaded, decoding tokens...\");\n const decoded = await tokenizer.decode(tokens, {\n skip_special_tokens: true,\n clean_up_tokenization_spaces: true,\n });\n\n logger.info(\n {\n textLength: decoded.length,\n tokenizer: modelConfig.tokenizer.name,\n },\n \"Tokens decoded successfully:\"\n );\n return decoded;\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n tokenCount: tokens.length,\n tokenizer: modelConfig.tokenizer.name,\n modelsDir: this.modelsDir,\n },\n \"Token decoding failed:\"\n );\n throw error;\n }\n }\n}\n",
12
+ "// @ts-nocheck — pending migration: @huggingface/transformers 3->4\n// (PreTrainedModel/Florence2 interface changes), @elizaos/core logger\n// signature drift (structured-context overload removed), and\n// GenerateTextParams.{modelType,runtime} field removal. Tracked separately.\nimport { exec } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { logger } from \"@elizaos/core\";\n\nconst execAsync = promisify(exec);\n\ntype WhisperModule = (\n filePath: string,\n options?: Record<string, unknown>\n) => Promise<Array<{ speech?: string }>>;\n\nlet whisperModule: WhisperModule | null = null;\nasync function getWhisper(): Promise<WhisperModule> {\n if (!whisperModule) {\n const module = await import(\"whisper-node\");\n whisperModule = (module as { whisper: WhisperModule }).whisper;\n }\n return whisperModule as WhisperModule;\n}\n\ninterface TranscriptionResult {\n text: string;\n}\n\nexport class TranscribeManager {\n private static instance: TranscribeManager | null = null;\n private cacheDir: string;\n private ffmpegAvailable = false;\n private ffmpegVersion: string | null = null;\n private ffmpegPath: string | null = null;\n private ffmpegInitialized = false;\n\n private constructor(cacheDir: string) {\n this.cacheDir = path.join(cacheDir, \"whisper\");\n logger.debug(\n {\n cacheDir: this.cacheDir,\n timestamp: new Date().toISOString(),\n },\n \"Initializing TranscribeManager\"\n );\n this.ensureCacheDirectory();\n }\n\n public async ensureFFmpeg(): Promise<boolean> {\n if (!this.ffmpegInitialized) {\n try {\n await this.initializeFFmpeg();\n this.ffmpegInitialized = true;\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n timestamp: new Date().toISOString(),\n },\n \"FFmpeg initialization failed:\"\n );\n return false;\n }\n }\n return this.ffmpegAvailable;\n }\n\n public isFFmpegAvailable(): boolean {\n return this.ffmpegAvailable;\n }\n\n public async getFFmpegVersion(): Promise<string | null> {\n if (!this.ffmpegVersion) {\n await this.fetchFFmpegVersion();\n }\n return this.ffmpegVersion;\n }\n\n private async fetchFFmpegVersion(): Promise<void> {\n try {\n const { stdout } = await execAsync(\"ffmpeg -version\");\n this.ffmpegVersion = stdout.split(\"\\n\")[0];\n logger.info(\n {\n version: this.ffmpegVersion,\n timestamp: new Date().toISOString(),\n },\n \"FFmpeg version:\"\n );\n } catch (error) {\n this.ffmpegVersion = null;\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n timestamp: new Date().toISOString(),\n },\n \"Failed to get FFmpeg version:\"\n );\n }\n }\n\n private async initializeFFmpeg(): Promise<void> {\n try {\n await this.checkFFmpegAvailability();\n\n if (this.ffmpegAvailable) {\n await this.fetchFFmpegVersion();\n\n await this.verifyFFmpegCapabilities();\n\n logger.success(\n {\n version: this.ffmpegVersion,\n path: this.ffmpegPath,\n timestamp: new Date().toISOString(),\n },\n \"FFmpeg initialized successfully\"\n );\n } else {\n this.logFFmpegInstallInstructions();\n }\n } catch (error) {\n this.ffmpegAvailable = false;\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n timestamp: new Date().toISOString(),\n },\n \"FFmpeg initialization failed:\"\n );\n this.logFFmpegInstallInstructions();\n }\n }\n\n private async checkFFmpegAvailability(): Promise<void> {\n try {\n const { stdout, stderr } = await execAsync(\"which ffmpeg || where ffmpeg\");\n this.ffmpegPath = stdout.trim();\n this.ffmpegAvailable = true;\n logger.info(\n {\n path: this.ffmpegPath,\n stderr: stderr ? stderr.trim() : undefined,\n timestamp: new Date().toISOString(),\n },\n \"FFmpeg found at:\"\n );\n } catch (error) {\n this.ffmpegAvailable = false;\n this.ffmpegPath = null;\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stderr:\n error instanceof Error && \"stderr\" in error\n ? String((error as NodeJS.ErrnoException).code)\n : undefined,\n timestamp: new Date().toISOString(),\n },\n \"FFmpeg not found in PATH:\"\n );\n }\n }\n\n private async verifyFFmpegCapabilities(): Promise<void> {\n try {\n const { stdout } = await execAsync(\"ffmpeg -codecs\");\n const hasRequiredCodecs = stdout.includes(\"pcm_s16le\") && stdout.includes(\"wav\");\n\n if (!hasRequiredCodecs) {\n throw new Error(\"FFmpeg installation missing required codecs (pcm_s16le, wav)\");\n }\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n timestamp: new Date().toISOString(),\n },\n \"FFmpeg capabilities verification failed:\"\n );\n throw error;\n }\n }\n\n private logFFmpegInstallInstructions(): void {\n logger.warn(\n {\n instructions: {\n mac: \"brew install ffmpeg\",\n ubuntu: \"sudo apt-get install ffmpeg\",\n windows: \"choco install ffmpeg\",\n manual: \"Download from https://ffmpeg.org/download.html\",\n },\n requiredVersion: \"4.0 or later\",\n requiredCodecs: [\"pcm_s16le\", \"wav\"],\n timestamp: new Date().toISOString(),\n },\n \"FFmpeg is required but not properly installed. Please install FFmpeg:\"\n );\n }\n\n public static getInstance(cacheDir: string): TranscribeManager {\n if (!TranscribeManager.instance) {\n TranscribeManager.instance = new TranscribeManager(cacheDir);\n }\n return TranscribeManager.instance;\n }\n\n private ensureCacheDirectory(): void {\n if (!fs.existsSync(this.cacheDir)) {\n fs.mkdirSync(this.cacheDir, { recursive: true });\n }\n }\n\n private async convertToWav(inputPath: string, outputPath: string): Promise<void> {\n if (!this.ffmpegAvailable) {\n throw new Error(\n \"FFmpeg is not installed or not properly configured. Please install FFmpeg to use audio transcription.\"\n );\n }\n\n try {\n const { stderr } = await execAsync(\n `ffmpeg -y -loglevel error -i \"${inputPath}\" -acodec pcm_s16le -ar 16000 -ac 1 \"${outputPath}\"`\n );\n\n if (stderr) {\n logger.warn(\n {\n stderr,\n inputPath,\n outputPath,\n timestamp: new Date().toISOString(),\n },\n \"FFmpeg conversion error:\"\n );\n }\n\n if (!fs.existsSync(outputPath)) {\n throw new Error(\"WAV file was not created successfully\");\n }\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n command: `ffmpeg -y -loglevel error -i \"${inputPath}\" -acodec pcm_s16le -ar 16000 -ac 1 \"${outputPath}\"`,\n ffmpegAvailable: this.ffmpegAvailable,\n ffmpegVersion: this.ffmpegVersion,\n ffmpegPath: this.ffmpegPath,\n timestamp: new Date().toISOString(),\n },\n \"Audio conversion failed:\"\n );\n throw new Error(\n `Failed to convert audio to WAV format: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n private async preprocessAudio(audioBuffer: Buffer): Promise<string> {\n if (!this.ffmpegAvailable) {\n throw new Error(\"FFmpeg is not installed. Please install FFmpeg to use audio transcription.\");\n }\n\n try {\n const isWav =\n audioBuffer.length > 4 &&\n audioBuffer.toString(\"ascii\", 0, 4) === \"RIFF\" &&\n audioBuffer.length > 12 &&\n audioBuffer.toString(\"ascii\", 8, 12) === \"WAVE\";\n\n const extension = isWav ? \".wav\" : \"\";\n const tempInputFile = path.join(this.cacheDir, `temp_input_${Date.now()}${extension}`);\n const tempWavFile = path.join(this.cacheDir, `temp_${Date.now()}.wav`);\n\n fs.writeFileSync(tempInputFile, audioBuffer);\n\n if (isWav) {\n try {\n const { stdout } = await execAsync(\n `ffprobe -v error -show_entries stream=sample_rate,channels,bits_per_raw_sample -of json \"${tempInputFile}\"`\n );\n const probeResult = JSON.parse(stdout);\n const stream = probeResult.streams?.[0];\n\n if (\n stream?.sample_rate === \"16000\" &&\n stream?.channels === 1 &&\n (stream?.bits_per_raw_sample === 16 || stream?.bits_per_raw_sample === undefined)\n ) {\n fs.renameSync(tempInputFile, tempWavFile);\n return tempWavFile;\n }\n } catch (probeError) {\n logger.debug(\n { error: probeError instanceof Error ? probeError.message : String(probeError) },\n \"FFprobe failed, continuing with conversion:\"\n );\n }\n }\n\n await this.convertToWav(tempInputFile, tempWavFile);\n\n if (fs.existsSync(tempInputFile)) {\n fs.unlinkSync(tempInputFile);\n }\n\n return tempWavFile;\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n ffmpegAvailable: this.ffmpegAvailable,\n timestamp: new Date().toISOString(),\n },\n \"Audio preprocessing failed:\"\n );\n throw new Error(\n `Failed to preprocess audio: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n public async transcribe(audioBuffer: Buffer): Promise<TranscriptionResult> {\n await this.ensureFFmpeg();\n\n if (!this.ffmpegAvailable) {\n throw new Error(\n \"FFmpeg is not installed or not properly configured. Please install FFmpeg to use audio transcription.\"\n );\n }\n\n try {\n const wavFile = await this.preprocessAudio(audioBuffer);\n\n logger.info(\"Starting transcription with whisper...\");\n\n let segments: Array<{ speech?: string }> | null = null;\n try {\n const whisper = await getWhisper();\n\n segments = await whisper(wavFile, {\n modelName: \"tiny\",\n modelPath: path.join(this.cacheDir, \"models\"),\n whisperOptions: {\n language: \"en\",\n word_timestamps: false,\n },\n });\n } catch (whisperError) {\n const errorMessage =\n whisperError instanceof Error ? whisperError.message : String(whisperError);\n if (errorMessage.includes(\"not found\") || errorMessage.includes(\"download\")) {\n logger.error(\"Whisper model not found. Please run: npx whisper-node download\");\n throw new Error(\n \"Whisper model not found. Please install it with: npx whisper-node download\"\n );\n }\n\n logger.error(\n { error: whisperError instanceof Error ? whisperError.message : String(whisperError) },\n \"Whisper transcription error:\"\n );\n throw whisperError;\n }\n\n if (fs.existsSync(wavFile)) {\n fs.unlinkSync(wavFile);\n logger.info(\"Temporary WAV file cleaned up\");\n }\n\n if (!segments || !Array.isArray(segments)) {\n logger.warn(\"Whisper returned no segments (likely silence or very short audio)\");\n return { text: \"\" };\n }\n\n if (segments.length === 0) {\n logger.warn(\"No speech detected in audio\");\n return { text: \"\" };\n }\n\n const cleanText = segments\n .map((segment: { speech?: string }) => segment.speech?.trim() || \"\")\n .filter((text: string) => text)\n .join(\" \");\n\n logger.success(\n {\n textLength: cleanText.length,\n segmentCount: segments.length,\n timestamp: new Date().toISOString(),\n },\n \"Transcription complete:\"\n );\n\n return { text: cleanText };\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n ffmpegAvailable: this.ffmpegAvailable,\n },\n \"Transcription failed:\"\n );\n throw error;\n }\n }\n}\n",
13
+ "// @ts-nocheck — pending migration: @huggingface/transformers 3->4\n// (PreTrainedModel/Florence2 interface changes), @elizaos/core logger\n// signature drift (structured-context overload removed), and\n// GenerateTextParams.{modelType,runtime} field removal. Tracked separately.\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { PassThrough, Readable } from \"node:stream\";\nimport { logger } from \"@elizaos/core\";\nimport { pipeline, type TextToAudioPipeline } from \"@huggingface/transformers\";\nimport { MODEL_SPECS } from \"../types\";\n\nfunction getWavHeader(\n audioLength: number,\n sampleRate: number,\n channelCount = 1,\n bitsPerSample = 16\n): Buffer {\n const wavHeader = Buffer.alloc(44);\n wavHeader.write(\"RIFF\", 0);\n wavHeader.writeUInt32LE(36 + audioLength, 4);\n wavHeader.write(\"WAVE\", 8);\n wavHeader.write(\"fmt \", 12);\n wavHeader.writeUInt32LE(16, 16);\n wavHeader.writeUInt16LE(1, 20);\n wavHeader.writeUInt16LE(channelCount, 22);\n wavHeader.writeUInt32LE(sampleRate, 24);\n wavHeader.writeUInt32LE((sampleRate * bitsPerSample * channelCount) / 8, 28);\n wavHeader.writeUInt16LE((bitsPerSample * channelCount) / 8, 32);\n wavHeader.writeUInt16LE(bitsPerSample, 34);\n wavHeader.write(\"data\", 36);\n wavHeader.writeUInt32LE(audioLength, 40);\n return wavHeader;\n}\n\nfunction prependWavHeader(\n readable: Readable,\n audioLength: number,\n sampleRate: number,\n channelCount = 1,\n bitsPerSample = 16\n): PassThrough {\n const wavHeader = getWavHeader(audioLength, sampleRate, channelCount, bitsPerSample);\n let pushedHeader = false;\n const passThrough = new PassThrough();\n readable.on(\"data\", (data: Buffer) => {\n if (!pushedHeader) {\n passThrough.push(wavHeader);\n pushedHeader = true;\n }\n passThrough.push(data);\n });\n readable.on(\"end\", () => {\n passThrough.end();\n });\n return passThrough;\n}\n\nexport class TTSManager {\n private static instance: TTSManager | null = null;\n private cacheDir: string;\n private synthesizer: TextToAudioPipeline | null = null;\n private defaultSpeakerEmbedding: Float32Array | null = null;\n private initialized = false;\n private initializingPromise: Promise<void> | null = null;\n\n private constructor(cacheDir: string) {\n this.cacheDir = path.join(cacheDir, \"tts\");\n this.ensureCacheDirectory();\n logger.debug(\"TTSManager using Transformers.js initialized\");\n }\n\n public static getInstance(cacheDir: string): TTSManager {\n if (!TTSManager.instance) {\n TTSManager.instance = new TTSManager(cacheDir);\n }\n return TTSManager.instance;\n }\n\n private ensureCacheDirectory(): void {\n if (!fs.existsSync(this.cacheDir)) {\n fs.mkdirSync(this.cacheDir, { recursive: true });\n logger.debug(\"Created TTS cache directory:\", this.cacheDir);\n }\n }\n\n private async initialize(): Promise<void> {\n if (this.initializingPromise) {\n return this.initializingPromise;\n }\n\n if (this.initialized) {\n return;\n }\n\n this.initializingPromise = (async () => {\n try {\n logger.info(\"Initializing TTS with Transformers.js backend...\");\n\n const ttsModelSpec = MODEL_SPECS.tts.default;\n if (!ttsModelSpec) {\n throw new Error(\"Default TTS model specification not found in MODEL_SPECS.\");\n }\n const modelName = ttsModelSpec.modelId;\n const speakerEmbeddingUrl = ttsModelSpec.defaultSpeakerEmbeddingUrl;\n\n logger.info(`Loading TTS pipeline for model: ${modelName}`);\n this.synthesizer = await pipeline(\"text-to-audio\", modelName);\n logger.success(`TTS pipeline loaded successfully for model: ${modelName}`);\n\n if (speakerEmbeddingUrl) {\n const embeddingFilename = path.basename(new URL(speakerEmbeddingUrl).pathname);\n const embeddingPath = path.join(this.cacheDir, embeddingFilename);\n\n if (fs.existsSync(embeddingPath)) {\n logger.info(\"Loading default speaker embedding from cache...\");\n const buffer = fs.readFileSync(embeddingPath);\n this.defaultSpeakerEmbedding = new Float32Array(\n buffer.buffer,\n buffer.byteOffset,\n buffer.length / Float32Array.BYTES_PER_ELEMENT\n );\n logger.success(\"Default speaker embedding loaded from cache.\");\n } else {\n logger.info(`Downloading default speaker embedding from: ${speakerEmbeddingUrl}`);\n const response = await fetch(speakerEmbeddingUrl);\n if (!response.ok) {\n throw new Error(`Failed to download speaker embedding: ${response.statusText}`);\n }\n const buffer = await response.arrayBuffer();\n this.defaultSpeakerEmbedding = new Float32Array(buffer);\n fs.writeFileSync(embeddingPath, Buffer.from(buffer));\n logger.success(\"Default speaker embedding downloaded and cached.\");\n }\n } else {\n logger.warn(\n `No default speaker embedding URL specified for model ${modelName}. Speaker control may be limited.`\n );\n this.defaultSpeakerEmbedding = null;\n }\n\n if (!this.synthesizer) {\n throw new Error(\"TTS initialization failed: Pipeline not loaded.\");\n }\n\n logger.success(\"TTS initialization complete (Transformers.js)\");\n this.initialized = true;\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n \"TTS (Transformers.js) initialization failed:\"\n );\n this.initialized = false;\n this.synthesizer = null;\n this.defaultSpeakerEmbedding = null;\n throw error;\n } finally {\n this.initializingPromise = null;\n }\n })();\n\n return this.initializingPromise;\n }\n\n public async generateSpeech(text: string): Promise<Readable> {\n try {\n await this.initialize();\n\n if (!this.synthesizer) {\n throw new Error(\"TTS Manager not properly initialized.\");\n }\n\n logger.info(\n { text: `${text.substring(0, 50)}...` },\n \"Starting speech generation with Transformers.js for text:\"\n );\n\n const output = await this.synthesizer(text, {\n ...(this.defaultSpeakerEmbedding && {\n speaker_embeddings: this.defaultSpeakerEmbedding,\n }),\n });\n\n const audioFloat32 = output.audio as Float32Array;\n const samplingRate = output.sampling_rate as number;\n\n logger.info(\n { samplingRate, length: audioFloat32.length },\n \"Raw audio data received from pipeline:\"\n );\n\n if (!audioFloat32 || audioFloat32.length === 0) {\n throw new Error(\"TTS pipeline generated empty audio output.\");\n }\n\n const pcmData = new Int16Array(audioFloat32.length);\n for (let i = 0; i < audioFloat32.length; i++) {\n const s = Math.max(-1, Math.min(1, audioFloat32[i]));\n pcmData[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n const audioBuffer = Buffer.from(pcmData.buffer);\n\n logger.info({ byteLength: audioBuffer.length }, \"Audio data converted to 16-bit PCM Buffer:\");\n\n const audioStream = prependWavHeader(\n Readable.from(audioBuffer),\n audioBuffer.length,\n samplingRate,\n 1,\n 16\n );\n\n logger.success(\"Speech generation complete (Transformers.js)\");\n return audioStream;\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n text: `${text.substring(0, 50)}...`,\n stack: error instanceof Error ? error.stack : undefined,\n },\n \"Transformers.js speech generation failed:\"\n );\n throw error;\n }\n }\n}\n",
14
+ "// @ts-nocheck — pending migration: @huggingface/transformers 3->4\n// (PreTrainedModel/Florence2 interface changes), @elizaos/core logger\n// signature drift (structured-context overload removed), and\n// GenerateTextParams.{modelType,runtime} field removal. Tracked separately.\nimport fs, { existsSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { logger } from \"@elizaos/core\";\nimport {\n AutoProcessor,\n AutoTokenizer,\n env,\n Florence2ForConditionalGeneration,\n type Florence2Processor,\n type PreTrainedTokenizer,\n type ProgressCallback,\n type ProgressInfo,\n RawImage,\n type Tensor,\n} from \"@huggingface/transformers\";\nimport { MODEL_SPECS } from \"../types\";\nimport { DownloadManager } from \"./downloadManager\";\n\ntype DeviceType = \"cpu\" | \"gpu\" | \"auto\";\ntype DTypeType = \"fp32\" | \"fp16\" | \"auto\";\n\ninterface PlatformConfig {\n device: DeviceType;\n dtype: DTypeType;\n useOnnx: boolean;\n}\n\nexport class VisionManager {\n private static instance: VisionManager | null = null;\n private model: Florence2ForConditionalGeneration | null = null;\n private processor: Florence2Processor | null = null;\n private tokenizer: PreTrainedTokenizer | null = null;\n private modelsDir: string;\n private cacheDir: string;\n private initialized = false;\n private modelDownloaded = false;\n private tokenizerDownloaded = false;\n private processorDownloaded = false;\n private platformConfig: PlatformConfig;\n\n private constructor(cacheDir: string) {\n this.modelsDir = path.join(path.dirname(cacheDir), \"models\", \"vision\");\n this.cacheDir = cacheDir;\n this.ensureModelsDirExists();\n this.downloadManager = DownloadManager.getInstance(this.cacheDir, this.modelsDir);\n this.platformConfig = this.getPlatformConfig();\n logger.debug(\"VisionManager initialized\");\n }\n\n private getPlatformConfig(): PlatformConfig {\n const platform = os.platform();\n const arch = os.arch();\n\n let config: PlatformConfig = {\n device: \"cpu\",\n dtype: \"fp32\",\n useOnnx: true,\n };\n\n if (platform === \"darwin\" && arch === \"arm64\") {\n config = {\n device: \"gpu\",\n dtype: \"fp16\",\n useOnnx: true,\n };\n } else if (platform === \"win32\" || platform === \"linux\") {\n const hasCuda = process.env.CUDA_VISIBLE_DEVICES !== undefined;\n if (hasCuda) {\n config = {\n device: \"gpu\",\n dtype: \"fp16\",\n useOnnx: true,\n };\n }\n }\n return config;\n }\n\n private ensureModelsDirExists(): void {\n if (!existsSync(this.modelsDir)) {\n logger.debug(`Creating models directory at: ${this.modelsDir}`);\n fs.mkdirSync(this.modelsDir, { recursive: true });\n }\n }\n\n public static getInstance(cacheDir: string): VisionManager {\n if (!VisionManager.instance) {\n VisionManager.instance = new VisionManager(cacheDir);\n }\n return VisionManager.instance;\n }\n\n private checkCacheExists(modelId: string, type: \"model\" | \"tokenizer\" | \"processor\"): boolean {\n const modelPath = path.join(this.modelsDir, modelId.replace(\"/\", \"--\"), type);\n if (existsSync(modelPath)) {\n logger.info(`${type} found at: ${modelPath}`);\n return true;\n }\n return false;\n }\n\n private async initialize() {\n try {\n if (this.initialized) {\n logger.info(\"Vision model already initialized, skipping initialization\");\n return;\n }\n\n logger.info(\"Starting vision model initialization...\");\n const modelSpec = MODEL_SPECS.vision;\n\n logger.info(\"Configuring environment for vision model...\");\n env.allowLocalModels = true;\n env.allowRemoteModels = true;\n\n if (this.platformConfig.useOnnx) {\n env.backends.onnx.enabled = true;\n env.backends.onnx.logLevel = \"info\";\n }\n\n logger.info(\"Loading Florence2 model...\");\n try {\n let lastProgress = -1;\n const modelCached = this.checkCacheExists(modelSpec.modelId, \"model\");\n\n const model = await Florence2ForConditionalGeneration.from_pretrained(modelSpec.modelId, {\n device: \"cpu\",\n cache_dir: this.modelsDir,\n local_files_only: modelCached,\n revision: \"main\",\n progress_callback: ((progressInfo: ProgressInfo) => {\n if (modelCached || this.modelDownloaded) return;\n const progress =\n \"progress\" in progressInfo ? Math.max(0, Math.min(1, progressInfo.progress)) : 0;\n const currentProgress = Math.round(progress * 100);\n if (currentProgress > lastProgress + 9 || currentProgress === 100) {\n lastProgress = currentProgress;\n const barLength = 30;\n const filledLength = Math.floor((currentProgress / 100) * barLength);\n const progressBar = \"▰\".repeat(filledLength) + \"▱\".repeat(barLength - filledLength);\n logger.info(`Downloading vision model: ${progressBar} ${currentProgress}%`);\n if (currentProgress === 100) this.modelDownloaded = true;\n }\n }) as ProgressCallback,\n });\n\n this.model = model as Florence2ForConditionalGeneration;\n logger.success(\"Florence2 model loaded successfully\");\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n modelId: modelSpec.modelId,\n },\n \"Failed to load Florence2 model:\"\n );\n throw error;\n }\n\n logger.info(\"Loading vision tokenizer...\");\n try {\n const tokenizerCached = this.checkCacheExists(modelSpec.modelId, \"tokenizer\");\n let tokenizerProgress = -1;\n\n this.tokenizer = await AutoTokenizer.from_pretrained(modelSpec.modelId, {\n cache_dir: this.modelsDir,\n local_files_only: tokenizerCached,\n progress_callback: ((progressInfo: ProgressInfo) => {\n if (tokenizerCached || this.tokenizerDownloaded) return;\n const progress =\n \"progress\" in progressInfo ? Math.max(0, Math.min(1, progressInfo.progress)) : 0;\n const currentProgress = Math.round(progress * 100);\n if (currentProgress !== tokenizerProgress) {\n tokenizerProgress = currentProgress;\n const barLength = 30;\n const filledLength = Math.floor((currentProgress / 100) * barLength);\n const progressBar = \"▰\".repeat(filledLength) + \"▱\".repeat(barLength - filledLength);\n logger.info(`Downloading vision tokenizer: ${progressBar} ${currentProgress}%`);\n if (currentProgress === 100) this.tokenizerDownloaded = true;\n }\n }) as ProgressCallback,\n });\n logger.success(\"Vision tokenizer loaded successfully\");\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n modelId: modelSpec.modelId,\n },\n \"Failed to load tokenizer:\"\n );\n throw error;\n }\n\n logger.info(\"Loading vision processor...\");\n try {\n const processorCached = this.checkCacheExists(modelSpec.modelId, \"processor\");\n let processorProgress = -1;\n\n this.processor = (await AutoProcessor.from_pretrained(modelSpec.modelId, {\n device: \"cpu\",\n cache_dir: this.modelsDir,\n local_files_only: processorCached,\n progress_callback: ((progressInfo: ProgressInfo) => {\n if (processorCached || this.processorDownloaded) return;\n const progress =\n \"progress\" in progressInfo ? Math.max(0, Math.min(1, progressInfo.progress)) : 0;\n const currentProgress = Math.round(progress * 100);\n if (currentProgress !== processorProgress) {\n processorProgress = currentProgress;\n const barLength = 30;\n const filledLength = Math.floor((currentProgress / 100) * barLength);\n const progressBar = \"▰\".repeat(filledLength) + \"▱\".repeat(barLength - filledLength);\n logger.info(`Downloading vision processor: ${progressBar} ${currentProgress}%`);\n if (currentProgress === 100) this.processorDownloaded = true;\n }\n }) as ProgressCallback,\n })) as Florence2Processor;\n logger.success(\"Vision processor loaded successfully\");\n } catch (error) {\n logger.error(\"Failed to load vision processor:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n modelId: modelSpec.modelId,\n });\n throw error;\n }\n\n this.initialized = true;\n logger.success(\"Vision model initialization complete\");\n } catch (error) {\n logger.error(\"Vision model initialization failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n modelsDir: this.modelsDir,\n });\n throw error;\n }\n }\n\n private async fetchImage(url: string): Promise<{ buffer: Buffer; mimeType: string }> {\n try {\n logger.info(`Fetching image from URL: ${url.slice(0, 100)}...`);\n\n if (url.startsWith(\"data:\")) {\n logger.info(\"Processing data URL...\");\n const [header, base64Data] = url.split(\",\");\n const mimeType = header.split(\";\")[0].split(\":\")[1];\n const buffer = Buffer.from(base64Data, \"base64\");\n logger.info(\"Data URL processed successfully\");\n return { buffer, mimeType };\n }\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch image: ${response.statusText}`);\n }\n const buffer = Buffer.from(await response.arrayBuffer());\n const mimeType = response.headers.get(\"content-type\") || \"image/jpeg\";\n\n logger.info(\"Image fetched successfully:\", {\n mimeType,\n bufferSize: buffer.length,\n status: response.status,\n });\n\n return { buffer, mimeType };\n } catch (error) {\n logger.error(\"Failed to fetch image:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n url,\n });\n throw error;\n }\n }\n\n public async processImage(imageUrl: string): Promise<{ title: string; description: string }> {\n try {\n logger.info(\"Starting image processing...\");\n\n if (!this.initialized) {\n logger.info(\"Vision model not initialized, initializing now...\");\n await this.initialize();\n }\n\n if (!this.model || !this.processor || !this.tokenizer) {\n throw new Error(\"Vision model components not properly initialized\");\n }\n\n logger.info(\"Fetching image...\");\n const { buffer, mimeType } = await this.fetchImage(imageUrl);\n\n logger.info(\"Creating image blob...\");\n const blob = new Blob([buffer], { type: mimeType });\n logger.info(\"Converting blob to RawImage...\");\n const image = await RawImage.fromBlob(blob as globalThis.Blob);\n\n logger.info(\"Processing image with vision processor...\");\n const visionInputs = await this.processor(image);\n logger.info(\"Constructing prompts...\");\n const prompts = this.processor.construct_prompts(\"<DETAILED_CAPTION>\");\n logger.info(\"Tokenizing prompts...\");\n const textInputs = this.tokenizer(prompts);\n\n logger.info(\"Generating image description...\");\n const generatedIds = (await this.model.generate({\n ...textInputs,\n ...visionInputs,\n max_new_tokens: MODEL_SPECS.vision.maxTokens,\n })) as Tensor;\n\n logger.info(\"Decoding generated text...\");\n const generatedText = this.tokenizer.batch_decode(generatedIds, {\n skip_special_tokens: false,\n })[0];\n\n logger.info(\"Post-processing generation...\");\n const result = this.processor.post_process_generation(\n generatedText,\n \"<DETAILED_CAPTION>\",\n image.size\n );\n\n const detailedCaption = result[\"<DETAILED_CAPTION>\"] as string;\n const response = {\n title: `${detailedCaption.split(\".\")[0]}.`,\n description: detailedCaption,\n };\n\n logger.success(\"Image processing complete:\", {\n titleLength: response.title.length,\n descriptionLength: response.description.length,\n });\n\n return response;\n } catch (error) {\n logger.error(\"Image processing failed:\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n imageUrl,\n modelInitialized: this.initialized,\n hasModel: !!this.model,\n hasProcessor: !!this.processor,\n hasTokenizer: !!this.tokenizer,\n });\n throw error;\n }\n }\n}\n"
14
15
  ],
15
- "mappings": "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",
16
- "debugId": "47689E660851F59964756E2164756E21",
16
+ "mappings": "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",
17
+ "debugId": "B1A63AD720108B0264756E2164756E21",
17
18
  "names": []
18
19
  }