UNPKG

infomaniak-ai-provider

Version:

The Infomaniak provider for the [AI SDK](https://ai-sdk.dev/docs/introduction) contains language model support for the [Infomaniak AI Tools API](https://www.infomaniak.com/en/hosting/ai-services/open-source-models).

1 lines 24.8 kB
{"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"]}