UNPKG

sarvam-ai-provider

Version:

The **Sarvam AI SDK Provider** is a library developed to integrate with the Vercel AI SDK. This library brings Speech to Text (STT) capabilities to your applications, allowing for seamless interaction with audio and text data.

1 lines 11.3 kB
{"version":3,"sources":["../src/sarvam-transcription-model.ts","../src/sarvam-error.ts","../src/sarvam-provider.ts"],"sourcesContent":["import {\r\n TranscriptionModelV1,\r\n TranscriptionModelV1CallWarning,\r\n} from '@ai-sdk/provider';\r\nimport {\r\n combineHeaders,\r\n createJsonResponseHandler,\r\n parseProviderOptions,\r\n postFormDataToApi,\r\n} from '@ai-sdk/provider-utils';\r\nimport { z } from 'zod';\r\nimport { SarvamConfig } from './sarvam-config';\r\nimport { SarvamTranscriptionAPITypes } from './sarvam-api-types';\r\nimport { sarvamFailedResponseHandler } from './sarvam-error';\r\nimport { SarvamTranscriptionModelId } from './sarvam-transcription-settings';\r\n\r\n// https://docs.sarvam.ai/api-reference-docs/endpoints/speech-to-text\r\nconst sarvamProviderOptionsSchema = z.object({\r\n language_code: z.string(),\r\n with_timestamps: z.boolean().nullish().default(false),\r\n /**\r\n * Enables speaker diarization, which identifies and separates different speakers in the audio.\r\n * When set to true, the API will provide speaker-specific segments in the response.\r\n * Note: This parameter is currently in Beta mode.\r\n */\r\n with_diarization: z.boolean().nullish().default(false),\r\n /**\r\n * Number of speakers to be detected in the audio.\r\n * This is used when with_diarization is set to true.\r\n * Can be null.\r\n */\r\n num_speakers: z.number().int().nullish(),\r\n});\r\n\r\nexport type SarvamTranscriptionCallOptions = z.infer<\r\n typeof sarvamProviderOptionsSchema\r\n>;\r\n\r\ninterface SarvamTranscriptionModelConfig extends SarvamConfig {\r\n _internal?: {\r\n currentDate?: () => Date;\r\n };\r\n}\r\n\r\nexport class SarvamTranscriptionModel implements TranscriptionModelV1 {\r\n readonly specificationVersion = 'v1';\r\n\r\n constructor(\r\n readonly modelId: SarvamTranscriptionModelId,\r\n private readonly config: SarvamTranscriptionModelConfig,\r\n ) {}\r\n\r\n get provider(): string {\r\n return this.config.provider;\r\n }\r\n\r\n private getArgs({\r\n audio,\r\n mediaType,\r\n providerOptions,\r\n }: Parameters<TranscriptionModelV1['doGenerate']>[0]) {\r\n const warnings: TranscriptionModelV1CallWarning[] = [];\r\n\r\n const sarvamOptions = parseProviderOptions({\r\n provider: 'sarvam',\r\n providerOptions,\r\n schema: sarvamProviderOptionsSchema,\r\n });\r\n\r\n const formData = new FormData();\r\n const blob =\r\n audio instanceof Blob ? audio : new Blob([audio], { type: mediaType });\r\n\r\n formData.append('file', blob);\r\n formData.append('model', this.modelId);\r\n if (sarvamOptions) {\r\n formData.append('language_code', sarvamOptions.language_code);\r\n formData.append(\r\n 'with_timestamps',\r\n sarvamOptions.with_timestamps ? 'true' : 'false',\r\n );\r\n formData.append(\r\n 'with_diarization',\r\n sarvamOptions.with_diarization ? 'true' : 'false',\r\n );\r\n if (\r\n sarvamOptions.num_speakers !== null &&\r\n sarvamOptions.num_speakers !== undefined\r\n ) {\r\n formData.append('num_speakers', sarvamOptions.num_speakers.toString());\r\n }\r\n }\r\n\r\n return {\r\n formData,\r\n warnings,\r\n };\r\n }\r\n\r\n async doGenerate(\r\n options: Parameters<TranscriptionModelV1['doGenerate']>[0],\r\n ): Promise<Awaited<ReturnType<TranscriptionModelV1['doGenerate']>>> {\r\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\r\n const { formData, warnings } = this.getArgs(options);\r\n\r\n const {\r\n value: response,\r\n responseHeaders,\r\n rawValue: rawResponse,\r\n } = await postFormDataToApi({\r\n url: this.config.url({\r\n path: '/speech-to-text',\r\n modelId: this.modelId,\r\n }),\r\n headers: combineHeaders(this.config.headers(), options.headers),\r\n formData,\r\n failedResponseHandler: sarvamFailedResponseHandler,\r\n successfulResponseHandler: createJsonResponseHandler(\r\n sarvamTranscriptionResponseSchema,\r\n ),\r\n abortSignal: options.abortSignal,\r\n fetch: this.config.fetch,\r\n });\r\n\r\n return {\r\n text: response.transcript,\r\n segments: response.timestamps\r\n ? response.timestamps.words.map((word, index) => ({\r\n text: word,\r\n startSecond: response.timestamps!.start_time_seconds[index],\r\n endSecond: response.timestamps!.end_time_seconds[index],\r\n }))\r\n : [],\r\n language: response.language_code ? response.language_code : undefined,\r\n durationInSeconds:\r\n response.timestamps?.end_time_seconds[\r\n response.timestamps.end_time_seconds.length - 1\r\n ] ?? undefined,\r\n warnings,\r\n response: {\r\n timestamp: currentDate,\r\n modelId: this.modelId,\r\n headers: responseHeaders,\r\n body: rawResponse,\r\n },\r\n };\r\n }\r\n}\r\n\r\nconst sarvamTranscriptionResponseSchema = z.object({\r\n request_id: z.string().nullable(),\r\n transcript: z.string(),\r\n language_code: z.string().nullable(),\r\n timestamps: z\r\n .object({\r\n end_time_seconds: z.array(z.number()),\r\n start_time_seconds: z.array(z.number()),\r\n words: z.array(z.string()),\r\n })\r\n .optional(),\r\n diarized_transcript: z\r\n .object({\r\n entries: z.array(\r\n z.object({\r\n end_time_seconds: z.array(z.number()),\r\n start_time_seconds: z.array(z.number()),\r\n transcript: z.string(),\r\n speaker_id: z.string(),\r\n }),\r\n ),\r\n })\r\n .optional(),\r\n});\r\n","import { z } from 'zod';\r\nimport { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\r\n\r\nexport const SarvamErrorDataSchema = z.object({\r\n error: z.object({\r\n message: z.string(),\r\n code: z.number(),\r\n }),\r\n});\r\n\r\nexport type SarvamErrorData = z.infer<typeof SarvamErrorDataSchema>;\r\n\r\nexport const sarvamFailedResponseHandler = createJsonErrorResponseHandler({\r\n errorSchema: SarvamErrorDataSchema,\r\n errorToMessage: data => data.error.message,\r\n});\r\n","import { TranscriptionModelV1, ProviderV1 } from '@ai-sdk/provider';\r\nimport { FetchFunction, loadApiKey } from '@ai-sdk/provider-utils';\r\nimport { SarvamTranscriptionModel } from './sarvam-transcription-model';\r\nimport { SarvamTranscriptionModelId } from './sarvam-transcription-settings';\r\n\r\nexport interface SarvamProvider extends Pick<ProviderV1, 'transcriptionModel'> {\r\n (\r\n modelId: 'saarika:v2',\r\n settings?: {},\r\n ): {\r\n transcription: SarvamTranscriptionModel;\r\n };\r\n\r\n /**\r\n * Creates a model for transcription.\r\n */\r\n transcription(modelId: SarvamTranscriptionModelId): TranscriptionModelV1;\r\n}\r\n\r\nexport interface SarvamProviderSettings {\r\n apiKey?: string;\r\n headers?: Record<string, string>;\r\n fetch?: FetchFunction;\r\n}\r\n\r\nexport function createSarvam(\r\n options: SarvamProviderSettings = {},\r\n): SarvamProvider {\r\n const getHeaders = () => ({\r\n ...options.headers,\r\n });\r\n\r\n const createTranscriptionModel = (modelId: SarvamTranscriptionModelId) =>\r\n new SarvamTranscriptionModel(modelId, {\r\n provider: `sarvam.transcription`,\r\n url: ({ path }) => `https://api.sarvam.ai${path}`,\r\n headers: getHeaders,\r\n fetch: options.fetch,\r\n });\r\n\r\n const provider = function (modelId: SarvamTranscriptionModelId) {\r\n return {\r\n transcription: createTranscriptionModel(modelId),\r\n };\r\n };\r\n\r\n provider.transcription = createTranscriptionModel;\r\n provider.transcriptionModel = createTranscriptionModel;\r\n\r\n return provider as SarvamProvider;\r\n}\r\n\r\nexport const sarvam = createSarvam();\r\n"],"mappings":"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","names":["z","z"]}