{"version":3,"sources":["../src/polyfill/session.ts","../src/polyfill/index.ts"],"sourcesContent":["import { LlmInference, ProgressListener } from '@mediapipe/tasks-genai';\nimport type {\n  ChromeAIAssistant,\n  ChromeAIAssistantFactory,\n  ChromeAIAssistantCapabilities,\n  ChromeAIAssistantCreateOptions,\n  PolyfillChromeAIOptions,\n} from '../global';\nimport { ChromeAICapabilityAvailability } from '../enum';\nimport createDebug from 'debug';\n\nconst debug = createDebug('chromeai:polyfill');\n\nclass PolyfillChromeAIAssistant implements ChromeAIAssistant {\n  public constructor(private llm: LlmInference) {\n    debug('PolyfillChromeAIAssistant created', llm);\n  }\n\n  public prompt = async (prompt: string): Promise<string> => {\n    const response = await this.llm.generateResponse(prompt);\n    debug('prompt', prompt, response);\n    return response;\n  };\n\n  public promptStreaming = (prompt: string): ReadableStream<string> => {\n    debug('promptStreaming', prompt);\n    const stream = new ReadableStream<string>({\n      start: (controller) => {\n        const listener: ProgressListener = (\n          partialResult: string,\n          done: boolean\n        ) => {\n          controller.enqueue(partialResult);\n          if (done) {\n            controller.close();\n          }\n        };\n        this.llm.generateResponse(prompt, listener);\n      },\n      cancel: (reason) => {\n        console.warn('stream text canceled', reason);\n      },\n    });\n    debug('promptStreaming', prompt);\n    return stream;\n  };\n\n  public destroy = async () => this.llm.close();\n}\n\n/**\n * Model: https://huggingface.co/oongaboongahacker/Gemini-Nano\n */\nexport class PolyfillChromeAIAssistantFactory\n  implements ChromeAIAssistantFactory\n{\n  private aiOptions: PolyfillChromeAIOptions = {\n    wasmBinaryPath:\n      'https://pub-ddcfe353995744e89b8002f16bf98575.r2.dev/genai_wasm_internal.wasm',\n    wasmLoaderPath:\n      'https://pub-ddcfe353995744e89b8002f16bf98575.r2.dev/genai_wasm_internal.js',\n    // About 1.78GB, should cache by browser\n    modelAssetPath:\n      'https://pub-ddcfe353995744e89b8002f16bf98575.r2.dev/gemini-nano-it-chrome-128.bin',\n  };\n\n  public constructor(aiOptions: Partial<PolyfillChromeAIOptions> = {}) {\n    this.aiOptions = Object.assign(this.aiOptions, aiOptions);\n    debug('PolyfillChromeAI created', this.aiOptions);\n    this.modelAssetBuffer = fetch(this.aiOptions.modelAssetPath).then(\n      (response) => response.body!.getReader()\n    )!;\n  }\n\n  private modelAssetBuffer: Promise<ReadableStreamDefaultReader>;\n\n  public capabilities = async (): Promise<ChromeAIAssistantCapabilities> => {\n    const defaultOptions = {\n      defaultTemperature: 0.8,\n      defaultTopK: 3,\n      maxTopK: 128,\n    };\n\n    // If browser do not support WebAssembly/WebGPU, return 'no';\n    if (typeof WebAssembly.instantiate !== 'function')\n      return {\n        ...defaultOptions,\n        available: ChromeAICapabilityAvailability.NO,\n      };\n    if (!(<any>navigator).gpu)\n      return {\n        ...defaultOptions,\n        available: ChromeAICapabilityAvailability.NO,\n      };\n\n    // Check if modelAssetBuffer is downloaded, if not, return 'after-download';\n    const isModelAssetBufferReady = await Promise.race([\n      this.modelAssetBuffer,\n      Promise.resolve('sentinel'),\n    ])\n      .then((value) => value === 'sentinel')\n      .catch(() => true);\n\n    return {\n      ...defaultOptions,\n      available: isModelAssetBufferReady\n        ? ChromeAICapabilityAvailability.READILY\n        : ChromeAICapabilityAvailability.AFTER_DOWNLOAD,\n    };\n  };\n\n  public create = async (\n    options?: ChromeAIAssistantCreateOptions\n  ): Promise<ChromeAIAssistant> => {\n    const defaultParams = await this.capabilities();\n    const argv = Object.assign(\n      {\n        temperature: defaultParams.defaultTemperature,\n        topK: defaultParams.defaultTopK,\n      },\n      options\n    );\n    const llm = await LlmInference.createFromOptions(\n      {\n        wasmLoaderPath: this.aiOptions.wasmLoaderPath!,\n        wasmBinaryPath: this.aiOptions.wasmBinaryPath!,\n      },\n      {\n        baseOptions: {\n          modelAssetBuffer: await this.modelAssetBuffer,\n        },\n        temperature: argv.temperature,\n        topK: argv.topK,\n      }\n    );\n    const session = new PolyfillChromeAIAssistant(llm);\n    debug('createSession', options, session);\n    return session;\n  };\n}\n\nexport const polyfillChromeAI = (\n  options?: Partial<PolyfillChromeAIOptions>\n) => {\n  const ai = {\n    assistant: new PolyfillChromeAIAssistantFactory(options),\n  };\n  globalThis.ai = globalThis.ai || ai;\n  globalThis.model = globalThis.model || ai;\n};\n","import { polyfillChromeAI } from './session';\n\npolyfillChromeAI(globalThis.__polyfill_ai_options__);\n"],"mappings":"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","names":[]}