{"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"]}