{"version":3,"file":"ngx-web-llm.mjs","sources":["../../../projects/ngx-web-llm/src/lib/config/ngx-web-llm.config.token.ts","../../../projects/ngx-web-llm/src/lib/web-llm.service.ts","../../../projects/ngx-web-llm/src/lib/ngx-web-llm.module.ts","../../../projects/ngx-web-llm/src/public-api.ts","../../../projects/ngx-web-llm/src/ngx-web-llm.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport { NgxWebLlmConfig } from './ngx-web-llm-config.interface';\r\n\r\n// Injection token for the configuration\r\nexport const NGX_WEB_LLM_CONFIG = new InjectionToken<NgxWebLlmConfig>(\r\n  'ngx-web-llm.config'\r\n);\r\n","import { Injectable, Optional, Inject } from '@angular/core';\r\nimport { BehaviorSubject, Observable, Subject, from, throwError } from 'rxjs';\r\nimport {\r\n  catchError,\r\n  switchMap,\r\n  map,\r\n  distinctUntilChanged,\r\n  filter,\r\n} from 'rxjs/operators';\r\nimport * as webllm from '@mlc-ai/web-llm';\r\n\r\nimport { NgxInitProgressReport } from './interfaces/ngx-init-progress-report.interface';\r\nimport { NgxChatCompletionRequest } from './interfaces/ngx-chat-completion-request.interface';\r\nimport { NgxMessage } from './interfaces/ngx-message.interface'; // Though NgxChatCompletionRequest imports it, service might use it directly\r\nimport { NgxChatCompletionChunk } from './interfaces/ngx-chat-completion-chunk.interface';\r\nimport { NgxChatCompletion } from './interfaces/ngx-chat-completion.interface';\r\nimport { NgxModelRecord } from './interfaces/ngx-model-record.interface';\r\n\r\nimport { NgxWebLlmConfig } from './config/ngx-web-llm-config.interface';\r\nimport { NGX_WEB_LLM_CONFIG } from './config/ngx-web-llm.config.token';\r\n\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class WebLlmService {\r\n  private engine: webllm.MLCEngineInterface | null = null;\r\n  private worker: Worker | null = null;\r\n\r\n  private readonly DEFAULT_MODEL_ID = 'Llama-3.1-8B-Instruct-q4f32_1-MLC';\r\n  private readonly DEFAULT_ENGINE_CONFIG: webllm.MLCEngineConfig = {\r\n    logLevel: 'INFO',\r\n  };\r\n\r\n  private _initializationProgress =\r\n    new BehaviorSubject<NgxInitProgressReport | null>(null);\r\n  private _engineReady = new BehaviorSubject<boolean>(false);\r\n  private _currentModelId = new BehaviorSubject<string | null>(null);\r\n\r\n  constructor(\r\n    @Optional() @Inject(NGX_WEB_LLM_CONFIG) private config?: NgxWebLlmConfig\r\n  ) {\r\n    if (config?.preload) {\r\n      const modelIdToPreload = config.defaultModelId || this.DEFAULT_MODEL_ID;\r\n      const engineConfigToPreload =\r\n        config.defaultEngineConfig || this.DEFAULT_ENGINE_CONFIG;\r\n      const useWorkerForPreload = !!(config && config.workerScriptUrl);\r\n      this.initializeEngine(\r\n        modelIdToPreload,\r\n        engineConfigToPreload,\r\n        useWorkerForPreload\r\n      ).catch((error) => {\r\n        console.error('Error during preload:', error);\r\n      });\r\n    }\r\n  }\r\n\r\n  get currentModelId(): string | null {\r\n    return this._currentModelId.value;\r\n  }\r\n\r\n  get currentModelId$(): Observable<string | null> {\r\n    return this._currentModelId.asObservable();\r\n  }\r\n\r\n  get isEngineReady(): boolean {\r\n    return this._engineReady.value;\r\n  }\r\n\r\n  get engineReady$(): Observable<boolean> {\r\n    return this._engineReady.asObservable();\r\n  }\r\n\r\n  get initializationProgress(): NgxInitProgressReport | null {\r\n    return this._initializationProgress.value;\r\n  }\r\n\r\n  get initializationProgress$(): Observable<NgxInitProgressReport | null> {\r\n    return this._initializationProgress.asObservable();\r\n  }\r\n\r\n  get isLoading(): boolean {\r\n    const progress = this.initializationProgress;\r\n    return progress !== null && progress.progress < 1;\r\n  }\r\n\r\n  get isLoading$(): Observable<boolean> {\r\n    return this.initializationProgress$.pipe(\r\n      map((progress) => progress !== null && progress.progress < 1),\r\n      distinctUntilChanged()\r\n    );\r\n  }\r\n\r\n  get prebuiltAppConfig(): webllm.AppConfig {\r\n    return webllm.prebuiltAppConfig;\r\n  }\r\n\r\n  async initializeEngine(\r\n    modelId: string = this.config?.defaultModelId || this.DEFAULT_MODEL_ID,\r\n    config?: webllm.MLCEngineConfig,\r\n    useWebWorker: boolean = false\r\n  ): Promise<void> {\r\n    const engineConfigToUse =\r\n      config || this.config?.defaultEngineConfig || this.DEFAULT_ENGINE_CONFIG;\r\n\r\n    if (this.config?.caching) {\r\n      if (this.config.caching.usePersistentStorage) {\r\n        if (navigator.storage && navigator.storage.persist) {\r\n          try {\r\n            const isPersisted = await navigator.storage.persist();\r\n            console.log(\r\n              `Persistent storage ${isPersisted ? 'granted' : 'denied'}`\r\n            );\r\n          } catch (e) {\r\n            console.warn('Error requesting persistent storage:', e);\r\n          }\r\n        }\r\n      }\r\n\r\n      if (\r\n        this.config.caching.storageQuotaBytes &&\r\n        this.config.caching.storageQuotaBytes > 0\r\n      ) {\r\n        if (navigator.storage && navigator.storage.estimate) {\r\n          try {\r\n            const estimate = await navigator.storage.estimate();\r\n            console.log(\r\n              `Storage estimate: ${estimate.usage} bytes used out of ${estimate.quota} bytes quota`\r\n            );\r\n          } catch (e) {\r\n            console.warn('Error estimating storage:', e);\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    if (this.engine) {\r\n      console.warn(\r\n        'Engine already initialized. Call unload() or reload() first.'\r\n      );\r\n      if (this._currentModelId.value === modelId && this._engineReady.value) {\r\n        return;\r\n      }\r\n      await this.unloadEngine();\r\n    }\r\n\r\n    this._engineReady.next(false);\r\n    this._currentModelId.next(modelId);\r\n    this._initializationProgress.next({\r\n      progress: 0,\r\n      timeElapsed: 0,\r\n      text: 'Initializing...',\r\n    });\r\n\r\n    const initProgressCallback = (report: webllm.InitProgressReport) => {\r\n      this._initializationProgress.next(report as NgxInitProgressReport);\r\n    };\r\n\r\n    const fullConfig: webllm.MLCEngineConfig = {\r\n      initProgressCallback,\r\n      logLevel: engineConfigToUse?.logLevel || 'INFO',\r\n      ...engineConfigToUse,\r\n    };\r\n\r\n    try {\r\n      if (useWebWorker) {\r\n        if (typeof Worker === 'undefined') {\r\n          console.warn(\r\n            'Web Workers are not available. Falling back to main thread. This may block the UI.'\r\n          );\r\n          this.engine = await webllm.CreateMLCEngine(modelId, fullConfig);\r\n        } else {\r\n          if (!this.config?.workerScriptUrl) {\r\n            console.error(\r\n              'Web Worker is enabled, but workerScriptUrl is not provided in the NgxWebLlmConfig. Falling back to main thread.'\r\n            );\r\n            this.engine = await webllm.CreateMLCEngine(modelId, fullConfig);\r\n          } else {\r\n            const workerUrl = new URL(\r\n              this.config.workerScriptUrl,\r\n              import.meta.url\r\n            );\r\n            this.worker = new Worker(workerUrl, { type: 'module' });\r\n            this.engine = await webllm.CreateWebWorkerMLCEngine(\r\n              this.worker,\r\n              modelId,\r\n              fullConfig\r\n            );\r\n          }\r\n        }\r\n      } else {\r\n        this.engine = await webllm.CreateMLCEngine(modelId, fullConfig);\r\n      }\r\n      this._engineReady.next(true);\r\n      this._initializationProgress.next({\r\n        progress: 1,\r\n        timeElapsed: 0,\r\n        text: 'Engine Ready.',\r\n      } as NgxInitProgressReport);\r\n      console.log('Engine initialized.');\r\n    } catch (error) {\r\n      this._engineReady.next(false);\r\n      this._currentModelId.next(null);\r\n      this._initializationProgress.next({\r\n        progress: 0,\r\n        timeElapsed: 0,\r\n        text: `Error: ${error}`,\r\n      } as NgxInitProgressReport);\r\n      console.error('Failed to initialize WebLLM Engine:', error);\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  getAvailableModels(): NgxModelRecord[] {\r\n    return this.prebuiltAppConfig.model_list;\r\n  }\r\n\r\n  chatCompletions(\r\n    request: NgxChatCompletionRequest\r\n  ): Observable<NgxChatCompletionChunk | NgxChatCompletion> {\r\n    if (!this.engine || !this.isEngineReady) {\r\n      return throwError(\r\n        () => new Error('Engine not initialized or not ready.')\r\n      );\r\n    }\r\n\r\n    const engine = this.engine;\r\n\r\n    if (request.stream) {\r\n      const subject = new Subject<NgxChatCompletionChunk>();\r\n      const processStream = async () => {\r\n        try {\r\n          const chunksAsyncIterable = await engine.chat.completions.create(\r\n            request as webllm.ChatCompletionRequestStreaming\r\n          );\r\n          for await (const chunk of chunksAsyncIterable) {\r\n            subject.next(chunk as NgxChatCompletionChunk);\r\n          }\r\n          subject.complete();\r\n        } catch (error) {\r\n          subject.error(error);\r\n        }\r\n      };\r\n      processStream();\r\n      return subject.asObservable();\r\n    } else {\r\n      return from(\r\n        engine.chat.completions.create(\r\n          request as webllm.ChatCompletionRequest\r\n        ) as Promise<webllm.ChatCompletion>\r\n      ).pipe(\r\n        map((response) => response as NgxChatCompletion),\r\n        catchError((err) => {\r\n          console.error('Chat completion error:', err);\r\n          return throwError(() => err);\r\n        })\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Provides a simpler way to stream chat completions, yielding only the delta content strings.\r\n   * @param request The chat completion request, `stream` property will be overridden to true.\r\n   * @returns An Observable that emits delta content strings from the assistant's response.\r\n   */\r\n  streamChatDeltas(\r\n    request: Omit<NgxChatCompletionRequest, 'stream'>\r\n  ): Observable<string> {\r\n    if (!this.engine || !this.isEngineReady) {\r\n      return throwError(\r\n        () => new Error('Engine not initialized or not ready.')\r\n      );\r\n    }\r\n\r\n    const fullRequest: NgxChatCompletionRequest = {\r\n      ...request,\r\n      stream: true, // Ensure streaming is enabled\r\n    };\r\n\r\n    return this.chatCompletions(fullRequest).pipe(\r\n      filter(\r\n        (chunk): chunk is NgxChatCompletionChunk =>\r\n          chunk.hasOwnProperty('choices') &&\r\n          Array.isArray((chunk as any).choices) &&\r\n          (chunk as NgxChatCompletionChunk).choices.length > 0 &&\r\n          (chunk as NgxChatCompletionChunk).choices[0].delta !== undefined &&\r\n          (chunk as NgxChatCompletionChunk).choices[0].delta.content !== null &&\r\n          (chunk as NgxChatCompletionChunk).choices[0].delta.content !==\r\n            undefined\r\n      ),\r\n      map(\r\n        (chunk: NgxChatCompletionChunk) =>\r\n          chunk.choices[0].delta.content as string\r\n      ) // Already filtered for non-null/undefined\r\n    );\r\n  }\r\n\r\n  async reloadModel(\r\n    modelId: string,\r\n    chatOpts?: webllm.ChatOptions\r\n  ): Promise<void> {\r\n    if (!this.engine) {\r\n      throw new Error('Engine not initialized. Call initializeEngine() first.');\r\n    }\r\n    this._engineReady.next(false);\r\n    this._currentModelId.next(modelId);\r\n    this._initializationProgress.next({\r\n      progress: 0,\r\n      timeElapsed: 0,\r\n      text: `Reloading to ${modelId}...`,\r\n    } as NgxInitProgressReport);\r\n    try {\r\n      await this.engine.reload(modelId, chatOpts);\r\n      this._engineReady.next(true);\r\n      this._initializationProgress.next({\r\n        progress: 1,\r\n        timeElapsed: 0,\r\n        text: 'Engine Reloaded.',\r\n      } as NgxInitProgressReport);\r\n    } catch (error) {\r\n      this._engineReady.next(false);\r\n      this._currentModelId.next(null);\r\n      this._initializationProgress.next({\r\n        progress: 0,\r\n        timeElapsed: 0,\r\n        text: `Error reloading: ${error}`,\r\n      } as NgxInitProgressReport);\r\n      console.error('Failed to reload model:', error);\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  async unloadEngine(): Promise<void> {\r\n    if (this.engine) {\r\n      await this.engine.unload();\r\n      this.engine = null;\r\n      if (this.worker) {\r\n        this.worker.terminate();\r\n        this.worker = null;\r\n      }\r\n      this._engineReady.next(false);\r\n      this._currentModelId.next(null);\r\n      this._initializationProgress.next(null);\r\n    }\r\n  }\r\n\r\n  async interruptGeneration(): Promise<void> {\r\n    if (this.engine && this.isEngineReady) {\r\n      await this.engine.interruptGenerate();\r\n    }\r\n  }\r\n\r\n  async getRuntimeStats(): Promise<string> {\r\n    if (this.engine && this.isEngineReady) {\r\n      return await this.engine.runtimeStatsText();\r\n    }\r\n    return 'Engine not ready.';\r\n  }\r\n\r\n  async resetChat(keepSystemPrompt: boolean = false): Promise<void> {\r\n    if (this.engine && this.isEngineReady) {\r\n      await this.engine.resetChat(keepSystemPrompt);\r\n    }\r\n  }\r\n}\r\n","// projects/ngx-web-llm/src/lib/ngx-web-llm.module.ts\r\nimport { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n// WebLlmService is providedIn: 'root'\r\nimport { NGX_WEB_LLM_CONFIG } from './config/ngx-web-llm.config.token';\r\nimport { NgxWebLlmConfig } from './config/ngx-web-llm-config.interface';\r\n\r\n@NgModule({\r\n  imports: [CommonModule],\r\n  // providers: [WebLlmService] // Service is providedIn: 'root'\r\n})\r\nexport class NgxWebLlmModule {\r\n  public static forRoot(\r\n    config?: NgxWebLlmConfig\r\n  ): ModuleWithProviders<NgxWebLlmModule> {\r\n    return {\r\n      ngModule: NgxWebLlmModule,\r\n      providers: [\r\n        // WebLlmService is already provided in root.\r\n        // We provide the configuration for it here.\r\n        {\r\n          provide: NGX_WEB_LLM_CONFIG,\r\n          useValue: config || {}, // Provide the config, or an empty object if none given\r\n        },\r\n      ],\r\n    };\r\n  }\r\n}\r\n","// Service class\r\nexport * from './lib/web-llm.service';\r\n\r\n// Module\r\nexport * from './lib/ngx-web-llm.module';\r\n\r\n// Interfaces\r\nexport type { NgxInitProgressReport } from './lib/interfaces/ngx-init-progress-report.interface';\r\nexport type { NgxChatCompletionRequest } from './lib/interfaces/ngx-chat-completion-request.interface';\r\nexport type { NgxMessage } from './lib/interfaces/ngx-message.interface';\r\nexport type { NgxChatCompletionChunk } from './lib/interfaces/ngx-chat-completion-chunk.interface';\r\nexport type { NgxChatCompletion } from './lib/interfaces/ngx-chat-completion.interface';\r\nexport type { NgxModelRecord } from './lib/interfaces/ngx-model-record.interface';\r\n\r\n// Configuration Interface and Token\r\nexport type { NgxWebLlmConfig } from './lib/config/ngx-web-llm-config.interface';\r\nexport { NGX_WEB_LLM_CONFIG } from './lib/config/ngx-web-llm.config.token';\r\n\r\n// Web Worker Handler\r\nexport { WebWorkerMLCEngineHandler } from '@mlc-ai/web-llm';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}