{"version":3,"sources":["../src/infomaniak-provider.ts","../src/transcription/infomaniak-transcription-model.ts","../src/infomaniak-error.ts","../src/transcription/infomaniak-transcription-options.ts"],"sourcesContent":["import type { OpenAICompatibleProviderSettings } from '@ai-sdk/openai-compatible'\nimport type { EmbeddingModelV3, ImageModelV3, LanguageModelV3, TranscriptionModelV3 } from '@ai-sdk/provider'\nimport type { InfomaniakCommonModelConfig } from './infomaniak-config'\nimport type { InfomaniakChatModelId, InfomaniakEmbeddingModelId, InfomaniakImageModelId, InfomaniakSTTModelId } from './infomaniak-models'\nimport {\n  OpenAICompatibleChatLanguageModel,\n  OpenAICompatibleEmbeddingModel,\n  OpenAICompatibleImageModel,\n} from '@ai-sdk/openai-compatible'\nimport { loadApiKey, loadSetting } from '@ai-sdk/provider-utils'\nimport { InfomaniakTranscriptionModel } from './transcription/infomaniak-transcription-model'\n\nexport interface InfomaniakProviderSettings {\n  /**\n  API key for authenticating requests. If specified, adds an `Authorization`\n  header to request headers with the value `Bearer <apiKey>`. This will be added\n  before any headers potentially specified in the `headers` option. Defaults to\n  `INFOMANIAK_API_KEY` env variable\n   */\n  apiKey?: OpenAICompatibleProviderSettings['apiKey']\n  /**\n  Custom headers to include in the requests.\n   */\n  headers?: OpenAICompatibleProviderSettings['headers']\n  /**\n  Infomaniak product ID.\n   */\n  productId?: string\n  /**\n  Custom fetch implementation. You can use it as a middleware to intercept requests,\n  or to provide a custom fetch implementation for e.g. testing.\n   */\n  fetch?: OpenAICompatibleProviderSettings['fetch']\n  /**\n  Include usage information in streaming responses.\n   */\n  includeUsage?: OpenAICompatibleProviderSettings['includeUsage']\n}\n\nexport interface InfomaniakProvider {\n  (modelId: InfomaniakChatModelId): LanguageModelV3\n  languageModel: (modelId: InfomaniakChatModelId) => LanguageModelV3\n  chatModel: (modelId: InfomaniakChatModelId) => LanguageModelV3\n  textEmbeddingModel: (modelId: InfomaniakEmbeddingModelId) => EmbeddingModelV3\n  imageModel: (modelId: InfomaniakImageModelId) => ImageModelV3\n  /**\n   * Creates a model for transcription.\n   * @experimental\n   */\n  transcription: (modelId: InfomaniakSTTModelId) => TranscriptionModelV3\n}\n\nexport function createInfomaniak(\n  options: InfomaniakProviderSettings = {},\n): InfomaniakProvider {\n  const getProductId = () => loadSetting({\n    environmentVariableName: 'INFOMANIAK_PRODUCT_ID',\n    settingName: 'productId',\n    description: 'Infomaniak product ID',\n    settingValue: options.productId,\n  })\n  const getApiUrl = () => `https://api.infomaniak.com/2/ai/${getProductId()}/openai/v1`\n  const getHeaders = () => ({\n    Authorization: `Bearer ${loadApiKey({\n      apiKey: options.apiKey,\n      environmentVariableName: 'INFOMANIAK_API_KEY',\n      description: 'Infomaniak API key',\n    })}`,\n    ...options.headers,\n  })\n\n  const getCommonModelConfig = (modelType: string): InfomaniakCommonModelConfig => ({\n    provider: `infomaniak.${modelType}`,\n    url: ({ path }) => {\n      const url = new URL(`${getApiUrl()}${path}`)\n      return url.toString()\n    },\n    headers: getHeaders,\n    fetch: options.fetch,\n  })\n\n  const createChatModel = (\n    modelId: InfomaniakChatModelId,\n  ) => {\n    return new OpenAICompatibleChatLanguageModel(\n      modelId,\n      { ...getCommonModelConfig('chat'), includeUsage: options.includeUsage ?? false },\n    )\n  }\n\n  const createTextEmbeddingModel = (\n    modelId: InfomaniakEmbeddingModelId,\n  ) => {\n    return new OpenAICompatibleEmbeddingModel(\n      modelId,\n      {\n        ...getCommonModelConfig('text_embedding'),\n        url: ({ path }) => {\n          const url = new URL(`${getApiUrl()}/v1${path}`) // additional versioning in url for embeddings https://developer.infomaniak.com/docs/api/post/1/ai/%7Bproduct_id%7D/openai/v1/embeddings\n          return url.toString()\n        },\n      },\n    )\n  }\n\n  const createImageModel = (modelId: InfomaniakImageModelId) =>\n    new OpenAICompatibleImageModel(modelId, getCommonModelConfig('image'))\n\n  const createTranscriptionModel = (modelId: InfomaniakSTTModelId) =>\n    new InfomaniakTranscriptionModel(modelId, {\n      ...getCommonModelConfig('transcription'),\n    })\n\n  const provider = (modelId: InfomaniakChatModelId) => createChatModel(modelId)\n  provider.chatModel = createChatModel\n  provider.languageModel = createChatModel\n  provider.textEmbeddingModel = createTextEmbeddingModel\n  provider.imageModel = createImageModel\n  provider.transcription = createTranscriptionModel\n\n  return provider\n}\n\nexport const infomaniak = createInfomaniak()\n","import type {\n  SharedV3Warning,\n  TranscriptionModelV3,\n  TranscriptionModelV3CallOptions,\n} from '@ai-sdk/provider'\nimport type { InfomaniakCommonModelConfig } from '../infomaniak-config'\nimport type { InfomaniakSTTModelId } from '../infomaniak-models'\nimport type { InfomaniakTranscriptionProviderOptions } from './infomaniak-transcription-options'\nimport {\n  combineHeaders,\n  convertBase64ToUint8Array,\n  createJsonResponseHandler,\n  getFromApi,\n  parseProviderOptions,\n  postFormDataToApi,\n} from '@ai-sdk/provider-utils'\nimport { z } from 'zod/v4'\nimport { infomaniakFailedResponseHandler } from '../infomaniak-error'\nimport { infomaniakTranscriptionProviderOptions } from './infomaniak-transcription-options'\n\nexport type InfomaniakTranscriptionCallOptions = Omit<\n  TranscriptionModelV3CallOptions,\n  'providerOptions'\n> & {\n  providerOptions?: {\n    infomaniak?: InfomaniakTranscriptionProviderOptions\n  }\n}\n\ninterface InfomaniakTranscriptionModelConfig extends InfomaniakCommonModelConfig {\n  _internal?: {\n    currentDate?: () => Date\n  }\n}\n\nconst languageMap = {\n  afrikaans: 'af',\n  arabic: 'ar',\n  armenian: 'hy',\n  azerbaijani: 'az',\n  belarusian: 'be',\n  bosnian: 'bs',\n  bulgarian: 'bg',\n  catalan: 'ca',\n  chinese: 'zh',\n  croatian: 'hr',\n  czech: 'cs',\n  danish: 'da',\n  dutch: 'nl',\n  english: 'en',\n  estonian: 'et',\n  finnish: 'fi',\n  french: 'fr',\n  galician: 'gl',\n  german: 'de',\n  greek: 'el',\n  hebrew: 'he',\n  hindi: 'hi',\n  hungarian: 'hu',\n  icelandic: 'is',\n  indonesian: 'id',\n  italian: 'it',\n  japanese: 'ja',\n  kannada: 'kn',\n  kazakh: 'kk',\n  korean: 'ko',\n  latvian: 'lv',\n  lithuanian: 'lt',\n  macedonian: 'mk',\n  malay: 'ms',\n  marathi: 'mr',\n  maori: 'mi',\n  nepali: 'ne',\n  norwegian: 'no',\n  persian: 'fa',\n  polish: 'pl',\n  portuguese: 'pt',\n  romanian: 'ro',\n  russian: 'ru',\n  serbian: 'sr',\n  slovak: 'sk',\n  slovenian: 'sl',\n  spanish: 'es',\n  swahili: 'sw',\n  swedish: 'sv',\n  tagalog: 'tl',\n  tamil: 'ta',\n  thai: 'th',\n  turkish: 'tr',\n  ukrainian: 'uk',\n  urdu: 'ur',\n  vietnamese: 'vi',\n  welsh: 'cy',\n}\n\nconst infomaniakTranscriptionResponseSchema = z.object({\n  batch_id: z.uuid(),\n})\n\nconst infomaniakBatchResponseSchema = z.object({\n  status: z.enum(['pending', 'success', 'error']),\n  url: z.url().nullable(),\n  file_name: z.string().nullable(),\n  file_size: z.number().nullable(),\n  data: z.json().nullable(),\n})\n\nconst infomaniakTranscriptionDataSchema = z.object({\n  duration: z.number().nullish(),\n  language: z.string().nullish(),\n  segments: z.array(z.object({\n    avg_logprob: z.number(),\n    compression_ratio: z.number(),\n    end: z.number(),\n    id: z.number(),\n    no_speech_prob: z.number().min(0).max(1),\n    seek: z.number(),\n    start: z.number(),\n    temperature: z.number().min(0).max(1),\n    text: z.string(),\n    tokens: z.array(z.number()),\n  })).nullish(),\n  task: z.string().nullish(),\n  text: z.string(),\n  words: z.array(z.object({\n    end: z.number(),\n    start: z.number(),\n    word: z.string(),\n  })).nullish(),\n})\n\nexport class InfomaniakTranscriptionModel implements TranscriptionModelV3 {\n  readonly specificationVersion = 'v3'\n\n  get provider(): string {\n    return this.config.provider\n  }\n\n  constructor(\n    readonly modelId: InfomaniakSTTModelId,\n    private readonly config: InfomaniakTranscriptionModelConfig,\n  ) { }\n\n  private async getArgs({\n    audio,\n    mediaType,\n    providerOptions,\n  }: InfomaniakTranscriptionCallOptions) {\n    const warnings: SharedV3Warning[] = []\n\n    // Parse provider options\n    const infomaniakOptions = await parseProviderOptions({\n      provider: 'infomaniak',\n      providerOptions,\n      schema: infomaniakTranscriptionProviderOptions,\n    })\n\n    // Create form data with base fields\n    const formData = new FormData()\n    const blob\n      = audio instanceof Uint8Array\n        ? new Blob([audio as Uint8Array<ArrayBuffer>])\n        : new Blob([convertBase64ToUint8Array(audio)])\n\n    formData.append('model', this.modelId)\n    formData.append('file', new File([blob], 'audio', { type: mediaType }))\n\n    // Add provider-specific options\n    if (infomaniakOptions) {\n      const transcriptionModelOptions = {\n        append_punctuations: infomaniakOptions.appendPunctuations,\n        chunk_length: infomaniakOptions.chunkLength,\n        highlight_words: infomaniakOptions.highlightWords,\n        language: infomaniakOptions.language,\n        max_line_count: infomaniakOptions.maxLineCount,\n        max_line_width: infomaniakOptions.maxLineWidth,\n        max_words_per_line: infomaniakOptions.maxWordsPerLine,\n        no_speech_threshold: infomaniakOptions.noSpeechThreshold,\n        prepend_punctuations: infomaniakOptions.prependPunctuations,\n        prompt: infomaniakOptions.prompt,\n        response_format: 'verbose_json', // always use verbose_json to get correct data shape\n        timestamp_granularities: infomaniakOptions.timestampGranularities || ['segment'],\n      }\n\n      for (const [key, value] of Object.entries(transcriptionModelOptions)) {\n        if (value != null) {\n          if (Array.isArray(value)) {\n            value.forEach(item => formData.append(`${key}[]`, String(item)))\n          }\n          else {\n            formData.append(key, String(value))\n          }\n        }\n      }\n    }\n\n    return {\n      formData,\n      warnings,\n    }\n  }\n\n  private async pollForResults(\n    batchId: string,\n    options: InfomaniakTranscriptionCallOptions,\n    maxRetries: number = 60,\n    delayMs: number = 2000,\n  ) {\n    for (let attempt = 0; attempt < maxRetries; attempt++) {\n      const url = this.config.url({\n        path: `/results/${batchId}`,\n      })\n      const { value: response, responseHeaders } = await getFromApi({\n        url: url.replace('/openai', ''), // remove the /openai part, maybe remove it from the base anyway\n        headers: combineHeaders(this.config.headers(), options.headers),\n        failedResponseHandler: infomaniakFailedResponseHandler,\n        successfulResponseHandler: createJsonResponseHandler(\n          infomaniakBatchResponseSchema,\n        ),\n        abortSignal: options.abortSignal,\n        fetch: this.config.fetch,\n      })\n\n      // Check if transcription is complete\n      if (response.status === 'success' && response.data) {\n        // Parse the JSON data\n        const parsedData = infomaniakTranscriptionDataSchema.parse(\n          JSON.parse(response.data as string),\n        )\n\n        return {\n          result: parsedData,\n          responseHeaders,\n          rawResponse: JSON.stringify(response),\n        }\n      }\n\n      // Wait before next attempt (unless it's the last attempt)\n      if (attempt < maxRetries - 1) {\n        await new Promise(resolve => setTimeout(resolve, delayMs))\n      }\n    }\n\n    throw new Error(`Transcription timed out after ${maxRetries} attempts`)\n  }\n\n  async doGenerate(\n    options: InfomaniakTranscriptionCallOptions,\n  ): Promise<Awaited<ReturnType<TranscriptionModelV3['doGenerate']>>> {\n    const currentDate = this.config._internal?.currentDate?.() ?? new Date()\n    const { formData, warnings } = await this.getArgs(options)\n\n    const { value: batchResponse } = await postFormDataToApi({\n      url: this.config.url({\n        path: '/audio/transcriptions',\n      }),\n      headers: combineHeaders(this.config.headers(), options.headers),\n      formData,\n      failedResponseHandler: infomaniakFailedResponseHandler,\n      successfulResponseHandler: createJsonResponseHandler(\n        infomaniakTranscriptionResponseSchema,\n      ),\n      abortSignal: options.abortSignal,\n      fetch: this.config.fetch,\n    })\n\n    const { result, responseHeaders, rawResponse } = await this.pollForResults(\n      batchResponse.batch_id,\n      options,\n    )\n\n    const language\n      = result.language != null && result.language in languageMap\n        ? languageMap[result.language as keyof typeof languageMap]\n        : undefined\n\n    return {\n      text: result.text,\n      segments:\n        result.segments?.map(segment => ({\n          text: segment.text,\n          startSecond: segment.start,\n          endSecond: segment.end,\n        }))\n        ?? result.words?.map(word => ({\n          text: word.word,\n          startSecond: word.start,\n          endSecond: word.end,\n        }))\n        ?? [],\n      language,\n      durationInSeconds: result.duration ?? undefined,\n      warnings,\n      response: {\n        timestamp: currentDate,\n        modelId: this.modelId,\n        headers: responseHeaders,\n        body: rawResponse,\n      },\n      providerMetadata: {\n        infomaniak: {\n          batchId: batchResponse.batch_id,\n        },\n      },\n    }\n  }\n}\n","import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils'\nimport { z } from 'zod/v4'\n\nexport const infomaniakErrorDataSchema = z.object({\n  result: z.string(),\n  error: z.object({\n    code: z.string(),\n    description: z.string(),\n    errors: z.array(z.any()),\n  }).optional(),\n})\n\nexport type InfomaniakErrorData = z.infer<typeof infomaniakErrorDataSchema>\n\nexport const infomaniakFailedResponseHandler = createJsonErrorResponseHandler({\n  errorSchema: infomaniakErrorDataSchema,\n  errorToMessage: data => data.error?.description || data.result,\n})\n","import { z } from 'zod/v4'\n\n// https://developer.infomaniak.com/docs/api/post/1/ai/%7Bproduct_id%7D/openai/audio/transcriptions\nexport const infomaniakTranscriptionProviderOptions = z.object({\n  /**\n   * Only if timestamp_granularities[]:word is True, merge these punctuation symbols with the previous word\n   */\n  appendPunctuations: z.array(z.string()).optional(),\n\n  /**\n   * Defines the maximum duration for an active segment in sec. For subtitle tasks, it's recommended to set this to a short duration (5-10 seconds) to avoid long sentences.\n   */\n  chunkLength: z.number().min(2).max(30).optional(),\n\n  /**\n   * Subtitle task. Underline each word as it is spoken in srt and vtt output formats (requires timestamp_granularities[]:word)\n   */\n  highlightWords: z.boolean().optional(),\n\n  /**\n   * The language of the input audio in ISO-639-1 format.\n   */\n  language: z.string().optional(),\n\n  /**\n   * Subtitle task. The maximum number of lines in a segment in srt and vtt output formats (requires timestamp_granularities[]:word)\n   */\n  maxLineCount: z.number().min(1).max(1000).optional(),\n\n  /**\n   * Subtitle task. The maximum number of characters in a line before breaking the line in srt and vtt output formats (requires timestamp_granularities[]:word)\n   */\n  maxLineWidth: z.number().min(1).max(1000).optional(),\n\n  /**\n   * Subtitle task. The maximum number of words in a segment (requires timestamp_granularities[]:word)\n   */\n  maxWordsPerLine: z.number().min(1).max(1000).optional(),\n\n  /**\n   * If the no_speech probability is higher than this value AND the average log probability over sampled tokens is below log_prob_threshold, consider the segment as silent.\n   */\n  noSpeechThreshold: z.number().optional(),\n\n  /**\n   * Only if timestamp_granularities[]:word is True, merge these punctuation symbols with the next word\n   */\n  prependPunctuations: z.array(z.string()).optional(),\n  /**\n   * An optional text to guide the model's style or continue a previous audio segment. The prompt should match the audio language.\n   */\n  prompt: z.string().optional(),\n\n  /**\n   * The format of the transcript output\n   * @default 'json'\n   */\n  responseFormat: z\n    .enum(['text', 'json', 'srt', 'verbose_json', 'vtt'])\n    .default('json')\n    .optional(),\n\n  /**\n   * The timestamp granularities to populate for this transcription.\n   * @default ['segment']\n   */\n  timestampGranularities: z\n    .array(z.enum(['word', 'segment']))\n    .default(['segment'])\n    .optional(),\n})\n\nexport type InfomaniakTranscriptionProviderOptions = z.infer<\n    typeof infomaniakTranscriptionProviderOptions\n>\n"],"mappings":"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","names":["z","z","z"]}