{"version":3,"sources":["../../../../node_modules/@ai-sdk/provider/src/errors/ai-sdk-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/api-call-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/empty-response-body-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/get-error-message.ts","../../../../node_modules/@ai-sdk/provider/src/errors/invalid-argument-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/invalid-prompt-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/invalid-response-data-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/json-parse-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/load-api-key-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/load-setting-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/no-content-generated-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/no-such-model-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/too-many-embedding-values-for-call-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/type-validation-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/unsupported-functionality-error.ts","../../../../node_modules/@ai-sdk/provider/src/json-value/is-json.ts","../src/chat/transformers-js-language-model.ts","../src/utils/convert-to-transformers-message.ts","../../shared/src/utils/tool-utils.ts","../../shared/src/utils/warnings.ts","../../shared/src/tool-calling/parse-json-function-calls.ts","../../shared/src/streaming/tool-call-detector.ts","../../shared/src/streaming/tool-call-stream-utils.ts","../../shared/src/streaming/stream-processor.ts","../src/utils/generation-stream.ts","../src/utils/convert-tools.ts","../src/utils/generation-helpers.ts","../src/embedding/transformers-js-embedding-model.ts","../src/transcription/transformers-js-transcription-model.ts","../src/transformers-js-provider.ts","../src/chat/transformers-js-worker-handler.ts","../src/utils/decode-utils.ts","../src/transcription/transformers-js-transcription-worker-handler.ts"],"sourcesContent":["/**\n * Symbol used for identifying AI SDK Error instances.\n * Enables checking if an error is an instance of AISDKError across package versions.\n */\nconst marker = 'vercel.ai.error';\nconst symbol = Symbol.for(marker);\n\n/**\n * Custom error class for AI SDK related errors.\n * @extends Error\n */\nexport class AISDKError extends Error {\n  private readonly [symbol] = true; // used in isInstance\n\n  /**\n   * The underlying cause of the error, if any.\n   */\n  readonly cause?: unknown;\n\n  /**\n   * Creates an AI SDK Error.\n   *\n   * @param {Object} params - The parameters for creating the error.\n   * @param {string} params.name - The name of the error.\n   * @param {string} params.message - The error message.\n   * @param {unknown} [params.cause] - The underlying cause of the error.\n   */\n  constructor({\n    name,\n    message,\n    cause,\n  }: {\n    name: string;\n    message: string;\n    cause?: unknown;\n  }) {\n    super(message);\n\n    this.name = name;\n    this.cause = cause;\n  }\n\n  /**\n   * Checks if the given error is an AI SDK Error.\n   * @param {unknown} error - The error to check.\n   * @returns {boolean} True if the error is an AI SDK Error, false otherwise.\n   */\n  static isInstance(error: unknown): error is AISDKError {\n    return AISDKError.hasMarker(error, marker);\n  }\n\n  protected static hasMarker(error: unknown, marker: string): boolean {\n    const markerSymbol = Symbol.for(marker);\n    return (\n      error != null &&\n      typeof error === 'object' &&\n      markerSymbol in error &&\n      typeof error[markerSymbol] === 'boolean' &&\n      error[markerSymbol] === true\n    );\n  }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_APICallError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class APICallError extends AISDKError {\n  private readonly [symbol] = true; // used in isInstance\n\n  readonly url: string;\n  readonly requestBodyValues: unknown;\n  readonly statusCode?: number;\n\n  readonly responseHeaders?: Record<string, string>;\n  readonly responseBody?: string;\n\n  readonly isRetryable: boolean;\n  readonly data?: unknown;\n\n  constructor({\n    message,\n    url,\n    requestBodyValues,\n    statusCode,\n    responseHeaders,\n    responseBody,\n    cause,\n    isRetryable = statusCode != null &&\n      (statusCode === 408 || // request timeout\n        statusCode === 409 || // conflict\n        statusCode === 429 || // too many requests\n        statusCode >= 500), // server error\n    data,\n  }: {\n    message: string;\n    url: string;\n    requestBodyValues: unknown;\n    statusCode?: number;\n    responseHeaders?: Record<string, string>;\n    responseBody?: string;\n    cause?: unknown;\n    isRetryable?: boolean;\n    data?: unknown;\n  }) {\n    super({ name, message, cause });\n\n    this.url = url;\n    this.requestBodyValues = requestBodyValues;\n    this.statusCode = statusCode;\n    this.responseHeaders = responseHeaders;\n    this.responseBody = responseBody;\n    this.isRetryable = isRetryable;\n    this.data = data;\n  }\n\n  static isInstance(error: unknown): error is APICallError {\n    return AISDKError.hasMarker(error, marker);\n  }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_EmptyResponseBodyError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class EmptyResponseBodyError extends AISDKError {\n  private readonly [symbol] = true; // used in isInstance\n\n  constructor({ message = 'Empty response body' }: { message?: string } = {}) {\n    super({ name, message });\n  }\n\n  static isInstance(error: unknown): error is EmptyResponseBodyError {\n    return AISDKError.hasMarker(error, marker);\n  }\n}\n","export function getErrorMessage(error: unknown | undefined) {\n  if (error == null) {\n    return 'unknown error';\n  }\n\n  if (typeof error === 'string') {\n    return error;\n  }\n\n  if (error instanceof Error) {\n    return error.message;\n  }\n\n  return JSON.stringify(error);\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidArgumentError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * A function argument is invalid.\n */\nexport class InvalidArgumentError extends AISDKError {\n  private readonly [symbol] = true; // used in isInstance\n\n  readonly argument: string;\n\n  constructor({\n    message,\n    cause,\n    argument,\n  }: {\n    argument: string;\n    message: string;\n    cause?: unknown;\n  }) {\n    super({ name, message, cause });\n\n    this.argument = argument;\n  }\n\n  static isInstance(error: unknown): error is InvalidArgumentError {\n    return AISDKError.hasMarker(error, marker);\n  }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidPromptError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * A prompt is invalid. This error should be thrown by providers when they cannot\n * process a prompt.\n */\nexport class InvalidPromptError extends AISDKError {\n  private readonly [symbol] = true; // used in isInstance\n\n  readonly prompt: unknown;\n\n  constructor({\n    prompt,\n    message,\n    cause,\n  }: {\n    prompt: unknown;\n    message: string;\n    cause?: unknown;\n  }) {\n    super({ name, message: `Invalid prompt: ${message}`, cause });\n\n    this.prompt = prompt;\n  }\n\n  static isInstance(error: unknown): error is InvalidPromptError {\n    return AISDKError.hasMarker(error, marker);\n  }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidResponseDataError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Server returned a response with invalid data content.\n * This should be thrown by providers when they cannot parse the response from the API.\n */\nexport class InvalidResponseDataError extends AISDKError {\n  private readonly [symbol] = true; // used in isInstance\n\n  readonly data: unknown;\n\n  constructor({\n    data,\n    message = `Invalid response data: ${JSON.stringify(data)}.`,\n  }: {\n    data: unknown;\n    message?: string;\n  }) {\n    super({ name, message });\n\n    this.data = data;\n  }\n\n  static isInstance(error: unknown): error is InvalidResponseDataError {\n    return AISDKError.hasMarker(error, marker);\n  }\n}\n","import { AISDKError } from './ai-sdk-error';\nimport { getErrorMessage } from './get-error-message';\n\nconst name = 'AI_JSONParseError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class JSONParseError extends AISDKError {\n  private readonly [symbol] = true; // used in isInstance\n\n  readonly text: string;\n\n  constructor({ text, cause }: { text: string; cause: unknown }) {\n    super({\n      name,\n      message:\n        `JSON parsing failed: ` +\n        `Text: ${text}.\\n` +\n        `Error message: ${getErrorMessage(cause)}`,\n      cause,\n    });\n\n    this.text = text;\n  }\n\n  static isInstance(error: unknown): error is JSONParseError {\n    return AISDKError.hasMarker(error, marker);\n  }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_LoadAPIKeyError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class LoadAPIKeyError extends AISDKError {\n  private readonly [symbol] = true; // used in isInstance\n\n  constructor({ message }: { message: string }) {\n    super({ name, message });\n  }\n\n  static isInstance(error: unknown): error is LoadAPIKeyError {\n    return AISDKError.hasMarker(error, marker);\n  }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_LoadSettingError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class LoadSettingError extends AISDKError {\n  private readonly [symbol] = true; // used in isInstance\n\n  constructor({ message }: { message: string }) {\n    super({ name, message });\n  }\n\n  static isInstance(error: unknown): error is LoadSettingError {\n    return AISDKError.hasMarker(error, marker);\n  }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_NoContentGeneratedError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\nThrown when the AI provider fails to generate any content.\n */\nexport class NoContentGeneratedError extends AISDKError {\n  private readonly [symbol] = true; // used in isInstance\n\n  constructor({\n    message = 'No content generated.',\n  }: { message?: string } = {}) {\n    super({ name, message });\n  }\n\n  static isInstance(error: unknown): error is NoContentGeneratedError {\n    return AISDKError.hasMarker(error, marker);\n  }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_NoSuchModelError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class NoSuchModelError extends AISDKError {\n  private readonly [symbol] = true; // used in isInstance\n\n  readonly modelId: string;\n  readonly modelType:\n    | 'languageModel'\n    | 'embeddingModel'\n    | 'imageModel'\n    | 'transcriptionModel'\n    | 'speechModel'\n    | 'rerankingModel';\n\n  constructor({\n    errorName = name,\n    modelId,\n    modelType,\n    message = `No such ${modelType}: ${modelId}`,\n  }: {\n    errorName?: string;\n    modelId: string;\n    modelType:\n      | 'languageModel'\n      | 'embeddingModel'\n      | 'imageModel'\n      | 'transcriptionModel'\n      | 'speechModel'\n      | 'rerankingModel';\n    message?: string;\n  }) {\n    super({ name: errorName, message });\n\n    this.modelId = modelId;\n    this.modelType = modelType;\n  }\n\n  static isInstance(error: unknown): error is NoSuchModelError {\n    return AISDKError.hasMarker(error, marker);\n  }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_TooManyEmbeddingValuesForCallError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class TooManyEmbeddingValuesForCallError extends AISDKError {\n  private readonly [symbol] = true; // used in isInstance\n\n  readonly provider: string;\n  readonly modelId: string;\n  readonly maxEmbeddingsPerCall: number;\n  readonly values: Array<unknown>;\n\n  constructor(options: {\n    provider: string;\n    modelId: string;\n    maxEmbeddingsPerCall: number;\n    values: Array<unknown>;\n  }) {\n    super({\n      name,\n      message:\n        `Too many values for a single embedding call. ` +\n        `The ${options.provider} model \"${options.modelId}\" can only embed up to ` +\n        `${options.maxEmbeddingsPerCall} values per call, but ${options.values.length} values were provided.`,\n    });\n\n    this.provider = options.provider;\n    this.modelId = options.modelId;\n    this.maxEmbeddingsPerCall = options.maxEmbeddingsPerCall;\n    this.values = options.values;\n  }\n\n  static isInstance(\n    error: unknown,\n  ): error is TooManyEmbeddingValuesForCallError {\n    return AISDKError.hasMarker(error, marker);\n  }\n}\n","import { AISDKError } from './ai-sdk-error';\nimport { getErrorMessage } from './get-error-message';\n\nconst name = 'AI_TypeValidationError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class TypeValidationError extends AISDKError {\n  private readonly [symbol] = true; // used in isInstance\n\n  readonly value: unknown;\n\n  constructor({ value, cause }: { value: unknown; cause: unknown }) {\n    super({\n      name,\n      message:\n        `Type validation failed: ` +\n        `Value: ${JSON.stringify(value)}.\\n` +\n        `Error message: ${getErrorMessage(cause)}`,\n      cause,\n    });\n\n    this.value = value;\n  }\n\n  static isInstance(error: unknown): error is TypeValidationError {\n    return AISDKError.hasMarker(error, marker);\n  }\n\n  /**\n   * Wraps an error into a TypeValidationError.\n   * If the cause is already a TypeValidationError with the same value, it returns the cause.\n   * Otherwise, it creates a new TypeValidationError.\n   *\n   * @param {Object} params - The parameters for wrapping the error.\n   * @param {unknown} params.value - The value that failed validation.\n   * @param {unknown} params.cause - The original error or cause of the validation failure.\n   * @returns {TypeValidationError} A TypeValidationError instance.\n   */\n  static wrap({\n    value,\n    cause,\n  }: {\n    value: unknown;\n    cause: unknown;\n  }): TypeValidationError {\n    return TypeValidationError.isInstance(cause) && cause.value === value\n      ? cause\n      : new TypeValidationError({ value, cause });\n  }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_UnsupportedFunctionalityError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class UnsupportedFunctionalityError extends AISDKError {\n  private readonly [symbol] = true; // used in isInstance\n\n  readonly functionality: string;\n\n  constructor({\n    functionality,\n    message = `'${functionality}' functionality not supported.`,\n  }: {\n    functionality: string;\n    message?: string;\n  }) {\n    super({ name, message });\n    this.functionality = functionality;\n  }\n\n  static isInstance(error: unknown): error is UnsupportedFunctionalityError {\n    return AISDKError.hasMarker(error, marker);\n  }\n}\n","import { JSONArray, JSONObject, JSONValue } from './json-value';\n\nexport function isJSONValue(value: unknown): value is JSONValue {\n  if (\n    value === null ||\n    typeof value === 'string' ||\n    typeof value === 'number' ||\n    typeof value === 'boolean'\n  ) {\n    return true;\n  }\n\n  if (Array.isArray(value)) {\n    return value.every(isJSONValue);\n  }\n\n  if (typeof value === 'object') {\n    return Object.entries(value).every(\n      ([key, val]) =>\n        typeof key === 'string' && (val === undefined || isJSONValue(val)),\n    );\n  }\n\n  return false;\n}\n\nexport function isJSONArray(value: unknown): value is JSONArray {\n  return Array.isArray(value) && value.every(isJSONValue);\n}\n\nexport function isJSONObject(value: unknown): value is JSONObject {\n  return (\n    value != null &&\n    typeof value === 'object' &&\n    Object.entries(value).every(\n      ([key, val]) =>\n        typeof key === 'string' && (val === undefined || isJSONValue(val)),\n    )\n  );\n}\n","import {\n  LanguageModelV3,\n  LanguageModelV3CallOptions,\n  SharedV3Warning,\n  LanguageModelV3Content,\n  LanguageModelV3FinishReason,\n  LanguageModelV3ProviderTool,\n  LanguageModelV3StreamPart,\n  LoadSettingError,\n  LanguageModelV3GenerateResult,\n  LanguageModelV3StreamResult,\n} from \"@ai-sdk/provider\";\nimport {\n  AutoTokenizer,\n  AutoModelForCausalLM,\n  AutoProcessor,\n  AutoModelForImageTextToText,\n  StoppingCriteria,\n  env,\n  type PretrainedModelOptions,\n  type ProgressInfo,\n} from \"@huggingface/transformers\";\nimport { convertToTransformersMessages } from \"../utils/convert-to-transformers-message\";\nimport type { TransformersMessage } from \"../utils/convert-to-transformers-message\";\nimport type {\n  ModelInstance,\n  GenerationOptions,\n} from \"./transformers-js-worker-types\";\nimport {\n  parseJsonFunctionCalls,\n  createUnsupportedSettingWarning,\n  createUnsupportedToolWarning,\n  isFunctionTool,\n  processToolCallStream,\n  type ParsedToolCall,\n  type ToolDefinition,\n  type DownloadProgressCallback,\n} from \"@browser-ai/shared\";\nimport {\n  createMainThreadGenerationStream,\n  createWorkerGenerationStream,\n} from \"../utils/generation-stream\";\n\ndeclare global {\n  interface Navigator {\n    gpu?: unknown;\n  }\n}\n\nexport type TransformersJSModelId = string;\n\nexport interface TransformersJSModelSettings extends Pick<\n  PretrainedModelOptions,\n  \"device\" | \"dtype\"\n> {\n  /**\n   * Optional ONNX external data format toggle.\n   * Keep undefined to use Transformers.js defaults.\n   */\n  use_external_data_format?: boolean;\n  /**\n   * Progress callback for model initialization\n   */\n  initProgressCallback?: DownloadProgressCallback;\n  /**\n   * Raw progress callback from Transformers.js\n   */\n  rawInitProgressCallback?: (progress: ProgressInfo) => void;\n  /**\n   * Whether this is a vision model\n   * @default false\n   */\n  isVisionModel?: boolean;\n  /**\n   * Optional Web Worker to run the model off the main thread\n   */\n  worker?: Worker;\n  /**\n   * Optional path to load local models from.\n   * Overrides the transformers.js env.localModelPath setting.\n   * @see https://huggingface.co/docs/transformers.js/api/env\n   * @example '~/models' or '/path/to/models'\n   */\n  localModelPath?: string;\n  /**\n   * Optional directory to use for caching files.\n   * Overrides the transformers.js env.cacheDir setting.\n   * @see https://huggingface.co/docs/transformers.js/api/env\n   * @example '~/model-cache' or '/path/to/cache'\n   */\n  cacheDir?: string;\n}\n\n/**\n * Check if we're running in a browser environment\n */\nexport function isBrowserEnvironment(): boolean {\n  return typeof window !== \"undefined\";\n}\n\n/**\n * Check if we're running in a server environment (Node.js)\n */\nexport function isServerEnvironment(): boolean {\n  return typeof window === \"undefined\" && typeof process !== \"undefined\";\n}\n\n/**\n * Check if the browser supports TransformersJS with optimal performance\n * Returns true if the browser has WebGPU or WebAssembly support\n * @returns true if the browser supports TransformersJS, false otherwise\n */\nexport function doesBrowserSupportTransformersJS(): boolean {\n  if (!isBrowserEnvironment()) {\n    return false;\n  }\n\n  // Check for WebGPU support for better performance\n  if (typeof navigator !== \"undefined\" && navigator.gpu) {\n    return true;\n  }\n\n  // Check for WebAssembly support as fallback\n  if (typeof WebAssembly !== \"undefined\") {\n    return true;\n  }\n\n  return false;\n}\n\n// Simplified config - just extend the settings with modelId\ninterface ModelConfig extends TransformersJSModelSettings {\n  modelId: TransformersJSModelId;\n}\n\nclass InterruptableStoppingCriteria extends StoppingCriteria {\n  interrupted = false;\n\n  interrupt() {\n    this.interrupted = true;\n  }\n\n  reset() {\n    this.interrupted = false;\n  }\n\n  _call(input_ids: number[][], scores: number[][]): boolean[] {\n    return new Array(input_ids.length).fill(this.interrupted);\n  }\n}\n\nexport class TransformersJSLanguageModel implements LanguageModelV3 {\n  readonly specificationVersion = \"v3\";\n  readonly modelId: TransformersJSModelId;\n  readonly provider = \"transformers-js\";\n\n  private readonly config: ModelConfig;\n  private modelInstance?: ModelInstance;\n  private isInitialized = false;\n  private initializationPromise?: Promise<void>;\n  private stoppingCriteria = new InterruptableStoppingCriteria();\n  private workerReady = false;\n\n  constructor(\n    modelId: TransformersJSModelId,\n    options: TransformersJSModelSettings = {},\n  ) {\n    this.modelId = modelId;\n    this.config = {\n      modelId,\n      device: \"auto\",\n      dtype: \"auto\",\n      isVisionModel: false,\n      ...options,\n    };\n  }\n\n  readonly supportedUrls: Record<string, RegExp[]> = {\n    // TransformersJS doesn't support URLs natively\n  };\n\n  private async getSession(\n    onInitProgress?: DownloadProgressCallback,\n  ): Promise<ModelInstance> {\n    if (this.modelInstance && this.isInitialized) {\n      return this.modelInstance;\n    }\n\n    if (this.initializationPromise) {\n      await this.initializationPromise;\n      if (this.modelInstance) {\n        return this.modelInstance;\n      }\n    }\n\n    this.initializationPromise = this._initializeModel(onInitProgress);\n    await this.initializationPromise;\n\n    if (!this.modelInstance) {\n      throw new LoadSettingError({\n        message: \"Model initialization failed\",\n      });\n    }\n\n    return this.modelInstance;\n  }\n\n  private async _initializeModel(\n    onInitProgress?: DownloadProgressCallback,\n  ): Promise<void> {\n    try {\n      const {\n        isVisionModel,\n        device,\n        dtype,\n        localModelPath,\n        cacheDir,\n        use_external_data_format,\n      } = this.config;\n\n      // Configure transformers.js environment settings\n      if (localModelPath) {\n        env.localModelPath = localModelPath;\n      }\n      if (cacheDir) {\n        env.cacheDir = cacheDir;\n      }\n\n      const progress_callback = this.createProgressTracker(onInitProgress);\n\n      // Set device based on environment\n      const resolvedDevice = this.resolveDevice(\n        device as string,\n      ) as PretrainedModelOptions[\"device\"];\n      const resolvedDtype = this.resolveDtype(\n        dtype as string,\n      ) as PretrainedModelOptions[\"dtype\"];\n\n      // Create model instance based on type\n      if (isVisionModel) {\n        const [processor, model] = await Promise.all([\n          AutoProcessor.from_pretrained(this.modelId, { progress_callback }),\n          AutoModelForImageTextToText.from_pretrained(this.modelId, {\n            dtype: resolvedDtype,\n            device: resolvedDevice,\n            ...(use_external_data_format !== undefined\n              ? { use_external_data_format }\n              : {}),\n            progress_callback,\n          }),\n        ]);\n        this.modelInstance = [processor, model];\n      } else {\n        const [tokenizer, model] = await Promise.all([\n          AutoTokenizer.from_pretrained(this.modelId, {\n            progress_callback,\n          }),\n          AutoModelForCausalLM.from_pretrained(this.modelId, {\n            dtype: resolvedDtype,\n            device: resolvedDevice,\n            ...(use_external_data_format !== undefined\n              ? { use_external_data_format }\n              : {}),\n            progress_callback,\n          }),\n        ]);\n        this.modelInstance = [tokenizer, model];\n\n        // Warm up text models (skip in server environment to reduce initialization time)\n        if (isBrowserEnvironment()) {\n          const dummyInputs = tokenizer(\"Hello\");\n          await model.generate({ ...dummyInputs, max_new_tokens: 1 });\n        }\n      }\n\n      onInitProgress?.(1.0);\n      this.isInitialized = true;\n    } catch (error) {\n      this.modelInstance = undefined;\n      this.isInitialized = false;\n      this.initializationPromise = undefined;\n\n      throw new LoadSettingError({\n        message: `Failed to initialize TransformersJS model: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n      });\n    }\n  }\n\n  private resolveDevice(device?: string): string {\n    if (device && device !== \"auto\") {\n      return device;\n    }\n\n    if (isServerEnvironment()) {\n      // In server environment, prefer CPU unless explicitly set\n      return \"cpu\";\n    }\n\n    // In browser environment, auto-detect WebGPU support\n    if (\n      isBrowserEnvironment() &&\n      typeof navigator !== \"undefined\" &&\n      navigator.gpu\n    ) {\n      return \"webgpu\";\n    }\n\n    return \"cpu\";\n  }\n\n  private resolveDtype(dtype?: string): string {\n    if (dtype && dtype !== \"auto\") {\n      return dtype;\n    }\n\n    return \"auto\";\n  }\n\n  private createProgressTracker(onInitProgress?: DownloadProgressCallback) {\n    const fileProgress = new Map<string, { loaded: number; total: number }>();\n\n    return (p: ProgressInfo) => {\n      // Pass through raw progress\n      this.config.rawInitProgressCallback?.(p);\n\n      if (!onInitProgress) return;\n\n      // Type guard to check if p has file property\n      const progressWithFile = p as ProgressInfo & {\n        file?: string;\n        loaded?: number;\n        total?: number;\n      };\n      const file = progressWithFile.file;\n\n      if (!file) return;\n\n      if (p.status === \"progress\" && file) {\n        fileProgress.set(file, {\n          loaded: progressWithFile.loaded || 0,\n          total: progressWithFile.total || 0,\n        });\n      } else if (p.status === \"done\" && file) {\n        const prev = fileProgress.get(file);\n        if (prev?.total) {\n          fileProgress.set(file, { loaded: prev.total, total: prev.total });\n        }\n      }\n\n      // Calculate overall progress\n      let totalLoaded = 0;\n      let totalBytes = 0;\n      for (const { loaded, total } of fileProgress.values()) {\n        if (total > 0) {\n          totalLoaded += loaded;\n          totalBytes += total;\n        }\n      }\n\n      if (totalBytes > 0) {\n        onInitProgress(Math.min(1, totalLoaded / totalBytes));\n      }\n    };\n  }\n\n  private getArgs({\n    prompt,\n    maxOutputTokens,\n    temperature,\n    topP,\n    topK,\n    frequencyPenalty,\n    presencePenalty,\n    stopSequences,\n    responseFormat,\n    seed,\n    tools,\n    toolChoice,\n    providerOptions,\n  }: Parameters<LanguageModelV3[\"doGenerate\"]>[0]): {\n    messages: TransformersMessage[];\n    warnings: SharedV3Warning[];\n    generationOptions: GenerationOptions;\n    functionTools: ToolDefinition[];\n    enableThinking: boolean;\n  } {\n    const warnings: SharedV3Warning[] = [];\n    // Filter and warn about unsupported tools\n    const functionTools: ToolDefinition[] = (tools ?? [])\n      .filter(isFunctionTool)\n      .map((tool) => ({\n        name: tool.name,\n        description: tool.description,\n        parameters: tool.inputSchema,\n      }));\n\n    const unsupportedTools = (tools ?? []).filter(\n      (tool): tool is LanguageModelV3ProviderTool => !isFunctionTool(tool),\n    );\n\n    for (const tool of unsupportedTools) {\n      warnings.push(\n        createUnsupportedToolWarning(\n          tool,\n          \"Only function tools are supported by TransformersJS\",\n        ),\n      );\n    }\n\n    // Add warnings for unsupported settings\n    if (frequencyPenalty != null) {\n      warnings.push(\n        createUnsupportedSettingWarning(\n          \"frequencyPenalty\",\n          \"Frequency penalty is not supported by TransformersJS\",\n        ),\n      );\n    }\n\n    if (presencePenalty != null) {\n      warnings.push(\n        createUnsupportedSettingWarning(\n          \"presencePenalty\",\n          \"Presence penalty is not supported by TransformersJS\",\n        ),\n      );\n    }\n\n    if (stopSequences != null) {\n      warnings.push(\n        createUnsupportedSettingWarning(\n          \"stopSequences\",\n          \"Stop sequences are not supported by TransformersJS\",\n        ),\n      );\n    }\n\n    if (responseFormat?.type === \"json\") {\n      warnings.push(\n        createUnsupportedSettingWarning(\n          \"responseFormat\",\n          \"JSON response format is not supported by TransformersJS\",\n        ),\n      );\n    }\n\n    if (seed != null) {\n      warnings.push(\n        createUnsupportedSettingWarning(\n          \"seed\",\n          \"Seed is not supported by TransformersJS\",\n        ),\n      );\n    }\n\n    if (toolChoice != null) {\n      warnings.push(\n        createUnsupportedSettingWarning(\n          \"toolChoice\",\n          \"toolChoice is not supported by TransformersJS\",\n        ),\n      );\n    }\n\n    // Convert messages to TransformersJS format\n    const messages = convertToTransformersMessages(\n      prompt,\n      this.config.isVisionModel,\n    );\n\n    const transformersJsOptions = providerOptions?.[\"transformers-js\"] as\n      | Record<string, unknown>\n      | undefined;\n    const enableThinking =\n      (transformersJsOptions?.enableThinking as boolean) ?? false;\n\n    const generationOptions: GenerationOptions = {\n      max_new_tokens: maxOutputTokens || (enableThinking ? 8192 : 4096),\n      temperature: temperature ?? 0.7,\n      top_p: topP,\n      top_k: topK,\n      do_sample: temperature === undefined || temperature > 0,\n    };\n\n    return {\n      messages,\n      warnings,\n      generationOptions,\n      functionTools,\n      enableThinking,\n    };\n  }\n\n  /**\n   * Check the availability of the TransformersJS model\n   */\n  public async availability(): Promise<\n    \"unavailable\" | \"downloadable\" | \"available\"\n  > {\n    // If using a worker (browser only), reflect worker readiness instead of main-thread state\n    if (this.config.worker && isBrowserEnvironment()) {\n      return this.workerReady ? \"available\" : \"downloadable\";\n    }\n\n    // In server environment, workers are not used\n    if (isServerEnvironment() && this.config.worker) {\n      // Ignore worker config on server and use main thread\n    }\n\n    if (this.isInitialized) {\n      return \"available\";\n    }\n\n    return \"downloadable\";\n  }\n\n  /**\n   * Creates a session with download progress monitoring\n   */\n  public async createSessionWithProgress(\n    onDownloadProgress?: DownloadProgressCallback,\n  ): Promise<TransformersJSLanguageModel> {\n    // If a worker is provided and we're in browser environment, initialize the worker\n    // (and forward progress) instead of initializing the model on the main thread\n    // to avoid double-initialization/downloads.\n    if (this.config.worker && isBrowserEnvironment()) {\n      await this.initializeWorker(onDownloadProgress);\n      return this;\n    }\n\n    // In server environment or when no worker is provided, use main thread\n    await this._initializeModel(onDownloadProgress);\n    return this;\n  }\n\n  /**\n   * Generates a complete text response using TransformersJS\n   */\n  public async doGenerate(\n    options: LanguageModelV3CallOptions,\n  ): Promise<LanguageModelV3GenerateResult> {\n    const {\n      messages,\n      warnings,\n      generationOptions,\n      functionTools,\n      enableThinking,\n    } = this.getArgs(options);\n\n    const useWorker = this.config.worker && isBrowserEnvironment();\n\n    // Initialize worker if needed\n    if (useWorker) {\n      await this.initializeWorker();\n    }\n\n    try {\n      // Create the appropriate generation stream\n      const generationStream = useWorker\n        ? createWorkerGenerationStream({\n            worker: this.config.worker!,\n            messages,\n            generationOptions,\n            tools: functionTools,\n            enableThinking,\n            abortSignal: options.abortSignal,\n          })\n        : createMainThreadGenerationStream({\n            modelInstance: await this.getSession(\n              this.config.initProgressCallback,\n            ),\n            messages,\n            generationOptions,\n            tools: functionTools,\n            isVisionModel: this.config.isVisionModel,\n            enableThinking,\n            stoppingCriteria: this.stoppingCriteria,\n            abortSignal: options.abortSignal,\n          });\n\n      // Collect all generated text\n      let generatedText = \"\";\n      let lastUsage: { inputTokens?: number; outputTokens?: number } = {};\n      let workerToolCalls: ParsedToolCall[] = [];\n\n      for await (const event of generationStream) {\n        if (event.type === \"delta\") {\n          generatedText += event.delta;\n        } else if (event.type === \"complete\") {\n          lastUsage = event.usage || {};\n          if (event.toolCalls) {\n            workerToolCalls = event.toolCalls;\n          }\n        }\n      }\n\n      // Parse for tool calls - prefer worker-parsed ones if available\n      const { toolCalls: parsedToolCalls, textContent } =\n        parseJsonFunctionCalls(generatedText);\n      const toolCalls =\n        workerToolCalls.length > 0 ? workerToolCalls : parsedToolCalls;\n\n      if (toolCalls.length > 0) {\n        const toolCallsToEmit = toolCalls.slice(0, 1);\n        const parts: LanguageModelV3Content[] = [];\n\n        if (textContent) {\n          parts.push({\n            type: \"text\",\n            text: textContent,\n          });\n        }\n\n        for (const call of toolCallsToEmit) {\n          parts.push({\n            type: \"tool-call\",\n            toolCallId: call.toolCallId,\n            toolName: call.toolName,\n            input: JSON.stringify(call.args ?? {}),\n          });\n        }\n\n        return {\n          content: parts,\n          finishReason: { unified: \"tool-calls\", raw: \"tool-calls\" },\n          usage: {\n            inputTokens: {\n              total: lastUsage.inputTokens,\n              noCache: undefined,\n              cacheRead: undefined,\n              cacheWrite: undefined,\n            },\n            outputTokens: {\n              total: lastUsage.outputTokens,\n              text: undefined,\n              reasoning: undefined,\n            },\n          },\n          request: { body: { messages, ...generationOptions } },\n          warnings,\n        };\n      }\n\n      const content: LanguageModelV3Content[] = [\n        {\n          type: \"text\",\n          text: textContent || generatedText,\n        },\n      ];\n\n      return {\n        content,\n        finishReason: { unified: \"stop\", raw: \"stop\" },\n        usage: {\n          inputTokens: {\n            total: lastUsage.inputTokens,\n            noCache: undefined,\n            cacheRead: undefined,\n            cacheWrite: undefined,\n          },\n          outputTokens: {\n            total: lastUsage.outputTokens,\n            text: undefined,\n            reasoning: undefined,\n          },\n        },\n        request: { body: { messages, ...generationOptions } },\n        warnings,\n      };\n    } catch (error) {\n      throw new Error(\n        `TransformersJS generation failed: ${\n          error instanceof Error ? error.message : \"Unknown error\"\n        }`,\n      );\n    }\n  }\n\n  private async initializeWorker(\n    onInitProgress?: DownloadProgressCallback,\n  ): Promise<void> {\n    if (!this.config.worker) return;\n\n    // If already ready, optionally emit completion progress\n    if (this.workerReady) {\n      if (onInitProgress) onInitProgress(1);\n      return;\n    }\n\n    const worker = this.config.worker;\n\n    await new Promise<void>((resolve, reject) => {\n      const trackProgress = this.createProgressTracker(onInitProgress);\n\n      const onMessage = (e: MessageEvent) => {\n        const msg = e.data;\n        if (!msg) return;\n\n        // Forward raw download progress events coming from @huggingface/transformers running in the worker\n        if (msg && typeof msg === \"object\" && \"status\" in msg) {\n          if (msg.status === \"ready\") {\n            worker.removeEventListener(\"message\", onMessage);\n            this.workerReady = true;\n            if (onInitProgress) onInitProgress(1);\n            resolve();\n            return;\n          }\n          if (msg.status === \"error\") {\n            worker.removeEventListener(\"message\", onMessage);\n            reject(\n              new Error(String(msg.data || \"Worker initialization failed\")),\n            );\n            return;\n          }\n\n          // Only track file-related messages (raw ProgressInfo events)\n          const msgWithFile = msg as ProgressInfo & { file?: string };\n          if (msgWithFile.file) trackProgress(msg as ProgressInfo);\n        }\n      };\n\n      worker.addEventListener(\"message\", onMessage);\n      worker.postMessage({\n        type: \"load\",\n        data: {\n          modelId: this.modelId,\n          dtype: this.config.dtype,\n          device: this.config.device,\n          use_external_data_format: this.config.use_external_data_format,\n          isVisionModel: this.config.isVisionModel,\n        },\n      });\n    });\n  }\n\n  /**\n   * Generates a streaming text response using TransformersJS\n   */\n  public async doStream(\n    options: LanguageModelV3CallOptions,\n  ): Promise<LanguageModelV3StreamResult> {\n    const {\n      messages,\n      warnings,\n      generationOptions,\n      functionTools,\n      enableThinking,\n    } = this.getArgs(options);\n\n    const useWorker = this.config.worker && isBrowserEnvironment();\n\n    // Initialize worker if needed\n    if (useWorker) {\n      await this.initializeWorker();\n    }\n\n    const self = this;\n    const textId = \"text-0\";\n\n    const stream = new ReadableStream<LanguageModelV3StreamPart>({\n      async start(controller) {\n        controller.enqueue({ type: \"stream-start\", warnings });\n\n        let textStarted = false;\n\n        const emitTextDelta = (delta: string) => {\n          if (!delta) return;\n          if (!textStarted) {\n            controller.enqueue({ type: \"text-start\", id: textId });\n            textStarted = true;\n          }\n          controller.enqueue({ type: \"text-delta\", id: textId, delta });\n        };\n\n        try {\n          // Create the appropriate generation stream\n          const generationStream = useWorker\n            ? createWorkerGenerationStream({\n                worker: self.config.worker!,\n                messages,\n                generationOptions,\n                tools: functionTools,\n                enableThinking,\n                abortSignal: options.abortSignal,\n              })\n            : createMainThreadGenerationStream({\n                modelInstance: await self.getSession(\n                  self.config.initProgressCallback,\n                ),\n                messages,\n                generationOptions,\n                tools: functionTools,\n                isVisionModel: self.config.isVisionModel,\n                enableThinking,\n                stoppingCriteria: self.stoppingCriteria,\n                abortSignal: options.abortSignal,\n              });\n\n          let lastUsage: { inputTokens?: number; outputTokens?: number } = {};\n\n          const chunks = (async function* () {\n            for await (const event of generationStream) {\n              if (event.type === \"delta\") yield event.delta;\n              else if (event.type === \"complete\") lastUsage = event.usage || {};\n            }\n          })();\n\n          const result = await processToolCallStream(\n            chunks,\n            emitTextDelta,\n            controller,\n          );\n\n          if (result.trailingText) {\n            emitTextDelta(result.trailingText);\n          }\n\n          if (textStarted) {\n            controller.enqueue({ type: \"text-end\", id: textId });\n          }\n\n          const finishReason: LanguageModelV3FinishReason =\n            result.toolCallDetected\n              ? { unified: \"tool-calls\", raw: \"tool-calls\" }\n              : { unified: \"stop\", raw: \"stop\" };\n\n          controller.enqueue({\n            type: \"finish\",\n            finishReason,\n            usage: {\n              inputTokens: {\n                total: lastUsage.inputTokens,\n                noCache: undefined,\n                cacheRead: undefined,\n                cacheWrite: undefined,\n              },\n              outputTokens: {\n                total: lastUsage.outputTokens,\n                text: undefined,\n                reasoning: undefined,\n              },\n            },\n          });\n          controller.close();\n        } catch (error) {\n          controller.enqueue({ type: \"error\", error });\n          controller.close();\n        }\n      },\n    });\n\n    return {\n      stream,\n      request: { body: { messages, ...generationOptions } },\n    };\n  }\n}\n","import {\n  LanguageModelV3Prompt,\n  UnsupportedFunctionalityError,\n} from \"@ai-sdk/provider\";\n\nfunction uint8ArrayToBase64(uint8array: Uint8Array): string {\n  return btoa(String.fromCharCode(...uint8array));\n}\n\nfunction convertDataToURL(\n  data:\n    | string\n    | Buffer\n    | URL\n    | Uint8Array\n    | ArrayBuffer\n    | ReadableStream\n    | undefined,\n  mediaType: string,\n): string {\n  if (data instanceof URL) return data.toString();\n\n  if (typeof data === \"string\") {\n    return `data:${mediaType};base64,${data}`;\n  }\n\n  if (data instanceof Uint8Array) {\n    return `data:${mediaType};base64,${uint8ArrayToBase64(data)}`;\n  }\n\n  if (data instanceof ArrayBuffer) {\n    return `data:${mediaType};base64,${uint8ArrayToBase64(new Uint8Array(data))}`;\n  }\n\n  if (typeof Buffer !== \"undefined\" && data instanceof Buffer) {\n    return `data:${mediaType};base64,${data.toString(\"base64\")}`;\n  }\n\n  throw new UnsupportedFunctionalityError({\n    functionality: `file data type: ${typeof data}`,\n  });\n}\n\n/**\n * TransformersJS message type compatible with HuggingFace chat templates\n */\nexport interface TransformersMessage {\n  role: string;\n  content:\n    | string\n    | null\n    | Array<{ type: string; text?: string; image?: string }>;\n  tool_calls?: Array<{\n    id: string;\n    type: \"function\";\n    function: {\n      name: string;\n      arguments: string;\n    };\n  }>;\n  tool_call_id?: string;\n  name?: string;\n}\n\n/**\n * Safely normalize tool arguments - handles both string and object inputs\n */\nfunction normalizeToolArguments(input: unknown): unknown {\n  if (input === undefined) {\n    return {};\n  }\n\n  if (typeof input === \"string\") {\n    try {\n      return JSON.parse(input);\n    } catch {\n      // If parsing fails, return the string as-is\n      return input;\n    }\n  }\n\n  return input ?? {};\n}\n\nfunction processVisionContent(\n  content: any[],\n): Array<{ type: \"text\"; text: string } | { type: \"image\"; image: string }> {\n  const contentParts: Array<\n    { type: \"text\"; text: string } | { type: \"image\"; image: string }\n  > = [];\n  let textParts: string[] = [];\n\n  for (const part of content) {\n    if (part.type === \"text\") {\n      textParts.push(part.text);\n    } else if (part.type === \"file\" && part.mediaType?.startsWith(\"image/\")) {\n      if (textParts.length > 0) {\n        contentParts.push({ type: \"text\", text: textParts.join(\"\\n\") });\n        textParts = [];\n      }\n      contentParts.push({\n        type: \"image\",\n        image: convertDataToURL(part.data, part.mediaType!),\n      });\n    } else if (part.type === \"file\") {\n      throw new UnsupportedFunctionalityError({\n        functionality: \"non-image file input\",\n      });\n    }\n  }\n\n  if (textParts.length > 0) {\n    contentParts.push({ type: \"text\", text: textParts.join(\"\\n\") });\n  }\n\n  return contentParts;\n}\n\nexport function convertToTransformersMessages(\n  prompt: LanguageModelV3Prompt,\n  isVisionModel: boolean = false,\n): TransformersMessage[] {\n  return prompt.flatMap(\n    (message): TransformersMessage | TransformersMessage[] => {\n      switch (message.role) {\n        case \"system\":\n          return { role: \"system\", content: message.content };\n\n        case \"user\":\n          if (isVisionModel) {\n            return {\n              role: \"user\",\n              content: processVisionContent(message.content),\n            };\n          }\n\n          const textContent = message.content\n            .map((part) => {\n              if (part.type === \"text\") return part.text;\n              if (part.type === \"file\")\n                throw new UnsupportedFunctionalityError({\n                  functionality: \"file input\",\n                });\n              return \"\";\n            })\n            .join(\"\\n\");\n          return { role: \"user\", content: textContent };\n\n        case \"assistant\":\n          const textParts = message.content\n            .filter((part) => part.type === \"text\")\n            .map((part) => (part as any).text);\n\n          const toolCallParts = message.content.filter(\n            (part) => part.type === \"tool-call\",\n          );\n\n          // If there are tool calls, format as HuggingFace expects\n          if (toolCallParts.length > 0) {\n            const tool_calls = toolCallParts.map((part) => ({\n              id: (part as any).toolCallId,\n              type: \"function\" as const,\n              function: {\n                name: (part as any).toolName,\n                arguments:\n                  typeof (part as any).input === \"string\"\n                    ? (part as any).input\n                    : JSON.stringify(\n                        normalizeToolArguments((part as any).input),\n                      ),\n              },\n            }));\n\n            return {\n              role: \"assistant\",\n              content: textParts.length > 0 ? textParts.join(\"\\n\") : \"\",\n              tool_calls,\n            };\n          }\n\n          return {\n            role: \"assistant\",\n            content: textParts.join(\"\\n\"),\n          };\n\n        case \"tool\":\n          // Each tool result becomes a separate message with role \"tool\"\n          // This is the native HuggingFace format for tool results\n          return message.content\n            .filter((part) => part.type === \"tool-result\")\n            .map((part) => {\n              const toolPart = part as any;\n\n              let resultValue: unknown;\n              switch (toolPart.output.type) {\n                case \"text\":\n                case \"json\":\n                case \"content\":\n                  resultValue = toolPart.output.value;\n                  break;\n                case \"error-text\":\n                case \"error-json\":\n                  resultValue = {\n                    error: true,\n                    message: toolPart.output.value,\n                  };\n                  break;\n                case \"execution-denied\":\n                  resultValue = {\n                    error: true,\n                    reason: toolPart.output.reason ?? \"execution denied\",\n                  };\n                  break;\n              }\n\n              return {\n                role: \"tool\",\n                tool_call_id: toolPart.toolCallId,\n                name: toolPart.toolName,\n                content:\n                  typeof resultValue === \"string\"\n                    ? resultValue\n                    : JSON.stringify(resultValue),\n              };\n            });\n\n        default:\n          throw new Error(`Unsupported message role: ${(message as any).role}`);\n      }\n    },\n  );\n}\n","/**\n * Utilities for working with AI SDK tools\n */\n\nimport type {\n  LanguageModelV3FunctionTool,\n  LanguageModelV3ProviderTool,\n} from \"@ai-sdk/provider\";\n\n/**\n * Type guard to check if a tool is a function tool\n *\n * @param tool - The tool to check\n * @returns true if the tool is a LanguageModelV3FunctionTool\n */\nexport function isFunctionTool(\n  tool: LanguageModelV3FunctionTool | LanguageModelV3ProviderTool,\n): tool is LanguageModelV3FunctionTool {\n  return tool.type === \"function\";\n}\n","/**\n * Warning generation utilities for unsupported settings and tools\n */\n\nimport type {\n  SharedV3Warning,\n  LanguageModelV3ProviderTool,\n} from \"@ai-sdk/provider\";\n\n/**\n * Creates a warning for an unsupported setting\n *\n * @param setting - Name of the setting that is not supported\n * @param details - Additional details about why it's not supported\n * @returns A call warning object\n *\n * @example\n * ```typescript\n * const warning = createUnsupportedSettingWarning(\n *   \"maxOutputTokens\",\n *   \"maxOutputTokens is not supported by this provider\"\n * );\n * ```\n */\nexport function createUnsupportedSettingWarning(\n  feature: string,\n  details: string,\n): SharedV3Warning {\n  return {\n    type: \"unsupported\",\n    feature,\n    details,\n  };\n}\n\n/**\n * Creates a warning for an unsupported tool type\n *\n * @param tool - The provider-defined tool that is not supported\n * @param details - Additional details about why it's not supported\n * @returns A call warning object\n *\n * @example\n * ```typescript\n * const warning = createUnsupportedToolWarning(\n *   providerTool,\n *   \"Only function tools are supported\"\n * );\n * ```\n */\nexport function createUnsupportedToolWarning(\n  tool: LanguageModelV3ProviderTool,\n  details: string,\n): SharedV3Warning {\n  return {\n    type: \"unsupported\",\n    feature: `tool:${tool.name}`,\n    details,\n  };\n}\n","import type { ParsedResponse, ParsedToolCall } from \"../types\";\n\n/**\n * Options for configuring the JSON function call parser\n */\nexport interface ParseJsonFunctionCallsOptions {\n  /** Support XML-style tags: <tool_call>...</tool_call> */\n  supportXmlTags?: boolean;\n  /** Support Python-style: [functionName(arg=\"value\")] */\n  supportPythonStyle?: boolean;\n  /** Support \"parameters\" as alias for \"arguments\" (Llama format) */\n  supportParametersField?: boolean;\n  /** Support call:name{key:value} style delimited with <|tool_call>...<tool_call|> */\n  supportCallColonStyle?: boolean;\n}\n\nconst DEFAULT_OPTIONS: ParseJsonFunctionCallsOptions = {\n  supportXmlTags: true,\n  supportPythonStyle: true,\n  supportParametersField: true,\n  supportCallColonStyle: true,\n};\n\nfunction generateToolCallId(): string {\n  return `call_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Parses key:value parameter pairs from the call:name{key:value,...} format.\n * Values are coerced to numbers/booleans/null when possible.\n */\nfunction parseCallColonParams(params: string): Record<string, unknown> {\n  const args: Record<string, unknown> = {};\n  if (!params || !params.trim()) return args;\n\n  const pairs = params.split(\",\").map((s) => s.trim());\n  for (const pair of pairs) {\n    const colonIndex = pair.indexOf(\":\");\n    if (colonIndex > 0) {\n      const key = pair.substring(0, colonIndex).trim();\n      const rawValue = pair.substring(colonIndex + 1).trim();\n      if (rawValue === \"true\") {\n        args[key] = true;\n      } else if (rawValue === \"false\") {\n        args[key] = false;\n      } else if (rawValue === \"null\") {\n        args[key] = null;\n      } else {\n        const numValue = Number(rawValue);\n        args[key] = !isNaN(numValue) && rawValue !== \"\" ? numValue : rawValue;\n      }\n    }\n  }\n  return args;\n}\n\nfunction buildRegex(options: ParseJsonFunctionCallsOptions): RegExp {\n  const patterns: string[] = [];\n\n  // Always support markdown fences\n  patterns.push(\"```tool[_-]?call\\\\s*([\\\\s\\\\S]*?)```\");\n\n  if (options.supportXmlTags) {\n    patterns.push(\"<tool_call>\\\\s*([\\\\s\\\\S]*?)\\\\s*</tool_call>\");\n  }\n\n  if (options.supportPythonStyle) {\n    patterns.push(\"\\\\[(\\\\w+)\\\\(([^)]*)\\\\)\\\\]\");\n  }\n\n  if (options.supportCallColonStyle) {\n    patterns.push(\"<\\\\|tool_call>\\\\s*([\\\\s\\\\S]*?)\\\\s*<tool_call\\\\|>\");\n  }\n\n  return new RegExp(patterns.join(\"|\"), \"gi\");\n}\n\n/**\n * Parses JSON-formatted tool calls from model response.\n * Supports multiple formats:\n * 1. Single object: {\"name\": \"tool\", \"arguments\": {...}} or {\"name\": \"tool\", \"parameters\": {...}}\n * 2. Array: [{\"name\": \"tool1\", ...}, {\"name\": \"tool2\", ...}]\n * 3. Newline-separated objects:\n *    {\"name\": \"tool1\", \"arguments\": {...}}\n *    {\"name\": \"tool2\", \"arguments\": {...}}\n *\n * Note: Handles both \"arguments\" (OpenAI/Mistral format) and \"parameters\" (Llama format)\n *\n * @param response - The model's response text to parse\n * @param options - Configuration options for parsing\n * @returns Object containing parsed tool calls and remaining text content\n */\nexport function parseJsonFunctionCalls(\n  response: string,\n  options: ParseJsonFunctionCallsOptions = DEFAULT_OPTIONS,\n): ParsedResponse {\n  const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n  const regex = buildRegex(mergedOptions);\n\n  const matches = Array.from(response.matchAll(regex));\n  regex.lastIndex = 0;\n\n  if (matches.length === 0) {\n    return { toolCalls: [], textContent: response };\n  }\n\n  const toolCalls: ParsedToolCall[] = [];\n  let textContent = response;\n\n  for (const match of matches) {\n    const fullMatch = match[0];\n    textContent = textContent.replace(fullMatch, \"\");\n\n    try {\n      // Check for Python-style match: [functionName(args)]\n      if (mergedOptions.supportPythonStyle && match[0].startsWith(\"[\")) {\n        const pythonMatch = /\\[(\\w+)\\(([^)]*)\\)\\]/.exec(match[0]);\n        if (pythonMatch) {\n          const [, funcName, pythonArgs] = pythonMatch;\n          const args: Record<string, unknown> = {};\n\n          if (pythonArgs && pythonArgs.trim()) {\n            const argPairs = pythonArgs.split(\",\").map((s) => s.trim());\n            for (const pair of argPairs) {\n              const equalIndex = pair.indexOf(\"=\");\n              if (equalIndex > 0) {\n                const key = pair.substring(0, equalIndex).trim();\n                let value = pair.substring(equalIndex + 1).trim();\n                if (\n                  (value.startsWith('\"') && value.endsWith('\"')) ||\n                  (value.startsWith(\"'\") && value.endsWith(\"'\"))\n                ) {\n                  value = value.substring(1, value.length - 1);\n                }\n                args[key] = value;\n              }\n            }\n          }\n\n          toolCalls.push({\n            type: \"tool-call\",\n            toolCallId: generateToolCallId(),\n            toolName: funcName,\n            args: args,\n          });\n          continue;\n        }\n      }\n\n      // Check for call:name{params} style (inside <|tool_call> delimiters)\n      if (mergedOptions.supportCallColonStyle) {\n        const callMatch = fullMatch.match(/call:(\\w+)\\{([^}]*)\\}/);\n        if (callMatch) {\n          const [, funcName, params] = callMatch;\n          toolCalls.push({\n            type: \"tool-call\",\n            toolCallId: generateToolCallId(),\n            toolName: funcName,\n            args: parseCallColonParams(params),\n          });\n          continue;\n        }\n      }\n\n      // Get the captured content from the first capturing group\n      const innerContent = match.slice(1).find((g) => g !== undefined) || \"\";\n      const trimmed = innerContent.trim();\n\n      if (!trimmed) continue;\n\n      // Try parsing as a single JSON value first (object or array)\n      try {\n        const parsed = JSON.parse(trimmed);\n        const callsArray = Array.isArray(parsed) ? parsed : [parsed];\n\n        for (const call of callsArray) {\n          if (!call.name) continue;\n\n          let args =\n            call.arguments ||\n            (mergedOptions.supportParametersField ? call.parameters : null) ||\n            {};\n\n          // If args is a string, try to parse it as JSON\n          if (typeof args === \"string\") {\n            try {\n              args = JSON.parse(args);\n            } catch {\n              // If parsing fails, keep it as string\n            }\n          }\n\n          toolCalls.push({\n            type: \"tool-call\",\n            toolCallId: call.id || generateToolCallId(),\n            toolName: call.name,\n            args: args,\n          });\n        }\n      } catch {\n        // If single JSON parsing fails, try parsing as newline-separated JSON objects\n        const lines = trimmed.split(\"\\n\").filter((line) => line.trim());\n\n        for (const line of lines) {\n          try {\n            const call = JSON.parse(line.trim());\n            if (!call.name) continue;\n\n            let args =\n              call.arguments ||\n              (mergedOptions.supportParametersField ? call.parameters : null) ||\n              {};\n\n            if (typeof args === \"string\") {\n              try {\n                args = JSON.parse(args);\n              } catch {\n                // If parsing fails, keep it as string\n              }\n            }\n\n            toolCalls.push({\n              type: \"tool-call\",\n              toolCallId: call.id || generateToolCallId(),\n              toolName: call.name,\n              args: args,\n            });\n          } catch {\n            // Skip invalid JSON lines\n            continue;\n          }\n        }\n      }\n    } catch (error) {\n      console.warn(\"Failed to parse JSON tool call:\", error);\n      continue;\n    }\n  }\n\n  textContent = textContent.replace(/\\n{2,}/g, \"\\n\");\n\n  return { toolCalls, textContent: textContent.trim() };\n}\n\n/**\n * Checks if a response contains JSON function calls\n */\nexport function hasJsonFunctionCalls(\n  response: string,\n  options: ParseJsonFunctionCallsOptions = DEFAULT_OPTIONS,\n): boolean {\n  const regex = buildRegex({ ...DEFAULT_OPTIONS, ...options });\n  const hasMatch = regex.test(response);\n  regex.lastIndex = 0;\n  return hasMatch;\n}\n\n/**\n * Extracts the first JSON function call block from a response\n */\nexport function extractJsonFunctionCallsBlock(\n  response: string,\n  options: ParseJsonFunctionCallsOptions = DEFAULT_OPTIONS,\n): string | null {\n  const regex = buildRegex({ ...DEFAULT_OPTIONS, ...options });\n  const match = regex.exec(response);\n  regex.lastIndex = 0;\n  return match ? match[0] : null;\n}\n","/**\n * ToolCallFenceDetector - Detects and extracts tool call fences from streaming text\n *\n * This module handles the complex task of detecting tool call fences in a stream\n * where fences might be split across multiple chunks. It uses overlap detection\n * to avoid emitting text that might be the beginning of a fence.\n */\n\n/**\n * Result of fence detection operation\n */\nexport interface FenceDetectionResult {\n  fence: string | null;\n  prefixText: string;\n  remainingText: string;\n  /** Length of potential partial fence at buffer end */\n  overlapLength: number;\n}\n\n/**\n * Result of streaming fence content detection\n */\nexport interface StreamingFenceResult {\n  inFence: boolean;\n  /** Content that can be safely emitted (either as text or tool-input-delta) */\n  safeContent: string;\n  completeFence: string | null;\n  textAfterFence: string;\n}\n\n/**\n * Fence pattern configuration\n */\nexport interface FencePattern {\n  start: string;\n  end: string;\n  reconstructStart: string;\n  isRegex?: boolean;\n  matchedStart?: string;\n}\n\n/**\n * Options for configuring the ToolCallFenceDetector\n */\nexport interface ToolCallFenceDetectorOptions {\n  /** Custom fence patterns to use instead of defaults */\n  patterns?: FencePattern[];\n  /** Enable Python-style function call detection: [functionName(args)] */\n  enablePythonStyle?: boolean;\n}\n\n/**\n * Default fence patterns for tool call detection\n */\nexport const DEFAULT_FENCE_PATTERNS: FencePattern[] = [\n  { start: \"```tool_call\", end: \"```\", reconstructStart: \"```tool_call\\n\" },\n  { start: \"```tool-call\", end: \"```\", reconstructStart: \"```tool-call\\n\" },\n];\n\n/**\n * Extended fence patterns including XML-style tags\n */\nexport const EXTENDED_FENCE_PATTERNS: FencePattern[] = [\n  ...DEFAULT_FENCE_PATTERNS,\n  {\n    start: \"<tool_call>\",\n    end: \"</tool_call>\",\n    reconstructStart: \"<tool_call>\",\n  },\n  {\n    start: \"<|tool_call>\",\n    end: \"<tool_call|>\",\n    reconstructStart: \"<|tool_call>\",\n  },\n];\n\n/**\n * Detects tool call fences in streaming text with support for partial matches\n */\nexport class ToolCallFenceDetector {\n  private readonly fencePatterns: FencePattern[];\n  private readonly enablePythonStyle: boolean;\n  private readonly pythonStyleRegex = /\\[(\\w+)\\(/g;\n  private readonly fenceStarts: string[];\n  private buffer = \"\";\n\n  private inFence = false;\n  private fenceStartBuffer = \"\"; // Accumulated fence content\n  private currentFencePattern: FencePattern | null = null;\n\n  constructor(options: ToolCallFenceDetectorOptions = {}) {\n    this.fencePatterns = options.patterns ?? EXTENDED_FENCE_PATTERNS;\n    this.enablePythonStyle = options.enablePythonStyle ?? true;\n    this.fenceStarts = this.fencePatterns.map((p) => p.start);\n  }\n\n  addChunk(chunk: string): void {\n    this.buffer += chunk;\n  }\n\n  getBuffer(): string {\n    return this.buffer;\n  }\n\n  clearBuffer(): void {\n    this.buffer = \"\";\n  }\n\n  /**\n   * Detects if there's a complete fence in the buffer\n   * @returns Detection result with fence info and safe text\n   */\n  detectFence(): FenceDetectionResult {\n    const {\n      index: startIdx,\n      prefix: matchedPrefix,\n      pattern,\n    } = this.findFenceStart(this.buffer);\n\n    // No fence start found\n    if (startIdx === -1) {\n      // Compute how much of the buffer end might be a partial fence start\n      const overlap = this.computeOverlapLength(this.buffer, this.fenceStarts);\n      const safeTextLength = this.buffer.length - overlap;\n\n      const prefixText =\n        safeTextLength > 0 ? this.buffer.slice(0, safeTextLength) : \"\";\n      const remaining = overlap > 0 ? this.buffer.slice(-overlap) : \"\";\n\n      // Update buffer to keep only the overlap\n      this.buffer = remaining;\n\n      return {\n        fence: null,\n        prefixText,\n        remainingText: \"\",\n        overlapLength: overlap,\n      };\n    }\n\n    const prefixText = this.buffer.slice(0, startIdx);\n    this.buffer = this.buffer.slice(startIdx);\n\n    // Look for closing fence using the matched pattern's end marker\n    const prefixLength = matchedPrefix?.length ?? 0;\n    const fenceEnd = pattern?.end ?? \"```\";\n    const closingIdx = this.buffer.indexOf(fenceEnd, prefixLength);\n\n    // Fence not complete yet\n    if (closingIdx === -1) {\n      // Keep the buffer as-is, waiting for more data\n      return {\n        fence: null,\n        prefixText,\n        remainingText: \"\",\n        overlapLength: 0,\n      };\n    }\n\n    // Complete fence found!\n    const endPos = closingIdx + fenceEnd.length;\n    const fence = this.buffer.slice(0, endPos);\n    const remainingText = this.buffer.slice(endPos);\n\n    // Clear the buffer since we extracted everything\n    this.buffer = \"\";\n\n    return {\n      fence,\n      prefixText,\n      remainingText,\n      overlapLength: 0,\n    };\n  }\n\n  /**\n   * Finds the first occurrence of any fence start marker\n   *\n   * @param text - Text to search in\n   * @returns Index of first fence start and which pattern matched\n   * @private\n   */\n  private findFenceStart(text: string): {\n    index: number;\n    prefix: string | null;\n    pattern: FencePattern | null;\n  } {\n    let bestIndex = -1;\n    let matchedPrefix: string | null = null;\n    let matchedPattern: FencePattern | null = null;\n\n    for (const pattern of this.fencePatterns) {\n      const idx = text.indexOf(pattern.start);\n      if (idx !== -1 && (bestIndex === -1 || idx < bestIndex)) {\n        bestIndex = idx;\n        matchedPrefix = pattern.start;\n        matchedPattern = pattern;\n      }\n    }\n\n    if (this.enablePythonStyle) {\n      this.pythonStyleRegex.lastIndex = 0;\n      const pythonMatch = this.pythonStyleRegex.exec(text);\n      if (pythonMatch && (bestIndex === -1 || pythonMatch.index < bestIndex)) {\n        bestIndex = pythonMatch.index;\n        matchedPrefix = pythonMatch[0];\n        matchedPattern = {\n          start: pythonMatch[0],\n          end: \")]\",\n          reconstructStart: pythonMatch[0],\n          isRegex: true,\n        };\n      }\n    }\n\n    return { index: bestIndex, prefix: matchedPrefix, pattern: matchedPattern };\n  }\n\n  /**\n   * Computes the maximum overlap between the end of text and the start of any prefix\n   * @param text - Text to check for overlap\n   * @param prefixes - List of prefixes to check against\n   * @returns Length of the maximum overlap found\n   */\n  private computeOverlapLength(text: string, prefixes: string[]): number {\n    let overlap = 0;\n\n    for (const prefix of prefixes) {\n      const maxLength = Math.min(text.length, prefix.length - 1);\n\n      for (let size = maxLength; size > 0; size -= 1) {\n        // Check if the last 'size' characters of text match the first 'size' characters of prefix\n        if (prefix.startsWith(text.slice(-size))) {\n          overlap = Math.max(overlap, size);\n          break;\n        }\n      }\n    }\n\n    return overlap;\n  }\n\n  /**\n   * Checks if the buffer currently contains any text\n   */\n  hasContent(): boolean {\n    return this.buffer.length > 0;\n  }\n\n  /**\n   * Gets the buffer size\n   */\n  getBufferSize(): number {\n    return this.buffer.length;\n  }\n\n  /**\n   * Detect and stream fence content in real-time for true incremental streaming\n   * @returns Streaming result with current state and safe content to emit\n   */\n  detectStreamingFence(): StreamingFenceResult {\n    if (!this.inFence) {\n      // Look for fence start\n      const {\n        index: startIdx,\n        prefix: matchedPrefix,\n        pattern,\n      } = this.findFenceStart(this.buffer);\n\n      if (startIdx === -1) {\n        // No fence start found - emit safe text\n        const overlap = this.computeOverlapLength(\n          this.buffer,\n          this.fenceStarts,\n        );\n        const safeTextLength = this.buffer.length - overlap;\n        const safeContent =\n          safeTextLength > 0 ? this.buffer.slice(0, safeTextLength) : \"\";\n        this.buffer = this.buffer.slice(safeTextLength);\n\n        return {\n          inFence: false,\n          safeContent,\n          completeFence: null,\n          textAfterFence: \"\",\n        };\n      }\n\n      // Found fence start!\n      const prefixText = this.buffer.slice(0, startIdx);\n      const fenceStartLength = matchedPrefix?.length ?? 0;\n\n      // Move buffer past the fence start marker\n      this.buffer = this.buffer.slice(startIdx + fenceStartLength);\n\n      if (\n        pattern &&\n        pattern.start.startsWith(\"```\") &&\n        this.buffer.startsWith(\"\\n\")\n      ) {\n        this.buffer = this.buffer.slice(1);\n      }\n\n      this.inFence = true;\n      this.fenceStartBuffer = \"\";\n      this.currentFencePattern = pattern;\n\n      return {\n        inFence: true,\n        safeContent: prefixText, // Emit any text before the fence\n        completeFence: null,\n        textAfterFence: \"\",\n      };\n    }\n\n    // We're inside a fence - look for fence end using the current pattern\n    const fenceEnd = this.currentFencePattern?.end ?? \"```\";\n    const closingIdx = this.buffer.indexOf(fenceEnd);\n\n    if (closingIdx === -1) {\n      // No fence end yet - emit safe content (leaving potential fence end marker)\n      const overlap = this.computeOverlapLength(this.buffer, [fenceEnd]);\n      const safeContentLength = this.buffer.length - overlap;\n\n      if (safeContentLength > 0) {\n        const safeContent = this.buffer.slice(0, safeContentLength);\n        this.fenceStartBuffer += safeContent;\n        this.buffer = this.buffer.slice(safeContentLength);\n\n        return {\n          inFence: true,\n          safeContent,\n          completeFence: null,\n          textAfterFence: \"\",\n        };\n      }\n\n      // Nothing safe to emit yet\n      return {\n        inFence: true,\n        safeContent: \"\",\n        completeFence: null,\n        textAfterFence: \"\",\n      };\n    }\n\n    // Found fence end!\n    const fenceContent = this.buffer.slice(0, closingIdx);\n    this.fenceStartBuffer += fenceContent;\n\n    // Reconstruct complete fence using the current pattern\n    const reconstructStart =\n      this.currentFencePattern?.reconstructStart ?? \"```tool_call\\n\";\n    const completeFence = `${reconstructStart}${this.fenceStartBuffer}${fenceEnd}`;\n\n    // Get text after fence\n    const textAfterFence = this.buffer.slice(closingIdx + fenceEnd.length);\n\n    // Reset state\n    this.inFence = false;\n    this.fenceStartBuffer = \"\";\n    this.currentFencePattern = null;\n    this.buffer = textAfterFence;\n\n    return {\n      inFence: false,\n      safeContent: fenceContent, // Emit the last bit of fence content\n      completeFence,\n      textAfterFence,\n    };\n  }\n\n  isInFence(): boolean {\n    return this.inFence;\n  }\n\n  resetStreamingState(): void {\n    this.inFence = false;\n    this.fenceStartBuffer = \"\";\n    this.currentFencePattern = null;\n  }\n}\n\n/**\n * Creates a basic ToolCallFenceDetector with default markdown fence patterns\n */\nexport function createBasicDetector(): ToolCallFenceDetector {\n  return new ToolCallFenceDetector({\n    patterns: DEFAULT_FENCE_PATTERNS,\n    enablePythonStyle: false,\n  });\n}\n\n/**\n * Creates an extended ToolCallFenceDetector with all fence patterns\n */\nexport function createExtendedDetector(): ToolCallFenceDetector {\n  return new ToolCallFenceDetector({\n    patterns: EXTENDED_FENCE_PATTERNS,\n    enablePythonStyle: true,\n  });\n}\n","/**\n * Extracts tool name from partial fence content for early tool-input-start emission.\n * Expects a JSON fragment like: {\"name\":\"toolName\"\n */\nexport function extractToolName(content: string): string | null {\n  const jsonMatch = content.match(/\\{\\s*\"name\"\\s*:\\s*\"([^\"]+)\"/);\n  if (jsonMatch) {\n    return jsonMatch[1];\n  }\n  const callColonMatch = content.match(/call:(\\w+)\\{/);\n  if (callColonMatch) {\n    return callColonMatch[1];\n  }\n  return null;\n}\n\nexport interface ArgumentsStreamState {\n  searchFrom: number;\n  valueStartIndex: number | null;\n  parseIndex: number;\n  started: boolean;\n  depth: number;\n  inString: boolean;\n  escaped: boolean;\n  complete: boolean;\n}\n\nconst ARGUMENTS_FIELD_REGEX = /\"arguments\"\\s*:\\s*/g;\nconst ARGUMENTS_SEARCH_OVERLAP = 32;\n\nexport function createArgumentsStreamState(): ArgumentsStreamState {\n  return {\n    searchFrom: 0,\n    valueStartIndex: null,\n    parseIndex: 0,\n    started: false,\n    depth: 0,\n    inString: false,\n    escaped: false,\n    complete: false,\n  };\n}\n\n/**\n * Incrementally extracts only new argument content from a streaming tool call fence.\n */\nexport function extractArgumentsDelta(\n  content: string,\n  state: ArgumentsStreamState,\n): string {\n  if (state.complete) {\n    return \"\";\n  }\n\n  if (state.valueStartIndex === null) {\n    ARGUMENTS_FIELD_REGEX.lastIndex = state.searchFrom;\n    const match = ARGUMENTS_FIELD_REGEX.exec(content);\n    ARGUMENTS_FIELD_REGEX.lastIndex = 0;\n\n    if (!match || match.index === undefined) {\n      state.searchFrom = Math.max(0, content.length - ARGUMENTS_SEARCH_OVERLAP);\n      return \"\";\n    }\n\n    state.valueStartIndex = match.index + match[0].length;\n    state.parseIndex = state.valueStartIndex;\n    state.searchFrom = state.valueStartIndex;\n  }\n\n  if (state.parseIndex >= content.length) {\n    return \"\";\n  }\n\n  let delta = \"\";\n  for (let i = state.parseIndex; i < content.length; i++) {\n    const char = content[i];\n    delta += char;\n\n    if (!state.started) {\n      if (!/\\s/.test(char)) {\n        state.started = true;\n        if (char === \"{\" || char === \"[\") {\n          state.depth = 1;\n        }\n      }\n      continue;\n    }\n\n    if (state.escaped) {\n      state.escaped = false;\n      continue;\n    }\n\n    if (char === \"\\\\\") {\n      state.escaped = true;\n      continue;\n    }\n\n    if (char === '\"') {\n      state.inString = !state.inString;\n      continue;\n    }\n\n    if (!state.inString) {\n      if (char === \"{\" || char === \"[\") {\n        state.depth += 1;\n      } else if (char === \"}\" || char === \"]\") {\n        if (state.depth > 0) {\n          state.depth -= 1;\n          if (state.depth === 0) {\n            state.parseIndex = i + 1;\n            state.complete = true;\n            return delta;\n          }\n        }\n      }\n    }\n  }\n\n  state.parseIndex = content.length;\n  return delta;\n}\n","import type { LanguageModelV3StreamPart } from \"@ai-sdk/provider\";\nimport { ToolCallFenceDetector } from \"./tool-call-detector\";\nimport {\n  createArgumentsStreamState,\n  extractArgumentsDelta,\n  extractToolName,\n} from \"./tool-call-stream-utils\";\nimport { parseJsonFunctionCalls } from \"../tool-calling/parse-json-function-calls\";\nimport type { ParsedToolCall } from \"../types\";\n\nexport interface ToolCallStreamResult {\n  toolCallDetected: boolean;\n  toolCalls: ParsedToolCall[];\n  /** Text appearing after the tool call fence — caller decides when to emit it */\n  trailingText: string;\n}\n\nexport function generateToolCallId(): string {\n  return `call_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Processes an async iterable of string chunks, detecting tool call fences and\n * emitting the appropriate stream events via `controller` and `emitTextDelta`.\n *\n * When `stopEarlyOnToolCall` is true the function stops consuming chunks as soon as\n * a tool call is detected (useful when the caller needs to cancel the source).\n * When false (the default) the function continues draining remaining chunks without\n * processing them, allowing the underlying stream/engine to conclude normally.\n */\nexport async function processToolCallStream(\n  chunks: AsyncIterable<string>,\n  emitTextDelta: (delta: string) => void,\n  controller: ReadableStreamDefaultController<LanguageModelV3StreamPart>,\n  options?: { stopEarlyOnToolCall?: boolean },\n): Promise<ToolCallStreamResult> {\n  const fenceDetector = new ToolCallFenceDetector();\n\n  let currentToolCallId: string | null = null;\n  let toolInputStartEmitted = false;\n  let accumulatedFenceContent = \"\";\n  let argumentsStreamState = createArgumentsStreamState();\n  let insideFence = false;\n\n  let toolCallDetected = false;\n  let toolCalls: ParsedToolCall[] = [];\n  let trailingText = \"\";\n\n  const resetFenceState = () => {\n    currentToolCallId = null;\n    toolInputStartEmitted = false;\n    accumulatedFenceContent = \"\";\n    argumentsStreamState = createArgumentsStreamState();\n    insideFence = false;\n  };\n\n  for await (const chunk of chunks) {\n    if (toolCallDetected) {\n      // Drain without processing so the underlying stream/engine can conclude.\n      continue;\n    }\n\n    fenceDetector.addChunk(chunk);\n\n    while (fenceDetector.hasContent()) {\n      const wasInsideFence = insideFence;\n      const result = fenceDetector.detectStreamingFence();\n      insideFence = result.inFence;\n\n      let madeProgress = false;\n\n      if (!wasInsideFence && result.inFence) {\n        if (result.safeContent) {\n          emitTextDelta(result.safeContent);\n          madeProgress = true;\n        }\n\n        currentToolCallId = generateToolCallId();\n        toolInputStartEmitted = false;\n        accumulatedFenceContent = \"\";\n        argumentsStreamState = createArgumentsStreamState();\n        insideFence = true;\n\n        continue;\n      }\n\n      if (result.completeFence) {\n        madeProgress = true;\n        if (result.safeContent) {\n          accumulatedFenceContent += result.safeContent;\n        }\n\n        if (toolInputStartEmitted && currentToolCallId) {\n          const delta = extractArgumentsDelta(\n            accumulatedFenceContent,\n            argumentsStreamState,\n          );\n          if (delta.length > 0) {\n            controller.enqueue({\n              type: \"tool-input-delta\",\n              id: currentToolCallId,\n              delta,\n            });\n          }\n        }\n\n        const parsed = parseJsonFunctionCalls(result.completeFence);\n        const selectedToolCalls = parsed.toolCalls.slice(0, 1);\n\n        if (selectedToolCalls.length === 0) {\n          emitTextDelta(result.completeFence);\n          if (result.textAfterFence) {\n            emitTextDelta(result.textAfterFence);\n          }\n          resetFenceState();\n          continue;\n        }\n\n        if (currentToolCallId) {\n          selectedToolCalls[0].toolCallId = currentToolCallId;\n        }\n\n        for (const [index, call] of selectedToolCalls.entries()) {\n          const toolCallId =\n            index === 0 && currentToolCallId\n              ? currentToolCallId\n              : call.toolCallId;\n          const toolName = call.toolName;\n          const argsJson = JSON.stringify(call.args ?? {});\n\n          if (toolCallId === currentToolCallId) {\n            if (!toolInputStartEmitted) {\n              controller.enqueue({\n                type: \"tool-input-start\",\n                id: toolCallId,\n                toolName,\n              });\n              toolInputStartEmitted = true;\n            }\n\n            const delta = extractArgumentsDelta(\n              accumulatedFenceContent,\n              argumentsStreamState,\n            );\n            if (delta.length > 0) {\n              controller.enqueue({\n                type: \"tool-input-delta\",\n                id: toolCallId,\n                delta,\n              });\n            }\n          } else {\n            controller.enqueue({\n              type: \"tool-input-start\",\n              id: toolCallId,\n              toolName,\n            });\n            if (argsJson.length > 0) {\n              controller.enqueue({\n                type: \"tool-input-delta\",\n                id: toolCallId,\n                delta: argsJson,\n              });\n            }\n          }\n\n          controller.enqueue({ type: \"tool-input-end\", id: toolCallId });\n          controller.enqueue({\n            type: \"tool-call\",\n            toolCallId,\n            toolName,\n            input: argsJson,\n            providerExecuted: false,\n          });\n        }\n\n        trailingText = result.textAfterFence ?? \"\";\n        toolCalls = selectedToolCalls;\n        toolCallDetected = true;\n        resetFenceState();\n        break; // stop processing inner buffer\n      }\n\n      if (insideFence) {\n        if (result.safeContent) {\n          accumulatedFenceContent += result.safeContent;\n          madeProgress = true;\n\n          const toolName = extractToolName(accumulatedFenceContent);\n          if (toolName && !toolInputStartEmitted && currentToolCallId) {\n            controller.enqueue({\n              type: \"tool-input-start\",\n              id: currentToolCallId,\n              toolName,\n            });\n            toolInputStartEmitted = true;\n          }\n\n          if (toolInputStartEmitted && currentToolCallId) {\n            const delta = extractArgumentsDelta(\n              accumulatedFenceContent,\n              argumentsStreamState,\n            );\n            if (delta.length > 0) {\n              controller.enqueue({\n                type: \"tool-input-delta\",\n                id: currentToolCallId,\n                delta,\n              });\n            }\n          }\n        }\n\n        continue;\n      }\n\n      if (!insideFence && result.safeContent) {\n        emitTextDelta(result.safeContent);\n        madeProgress = true;\n      }\n\n      if (!madeProgress) {\n        break;\n      }\n    }\n\n    if (toolCallDetected && options?.stopEarlyOnToolCall) {\n      break; // caller will cancel/drain the underlying source\n    }\n  }\n\n  // Flush any remaining buffer when no tool call was detected\n  if (!toolCallDetected && fenceDetector.hasContent()) {\n    emitTextDelta(fenceDetector.getBuffer());\n    fenceDetector.clearBuffer();\n  }\n\n  return { toolCallDetected, toolCalls, trailingText };\n}\n","import {\n  TextStreamer,\n  StoppingCriteriaList,\n  StoppingCriteria,\n  load_image,\n  type PreTrainedTokenizer,\n} from \"@huggingface/transformers\";\nimport type { TransformersMessage } from \"./convert-to-transformers-message\";\nimport type {\n  ModelInstance,\n  GenerationOptions,\n} from \"../chat/transformers-js-worker-types\";\nimport type { ToolDefinition, ParsedToolCall } from \"@browser-ai/shared\";\nimport {\n  buildApplyChatTemplateOptions,\n  normalizeStreamedTextChunk,\n} from \"./generation-helpers\";\n\n/**\n * Events emitted by the generation stream\n */\nexport type GenerationEvent =\n  | { type: \"delta\"; delta: string }\n  | {\n      type: \"complete\";\n      toolCalls?: ParsedToolCall[];\n      usage?: { inputTokens?: number; outputTokens?: number };\n    };\n\ninterface MainThreadOptions {\n  modelInstance: ModelInstance;\n  messages: TransformersMessage[];\n  generationOptions: GenerationOptions;\n  tools?: ToolDefinition[];\n  isVisionModel?: boolean;\n  enableThinking?: boolean;\n  stoppingCriteria: StoppingCriteria & {\n    interrupt: () => void;\n    reset: () => void;\n  };\n  abortSignal?: AbortSignal;\n}\n\ninterface WorkerOptions {\n  worker: Worker;\n  messages: TransformersMessage[];\n  generationOptions: GenerationOptions;\n  tools?: ToolDefinition[];\n  enableThinking?: boolean;\n  abortSignal?: AbortSignal;\n}\n\n/**\n * Creates an async generator for main thread generation\n */\nexport async function* createMainThreadGenerationStream(\n  options: MainThreadOptions,\n): AsyncGenerator<GenerationEvent> {\n  const {\n    modelInstance,\n    messages,\n    generationOptions: userGenerationOptions,\n    tools,\n    isVisionModel,\n    enableThinking = false,\n    stoppingCriteria,\n    abortSignal,\n  } = options;\n\n  const [processor, model] = modelInstance;\n\n  const templateOptions = buildApplyChatTemplateOptions({\n    tools,\n    enableThinking,\n  });\n\n  // Prepare inputs\n  let inputs: any;\n  let inputLength = 0;\n\n  if (isVisionModel) {\n    const text = processor.apply_chat_template(\n      messages as any,\n      templateOptions,\n    );\n    const imageUrls = messages\n      .flatMap((msg) => (Array.isArray(msg.content) ? msg.content : []))\n      .filter((part) => part.type === \"image\")\n      .map((part) => part.image);\n\n    const images = await Promise.all(imageUrls.map((url) => load_image(url)));\n    inputs =\n      images.length > 0 ? await processor(text, images) : await processor(text);\n  } else {\n    inputs = processor.apply_chat_template(messages as any, {\n      ...templateOptions,\n      return_dict: true,\n    });\n    inputLength = inputs.input_ids.data.length;\n  }\n\n  const chunks: Array<GenerationEvent | { type: \"error\"; error: Error }> = [];\n  let resolve: (() => void) | null = null;\n  let generationComplete = false;\n  let outputTokens = 0;\n  let aborted = false;\n\n  const resolvePending = () => {\n    resolve?.();\n    resolve = null;\n  };\n\n  const pushChunk = (\n    chunk: GenerationEvent | { type: \"error\"; error: Error },\n  ) => {\n    chunks.push(chunk);\n    resolvePending();\n  };\n\n  const waitForChunk = () =>\n    chunks.length > 0 || generationComplete\n      ? Promise.resolve()\n      : new Promise<void>((r) => {\n          resolve = r;\n        });\n\n  const abortHandler = () => {\n    aborted = true;\n    stoppingCriteria.interrupt();\n  };\n\n  abortSignal?.addEventListener(\"abort\", abortHandler);\n\n  // Start generation in background\n  const generationPromise = (async () => {\n    try {\n      const streamer = new TextStreamer(\n        (isVisionModel\n          ? (processor as any).tokenizer\n          : processor) as PreTrainedTokenizer,\n        {\n          skip_prompt: true,\n          skip_special_tokens: false,\n          callback_function: (text: string) => {\n            if (aborted) return;\n\n            const normalizedText = normalizeStreamedTextChunk(text);\n            if (normalizedText === null) {\n              return;\n            }\n\n            outputTokens++;\n            pushChunk({ type: \"delta\", delta: normalizedText });\n          },\n        },\n      );\n\n      stoppingCriteria.reset();\n      const stoppingCriteriaList = new StoppingCriteriaList();\n      stoppingCriteriaList.extend([stoppingCriteria]);\n\n      await model.generate({\n        ...inputs,\n        ...userGenerationOptions,\n        streamer,\n        stopping_criteria: stoppingCriteriaList,\n        return_dict_in_generate: true,\n      });\n\n      pushChunk({\n        type: \"complete\",\n        usage: { inputTokens: inputLength, outputTokens },\n      });\n    } catch (error) {\n      pushChunk({ type: \"error\", error: error as Error });\n    } finally {\n      generationComplete = true;\n      resolvePending();\n      if (abortSignal) {\n        abortSignal.removeEventListener(\"abort\", abortHandler);\n      }\n    }\n  })();\n\n  // Yield chunks as they arrive\n  while (true) {\n    await waitForChunk();\n\n    while (chunks.length > 0) {\n      const chunk = chunks.shift()!;\n      if (chunk.type === \"error\") {\n        throw chunk.error;\n      }\n      yield chunk;\n      if (chunk.type === \"complete\") {\n        return;\n      }\n    }\n\n    if (generationComplete && chunks.length === 0) {\n      break;\n    }\n  }\n\n  await generationPromise;\n}\n\n/**\n * Creates an async generator for worker-based generation\n */\nexport async function* createWorkerGenerationStream(\n  options: WorkerOptions,\n): AsyncGenerator<GenerationEvent> {\n  const {\n    worker,\n    messages,\n    generationOptions,\n    tools,\n    enableThinking,\n    abortSignal,\n  } = options;\n\n  const chunks: Array<GenerationEvent | { type: \"error\"; error: Error }> = [];\n  let resolve: (() => void) | null = null;\n  let complete = false;\n\n  const pushChunk = (\n    chunk: GenerationEvent | { type: \"error\"; error: Error },\n  ) => {\n    chunks.push(chunk);\n    resolve?.();\n    resolve = null;\n  };\n\n  const waitForChunk = () =>\n    chunks.length > 0 || complete\n      ? Promise.resolve()\n      : new Promise<void>((r) => {\n          resolve = r;\n        });\n\n  const onMessage = (e: MessageEvent) => {\n    const msg = e.data;\n    if (!msg) return;\n\n    if (msg.status === \"update\" && typeof msg.output === \"string\") {\n      pushChunk({ type: \"delta\", delta: msg.output });\n    } else if (msg.status === \"complete\") {\n      pushChunk({\n        type: \"complete\",\n        toolCalls: msg.toolCalls,\n        usage: { inputTokens: msg.inputLength, outputTokens: msg.numTokens },\n      });\n      complete = true;\n      worker.removeEventListener(\"message\", onMessage);\n    } else if (msg.status === \"error\") {\n      pushChunk({\n        type: \"error\",\n        error: new Error(String(msg.data || \"Worker error\")),\n      });\n      complete = true;\n      worker.removeEventListener(\"message\", onMessage);\n    }\n  };\n\n  worker.addEventListener(\"message\", onMessage);\n\n  const onAbort = abortSignal\n    ? () => {\n        worker.postMessage({ type: \"interrupt\" });\n      }\n    : null;\n\n  if (abortSignal && onAbort) {\n    abortSignal.addEventListener(\"abort\", onAbort);\n  }\n\n  worker.postMessage({\n    type: \"generate\",\n    data: messages,\n    generationOptions,\n    tools: tools?.length ? tools : undefined,\n    enableThinking,\n  });\n\n  // Yield chunks as they arrive\n  try {\n    while (true) {\n      await waitForChunk();\n\n      while (chunks.length > 0) {\n        const chunk = chunks.shift()!;\n        if (chunk.type === \"error\") {\n          throw chunk.error;\n        }\n        yield chunk;\n        if (chunk.type === \"complete\") {\n          return;\n        }\n      }\n\n      if (complete && chunks.length === 0) {\n        break;\n      }\n    }\n  } finally {\n    if (abortSignal && onAbort) {\n      abortSignal.removeEventListener(\"abort\", onAbort);\n    }\n  }\n}\n","import type {\n  JSONSchema7,\n  LanguageModelV3FunctionTool,\n} from \"@ai-sdk/provider\";\nimport type { ToolDefinition } from \"@browser-ai/shared\";\n\n/**\n * HuggingFace tool definition format compatible with apply_chat_template\n */\nexport interface HuggingFaceToolDefinition {\n  type: \"function\";\n  function: {\n    name: string;\n    description: string;\n    parameters: JSONSchema7;\n  };\n}\n\n/**\n * Converts AI SDK tool format to HuggingFace chat template tool format.\n * The converted tools can be passed to processor.apply_chat_template({ tools: [...] })\n * to enable native tool-calling support in models that have it in their chat templates.\n *\n * @param tools - Array of AI SDK function tools or ToolDefinition\n * @returns Array of HuggingFace-formatted tool definitions\n */\nexport function convertToolsToHuggingFaceFormat(\n  tools: Array<LanguageModelV3FunctionTool | ToolDefinition>,\n): HuggingFaceToolDefinition[] {\n  return tools.map((tool) => {\n    const parameters =\n      \"inputSchema\" in tool ? tool.inputSchema : tool.parameters;\n\n    return {\n      type: \"function\",\n      function: {\n        name: tool.name,\n        description: tool.description ?? \"\",\n        parameters,\n      },\n    };\n  });\n}\n","import type { ToolDefinition } from \"@browser-ai/shared\";\nimport { convertToolsToHuggingFaceFormat } from \"./convert-tools\";\n\nexport function buildApplyChatTemplateOptions({\n  tools,\n  enableThinking = false,\n}: {\n  tools?: ToolDefinition[];\n  enableThinking?: boolean;\n}): Record<string, unknown> {\n  const hfTools = tools?.length\n    ? convertToolsToHuggingFaceFormat(tools)\n    : undefined;\n\n  return {\n    add_generation_prompt: true,\n    ...(hfTools ? { tools: hfTools } : {}),\n    ...(enableThinking ? { enable_thinking: true } : {}),\n  };\n}\n\nexport function normalizeStreamedTextChunk(output: string): string | null {\n  const trimmed = output.trim();\n  const isSpecialToken =\n    /^<\\|[^>]+>$/.test(trimmed) || /^<[^|>]+\\|>$/.test(trimmed);\n  const isToolCallToken =\n    trimmed === \"<|tool_call|>\" ||\n    trimmed === \"<|tool_call>\" ||\n    trimmed === \"<tool_call|>\" ||\n    /^<\\/?tool_call>$/.test(trimmed);\n\n  if (isSpecialToken && !isToolCallToken && !trimmed.includes(\"channel\")) {\n    return null;\n  }\n\n  if (trimmed === \"<|channel>\") return \"<think>\";\n  if (trimmed === \"<channel|>\") return \"</think>\";\n\n  return output;\n}\n","import {\n  EmbeddingModelV3,\n  TooManyEmbeddingValuesForCallError,\n  LoadSettingError,\n  EmbeddingModelV3CallOptions,\n  EmbeddingModelV3Result,\n} from \"@ai-sdk/provider\";\nimport {\n  pipeline,\n  AutoTokenizer,\n  type PreTrainedTokenizer,\n  type ProgressInfo,\n  type PretrainedModelOptions,\n  type FeatureExtractionPipeline,\n  type Tensor,\n} from \"@huggingface/transformers\";\nimport type { DownloadProgressCallback } from \"@browser-ai/shared\";\n\nexport type TransformersJSEmbeddingModelId = string;\n\n/**\n * Check if we're running in a browser environment\n */\nexport function isBrowserEnvironment(): boolean {\n  return typeof window !== \"undefined\";\n}\n\n/**\n * Check if we're running in a server environment (Node.js)\n */\nexport function isServerEnvironment(): boolean {\n  return typeof window === \"undefined\" && typeof process !== \"undefined\";\n}\n\nexport interface TransformersJSEmbeddingSettings extends Pick<\n  PretrainedModelOptions,\n  \"device\" | \"dtype\"\n> {\n  /**\n   * Progress callback for model initialization\n   */\n  initProgressCallback?: DownloadProgressCallback;\n  /**\n   * Raw progress callback from Transformers.js\n   */\n  rawInitProgressCallback?: (progress: ProgressInfo) => void;\n  /**\n   * Whether to normalize embeddings\n   * @default true\n   */\n  normalize?: boolean;\n  /**\n   * Pooling strategy for token embeddings\n   * @default \"mean\"\n   */\n  pooling?: \"mean\" | \"cls\" | \"max\";\n  /**\n   * Maximum number of tokens per input\n   * @default 512\n   */\n  maxTokens?: number;\n}\n\nexport class TransformersJSEmbeddingModel implements EmbeddingModelV3 {\n  readonly specificationVersion = \"v3\";\n  readonly provider = \"transformers-js\";\n  readonly modelId: TransformersJSEmbeddingModelId;\n  readonly maxEmbeddingsPerCall = 100; // Reasonable limit for browser\n  readonly supportsParallelCalls = false;\n\n  private readonly config: TransformersJSEmbeddingSettings & {\n    modelId: TransformersJSEmbeddingModelId;\n  };\n  private pipeline: FeatureExtractionPipeline | null = null;\n  private tokenizer: PreTrainedTokenizer | null = null;\n  private isInitialized = false;\n  private initializationPromise?: Promise<void>;\n\n  constructor(\n    modelId: TransformersJSEmbeddingModelId,\n    options: TransformersJSEmbeddingSettings = {},\n  ) {\n    this.modelId = modelId;\n    this.config = {\n      modelId,\n      device: \"auto\",\n      dtype: \"auto\",\n      normalize: true,\n      pooling: \"mean\",\n      maxTokens: 512,\n      ...options,\n    };\n  }\n\n  private async getSession(\n    onInitProgress?: DownloadProgressCallback,\n  ): Promise<[PreTrainedTokenizer, FeatureExtractionPipeline]> {\n    if (this.pipeline && this.tokenizer && this.isInitialized) {\n      return [this.tokenizer, this.pipeline];\n    }\n\n    if (this.initializationPromise) {\n      await this.initializationPromise;\n      if (this.pipeline && this.tokenizer) {\n        return [this.tokenizer, this.pipeline];\n      }\n    }\n\n    this.initializationPromise = this._initializeModel(onInitProgress);\n    await this.initializationPromise;\n\n    if (!this.pipeline || !this.tokenizer) {\n      throw new LoadSettingError({\n        message: \"Embedding model initialization failed\",\n      });\n    }\n\n    return [this.tokenizer, this.pipeline];\n  }\n\n  private async _initializeModel(\n    onInitProgress?: DownloadProgressCallback,\n  ): Promise<void> {\n    try {\n      const { device, dtype } = this.config;\n      const progress_callback = this.createProgressTracker(onInitProgress);\n\n      // Set device based on environment\n      const resolvedDevice = this.resolveDevice(\n        device as string,\n      ) as PretrainedModelOptions[\"device\"];\n      const resolvedDtype = this.resolveDtype(\n        dtype as string,\n      ) as PretrainedModelOptions[\"dtype\"];\n\n      // Create tokenizer and pipeline\n      const [tokenizer, embeddingPipeline] = await Promise.all([\n        AutoTokenizer.from_pretrained(this.modelId, {\n          progress_callback,\n        }),\n        pipeline(\"feature-extraction\", this.modelId, {\n          device: resolvedDevice,\n          dtype: resolvedDtype,\n          progress_callback,\n        }),\n      ]);\n\n      this.tokenizer = tokenizer;\n      this.pipeline = embeddingPipeline as FeatureExtractionPipeline;\n\n      onInitProgress?.(1.0);\n      this.isInitialized = true;\n    } catch (error) {\n      this.pipeline = null;\n      this.tokenizer = null;\n      this.isInitialized = false;\n      this.initializationPromise = undefined;\n\n      throw new LoadSettingError({\n        message: `Failed to initialize TransformersJS embedding model: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n      });\n    }\n  }\n\n  private resolveDevice(device?: string): string {\n    if (device && device !== \"auto\") {\n      return device;\n    }\n\n    if (isServerEnvironment()) {\n      // In server environment, prefer CPU unless explicitly set\n      return \"cpu\";\n    }\n\n    // In browser environment, auto-detect WebGPU support\n    if (\n      isBrowserEnvironment() &&\n      typeof navigator !== \"undefined\" &&\n      (navigator as any).gpu\n    ) {\n      return \"webgpu\";\n    }\n\n    return \"cpu\";\n  }\n\n  private resolveDtype(dtype?: string): string {\n    if (dtype && dtype !== \"auto\") {\n      return dtype;\n    }\n\n    return \"q8\";\n  }\n\n  private createProgressTracker(onInitProgress?: DownloadProgressCallback) {\n    const fileProgress = new Map<string, { loaded: number; total: number }>();\n\n    return (p: ProgressInfo) => {\n      // Pass through raw progress\n      this.config.rawInitProgressCallback?.(p);\n\n      if (!onInitProgress) return;\n\n      // Type guard to check if p has file property\n      const progressWithFile = p as ProgressInfo & {\n        file?: string;\n        loaded?: number;\n        total?: number;\n      };\n      const file = progressWithFile.file;\n\n      if (!file) return;\n\n      if (p.status === \"progress\" && file) {\n        fileProgress.set(file, {\n          loaded: progressWithFile.loaded || 0,\n          total: progressWithFile.total || 0,\n        });\n      } else if (p.status === \"done\" && file) {\n        const prev = fileProgress.get(file);\n        if (prev?.total) {\n          fileProgress.set(file, { loaded: prev.total, total: prev.total });\n        }\n      }\n\n      // Calculate overall progress\n      let totalLoaded = 0;\n      let totalBytes = 0;\n      for (const { loaded, total } of fileProgress.values()) {\n        if (total > 0) {\n          totalLoaded += loaded;\n          totalBytes += total;\n        }\n      }\n\n      if (totalBytes > 0) {\n        onInitProgress(Math.min(1, totalLoaded / totalBytes));\n      }\n    };\n  }\n\n  private applyPooling(embeddings: number[][], pooling: string): number[] {\n    if (pooling === \"cls\") {\n      return embeddings[0]; // Return first token (CLS token)\n    }\n\n    const hiddenSize = embeddings[0].length;\n\n    if (pooling === \"max\") {\n      const pooled = new Array(hiddenSize).fill(-Infinity);\n      for (const embedding of embeddings) {\n        for (let j = 0; j < hiddenSize; j++) {\n          pooled[j] = Math.max(pooled[j], embedding[j]);\n        }\n      }\n      return pooled;\n    }\n\n    // Default: mean pooling\n    const result = new Array(hiddenSize).fill(0);\n    for (const embedding of embeddings) {\n      for (let j = 0; j < hiddenSize; j++) {\n        result[j] += embedding[j];\n      }\n    }\n    return result.map((val) => val / embeddings.length);\n  }\n\n  private normalizeVector(vector: number[]): number[] {\n    const norm = Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0));\n    return norm > 0 ? vector.map((val) => val / norm) : vector;\n  }\n\n  /**\n   * Check the availability of the TransformersJS embedding model\n   */\n  public async availability(): Promise<\n    \"unavailable\" | \"downloadable\" | \"available\"\n  > {\n    if (this.isInitialized) {\n      return \"available\";\n    }\n\n    return \"downloadable\";\n  }\n\n  /**\n   * Creates a session with download progress monitoring\n   */\n  public async createSessionWithProgress(\n    onDownloadProgress?: DownloadProgressCallback,\n  ): Promise<TransformersJSEmbeddingModel> {\n    await this._initializeModel(onDownloadProgress);\n    return this;\n  }\n\n  async doEmbed(\n    options: EmbeddingModelV3CallOptions,\n  ): Promise<EmbeddingModelV3Result> {\n    const { values } = options;\n\n    if (values.length > this.maxEmbeddingsPerCall) {\n      throw new TooManyEmbeddingValuesForCallError({\n        provider: this.provider,\n        modelId: this.modelId,\n        maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,\n        values: values,\n      });\n    }\n\n    const [tokenizer, model] = await this.getSession(\n      this.config.initProgressCallback,\n    );\n\n    const embeddings = await Promise.all(\n      values.map(async (text) => {\n        try {\n          // Tokenize the input\n          const tokens = await tokenizer(text, {\n            padding: true,\n            truncation: true,\n            max_length: this.config.maxTokens,\n            return_tensors: false,\n          });\n\n          // Get embeddings\n          const result = await model(text, {\n            pooling: \"none\", // We'll handle pooling ourselves\n            normalize: false, // We'll handle normalization ourselves\n          });\n\n          let embedding: number[];\n\n          // Handle Tensor result from transformers.js\n          if (\n            result &&\n            typeof result === \"object\" &&\n            \"data\" in result &&\n            \"dims\" in result\n          ) {\n            // Result is a Tensor from transformers.js\n            const tensor = result as Tensor;\n            const data = Array.from(tensor.data) as number[];\n            const dims = tensor.dims as number[];\n\n            if (dims.length === 3) {\n              // [batch_size, sequence_length, hidden_size] - needs pooling\n              const [batchSize, seqLength, hiddenSize] = dims;\n              const sequences: number[][] = [];\n\n              // Reshape flat array back to [sequence_length, hidden_size] for first batch\n              for (let i = 0; i < seqLength; i++) {\n                const sequence: number[] = [];\n                for (let j = 0; j < hiddenSize; j++) {\n                  sequence.push(data[i * hiddenSize + j]);\n                }\n                sequences.push(sequence);\n              }\n\n              embedding = this.applyPooling(\n                sequences,\n                this.config.pooling || \"mean\",\n              );\n            } else if (dims.length === 2) {\n              // [sequence_length, hidden_size] - needs pooling\n              const [seqLength, hiddenSize] = dims;\n              const sequences: number[][] = [];\n\n              for (let i = 0; i < seqLength; i++) {\n                const sequence: number[] = [];\n                for (let j = 0; j < hiddenSize; j++) {\n                  sequence.push(data[i * hiddenSize + j]);\n                }\n                sequences.push(sequence);\n              }\n\n              embedding = this.applyPooling(\n                sequences,\n                this.config.pooling || \"mean\",\n              );\n            } else if (dims.length === 1) {\n              // Already pooled [hidden_size]\n              embedding = data;\n            } else {\n              throw new Error(`Unsupported tensor dimensions: ${dims}`);\n            }\n          } else if (\n            Array.isArray(result) &&\n            Array.isArray(result[0]) &&\n            Array.isArray(result[0][0])\n          ) {\n            // Result is [batch_size, sequence_length, hidden_size]\n            embedding = this.applyPooling(\n              result[0] as number[][],\n              this.config.pooling || \"mean\",\n            );\n          } else if (Array.isArray(result) && typeof result[0] === \"number\") {\n            // Result is already pooled\n            embedding = result as number[];\n          } else {\n            console.error(\"Unexpected result format:\", result);\n            throw new Error(\"Unexpected embedding result format\");\n          }\n\n          // Normalize if requested\n          if (this.config.normalize) {\n            embedding = this.normalizeVector(embedding);\n          }\n\n          return {\n            embedding,\n            tokenCount: Array.isArray(tokens.input_ids)\n              ? tokens.input_ids.length\n              : 0,\n          };\n        } catch (error) {\n          throw new Error(`Failed to generate embedding for text: ${error}`);\n        }\n      }),\n    );\n\n    const totalTokens = embeddings.reduce(\n      (sum, { tokenCount }) => sum + tokenCount,\n      0,\n    );\n\n    return {\n      embeddings: embeddings.map(({ embedding }) => embedding),\n      usage: { tokens: totalTokens },\n      warnings: [],\n    };\n  }\n}\n","import {\n  TranscriptionModelV3,\n  TranscriptionModelV3CallOptions,\n  SharedV3Warning,\n  LoadSettingError,\n} from \"@ai-sdk/provider\";\nimport {\n  AutoTokenizer,\n  AutoProcessor,\n  WhisperForConditionalGeneration,\n  full,\n  type PreTrainedTokenizer,\n  type Processor,\n  type PreTrainedModel,\n  type PretrainedModelOptions,\n  type ProgressInfo,\n  type Tensor,\n} from \"@huggingface/transformers\";\nimport type { DownloadProgressCallback } from \"@browser-ai/shared\";\n\nexport type TransformersJSTranscriptionModelId = string;\n\nexport interface TransformersJSTranscriptionSettings extends Pick<\n  PretrainedModelOptions,\n  \"device\" | \"dtype\"\n> {\n  /**\n   * Progress callback for model initialization\n   */\n  initProgressCallback?: DownloadProgressCallback;\n  /**\n   * Raw progress callback from Transformers.js\n   */\n  rawInitProgressCallback?: (progress: ProgressInfo) => void;\n  /**\n   * Maximum number of new tokens to generate\n   * @default 64\n   */\n  maxNewTokens?: number;\n  /**\n   * Language hint for better transcription accuracy\n   */\n  language?: string;\n  /**\n   * Return timestamps for segments\n   * @default false\n   */\n  returnTimestamps?: boolean;\n  /**\n   * Optional Web Worker to run the model off the main thread\n   */\n  worker?: Worker;\n}\n\n/**\n * Check if we're running in a browser environment\n */\nexport function isBrowserEnvironment(): boolean {\n  return typeof window !== \"undefined\";\n}\n\n/**\n * Check if we're running in a server environment (Node.js)\n */\nexport function isServerEnvironment(): boolean {\n  return typeof window === \"undefined\" && typeof process !== \"undefined\";\n}\n\ninterface TranscriptionModelConfig extends TransformersJSTranscriptionSettings {\n  modelId: TransformersJSTranscriptionModelId;\n}\n\ntype TranscriptionModelInstance = [\n  PreTrainedTokenizer,\n  Processor,\n  PreTrainedModel,\n];\n\nexport class TransformersJSTranscriptionModel implements TranscriptionModelV3 {\n  readonly specificationVersion = \"v3\";\n  readonly provider = \"transformers-js\";\n  readonly modelId: TransformersJSTranscriptionModelId;\n\n  private readonly config: TranscriptionModelConfig;\n  private modelInstance?: TranscriptionModelInstance;\n  private isInitialized = false;\n  private initializationPromise?: Promise<void>;\n  private workerReady = false;\n\n  constructor(\n    modelId: TransformersJSTranscriptionModelId,\n    options: TransformersJSTranscriptionSettings = {},\n  ) {\n    this.modelId = modelId;\n    this.config = {\n      modelId,\n      device: \"auto\",\n      dtype: \"auto\",\n      maxNewTokens: 64,\n      returnTimestamps: false,\n      ...options,\n    };\n  }\n\n  private async getSession(\n    onInitProgress?: DownloadProgressCallback,\n  ): Promise<TranscriptionModelInstance> {\n    if (this.modelInstance && this.isInitialized) {\n      return this.modelInstance;\n    }\n\n    if (this.initializationPromise) {\n      await this.initializationPromise;\n      if (this.modelInstance) {\n        return this.modelInstance;\n      }\n    }\n\n    this.initializationPromise = this._initializeModel(onInitProgress);\n    await this.initializationPromise;\n\n    if (!this.modelInstance) {\n      throw new LoadSettingError({\n        message: \"Transcription model initialization failed\",\n      });\n    }\n\n    return this.modelInstance;\n  }\n\n  private async _initializeModel(\n    onInitProgress?: DownloadProgressCallback,\n  ): Promise<void> {\n    try {\n      const { device, dtype } = this.config;\n      const progress_callback = this.createProgressTracker(onInitProgress);\n\n      const resolvedDevice = this.resolveDevice(device);\n      const resolvedDtype = this.resolveDtype(dtype);\n\n      // Create model instance\n      const [tokenizer, processor, model] = await Promise.all([\n        AutoTokenizer.from_pretrained(this.modelId, { progress_callback }),\n        AutoProcessor.from_pretrained(this.modelId, { progress_callback }),\n        WhisperForConditionalGeneration.from_pretrained(this.modelId, {\n          dtype: resolvedDtype,\n          device: resolvedDevice,\n          progress_callback,\n        }),\n      ]);\n\n      this.modelInstance = [tokenizer, processor, model];\n\n      // Warm up the model (skip in server environment to reduce initialization time)\n      if (isBrowserEnvironment()) {\n        try {\n          const numMelBins = (model.config as any)?.num_mel_bins ?? 80;\n          await model.generate({\n            inputs: full([1, numMelBins, 3000], 0.0),\n          });\n        } catch (error) {\n          // Ignore warmup errors\n          console.warn(\"Model warmup failed:\", error);\n        }\n      }\n\n      onInitProgress?.(1.0);\n      this.isInitialized = true;\n    } catch (error) {\n      this.modelInstance = undefined;\n      this.isInitialized = false;\n      this.initializationPromise = undefined;\n\n      throw new LoadSettingError({\n        message: `Failed to initialize TransformersJS transcription model: ${\n          error instanceof Error ? error.message : \"Unknown error\"\n        }`,\n      });\n    }\n  }\n\n  private resolveDevice(\n    device?: PretrainedModelOptions[\"device\"],\n  ): PretrainedModelOptions[\"device\"] {\n    if (device && device !== \"auto\") {\n      return device as PretrainedModelOptions[\"device\"];\n    }\n\n    if (isServerEnvironment()) {\n      return \"cpu\";\n    }\n\n    return \"auto\";\n  }\n\n  private resolveDtype(\n    dtype?: string | object,\n  ): PretrainedModelOptions[\"dtype\"] {\n    if (dtype && dtype !== \"auto\") {\n      return dtype as PretrainedModelOptions[\"dtype\"];\n    }\n\n    return {\n      encoder_model: \"auto\",\n      decoder_model_merged: \"auto\",\n    };\n  }\n\n  private createProgressTracker(onInitProgress?: DownloadProgressCallback) {\n    const fileProgress = new Map<string, { loaded: number; total: number }>();\n\n    return (p: ProgressInfo) => {\n      this.config.rawInitProgressCallback?.(p);\n\n      if (!onInitProgress) return;\n\n      // Type guard to check if p has model file property\n      const progressWithFile = p as ProgressInfo & {\n        file?: string;\n        loaded?: number;\n        total?: number;\n      };\n      const file = progressWithFile.file;\n\n      if (!file) return;\n\n      if (p.status === \"progress\" && file) {\n        fileProgress.set(file, {\n          loaded: progressWithFile.loaded || 0,\n          total: progressWithFile.total || 0,\n        });\n      } else if (p.status === \"done\" && file) {\n        const prev = fileProgress.get(file);\n        if (prev?.total) {\n          fileProgress.set(file, { loaded: prev.total, total: prev.total });\n        }\n      }\n\n      // Calculate overall progress\n      let totalLoaded = 0;\n      let totalBytes = 0;\n      for (const { loaded, total } of fileProgress.values()) {\n        if (total > 0) {\n          totalLoaded += loaded;\n          totalBytes += total;\n        }\n      }\n\n      if (totalBytes > 0) {\n        onInitProgress(Math.min(1, totalLoaded / totalBytes));\n      }\n    };\n  }\n\n  private convertAudioToFloat32Array(\n    audio: string | Uint8Array | ArrayBuffer,\n  ): Promise<Float32Array> {\n    return new Promise((resolve, reject) => {\n      try {\n        let audioData: Uint8Array;\n\n        if (typeof audio === \"string\") {\n          // Base64 encoded audio data\n          const binaryString = atob(audio);\n          audioData = new Uint8Array(binaryString.length);\n          for (let i = 0; i < binaryString.length; i++) {\n            audioData[i] = binaryString.charCodeAt(i);\n          }\n        } else if (audio instanceof Uint8Array) {\n          audioData = audio;\n        } else if (audio instanceof ArrayBuffer) {\n          audioData = new Uint8Array(audio);\n        } else {\n          throw new Error(\"Unsupported audio format\");\n        }\n\n        // Create an AudioContext to decode the audio\n        // TODO: Make this work for server environment too.\n        if (\n          typeof AudioContext !== \"undefined\" ||\n          typeof (window as any)?.webkitAudioContext !== \"undefined\"\n        ) {\n          const AudioContextClass =\n            AudioContext || (window as any).webkitAudioContext;\n          const audioContext = new AudioContextClass({ sampleRate: 16000 });\n\n          audioContext\n            .decodeAudioData(\n              audioData.buffer.slice(\n                audioData.byteOffset,\n                audioData.byteOffset + audioData.byteLength,\n              ) as ArrayBuffer,\n            )\n            .then((audioBuffer) => {\n              const channelData = audioBuffer.getChannelData(0);\n              resolve(new Float32Array(channelData));\n            })\n            .catch(reject);\n        } else {\n          // This is a simplified approach. TODO: proper audio decoding!!\n          const float32Data = new Float32Array(audioData.length);\n          for (let i = 0; i < audioData.length; i++) {\n            float32Data[i] = (audioData[i] - 128) / 128.0;\n          }\n          resolve(float32Data);\n        }\n      } catch (error) {\n        reject(error);\n      }\n    });\n  }\n\n  private getArgs({ audio, providerOptions }: TranscriptionModelV3CallOptions) {\n    const warnings: SharedV3Warning[] = [];\n\n    const transformersJSOptions = providerOptions?.[\"transformers-js\"];\n\n    const language =\n      typeof transformersJSOptions?.language === \"string\"\n        ? transformersJSOptions.language\n        : this.config.language;\n    const returnTimestamps =\n      typeof transformersJSOptions?.returnTimestamps === \"boolean\"\n        ? transformersJSOptions.returnTimestamps\n        : this.config.returnTimestamps;\n    const maxNewTokens =\n      typeof transformersJSOptions?.maxNewTokens === \"number\"\n        ? transformersJSOptions.maxNewTokens\n        : this.config.maxNewTokens;\n\n    return {\n      audio,\n      language,\n      returnTimestamps,\n      maxNewTokens,\n      warnings,\n    };\n  }\n\n  /**\n   * Check the availability of the TransformersJS transcription model\n   */\n  public async availability(): Promise<\n    \"unavailable\" | \"downloadable\" | \"available\"\n  > {\n    // If using a worker (browser only), reflect worker readiness instead of main-thread state\n    if (this.config.worker && isBrowserEnvironment()) {\n      return this.workerReady ? \"available\" : \"downloadable\";\n    }\n\n    if (isServerEnvironment() && this.config.worker) {\n      // Ignore worker config on server and use main thread\n    }\n\n    if (this.isInitialized) {\n      return \"available\";\n    }\n\n    return \"downloadable\";\n  }\n\n  /**\n   * Creates a session with download progress monitoring\n   */\n  public async createSessionWithProgress(\n    onDownloadProgress?: DownloadProgressCallback,\n  ): Promise<TransformersJSTranscriptionModel> {\n    // If a worker is provided and we're in browser environment, initialize the worker\n    // (and forward progress) instead of initializing the model on the main thread\n    // to avoid double-initialization/downloads.\n    if (this.config.worker && isBrowserEnvironment()) {\n      await this.initializeWorker(onDownloadProgress);\n      return this;\n    }\n\n    // In server environment or when no worker is provided, use main thread\n    if (!this.initializationPromise) {\n      this.initializationPromise = this._initializeModel(onDownloadProgress);\n    }\n    await this.initializationPromise;\n    return this;\n  }\n\n  async doGenerate(\n    options: TranscriptionModelV3CallOptions,\n  ): Promise<Awaited<ReturnType<TranscriptionModelV3[\"doGenerate\"]>>> {\n    const currentDate = new Date();\n    const { audio, language, returnTimestamps, maxNewTokens, warnings } =\n      this.getArgs(options);\n\n    // Use worker if provided and in browser environment\n    if (this.config.worker && isBrowserEnvironment()) {\n      return this.doGenerateWithWorker(\n        audio,\n        language,\n        returnTimestamps,\n        maxNewTokens,\n        warnings,\n        currentDate,\n        options,\n      );\n    }\n\n    // Main thread generation (browser without worker or server environment)\n    const [tokenizer, processor, model] = await this.getSession(\n      this.config.initProgressCallback,\n    );\n\n    try {\n      const audioFloat32 = await this.convertAudioToFloat32Array(audio);\n\n      const durationInSeconds = audioFloat32.length / 16000;\n\n      const inputs = await processor(audioFloat32);\n\n      const outputs = await model.generate({\n        ...inputs,\n        max_new_tokens: maxNewTokens,\n        language: language,\n        return_timestamps: returnTimestamps,\n      });\n\n      const transcriptionText = tokenizer.batch_decode(outputs as Tensor, {\n        skip_special_tokens: true,\n      })[0];\n\n      return {\n        text: transcriptionText,\n        segments: [], // TODO: Parse segments from output if returnTimestamps is true\n        language: typeof language === \"string\" ? language : undefined,\n        durationInSeconds: durationInSeconds,\n        warnings,\n        response: {\n          timestamp: currentDate,\n          modelId: this.modelId,\n          headers: {},\n          body: JSON.stringify({ text: transcriptionText }),\n        },\n      };\n    } catch (error) {\n      throw new Error(\n        `TransformersJS transcription failed: ${\n          error instanceof Error ? error.message : \"Unknown error\"\n        }`,\n      );\n    }\n  }\n\n  private async doGenerateWithWorker(\n    audio: string | Uint8Array | ArrayBuffer,\n    language: string | undefined,\n    returnTimestamps: boolean | undefined,\n    maxNewTokens: number | undefined,\n    warnings: SharedV3Warning[],\n    currentDate: Date,\n    options: TranscriptionModelV3CallOptions,\n  ): Promise<Awaited<ReturnType<TranscriptionModelV3[\"doGenerate\"]>>> {\n    const worker = this.config.worker!;\n\n    await this.initializeWorker();\n\n    const audioFloat32 = await this.convertAudioToFloat32Array(audio);\n    const durationInSeconds = audioFloat32.length / 16000;\n\n    const result = await new Promise<string>((resolve, reject) => {\n      const onMessage = (e: MessageEvent) => {\n        const msg = e.data;\n        if (!msg) return;\n        if (msg.status === \"complete\" && Array.isArray(msg.output)) {\n          worker.removeEventListener(\"message\", onMessage);\n          resolve(String(msg.output[0] ?? \"\"));\n        } else if (msg.status === \"error\") {\n          worker.removeEventListener(\"message\", onMessage);\n          reject(new Error(String(msg.data || \"Worker error\")));\n        }\n      };\n      worker.addEventListener(\"message\", onMessage);\n      worker.postMessage({\n        type: \"generate\",\n        data: {\n          audio: Array.from(audioFloat32), // Convert to array for worker transfer\n          language,\n          maxNewTokens,\n        },\n      });\n\n      if (options.abortSignal) {\n        const onAbort = () => {\n          worker.postMessage({ type: \"interrupt\" });\n          options.abortSignal?.removeEventListener(\"abort\", onAbort);\n        };\n        options.abortSignal.addEventListener(\"abort\", onAbort);\n      }\n    });\n\n    return {\n      text: result,\n      segments: [], // TODO: Parse segments from output if returnTimestamps is true\n      language: typeof language === \"string\" ? language : undefined,\n      durationInSeconds: durationInSeconds,\n      warnings,\n      response: {\n        timestamp: currentDate,\n        modelId: this.modelId,\n        headers: {},\n        body: JSON.stringify({ text: result }),\n      },\n    };\n  }\n\n  private async initializeWorker(\n    onInitProgress?: DownloadProgressCallback,\n  ): Promise<void> {\n    if (!this.config.worker) return;\n\n    // If already ready, optionally emit completion progress\n    if (this.workerReady) {\n      if (onInitProgress) onInitProgress(1);\n      return;\n    }\n\n    const worker = this.config.worker;\n\n    await new Promise<void>((resolve, reject) => {\n      const trackProgress = this.createProgressTracker(onInitProgress);\n\n      const onMessage = (e: MessageEvent) => {\n        const msg = e.data;\n        if (!msg) return;\n\n        // Forward raw download progress events coming from @huggingface/transformers running in the worker\n        if (msg && typeof msg === \"object\" && \"status\" in msg) {\n          if (msg.status === \"ready\") {\n            worker.removeEventListener(\"message\", onMessage);\n            this.workerReady = true;\n            if (onInitProgress) onInitProgress(1);\n            resolve();\n            return;\n          }\n          if (msg.status === \"error\") {\n            worker.removeEventListener(\"message\", onMessage);\n            reject(\n              new Error(String(msg.data || \"Worker initialization failed\")),\n            );\n            return;\n          }\n        }\n        // Track progress for model file downloads\n        const msgWithFile = msg as ProgressInfo & { file?: string };\n        if (msgWithFile.file) trackProgress(msg as ProgressInfo);\n      };\n\n      worker.addEventListener(\"message\", onMessage);\n      worker.postMessage({\n        type: \"load\",\n        data: {\n          modelId: this.modelId,\n          dtype: this.config.dtype,\n          device: this.config.device,\n          maxNewTokens: this.config.maxNewTokens,\n        },\n      });\n    });\n  }\n}\n","import {\n  EmbeddingModelV3,\n  LanguageModelV3,\n  NoSuchModelError,\n  ProviderV3,\n  TranscriptionModelV3,\n} from \"@ai-sdk/provider\";\nimport {\n  TransformersJSLanguageModel,\n  TransformersJSModelId,\n  TransformersJSModelSettings,\n  isServerEnvironment,\n} from \"./chat/transformers-js-language-model\";\nimport {\n  TransformersJSEmbeddingModel,\n  TransformersJSEmbeddingModelId,\n  TransformersJSEmbeddingSettings,\n} from \"./embedding/transformers-js-embedding-model\";\nimport {\n  TransformersJSTranscriptionModel,\n  TransformersJSTranscriptionModelId,\n  TransformersJSTranscriptionSettings,\n} from \"./transcription/transformers-js-transcription-model\";\n\nexport interface TransformersJSProvider extends ProviderV3 {\n  (\n    modelId: TransformersJSModelId,\n    settings?: TransformersJSModelSettings,\n  ): TransformersJSLanguageModel;\n\n  /**\n   * Creates a model for text generation.\n   */\n  languageModel(\n    modelId: TransformersJSModelId,\n    settings?: TransformersJSModelSettings,\n  ): TransformersJSLanguageModel;\n\n  /**\n   * Creates a model for text generation.\n   */\n  chat(\n    modelId: TransformersJSModelId,\n    settings?: TransformersJSModelSettings,\n  ): TransformersJSLanguageModel;\n\n  embedding(\n    modelId: TransformersJSEmbeddingModelId,\n    settings?: TransformersJSEmbeddingSettings,\n  ): EmbeddingModelV3;\n\n  embeddingModel: (\n    modelId: TransformersJSEmbeddingModelId,\n    settings?: TransformersJSEmbeddingSettings,\n  ) => EmbeddingModelV3;\n\n  transcription(\n    modelId: TransformersJSTranscriptionModelId,\n    settings?: TransformersJSTranscriptionSettings,\n  ): TranscriptionModelV3;\n\n  transcriptionModel: (\n    modelId: TransformersJSTranscriptionModelId,\n    settings?: TransformersJSTranscriptionSettings,\n  ) => TranscriptionModelV3;\n}\n\nexport interface TransformersJSProviderSettings {\n  // Currently empty - provider settings are minimal for TransformersJS\n  // Future provider-level settings can be added here\n}\n\n/**\n * Create a TransformersJS provider instance.\n */\nexport function createTransformersJS(\n  options: TransformersJSProviderSettings = {},\n): TransformersJSProvider {\n  const createChatModel = (\n    modelId: TransformersJSModelId,\n    settings?: TransformersJSModelSettings,\n  ) => {\n    // On the server, return a singleton per model + device + dtype + isVision configuration\n    // so initialization state persists across uses (e.g. within a warm process).\n    if (isServerEnvironment()) {\n      // Avoid carrying a worker field on the server (workers are not used)\n      const { worker: _ignoredWorker, ...serverSettings } = (settings ||\n        {}) as TransformersJSModelSettings & { worker?: unknown };\n\n      const key = getLanguageModelKey(modelId, serverSettings);\n      const cached = serverLanguageModelSingletons.get(key);\n      if (cached) return cached;\n\n      const instance = new TransformersJSLanguageModel(modelId, serverSettings);\n      serverLanguageModelSingletons.set(key, instance);\n      return instance;\n    }\n\n    return new TransformersJSLanguageModel(modelId, settings);\n  };\n\n  const createEmbeddingModel = (\n    modelId: TransformersJSEmbeddingModelId,\n    settings?: TransformersJSEmbeddingSettings,\n  ) => {\n    return new TransformersJSEmbeddingModel(modelId, settings);\n  };\n\n  const createTranscriptionModel = (\n    modelId: TransformersJSTranscriptionModelId,\n    settings?: TransformersJSTranscriptionSettings,\n  ) => {\n    // On the server, return a singleton per model + device + dtype configuration\n    // so initialization state persists across uses (e.g. within a warm process).\n    if (isServerEnvironment()) {\n      const key = getTranscriptionModelKey(modelId, settings);\n      const cached = serverTranscriptionModelSingletons.get(key);\n      if (cached) return cached;\n\n      const instance = new TransformersJSTranscriptionModel(modelId, settings);\n      serverTranscriptionModelSingletons.set(key, instance);\n      return instance;\n    }\n\n    return new TransformersJSTranscriptionModel(modelId, settings);\n  };\n\n  const provider = function (\n    modelId: TransformersJSModelId,\n    settings?: TransformersJSModelSettings,\n  ) {\n    if (new.target) {\n      throw new Error(\n        \"The TransformersJS model function cannot be called with the new keyword.\",\n      );\n    }\n\n    return createChatModel(modelId, settings);\n  };\n\n  provider.specificationVersion = \"v3\" as const;\n  provider.languageModel = createChatModel;\n  provider.chat = createChatModel;\n  provider.embedding = createEmbeddingModel;\n  provider.embeddingModel = createEmbeddingModel;\n  provider.transcription = createTranscriptionModel;\n  provider.transcriptionModel = createTranscriptionModel;\n\n  provider.imageModel = (modelId: string) => {\n    throw new NoSuchModelError({ modelId, modelType: \"imageModel\" });\n  };\n\n  provider.speechModel = (modelId: string) => {\n    throw new NoSuchModelError({ modelId, modelType: \"speechModel\" });\n  };\n\n  return provider;\n}\n\n/**\n * Default TransformersJS provider instance.\n */\nexport const transformersJS = createTransformersJS();\n\n// Server-side singleton cache for language model instances\nconst serverLanguageModelSingletons = new Map<\n  string,\n  TransformersJSLanguageModel\n>();\n\n// Server-side singleton cache for transcription model instances\nconst serverTranscriptionModelSingletons = new Map<\n  string,\n  TransformersJSTranscriptionModel\n>();\n\nfunction getLanguageModelKey(\n  modelId: string,\n  settings?: TransformersJSModelSettings,\n): string {\n  const device = (settings?.device ?? \"auto\").toString();\n  const dtype = (settings?.dtype ?? \"auto\").toString();\n  const isVision = !!settings?.isVisionModel;\n  return `${modelId}::${device}::${dtype}::${isVision ? \"vision\" : \"text\"}`;\n}\n\nfunction getTranscriptionModelKey(\n  modelId: string,\n  settings?: TransformersJSTranscriptionSettings,\n): string {\n  const device = (settings?.device ?? \"auto\").toString();\n  const dtype = (settings?.dtype ?? \"auto\").toString();\n  const maxNewTokens = (settings?.maxNewTokens ?? 64).toString();\n  return `${modelId}::${device}::${dtype}::${maxNewTokens}`;\n}\n","import {\n  AutoTokenizer,\n  AutoModelForCausalLM,\n  AutoProcessor,\n  AutoModelForImageTextToText,\n  TextStreamer,\n  InterruptableStoppingCriteria,\n  StoppingCriteriaList,\n  load_image,\n  type ProgressInfo,\n} from \"@huggingface/transformers\";\nimport { decodeGeneratedText } from \"../utils/decode-utils\";\nimport {\n  parseJsonFunctionCalls,\n  ToolCallFenceDetector,\n  type ToolDefinition,\n  type ParsedToolCall,\n} from \"@browser-ai/shared\";\nimport {\n  buildApplyChatTemplateOptions,\n  normalizeStreamedTextChunk,\n} from \"../utils/generation-helpers\";\nimport type {\n  WorkerMessage,\n  WorkerGlobalScope,\n  ModelInstance,\n  WorkerLoadOptions,\n  GenerationOptions,\n  WorkerGenerateData,\n  WorkerLoadData,\n} from \"./transformers-js-worker-types\";\nimport type { PretrainedModelOptions } from \"@huggingface/transformers\";\n\ndeclare const self: WorkerGlobalScope;\n\nclass ModelManager {\n  private static configs = new Map<string, WorkerLoadOptions>();\n  private static instances = new Map<string, Promise<ModelInstance>>();\n\n  static configure(key: string, options: WorkerLoadOptions) {\n    this.configs.set(key, options);\n  }\n\n  static async getInstance(\n    key: string,\n    progressCallback?: (progress: ProgressInfo) => void,\n  ): Promise<ModelInstance> {\n    const cached = this.instances.get(key);\n    if (cached) return cached;\n\n    const config = this.configs.get(key);\n    if (!config || !config.modelId) {\n      throw new Error(`No configuration found for key: ${key}`);\n    }\n\n    const {\n      modelId,\n      dtype = \"auto\",\n      device = \"auto\",\n      use_external_data_format,\n      isVisionModel = false,\n    } = config;\n\n    const instancePromise = isVisionModel\n      ? this.createVisionModel(modelId, {\n          dtype,\n          device,\n          use_external_data_format,\n          progressCallback,\n        })\n      : this.createTextModel(modelId, {\n          dtype,\n          device,\n          use_external_data_format,\n          progressCallback,\n        });\n\n    this.instances.set(key, instancePromise);\n    return instancePromise;\n  }\n\n  private static async createTextModel(\n    modelId: string,\n    options: {\n      dtype?: PretrainedModelOptions[\"dtype\"];\n      device?: PretrainedModelOptions[\"device\"];\n      use_external_data_format?: boolean;\n      progressCallback?: (progress: ProgressInfo) => void;\n    },\n  ): Promise<ModelInstance> {\n    const [tokenizer, model] = await Promise.all([\n      AutoTokenizer.from_pretrained(modelId, {\n        progress_callback: options.progressCallback,\n      }),\n      AutoModelForCausalLM.from_pretrained(modelId, {\n        dtype: options.dtype,\n        device: options.device,\n        ...(options.use_external_data_format !== undefined\n          ? { use_external_data_format: options.use_external_data_format }\n          : {}),\n        progress_callback: options.progressCallback,\n      }),\n    ]);\n    return [tokenizer, model];\n  }\n\n  private static async createVisionModel(\n    modelId: string,\n    options: {\n      dtype?: PretrainedModelOptions[\"dtype\"];\n      device?: PretrainedModelOptions[\"device\"];\n      use_external_data_format?: boolean;\n      progressCallback?: (progress: ProgressInfo) => void;\n    },\n  ): Promise<ModelInstance> {\n    const [processor, model] = await Promise.all([\n      AutoProcessor.from_pretrained(modelId, {\n        progress_callback: options.progressCallback,\n      }),\n      AutoModelForImageTextToText.from_pretrained(modelId, {\n        dtype: options.dtype || \"fp32\",\n        device: options.device || \"webgpu\",\n        ...(options.use_external_data_format !== undefined\n          ? { use_external_data_format: options.use_external_data_format }\n          : {}),\n        progress_callback: options.progressCallback,\n      }),\n    ]);\n    return [processor, model];\n  }\n\n  static clearCache() {\n    this.instances.clear();\n  }\n}\n\nexport class TransformersJSWorkerHandler {\n  private stopping_criteria = new InterruptableStoppingCriteria();\n  private isVisionModel = false;\n  private currentModelKey = \"default\";\n  private past_key_values_cache: unknown = null;\n  private cachedSequenceTokenIds: number[] | null = null;\n\n  async generate(\n    messages: WorkerGenerateData[],\n    generationOptions?: GenerationOptions,\n    tools?: ToolDefinition[],\n    enableThinking?: boolean,\n  ) {\n    try {\n      const modelInstance = await ModelManager.getInstance(\n        this.currentModelKey,\n      );\n      await this.runGeneration(\n        modelInstance,\n        messages,\n        generationOptions,\n        tools,\n        enableThinking,\n      );\n    } catch (error) {\n      this.sendError(error instanceof Error ? error.message : String(error));\n    }\n  }\n\n  private async runGeneration(\n    modelInstance: ModelInstance,\n    messages: WorkerGenerateData[],\n    userGenerationOptions?: GenerationOptions,\n    tools?: ToolDefinition[],\n    enableThinking: boolean = false,\n  ) {\n    const [processor, model] = modelInstance;\n    const isVision = this.isVisionModel;\n\n    const processedMessages = messages;\n    const templateOptions = buildApplyChatTemplateOptions({\n      tools,\n      enableThinking,\n    });\n\n    // Prepare inputs based on model type\n    // Using 'any' here as transformers.js returns various formats depending on model type\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    let inputs: any;\n    if (isVision) {\n      // For vision models, use last message and extract images\n      const lastMessages = processedMessages.slice(-1);\n      const images = await Promise.all(\n        lastMessages\n          .map((x) => x.content)\n          .flat(Infinity)\n          .filter(\n            (msg): msg is { type: string; image: string } =>\n              typeof msg === \"object\" &&\n              msg !== null &&\n              \"image\" in msg &&\n              msg.image !== undefined,\n          )\n          .map((msg) => load_image(msg.image)),\n      );\n      const text = processor.apply_chat_template(\n        lastMessages as any,\n        templateOptions,\n      );\n      inputs =\n        images.length > 0\n          ? await processor(text, images)\n          : await processor(text);\n    } else {\n      inputs = processor.apply_chat_template(processedMessages as any, {\n        ...templateOptions,\n        return_dict: true,\n      });\n    }\n\n    const inputTokenIds = isVision\n      ? null\n      : this.extractTokenIds(inputs.input_ids);\n    if (\n      !isVision &&\n      this.past_key_values_cache !== null &&\n      (!inputTokenIds || !this.canReuseCache(inputTokenIds))\n    ) {\n      this.clearGenerationCache();\n    }\n\n    // Setup performance tracking and tool call detection\n    let startTime: number | undefined;\n    let numTokens = 0;\n    const fenceDetector = new ToolCallFenceDetector();\n    let accumulatedText = \"\";\n    let toolCallDetected = false;\n\n    const token_callback = () => {\n      startTime ??= performance.now();\n      numTokens++;\n    };\n    const output_callback = (output: string) => {\n      const normalizedOutput = normalizeStreamedTextChunk(output);\n      if (normalizedOutput === null) {\n        return;\n      }\n\n      accumulatedText += normalizedOutput;\n\n      if (tools && tools.length > 0 && !toolCallDetected) {\n        fenceDetector.addChunk(normalizedOutput);\n        const result = fenceDetector.detectStreamingFence();\n\n        // If we detect a complete fence, check if it's a valid tool call\n        if (result.completeFence) {\n          const { toolCalls } = parseJsonFunctionCalls(result.completeFence);\n          if (toolCalls.length > 0) {\n            toolCallDetected = true;\n            this.stopping_criteria.interrupt();\n          }\n        }\n      }\n\n      const tps = startTime\n        ? (numTokens / (performance.now() - startTime)) * 1000\n        : undefined;\n      this.sendUpdate(normalizedOutput, tps, numTokens);\n    };\n\n    const streamer = new TextStreamer(\n      isVision ? (processor as any).tokenizer : processor,\n      {\n        skip_prompt: true,\n        skip_special_tokens: false,\n        callback_function: output_callback,\n        token_callback_function: token_callback,\n      },\n    );\n\n    const stoppingCriteriaList = new StoppingCriteriaList();\n    stoppingCriteriaList.push(this.stopping_criteria);\n\n    // Merge user generation options with defaults based on model type\n    const defaultOptions = isVision\n      ? {\n          do_sample: false,\n          repetition_penalty: 1.1,\n          max_new_tokens: 4096,\n        }\n      : {\n          do_sample: true,\n          top_k: 3,\n          temperature: 0.7,\n          max_new_tokens: 4096,\n        };\n\n    const generationOptions = {\n      ...defaultOptions,\n      ...userGenerationOptions,\n      streamer,\n      stopping_criteria: stoppingCriteriaList,\n      return_dict_in_generate: true,\n    };\n\n    this.sendMessage({ status: \"start\" });\n    const baseOptions = Object.assign({}, inputs, generationOptions);\n    const withCacheOptions =\n      !isVision && this.past_key_values_cache !== null\n        ? Object.assign({}, baseOptions, {\n            past_key_values: this.past_key_values_cache,\n          })\n        : baseOptions;\n\n    let generationOutput: unknown;\n    try {\n      generationOutput = await model.generate(withCacheOptions);\n    } catch (error) {\n      // If cached prefill is rejected by runtime/model, retry once without cache.\n      if (!isVision && this.past_key_values_cache !== null && numTokens === 0) {\n        this.clearGenerationCache();\n        generationOutput = await model.generate(baseOptions);\n      } else {\n        throw error;\n      }\n    }\n    const sequences = (generationOutput as any).sequences || generationOutput;\n    const inputLength = isVision\n      ? 0\n      : (inputTokenIds?.length ?? inputs.input_ids.data.length);\n\n    const decoded = decodeGeneratedText(\n      processor,\n      sequences,\n      isVision,\n      inputLength,\n    );\n\n    if (!isVision) {\n      this.updateGenerationCache(generationOutput);\n    }\n\n    // Parse tool calls from the complete response if tools are available\n    let toolCalls: ParsedToolCall[] = [];\n    if (tools && tools.length > 0) {\n      const finalText = Array.isArray(decoded) ? decoded[0] : decoded;\n      const parsed = parseJsonFunctionCalls(finalText);\n      toolCalls = parsed.toolCalls;\n    }\n\n    self.postMessage({\n      status: \"complete\",\n      output: decoded,\n      inputLength,\n      numTokens,\n      toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n    });\n  }\n\n  async load(options?: WorkerLoadData) {\n    try {\n      ModelManager.clearCache();\n      this.clearGenerationCache();\n\n      this.isVisionModel = options?.isVisionModel || false;\n\n      const modelId =\n        options?.modelId ||\n        (this.isVisionModel\n          ? \"HuggingFaceTB/SmolVLM-256M-Instruct\"\n          : \"HuggingFaceTB/SmolLM2-360M-Instruct\");\n\n      ModelManager.configure(this.currentModelKey, {\n        ...options,\n        modelId,\n      });\n\n      this.sendMessage({ status: \"loading\", data: \"Loading model...\" });\n\n      const throttledProgress = this.createThrottledProgressCallback();\n\n      const modelInstance = await ModelManager.getInstance(\n        this.currentModelKey,\n        throttledProgress,\n      );\n\n      // Warm up text models to trigger WebGPU shader compilation\n      if (!this.isVisionModel) {\n        this.sendMessage({\n          status: \"loading\",\n          data: \"Compiling shaders and warming up model...\",\n        });\n        const [tokenizer, model] = modelInstance;\n        const inputs = tokenizer(\"a\");\n        await model.generate({ ...inputs, max_new_tokens: 1 });\n      }\n\n      this.sendMessage({ status: \"ready\" });\n    } catch (error) {\n      console.error(\"Error in worker load:\", error);\n      this.sendError(error instanceof Error ? error.message : String(error));\n    }\n  }\n\n  interrupt() {\n    this.stopping_criteria.interrupt();\n  }\n\n  reset() {\n    this.stopping_criteria.reset();\n    ModelManager.clearCache();\n    this.clearGenerationCache();\n  }\n\n  private clearGenerationCache() {\n    this.past_key_values_cache = null;\n    this.cachedSequenceTokenIds = null;\n  }\n\n  private canReuseCache(inputTokenIds: number[]): boolean {\n    if (!this.cachedSequenceTokenIds) {\n      return false;\n    }\n\n    if (inputTokenIds.length < this.cachedSequenceTokenIds.length) {\n      return false;\n    }\n\n    for (let i = 0; i < this.cachedSequenceTokenIds.length; i++) {\n      if (inputTokenIds[i] !== this.cachedSequenceTokenIds[i]) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  private updateGenerationCache(generationOutput: unknown) {\n    const output = generationOutput as { past_key_values?: unknown };\n    if (!output?.past_key_values) {\n      this.clearGenerationCache();\n      return;\n    }\n\n    const sequenceTokenIds =\n      this.extractFirstSequenceTokenIds(generationOutput);\n    if (!sequenceTokenIds) {\n      this.clearGenerationCache();\n      return;\n    }\n\n    this.past_key_values_cache = output.past_key_values;\n    this.cachedSequenceTokenIds = sequenceTokenIds;\n  }\n\n  private extractFirstSequenceTokenIds(\n    generationOutput: unknown,\n  ): number[] | null {\n    const output = generationOutput as { sequences?: unknown };\n    const sequences = output?.sequences ?? generationOutput;\n\n    if (Array.isArray(sequences)) {\n      if (sequences.length === 0) {\n        return null;\n      }\n\n      const first = sequences[0];\n      if (typeof first === \"number\") {\n        return (sequences as number[]).slice();\n      }\n      return this.extractTokenIds(first);\n    }\n\n    return this.extractTokenIds(sequences);\n  }\n\n  private extractTokenIds(value: unknown): number[] | null {\n    if (!value || typeof value !== \"object\") {\n      return null;\n    }\n\n    const maybeData = (value as { data?: unknown }).data;\n    if (Array.isArray(maybeData)) {\n      return maybeData.slice();\n    }\n\n    if (ArrayBuffer.isView(maybeData)) {\n      if (maybeData instanceof DataView) {\n        return null;\n      }\n      return Array.from(maybeData as unknown as ArrayLike<number>);\n    }\n\n    return null;\n  }\n\n  private sendMessage(message: {\n    status: \"loading\" | \"ready\" | \"start\" | \"complete\";\n    data?: string;\n  }) {\n    self.postMessage(message);\n  }\n\n  private sendUpdate(output: string, tps?: number, numTokens?: number) {\n    self.postMessage({ status: \"update\", output, tps, numTokens });\n  }\n\n  private sendError(message: string) {\n    self.postMessage({ status: \"error\", data: message });\n  }\n\n  private createThrottledProgressCallback() {\n    const throttleMs = 100;\n    let lastProgressTs = 0;\n\n    return (progress: ProgressInfo) => {\n      const now = performance?.now?.() ?? Date.now();\n      if (progress.status === \"progress\") {\n        if (now - lastProgressTs < throttleMs) return;\n        lastProgressTs = now;\n      }\n      self.postMessage(progress);\n    };\n  }\n\n  onmessage(e: MessageEvent<WorkerMessage>) {\n    try {\n      const msg = e.data;\n      if (!msg) {\n        this.sendError(\"Empty message received\");\n        return;\n      }\n\n      switch (msg.type) {\n        case \"load\":\n          this.load(msg.data);\n          break;\n        case \"generate\":\n          this.stopping_criteria.reset();\n          this.generate(\n            msg.data,\n            msg.generationOptions,\n            msg.tools,\n            msg.enableThinking,\n          );\n          break;\n        case \"interrupt\":\n          this.interrupt();\n          break;\n        case \"reset\":\n          this.reset();\n          break;\n        default:\n          this.sendError(\n            `Unknown message type: ${(msg as { type: string }).type}`,\n          );\n          break;\n      }\n    } catch (error) {\n      this.sendError(error instanceof Error ? error.message : String(error));\n    }\n  }\n}\n","import type {\n  PreTrainedTokenizer,\n  Processor,\n  Tensor,\n} from \"@huggingface/transformers\";\n\ninterface TokenSequence {\n  data?: number[] | Int32Array | Float32Array;\n}\n\ntype GenerationOutput =\n  | Tensor\n  | TokenSequence\n  | number[]\n  | { sequences?: TokenSequence[] };\n\n/**\n * Decodes generated text from model output sequences, handling both vision and text models\n * @param processor - The tokenizer/processor instance\n * @param sequences - Output sequences from model.generate()\n * @param isVision - Whether this is a vision model\n * @param inputLength - Length of input tokens (only used for text models)\n * @returns Array of decoded text strings\n */\nexport function decodeGeneratedText(\n  processor: PreTrainedTokenizer | Processor,\n  sequences: GenerationOutput | GenerationOutput[],\n  isVision: boolean,\n  inputLength: number,\n): string[] {\n  if (isVision) {\n    return (processor as Processor).batch_decode(sequences as Tensor, {\n      skip_special_tokens: true,\n    });\n  }\n\n  const sequenceArray = Array.isArray(sequences) ? sequences : [sequences];\n\n  return sequenceArray.map((seq: GenerationOutput) => {\n    const outputData = (seq as TokenSequence).data || seq;\n    const tokenArray = Array.isArray(outputData)\n      ? outputData\n      : Array.from(outputData as ArrayLike<number>);\n\n    // Extract only new tokens if output includes input\n    const newTokens =\n      tokenArray.length > inputLength\n        ? tokenArray.slice(inputLength)\n        : tokenArray;\n\n    return newTokens.length > 0\n      ? (processor as PreTrainedTokenizer).decode(newTokens, {\n          skip_special_tokens: true,\n        })\n      : \"\";\n  });\n}\n\n/**\n * Decodes a single sequence for text models (used in main thread)\n * @param processor - The tokenizer instance\n * @param sequence - Single output sequence\n * @param inputLength - Length of input tokens\n * @returns Decoded text string\n */\nexport function decodeSingleSequence(\n  processor: PreTrainedTokenizer,\n  sequence: GenerationOutput,\n  inputLength: number,\n): string {\n  const outputData = (sequence as TokenSequence).data || sequence;\n  const tokenArray = Array.isArray(outputData)\n    ? outputData\n    : Array.from(outputData as ArrayLike<number>);\n\n  const newTokens =\n    tokenArray.length > inputLength\n      ? tokenArray.slice(inputLength)\n      : tokenArray;\n\n  return newTokens.length > 0\n    ? processor.decode(newTokens, { skip_special_tokens: true })\n    : \"\";\n}\n","import {\n  AutoTokenizer,\n  AutoProcessor,\n  WhisperForConditionalGeneration,\n  TextStreamer,\n  full,\n  type ProgressInfo,\n  type PreTrainedTokenizer,\n  type Processor,\n  type PreTrainedModel,\n} from \"@huggingface/transformers\";\n\nexport interface TranscriptionWorkerMessage {\n  type: \"load\" | \"generate\" | \"interrupt\" | \"reset\";\n  data?: any;\n}\n\nexport interface TranscriptionWorkerResponse {\n  status: \"loading\" | \"ready\" | \"start\" | \"update\" | \"complete\" | \"error\";\n  output?: string | string[];\n  data?: string;\n  tps?: number;\n  numTokens?: number;\n}\n\nexport interface TranscriptionWorkerLoadOptions {\n  modelId?: string;\n  dtype?: string;\n  device?: string;\n}\n\nexport interface TranscriptionWorkerGlobalScope {\n  postMessage(message: any): void;\n  addEventListener(type: string, listener: (e: any) => void): void;\n}\n\ndeclare const self: TranscriptionWorkerGlobalScope;\n\ntype TranscriptionModelInstance = [\n  PreTrainedTokenizer,\n  Processor,\n  PreTrainedModel,\n];\n\nclass TranscriptionModelManager {\n  private static configs = new Map<string, TranscriptionWorkerLoadOptions>();\n  private static instances = new Map<\n    string,\n    Promise<TranscriptionModelInstance>\n  >();\n\n  static configure(key: string, options: TranscriptionWorkerLoadOptions) {\n    this.configs.set(key, options);\n  }\n\n  static async getInstance(\n    key: string,\n    progressCallback?: (progress: ProgressInfo) => void,\n  ): Promise<TranscriptionModelInstance> {\n    const cached = this.instances.get(key);\n    if (cached) return cached;\n\n    const config = this.configs.get(key);\n    if (!config || !config.modelId) {\n      throw new Error(`No configuration found for key: ${key}`);\n    }\n\n    const { modelId, dtype = \"auto\", device = \"auto\" } = config;\n\n    const instancePromise = this.createTranscriptionModel(modelId, {\n      dtype,\n      device,\n      progressCallback,\n    });\n\n    this.instances.set(key, instancePromise);\n    return instancePromise;\n  }\n\n  private static async createTranscriptionModel(\n    modelId: string,\n    options: any,\n  ): Promise<TranscriptionModelInstance> {\n    const [tokenizer, processor, model] = await Promise.all([\n      AutoTokenizer.from_pretrained(modelId, {\n        progress_callback: options.progressCallback,\n      }),\n      AutoProcessor.from_pretrained(modelId, {\n        progress_callback: options.progressCallback,\n      }),\n      WhisperForConditionalGeneration.from_pretrained(modelId, {\n        dtype: options.dtype || {\n          encoder_model: \"fp32\",\n          decoder_model_merged: \"q4\",\n        },\n        device: options.device || \"auto\",\n        progress_callback: options.progressCallback,\n      }),\n    ]);\n    return [tokenizer, processor, model];\n  }\n\n  static clearCache() {\n    this.instances.clear();\n  }\n}\n\n/**\n * Worker handler for TransformersJS transcription models that runs in a Web Worker context.\n *\n * This class manages the lifecycle of transcription models in a worker thread, providing\n * audio transcription capabilities without blocking the main UI thread. It handles model\n * loading, initialization, transcription generation, and communication with the main thread.\n *\n * @example\n * ```typescript\n * // worker.ts\n * import { TransformersJSTranscriptionWorkerHandler } from \"@browser-ai/transformers-js\";\n *\n * const handler = new TransformersJSTranscriptionWorkerHandler();\n * self.onmessage = (msg: MessageEvent) => {\n * handler.onmessage(msg);\n * };\n * ```\n */\nexport class TransformersJSTranscriptionWorkerHandler {\n  private processing = false;\n  private currentModelKey = \"default\";\n\n  async generate({\n    audio,\n    language,\n    maxNewTokens,\n  }: {\n    audio: any;\n    language?: string;\n    maxNewTokens?: number;\n  }) {\n    if (this.processing) return;\n    this.processing = true;\n\n    try {\n      // Tell the main thread we are starting\n      this.sendMessage({ status: \"start\" });\n\n      // Retrieve the transcription model\n      const [tokenizer, processor, model] =\n        await TranscriptionModelManager.getInstance(this.currentModelKey);\n\n      // Setup performance tracking\n      let startTime: number | undefined;\n      let numTokens = 0;\n      const token_callback_function = () => {\n        startTime ??= performance.now();\n        if (numTokens++ > 0) {\n          const tps = (numTokens / (performance.now() - startTime!)) * 1000;\n        }\n      };\n\n      const callback_function = (output: string) => {\n        const tps = startTime\n          ? (numTokens / (performance.now() - startTime)) * 1000\n          : undefined;\n        this.sendUpdate(output, tps, numTokens);\n      };\n\n      const streamer = new TextStreamer(tokenizer, {\n        skip_prompt: true,\n        skip_special_tokens: true,\n        callback_function,\n        token_callback_function,\n      });\n\n      // Convert audio data - expecting Float32Array from properly decoded audio\n      let audioFloat32: Float32Array;\n      if (Array.isArray(audio)) {\n        audioFloat32 = new Float32Array(audio);\n      } else if (audio instanceof Float32Array) {\n        audioFloat32 = audio;\n      } else {\n        // Convert other formats to Float32Array\n        audioFloat32 = new Float32Array(audio);\n      }\n\n      // Process the audio\n      const inputs = await processor(audioFloat32);\n\n      // Generate transcription with proper error handling\n      const outputs = await (model as any).generate({\n        ...inputs,\n        max_new_tokens: maxNewTokens || 448,\n        language,\n        streamer,\n      });\n\n      const decoded = tokenizer.batch_decode(outputs, {\n        skip_special_tokens: true,\n      });\n\n      // Send the output back to the main thread\n      this.sendMessage({\n        status: \"complete\",\n        output: decoded,\n      });\n    } catch (error) {\n      this.sendError(error instanceof Error ? error.message : String(error));\n    } finally {\n      this.processing = false;\n    }\n  }\n\n  async load(options?: TranscriptionWorkerLoadOptions) {\n    try {\n      TranscriptionModelManager.clearCache();\n\n      const modelId = options?.modelId;\n\n      TranscriptionModelManager.configure(this.currentModelKey, {\n        ...options,\n        modelId,\n      });\n\n      this.sendMessage({ status: \"loading\", data: \"Loading model...\" });\n\n      const throttledProgress = this.createThrottledProgressCallback();\n\n      const [tokenizer, processor, model] =\n        await TranscriptionModelManager.getInstance(\n          this.currentModelKey,\n          throttledProgress,\n        );\n\n      this.sendMessage({\n        status: \"loading\",\n        data: \"Compiling shaders and warming up model...\",\n      });\n\n      // Run model with dummy input to compile shaders\n      try {\n        const numMelBins = (model.config as any).num_mel_bins ?? 80;\n        await (model as any).generate({\n          inputs: full([1, numMelBins, 3000], 0.0),\n          max_new_tokens: 1,\n        });\n      } catch (error) {\n        // Ignore warmup errors\n        console.warn(\"Model warmup failed:\", error);\n      }\n\n      this.sendMessage({ status: \"ready\" });\n    } catch (error) {\n      console.error(\"Error in transcription worker load:\", error);\n      this.sendError(error instanceof Error ? error.message : String(error));\n    }\n  }\n\n  interrupt() {\n    // For transcription, we don't have the same stopping criteria as text generation\n    // but we can set a flag to prevent new generations\n    this.processing = false;\n  }\n\n  reset() {\n    this.processing = false;\n    TranscriptionModelManager.clearCache();\n  }\n\n  private sendMessage(message: {\n    status: \"loading\" | \"ready\" | \"start\" | \"complete\";\n    data?: string;\n    output?: string | string[];\n  }) {\n    self.postMessage(message);\n  }\n\n  private sendUpdate(output: string, tps?: number, numTokens?: number) {\n    self.postMessage({ status: \"update\", output, tps, numTokens });\n  }\n\n  private sendError(message: string) {\n    self.postMessage({ status: \"error\", data: message });\n  }\n\n  private createThrottledProgressCallback() {\n    const throttleMs = 100;\n    let lastProgressTs = 0;\n\n    return (progress: ProgressInfo) => {\n      const now = performance?.now?.() ?? Date.now();\n      if (progress.status === \"progress\") {\n        if (now - lastProgressTs < throttleMs) return;\n        lastProgressTs = now;\n      }\n      self.postMessage(progress);\n    };\n  }\n\n  onmessage(e: MessageEvent<TranscriptionWorkerMessage>) {\n    try {\n      const { type, data } = e.data || ({} as TranscriptionWorkerMessage);\n      switch (type) {\n        case \"load\":\n          this.load(data);\n          break;\n        case \"generate\":\n          this.generate(data);\n          break;\n        case \"interrupt\":\n          this.interrupt();\n          break;\n        case \"reset\":\n          this.reset();\n          break;\n        default:\n          this.sendError(`Unknown message type: ${type}`);\n          break;\n      }\n    } catch (error) {\n      this.sendError(error instanceof Error ? error.message : String(error));\n    }\n  }\n}\n"],"mappings":"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","names":["name","marker","symbol","_a","_b","StoppingCriteria","prefixText","generateToolCallId","StoppingCriteria","self","AutoTokenizer","isBrowserEnvironment","isServerEnvironment","AutoTokenizer","AutoProcessor","isBrowserEnvironment","isServerEnvironment","AutoTokenizer","AutoModelForCausalLM","AutoProcessor","AutoModelForImageTextToText","TextStreamer","InterruptableStoppingCriteria","StoppingCriteriaList","load_image","AutoTokenizer","AutoModelForCausalLM","AutoProcessor","AutoModelForImageTextToText","InterruptableStoppingCriteria","load_image","toolCalls","TextStreamer","StoppingCriteriaList","AutoTokenizer","AutoProcessor","WhisperForConditionalGeneration","TextStreamer","full"]}