@ai-sdk/cartesia 0.0.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/LICENSE +13 -0
- package/README.md +47 -0
- package/dist/index.d.ts +185 -0
- package/dist/index.js +724 -0
- package/dist/index.js.map +1 -0
- package/docs/95-cartesia.mdx +262 -0
- package/package.json +69 -7
- package/src/cartesia-api-types.ts +17 -0
- package/src/cartesia-config.ts +9 -0
- package/src/cartesia-error.ts +17 -0
- package/src/cartesia-provider.ts +190 -0
- package/src/cartesia-realtime-model-options.ts +3 -0
- package/src/cartesia-realtime-model.ts +326 -0
- package/src/cartesia-speech-api-types.ts +64 -0
- package/src/cartesia-speech-model-options.ts +40 -0
- package/src/cartesia-speech-model.ts +285 -0
- package/src/cartesia-speech-options.ts +9 -0
- package/src/cartesia-transcription-model-options.ts +13 -0
- package/src/cartesia-transcription-model.ts +157 -0
- package/src/cartesia-transcription-options.ts +1 -0
- package/src/index.ts +20 -0
- package/src/transcript-test.mp3 +0 -0
- package/src/version.ts +6 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cartesia-provider.ts","../src/cartesia-transcription-model.ts","../src/cartesia-error.ts","../src/cartesia-transcription-model-options.ts","../src/cartesia-speech-model.ts","../src/cartesia-speech-model-options.ts","../src/cartesia-realtime-model.ts","../src/version.ts"],"sourcesContent":["import {\n type Experimental_RealtimeFactoryV4 as RealtimeFactoryV4,\n type Experimental_RealtimeFactoryV4GetTokenOptions as RealtimeFactoryV4GetTokenOptions,\n NoSuchModelError,\n type TranscriptionModelV4,\n type SpeechModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { CartesiaTranscriptionModel } from './cartesia-transcription-model';\nimport type { CartesiaTranscriptionModelId } from './cartesia-transcription-options';\nimport { CartesiaSpeechModel } from './cartesia-speech-model';\nimport type { CartesiaSpeechModelId } from './cartesia-speech-options';\nimport { CartesiaRealtimeModel } from './cartesia-realtime-model';\nimport type { CartesiaRealtimeModelId } from './cartesia-realtime-model-options';\nimport { VERSION } from './version';\n\n/**\n * The Cartesia API version sent with every request via the `Cartesia-Version`\n * header. See https://docs.cartesia.ai/api-reference/api-versioning\n */\nconst CARTESIA_API_VERSION = '2026-03-01';\n\nexport interface CartesiaProvider extends ProviderV4 {\n (\n modelId: CartesiaSpeechModelId,\n settings?: {},\n ): {\n speech: CartesiaSpeechModel;\n };\n\n /**\n * Creates a model for transcription.\n */\n transcription(modelId: CartesiaTranscriptionModelId): TranscriptionModelV4;\n\n /**\n * Creates a model for speech generation.\n */\n speech(modelId: CartesiaSpeechModelId): SpeechModelV4;\n\n /**\n * Creates a realtime Ink speech-to-text model.\n */\n experimental_realtime: RealtimeFactoryV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport interface CartesiaProviderSettings {\n /**\n * API key for authenticating requests.\n */\n apiKey?: string;\n\n /**\n * The Cartesia API version to use (sent via the `Cartesia-Version` header).\n */\n version?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\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?: FetchFunction;\n}\n\n/**\n * Create a Cartesia provider instance.\n */\nexport function createCartesia(\n options: CartesiaProviderSettings = {},\n): CartesiaProvider {\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'CARTESIA_API_KEY',\n description: 'Cartesia',\n })}`,\n 'Cartesia-Version': options.version ?? CARTESIA_API_VERSION,\n ...options.headers,\n },\n `ai-sdk/cartesia/${VERSION}`,\n );\n\n const createTranscriptionModel = (modelId: CartesiaTranscriptionModelId) =>\n new CartesiaTranscriptionModel(modelId, {\n provider: `cartesia.transcription`,\n url: ({ path }) => `https://api.cartesia.ai${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createSpeechModel = (modelId: CartesiaSpeechModelId) =>\n new CartesiaSpeechModel(modelId, {\n provider: `cartesia.speech`,\n url: ({ path }) => `https://api.cartesia.ai${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createRealtimeModel = (modelId: CartesiaRealtimeModelId) =>\n new CartesiaRealtimeModel(modelId, {\n provider: `cartesia.realtime`,\n baseURL: 'https://api.cartesia.ai',\n version: options.version ?? CARTESIA_API_VERSION,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const experimentalRealtimeFactory = Object.assign(\n (modelId: CartesiaRealtimeModelId) => createRealtimeModel(modelId),\n {\n getToken: async (tokenOptions: RealtimeFactoryV4GetTokenOptions) => {\n const secret = await createRealtimeModel(\n tokenOptions.model as CartesiaRealtimeModelId,\n ).doCreateClientSecret({\n sessionConfig: tokenOptions.sessionConfig,\n expiresAfterSeconds: tokenOptions.expiresAfterSeconds,\n });\n\n return {\n token: secret.token,\n url: secret.url,\n expiresAt: secret.expiresAt,\n };\n },\n },\n ) as RealtimeFactoryV4;\n\n const provider = function (modelId: CartesiaSpeechModelId) {\n return {\n speech: createSpeechModel(modelId),\n };\n };\n\n provider.specificationVersion = 'v4' as const;\n provider.transcription = createTranscriptionModel;\n provider.transcriptionModel = createTranscriptionModel;\n provider.speech = createSpeechModel;\n provider.speechModel = createSpeechModel;\n provider.experimental_realtime = experimentalRealtimeFactory;\n\n // Required ProviderV4 methods that are not supported\n provider.languageModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'languageModel',\n message: 'Cartesia does not provide language models',\n });\n };\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n message: 'Cartesia does not provide embedding models',\n });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'imageModel',\n message: 'Cartesia does not provide image models',\n });\n };\n\n return provider as CartesiaProvider;\n}\n\n/**\n * Default Cartesia provider instance.\n */\nexport const cartesia = createCartesia();\n","import type { TranscriptionModelV4, SharedV4Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertBase64ToUint8Array,\n createJsonResponseHandler,\n mediaTypeToExtension,\n parseProviderOptions,\n postFormDataToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { CartesiaConfig } from './cartesia-config';\nimport { cartesiaFailedResponseHandler } from './cartesia-error';\nimport { cartesiaTranscriptionModelOptionsSchema } from './cartesia-transcription-model-options';\nimport type { CartesiaTranscriptionModelId } from './cartesia-transcription-options';\n\ninterface CartesiaTranscriptionModelConfig extends CartesiaConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class CartesiaTranscriptionModel implements TranscriptionModelV4 {\n readonly specificationVersion = 'v4';\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: CartesiaTranscriptionModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: CartesiaTranscriptionModelId;\n config: CartesiaTranscriptionModelConfig;\n }) {\n return new CartesiaTranscriptionModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: CartesiaTranscriptionModelId,\n private readonly config: CartesiaTranscriptionModelConfig,\n ) {}\n\n private async getArgs({\n audio,\n mediaType,\n providerOptions,\n }: Parameters<TranscriptionModelV4['doGenerate']>[0]) {\n const warnings: SharedV4Warning[] = [];\n\n // Parse provider options\n const cartesiaOptions = await parseProviderOptions({\n provider: 'cartesia',\n providerOptions,\n schema: cartesiaTranscriptionModelOptionsSchema,\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])\n : new Blob([convertBase64ToUint8Array(audio)]);\n\n const fileExtension = mediaTypeToExtension(mediaType);\n formData.append('model', this.modelId);\n formData.append(\n 'file',\n new File([blob], 'audio', { type: mediaType }),\n `audio.${fileExtension}`,\n );\n\n // Add provider-specific options\n if (cartesiaOptions) {\n if (cartesiaOptions.language != null) {\n formData.set('language', cartesiaOptions.language);\n }\n if (cartesiaOptions.timestampGranularities != null) {\n for (const granularity of cartesiaOptions.timestampGranularities) {\n formData.append('timestamp_granularities[]', granularity);\n }\n }\n }\n\n return {\n formData,\n warnings,\n };\n }\n\n async doGenerate(\n options: Parameters<TranscriptionModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<TranscriptionModelV4['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { formData, warnings } = await this.getArgs(options);\n\n const {\n value: response,\n responseHeaders,\n rawValue: rawResponse,\n } = await postFormDataToApi({\n url: this.config.url({\n path: '/stt',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n formData,\n failedResponseHandler: cartesiaFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n cartesiaTranscriptionResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n text: response.text,\n segments:\n response.words?.map(word => ({\n text: word.word,\n startSecond: word.start,\n endSecond: word.end,\n })) ?? [],\n language: response.language ?? undefined,\n durationInSeconds: response.duration ?? undefined,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawResponse,\n },\n };\n }\n}\n\nconst cartesiaTranscriptionResponseSchema = z.object({\n text: z.string(),\n language: z.string().nullish(),\n duration: z.number().nullish(),\n words: z\n .array(\n z.object({\n word: z.string(),\n start: z.number(),\n end: z.number(),\n }),\n )\n .nullish(),\n});\n","import { z } from 'zod/v4';\nimport { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\n\nexport const cartesiaErrorDataSchema = z.object({\n error_code: z.string().nullish(),\n title: z.string(),\n message: z.string(),\n request_id: z.string(),\n doc_url: z.string().optional(),\n});\n\nexport type CartesiaErrorData = z.infer<typeof cartesiaErrorDataSchema>;\n\nexport const cartesiaFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: cartesiaErrorDataSchema,\n errorToMessage: data => `${data.title}: ${data.message}`,\n});\n","import { z } from 'zod/v4';\n\n// https://docs.cartesia.ai/api-reference/stt/transcribe\nexport const cartesiaTranscriptionModelOptionsSchema = z.object({\n /** The language of the audio (ISO 639-1 code). Defaults to English. */\n language: z.string().nullish(),\n /** The timestamp granularities to populate. Currently only `word` is supported. */\n timestampGranularities: z.array(z.enum(['word'])).nullish(),\n});\n\nexport type CartesiaTranscriptionModelOptions = z.infer<\n typeof cartesiaTranscriptionModelOptionsSchema\n>;\n","import type { SpeechModelV4, SharedV4Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createBinaryResponseHandler,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport type { CartesiaConfig } from './cartesia-config';\nimport { cartesiaFailedResponseHandler } from './cartesia-error';\nimport { cartesiaSpeechModelOptionsSchema } from './cartesia-speech-model-options';\nimport type {\n CartesiaSpeechAPITypes,\n CartesiaSpeechBitRate,\n CartesiaSpeechEncoding,\n CartesiaSpeechOutputFormat,\n CartesiaSpeechSampleRate,\n} from './cartesia-speech-api-types';\nimport type {\n CartesiaSpeechModelId,\n CartesiaSpeechVoiceId,\n} from './cartesia-speech-options';\n\ninterface CartesiaSpeechModelConfig extends CartesiaConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\n// Default output format used when no outputFormat / provider options are set.\nconst DEFAULT_OUTPUT_FORMAT: CartesiaSpeechAPITypes['output_format'] = {\n container: 'mp3',\n sample_rate: 44100,\n bit_rate: 128000,\n};\n\nconst OUTPUT_FORMATS: Record<string, CartesiaSpeechOutputFormat> = {\n alaw: { container: 'raw', encoding: 'pcm_alaw', sample_rate: 8000 },\n mp3: DEFAULT_OUTPUT_FORMAT,\n mulaw: { container: 'raw', encoding: 'pcm_mulaw', sample_rate: 8000 },\n pcm: { container: 'raw', encoding: 'pcm_f32le', sample_rate: 44100 },\n raw: { container: 'raw', encoding: 'pcm_f32le', sample_rate: 44100 },\n wav: { container: 'wav', encoding: 'pcm_s16le', sample_rate: 44100 },\n};\n\nconst SAMPLE_RATES = [8000, 16000, 22050, 24000, 44100, 48000] as const;\n\nfunction isSampleRate(value: number): value is CartesiaSpeechSampleRate {\n return SAMPLE_RATES.includes(value as CartesiaSpeechSampleRate);\n}\n\nfunction resolveOutputFormat({\n outputFormat,\n providerOptions,\n warnings,\n}: {\n outputFormat: string;\n providerOptions:\n | {\n container?: 'raw' | 'wav' | 'mp3' | null;\n encoding?: CartesiaSpeechEncoding | null;\n sampleRate?: CartesiaSpeechSampleRate | null;\n bitRate?: CartesiaSpeechBitRate | null;\n }\n | undefined;\n warnings: SharedV4Warning[];\n}): CartesiaSpeechOutputFormat {\n const [formatName, sampleRateText, ...extraParts] = outputFormat\n .toLowerCase()\n .split('_');\n const mapped = OUTPUT_FORMATS[formatName];\n let resolved = mapped ? { ...mapped } : { ...DEFAULT_OUTPUT_FORMAT };\n\n if (!mapped) {\n warnings.push({\n type: 'unsupported',\n feature: 'outputFormat',\n details: `Unknown output format \"${outputFormat}\". Falling back to mp3. Use providerOptions.cartesia to configure container, encoding, and sampleRate directly.`,\n });\n } else if (sampleRateText != null) {\n const parsedRate = Number(sampleRateText);\n if (\n extraParts.length === 0 &&\n Number.isInteger(parsedRate) &&\n isSampleRate(parsedRate)\n ) {\n resolved.sample_rate = parsedRate;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'outputFormat',\n details: `Unsupported Cartesia sample rate in output format \"${outputFormat}\". Using ${resolved.sample_rate} Hz instead.`,\n });\n }\n }\n\n const container = providerOptions?.container ?? resolved.container;\n const sampleRate = providerOptions?.sampleRate ?? resolved.sample_rate;\n\n if (container === 'mp3') {\n if (providerOptions?.encoding != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'providerOptions.cartesia.encoding',\n details:\n 'Cartesia MP3 output does not accept an encoding. The encoding option was ignored.',\n });\n }\n\n return {\n container,\n sample_rate: sampleRate,\n bit_rate:\n providerOptions?.bitRate ??\n (resolved.container === 'mp3' ? resolved.bit_rate : 128000),\n };\n }\n\n if (providerOptions?.bitRate != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'providerOptions.cartesia.bitRate',\n details:\n 'Cartesia raw and WAV output do not accept a bit rate. The bitRate option was ignored.',\n });\n }\n\n return {\n container,\n encoding:\n providerOptions?.encoding ??\n (resolved.container === 'mp3'\n ? container === 'wav'\n ? 'pcm_s16le'\n : 'pcm_f32le'\n : resolved.encoding),\n sample_rate: sampleRate,\n };\n}\n\nexport class CartesiaSpeechModel implements SpeechModelV4 {\n readonly specificationVersion = 'v4';\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: CartesiaSpeechModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: CartesiaSpeechModelId;\n config: CartesiaSpeechModelConfig;\n }) {\n return new CartesiaSpeechModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: CartesiaSpeechModelId,\n private readonly config: CartesiaSpeechModelConfig,\n ) {}\n\n private async getArgs({\n text,\n voice,\n outputFormat = 'mp3',\n instructions,\n language,\n speed,\n providerOptions,\n }: Parameters<SpeechModelV4['doGenerate']>[0]) {\n const warnings: SharedV4Warning[] = [];\n\n // Parse provider options\n const cartesiaOptions = await parseProviderOptions({\n provider: 'cartesia',\n providerOptions,\n schema: cartesiaSpeechModelOptionsSchema,\n });\n\n if (!voice) {\n throw new Error('Cartesia speech models require a `voice` to be set.');\n }\n\n const outputFormatObject = resolveOutputFormat({\n outputFormat,\n providerOptions: cartesiaOptions,\n warnings,\n });\n\n // Create request body\n const requestBody: CartesiaSpeechAPITypes = {\n model_id: this.modelId,\n transcript: text,\n voice: {\n mode: 'id',\n id: voice as CartesiaSpeechVoiceId,\n },\n output_format: outputFormatObject,\n };\n\n // Map generic language\n if (language) {\n requestBody.language = language;\n }\n\n // Provider-specific options override the corresponding generic options.\n if (cartesiaOptions) {\n if (cartesiaOptions.language != null) {\n requestBody.language = cartesiaOptions.language;\n }\n }\n\n const resolvedSpeed = cartesiaOptions?.speed ?? speed;\n if (resolvedSpeed != null) {\n if (resolvedSpeed >= 0.6 && resolvedSpeed <= 1.5) {\n requestBody.generation_config = { speed: resolvedSpeed };\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'speed',\n details:\n 'Cartesia speed must be between 0.6 and 1.5. The speed option was ignored.',\n });\n }\n }\n\n if (instructions) {\n warnings.push({\n type: 'unsupported',\n feature: 'instructions',\n details: `Cartesia speech models do not support instructions. Instructions parameter was ignored.`,\n });\n }\n\n return {\n requestBody,\n warnings,\n };\n }\n\n async doGenerate(\n options: Parameters<SpeechModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<SpeechModelV4['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { requestBody, warnings } = await this.getArgs(options);\n\n const {\n value: audio,\n responseHeaders,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.config.url({\n path: '/tts/bytes',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body: requestBody,\n failedResponseHandler: cartesiaFailedResponseHandler,\n successfulResponseHandler: createBinaryResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n audio,\n warnings,\n request: {\n body: JSON.stringify(requestBody),\n },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawResponse,\n },\n };\n }\n}\n","import { z } from 'zod/v4';\n\n// https://docs.cartesia.ai/api-reference/tts/bytes\nexport const cartesiaSpeechModelOptionsSchema = z.object({\n /** Container format for the output audio (raw, wav, mp3). */\n container: z.enum(['raw', 'wav', 'mp3']).nullish(),\n /** Encoding type for the audio output (pcm_f32le, pcm_s16le, pcm_mulaw, pcm_alaw). */\n encoding: z\n .enum(['pcm_f32le', 'pcm_s16le', 'pcm_mulaw', 'pcm_alaw'])\n .nullish(),\n /** Sample rate for the output audio in Hz (e.g. 8000, 16000, 22050, 24000, 44100, 48000). */\n sampleRate: z\n .union([\n z.literal(8000),\n z.literal(16000),\n z.literal(22050),\n z.literal(24000),\n z.literal(44100),\n z.literal(48000),\n ])\n .nullish(),\n /** Bitrate for mp3 output in bits per second (e.g. 32000, 64000, 128000, 192000). */\n bitRate: z\n .union([\n z.literal(32000),\n z.literal(64000),\n z.literal(96000),\n z.literal(128000),\n z.literal(192000),\n ])\n .nullish(),\n /** Controls the speed of the generated speech. */\n speed: z.number().min(0.6).max(1.5).nullish(),\n /** The language to generate speech in (ISO 639-1 code). */\n language: z.string().nullish(),\n});\n\nexport type CartesiaSpeechModelOptions = z.infer<\n typeof cartesiaSpeechModelOptionsSchema\n>;\n","import type {\n Experimental_RealtimeModelV4 as RealtimeModelV4,\n Experimental_RealtimeModelV4ClientEvent as RealtimeModelV4ClientEvent,\n Experimental_RealtimeModelV4ClientSecretOptions as RealtimeModelV4ClientSecretOptions,\n Experimental_RealtimeModelV4ClientSecretResult as RealtimeModelV4ClientSecretResult,\n Experimental_RealtimeModelV4ServerEvent as RealtimeModelV4ServerEvent,\n Experimental_RealtimeModelV4SessionConfig as RealtimeModelV4SessionConfig,\n} from '@ai-sdk/provider';\nimport {\n convertBase64ToUint8Array,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport type { CartesiaRealtimeModelId } from './cartesia-realtime-model-options';\n\nexport type CartesiaRealtimeModelConfig = {\n provider: string;\n baseURL: string;\n version: string;\n headers: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n};\n\ntype CartesiaRealtimeWireEvent = {\n type: string;\n request_id?: string;\n transcript?: string;\n text?: string;\n is_final?: boolean;\n duration?: number;\n message?: string;\n error_code?: string;\n};\n\ntype ManualTranscriptState = {\n duration: number;\n events: CartesiaRealtimeWireEvent[];\n text: string;\n};\n\n/**\n * Realtime Ink model using Cartesia's STT WebSocket APIs.\n */\nexport class CartesiaRealtimeModel implements RealtimeModelV4 {\n readonly specificationVersion = 'v4' as const;\n readonly provider: string;\n readonly modelId: CartesiaRealtimeModelId;\n\n private readonly config: CartesiaRealtimeModelConfig;\n private manualTranscript: ManualTranscriptState = {\n duration: 0,\n events: [],\n text: '',\n };\n private sessionCreated = false;\n private useTurnDetection = true;\n\n constructor(\n modelId: CartesiaRealtimeModelId,\n config: CartesiaRealtimeModelConfig,\n ) {\n this.modelId = modelId;\n this.provider = config.provider;\n this.config = config;\n }\n\n async doCreateClientSecret(\n options: RealtimeModelV4ClientSecretOptions,\n ): Promise<RealtimeModelV4ClientSecretResult> {\n const expiresIn = options.expiresAfterSeconds;\n if (\n expiresIn != null &&\n (!Number.isInteger(expiresIn) || expiresIn <= 0 || expiresIn > 3600)\n ) {\n throw new Error(\n 'Cartesia realtime client secrets must expire between 1 and 3600 seconds.',\n );\n }\n\n const sessionConfig = options.sessionConfig;\n const language = sessionConfig?.inputAudioTranscription?.language;\n if (language != null && language !== 'en') {\n throw new Error('Cartesia Ink 2 currently supports English only.');\n }\n\n const fetchFn = this.config.fetch ?? fetch;\n const response = await fetchFn(`${this.config.baseURL}/access-token`, {\n method: 'POST',\n headers: {\n ...this.config.headers(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n grants: { stt: true },\n ...(expiresIn != null ? { expires_in: expiresIn } : {}),\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(\n `Cartesia realtime client secret request failed: ${response.status} ${text}`,\n );\n }\n\n const data = (await response.json()) as { token?: unknown };\n if (typeof data.token !== 'string' || data.token.length === 0) {\n throw new Error(\n 'Cartesia realtime client secret response did not include a token.',\n );\n }\n\n const turnDetection = sessionConfig?.turnDetection;\n const useTurnDetection =\n turnDetection === undefined ||\n (turnDetection !== null && turnDetection.type !== 'disabled');\n const inputAudioFormat = sessionConfig?.inputAudioFormat;\n const url = new URL(\n useTurnDetection\n ? `${this.config.baseURL}/stt/turns/websocket`\n : `${this.config.baseURL}/stt/websocket`,\n );\n url.protocol = url.protocol === 'http:' ? 'ws:' : 'wss:';\n url.searchParams.set('model', this.modelId);\n url.searchParams.set(\n 'encoding',\n resolveCartesiaEncoding(inputAudioFormat?.type),\n );\n url.searchParams.set(\n 'sample_rate',\n String(inputAudioFormat?.rate ?? 24000),\n );\n url.searchParams.set('cartesia_version', this.config.version);\n if (!useTurnDetection && language != null) {\n url.searchParams.set('language', language);\n }\n\n return {\n token: data.token,\n url: url.toString(),\n ...(expiresIn != null\n ? {\n expiresAt:\n Math.floor(\n (\n this.config._internal?.currentDate?.() ?? new Date()\n ).getTime() / 1000,\n ) + expiresIn,\n }\n : {}),\n };\n }\n\n getWebSocketConfig(options: { token: string; url: string }): {\n url: string;\n } {\n const url = new URL(options.url);\n this.useTurnDetection = url.pathname.includes('/stt/turns/websocket');\n url.searchParams.set('access_token', options.token);\n return { url: url.toString() };\n }\n\n parseServerEvent(\n raw: unknown,\n ): RealtimeModelV4ServerEvent | RealtimeModelV4ServerEvent[] {\n const event = raw as CartesiaRealtimeWireEvent;\n const requestId = event.request_id ?? 'cartesia-realtime';\n let mapped: RealtimeModelV4ServerEvent | RealtimeModelV4ServerEvent[];\n\n switch (event.type) {\n case 'connected':\n this.sessionCreated = true;\n return {\n type: 'session-created',\n sessionId: event.request_id,\n raw,\n };\n\n case 'turn.start':\n mapped = { type: 'speech-started', itemId: requestId, raw };\n break;\n\n case 'turn.resume':\n mapped = [\n { type: 'speech-started', itemId: requestId, raw },\n { type: 'custom', rawType: event.type, raw },\n ];\n break;\n\n case 'turn.end':\n mapped = [\n { type: 'speech-stopped', itemId: requestId, raw },\n {\n type: 'input-transcription-completed',\n itemId: requestId,\n transcript: event.transcript ?? '',\n raw,\n },\n ];\n break;\n\n case 'transcript':\n if (event.is_final === true) {\n this.manualTranscript.text += event.text ?? '';\n this.manualTranscript.duration += event.duration ?? 0;\n this.manualTranscript.events.push(event);\n }\n mapped = { type: 'custom', rawType: event.type, raw };\n break;\n\n case 'flush_done':\n mapped = this.finishManualTranscript(event, raw);\n break;\n\n case 'done': {\n if (this.manualTranscript.text.length > 0) {\n const completed = this.finishManualTranscript(event, raw);\n mapped = Array.isArray(completed)\n ? [...completed, { type: 'custom', rawType: event.type, raw }]\n : [completed, { type: 'custom', rawType: event.type, raw }];\n } else {\n mapped = { type: 'custom', rawType: event.type, raw };\n }\n break;\n }\n\n case 'error':\n mapped = {\n type: 'error',\n message: event.message ?? 'Unknown Cartesia realtime error',\n code: event.error_code,\n raw,\n };\n break;\n\n default:\n mapped = { type: 'custom', rawType: event.type, raw };\n break;\n }\n\n return this.withSessionCreated(mapped, requestId, raw);\n }\n\n serializeClientEvent(event: RealtimeModelV4ClientEvent): unknown {\n switch (event.type) {\n case 'session-update':\n case 'input-audio-clear':\n case 'response-create':\n return null;\n case 'input-audio-append':\n return convertBase64ToUint8Array(event.audio);\n case 'input-audio-commit':\n return this.useTurnDetection ? null : 'finalize';\n default:\n throw new Error(\n `Cartesia Ink 2 does not support realtime client event \"${event.type}\".`,\n );\n }\n }\n\n buildSessionConfig(_config: RealtimeModelV4SessionConfig): null {\n return null;\n }\n\n private finishManualTranscript(\n event: CartesiaRealtimeWireEvent,\n raw: unknown,\n ): RealtimeModelV4ServerEvent | RealtimeModelV4ServerEvent[] {\n const state = this.manualTranscript;\n this.manualTranscript = { duration: 0, events: [], text: '' };\n if (state.text.length === 0) {\n return { type: 'custom', rawType: event.type, raw };\n }\n\n return [\n {\n type: 'audio-committed',\n itemId: event.request_id,\n raw,\n },\n {\n type: 'input-transcription-completed',\n itemId: event.request_id ?? 'cartesia-realtime',\n transcript: state.text,\n raw: {\n event,\n transcriptEvents: state.events,\n duration: state.duration,\n },\n },\n ];\n }\n\n private withSessionCreated(\n event: RealtimeModelV4ServerEvent | RealtimeModelV4ServerEvent[],\n sessionId: string,\n raw: unknown,\n ): RealtimeModelV4ServerEvent | RealtimeModelV4ServerEvent[] {\n if (this.sessionCreated) {\n return event;\n }\n this.sessionCreated = true;\n const created: RealtimeModelV4ServerEvent = {\n type: 'session-created',\n sessionId,\n raw,\n };\n return Array.isArray(event) ? [created, ...event] : [created, event];\n }\n}\n\nfunction resolveCartesiaEncoding(type: string | undefined): string {\n switch (type) {\n case undefined:\n case 'audio/pcm':\n return 'pcm_s16le';\n case 'audio/pcmu':\n return 'pcm_mulaw';\n case 'audio/pcma':\n return 'pcm_alaw';\n default:\n throw new Error(`Unsupported Cartesia realtime audio format: ${type}`);\n }\n}\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","z","z","combineHeaders","parseProviderOptions","serializeModelOptions","WORKFLOW_SERIALIZE","WORKFLOW_DESERIALIZE","z","WORKFLOW_SERIALIZE","serializeModelOptions","WORKFLOW_DESERIALIZE","parseProviderOptions","combineHeaders","convertBase64ToUint8Array"]}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Cartesia
|
|
3
|
+
description: Learn how to use the Cartesia provider for the AI SDK.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Cartesia Provider
|
|
7
|
+
|
|
8
|
+
The [Cartesia](https://cartesia.ai/) provider contains Sonic speech generation,
|
|
9
|
+
Ink-Whisper batch transcription, and Ink 2 realtime transcription support.
|
|
10
|
+
|
|
11
|
+
## Setup
|
|
12
|
+
|
|
13
|
+
The Cartesia provider is available in the `@ai-sdk/cartesia` module. You can install it with
|
|
14
|
+
|
|
15
|
+
<Tabs items={['pnpm', 'npm', 'yarn', 'bun']}>
|
|
16
|
+
<Tab>
|
|
17
|
+
<Snippet text="pnpm add @ai-sdk/cartesia" dark />
|
|
18
|
+
</Tab>
|
|
19
|
+
<Tab>
|
|
20
|
+
<Snippet text="npm install @ai-sdk/cartesia" dark />
|
|
21
|
+
</Tab>
|
|
22
|
+
<Tab>
|
|
23
|
+
<Snippet text="yarn add @ai-sdk/cartesia" dark />
|
|
24
|
+
</Tab>
|
|
25
|
+
|
|
26
|
+
<Tab>
|
|
27
|
+
<Snippet text="bun add @ai-sdk/cartesia" dark />
|
|
28
|
+
</Tab>
|
|
29
|
+
</Tabs>
|
|
30
|
+
|
|
31
|
+
## Provider Instance
|
|
32
|
+
|
|
33
|
+
You can import the default provider instance `cartesia` from `@ai-sdk/cartesia`:
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import { cartesia } from '@ai-sdk/cartesia';
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
If you need a customized setup, you can import `createCartesia` from `@ai-sdk/cartesia` and create a provider instance with your settings:
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
import { createCartesia } from '@ai-sdk/cartesia';
|
|
43
|
+
|
|
44
|
+
const cartesia = createCartesia({
|
|
45
|
+
// custom settings, e.g.
|
|
46
|
+
fetch: customFetch,
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
You can use the following optional settings to customize the Cartesia provider instance:
|
|
51
|
+
|
|
52
|
+
- **apiKey** _string_
|
|
53
|
+
|
|
54
|
+
API key that is being sent using the `Authorization` header.
|
|
55
|
+
It defaults to the `CARTESIA_API_KEY` environment variable.
|
|
56
|
+
|
|
57
|
+
- **version** _string_
|
|
58
|
+
|
|
59
|
+
The Cartesia API version to use (sent via the `Cartesia-Version` header).
|
|
60
|
+
|
|
61
|
+
- **headers** _Record<string,string>_
|
|
62
|
+
|
|
63
|
+
Custom headers to include in the requests.
|
|
64
|
+
|
|
65
|
+
- **fetch** _(input: RequestInfo, init?: RequestInit) => Promise<Response>_
|
|
66
|
+
|
|
67
|
+
Custom [fetch](https://developer.mozilla.org/en-US/docs/Web/API/fetch) implementation.
|
|
68
|
+
Defaults to the global `fetch` function.
|
|
69
|
+
You can use it as a middleware to intercept requests,
|
|
70
|
+
or to provide a custom fetch implementation for e.g. testing.
|
|
71
|
+
|
|
72
|
+
## Speech Models
|
|
73
|
+
|
|
74
|
+
You can create models that call the [Cartesia text-to-speech API](https://docs.cartesia.ai/api-reference/tts/bytes)
|
|
75
|
+
using the `.speech()` factory method.
|
|
76
|
+
|
|
77
|
+
The first argument is the model id, e.g. `sonic-3.5`.
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
const model = cartesia.speech('sonic-3.5');
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
You can use the model with the `generateSpeech` function. Cartesia requires a `voice` id:
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
import { generateSpeech } from 'ai';
|
|
87
|
+
import { cartesia } from '@ai-sdk/cartesia';
|
|
88
|
+
|
|
89
|
+
const result = await generateSpeech({
|
|
90
|
+
model: cartesia.speech('sonic-3.5'),
|
|
91
|
+
text: 'Hello, world!',
|
|
92
|
+
voice: '694f9389-aac1-45b6-b726-9d9369183238',
|
|
93
|
+
});
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
You can also pass additional provider-specific options using the `providerOptions` argument:
|
|
97
|
+
|
|
98
|
+
```ts highlight="7-12"
|
|
99
|
+
import { generateSpeech } from 'ai';
|
|
100
|
+
import { cartesia, type CartesiaSpeechModelOptions } from '@ai-sdk/cartesia';
|
|
101
|
+
|
|
102
|
+
const result = await generateSpeech({
|
|
103
|
+
model: cartesia.speech('sonic-3.5'),
|
|
104
|
+
text: 'Hello, world!',
|
|
105
|
+
voice: '694f9389-aac1-45b6-b726-9d9369183238',
|
|
106
|
+
providerOptions: {
|
|
107
|
+
cartesia: {
|
|
108
|
+
container: 'wav',
|
|
109
|
+
encoding: 'pcm_s16le',
|
|
110
|
+
sampleRate: 24000,
|
|
111
|
+
} satisfies CartesiaSpeechModelOptions,
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
The following provider options are available:
|
|
117
|
+
|
|
118
|
+
- **container** _string_
|
|
119
|
+
|
|
120
|
+
Container format for the output audio.
|
|
121
|
+
Supported values: `'raw'`, `'wav'`, `'mp3'`.
|
|
122
|
+
Optional.
|
|
123
|
+
|
|
124
|
+
- **encoding** _string_
|
|
125
|
+
|
|
126
|
+
Encoding type for the audio output.
|
|
127
|
+
Supported values: `'pcm_f32le'`, `'pcm_s16le'`, `'pcm_mulaw'`, `'pcm_alaw'`.
|
|
128
|
+
Optional.
|
|
129
|
+
|
|
130
|
+
- **sampleRate** _number_
|
|
131
|
+
|
|
132
|
+
Sample rate for the output audio in Hz (e.g. `8000`, `16000`, `22050`, `24000`, `44100`, `48000`).
|
|
133
|
+
Optional.
|
|
134
|
+
|
|
135
|
+
- **bitRate** _number_
|
|
136
|
+
|
|
137
|
+
Bitrate for `mp3` output in bits per second (e.g. `32000`, `64000`, `128000`, `192000`).
|
|
138
|
+
Optional.
|
|
139
|
+
|
|
140
|
+
- **speed** _number_
|
|
141
|
+
|
|
142
|
+
Controls the speed of the generated speech between `0.6` and `1.5`.
|
|
143
|
+
Optional.
|
|
144
|
+
|
|
145
|
+
- **language** _string_
|
|
146
|
+
|
|
147
|
+
The language to generate speech in (ISO 639-1 code).
|
|
148
|
+
Optional.
|
|
149
|
+
|
|
150
|
+
### Model Capabilities
|
|
151
|
+
|
|
152
|
+
| Model |
|
|
153
|
+
| -------------- |
|
|
154
|
+
| `sonic-3.5` |
|
|
155
|
+
| `sonic-3` |
|
|
156
|
+
| `sonic-2` |
|
|
157
|
+
| `sonic-turbo` |
|
|
158
|
+
| `sonic-latest` |
|
|
159
|
+
|
|
160
|
+
## Realtime Transcription Models
|
|
161
|
+
|
|
162
|
+
<Note type="warning">Realtime is an experimental feature.</Note>
|
|
163
|
+
|
|
164
|
+
You can create a model for Cartesia's realtime [Ink 2](https://docs.cartesia.ai/build-with-cartesia/stt/latest)
|
|
165
|
+
API using the `.experimental_realtime()` factory method:
|
|
166
|
+
|
|
167
|
+
```ts
|
|
168
|
+
import { cartesia } from '@ai-sdk/cartesia';
|
|
169
|
+
|
|
170
|
+
const model = cartesia.experimental_realtime('ink-2');
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Realtime sessions run in the browser and require a short-lived access token
|
|
174
|
+
created on your server with `cartesia.experimental_realtime.getToken()`:
|
|
175
|
+
|
|
176
|
+
```ts
|
|
177
|
+
const token = await cartesia.experimental_realtime.getToken({
|
|
178
|
+
model: 'ink-2',
|
|
179
|
+
sessionConfig: {
|
|
180
|
+
inputAudioFormat: { type: 'audio/pcm', rate: 24000 },
|
|
181
|
+
inputAudioTranscription: { language: 'en' },
|
|
182
|
+
turnDetection: { type: 'server-vad' },
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Ink 2 produces input transcription events and supports English audio. Turn
|
|
188
|
+
detection is enabled by default. To use manual finalization instead, set
|
|
189
|
+
`turnDetection` to `null` in the session config and call `commitAudio()` when
|
|
190
|
+
the current input is complete.
|
|
191
|
+
|
|
192
|
+
See [Realtime](/docs/ai-sdk-core/realtime) for the complete browser session
|
|
193
|
+
setup.
|
|
194
|
+
|
|
195
|
+
### Model Capabilities
|
|
196
|
+
|
|
197
|
+
| Model | Streaming Transcription | Turn Detection |
|
|
198
|
+
| ------- | ----------------------- | ------------------- |
|
|
199
|
+
| `ink-2` | <Check size={18} /> | <Check size={18} /> |
|
|
200
|
+
|
|
201
|
+
## Batch Transcription Models
|
|
202
|
+
|
|
203
|
+
You can create models that call the [Cartesia transcription API](https://docs.cartesia.ai/api-reference/stt/transcribe)
|
|
204
|
+
using the `.transcription()` factory method.
|
|
205
|
+
|
|
206
|
+
The first argument is the model id e.g. `ink-whisper`.
|
|
207
|
+
|
|
208
|
+
```ts
|
|
209
|
+
const model = cartesia.transcription('ink-whisper');
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
You can use the model with the `transcribe` function:
|
|
213
|
+
|
|
214
|
+
```ts
|
|
215
|
+
import { transcribe } from 'ai';
|
|
216
|
+
import { cartesia } from '@ai-sdk/cartesia';
|
|
217
|
+
import { readFile } from 'fs/promises';
|
|
218
|
+
|
|
219
|
+
const result = await transcribe({
|
|
220
|
+
model: cartesia.transcription('ink-whisper'),
|
|
221
|
+
audio: await readFile('audio.mp3'),
|
|
222
|
+
});
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
You can also pass additional provider-specific options using the `providerOptions` argument:
|
|
226
|
+
|
|
227
|
+
```ts highlight="6"
|
|
228
|
+
import { transcribe } from 'ai';
|
|
229
|
+
import {
|
|
230
|
+
cartesia,
|
|
231
|
+
type CartesiaTranscriptionModelOptions,
|
|
232
|
+
} from '@ai-sdk/cartesia';
|
|
233
|
+
import { readFile } from 'fs/promises';
|
|
234
|
+
|
|
235
|
+
const result = await transcribe({
|
|
236
|
+
model: cartesia.transcription('ink-whisper'),
|
|
237
|
+
audio: await readFile('audio.mp3'),
|
|
238
|
+
providerOptions: {
|
|
239
|
+
cartesia: {
|
|
240
|
+
language: 'en',
|
|
241
|
+
} satisfies CartesiaTranscriptionModelOptions,
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
The following provider options are available:
|
|
247
|
+
|
|
248
|
+
- **language** _string_
|
|
249
|
+
|
|
250
|
+
The language of the audio (ISO 639-1 code). If not specified, it defaults to English.
|
|
251
|
+
Optional.
|
|
252
|
+
|
|
253
|
+
- **timestampGranularities** _array of strings_
|
|
254
|
+
|
|
255
|
+
The timestamp granularities to populate. Currently only `'word'` is supported.
|
|
256
|
+
Optional.
|
|
257
|
+
|
|
258
|
+
### Model Capabilities
|
|
259
|
+
|
|
260
|
+
| Model | Transcription | Duration | Segments | Language |
|
|
261
|
+
| ------------- | ------------------- | ------------------- | ------------------- | ------------------- |
|
|
262
|
+
| `ink-whisper` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
package/package.json
CHANGED
|
@@ -1,14 +1,76 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/cartesia",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
"
|
|
3
|
+
"version": "3.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
7
9
|
"files": [
|
|
8
|
-
"dist",
|
|
10
|
+
"dist/**/*",
|
|
11
|
+
"docs/**/*",
|
|
12
|
+
"src",
|
|
13
|
+
"!src/**/*.test.ts",
|
|
14
|
+
"!src/**/*.test-d.ts",
|
|
15
|
+
"!src/**/__snapshots__",
|
|
16
|
+
"!src/**/__fixtures__",
|
|
17
|
+
"CHANGELOG.md",
|
|
9
18
|
"README.md"
|
|
10
19
|
],
|
|
20
|
+
"directories": {
|
|
21
|
+
"doc": "./docs"
|
|
22
|
+
},
|
|
23
|
+
"exports": {
|
|
24
|
+
"./package.json": "./package.json",
|
|
25
|
+
".": {
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"import": "./dist/index.js",
|
|
28
|
+
"default": "./dist/index.js"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@ai-sdk/provider": "4.0.3",
|
|
33
|
+
"@ai-sdk/provider-utils": "5.0.7"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/node": "22.19.19",
|
|
37
|
+
"tsup": "^8.5.1",
|
|
38
|
+
"typescript": "5.6.3",
|
|
39
|
+
"zod": "3.25.76",
|
|
40
|
+
"@ai-sdk/test-server": "2.0.0",
|
|
41
|
+
"@vercel/ai-tsconfig": "0.0.0"
|
|
42
|
+
},
|
|
43
|
+
"peerDependencies": {
|
|
44
|
+
"zod": "^3.25.76 || ^4.1.8"
|
|
45
|
+
},
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=22"
|
|
48
|
+
},
|
|
11
49
|
"publishConfig": {
|
|
12
|
-
"access": "public"
|
|
50
|
+
"access": "public",
|
|
51
|
+
"provenance": true
|
|
52
|
+
},
|
|
53
|
+
"homepage": "https://ai-sdk.dev/docs",
|
|
54
|
+
"repository": {
|
|
55
|
+
"type": "git",
|
|
56
|
+
"url": "https://github.com/vercel/ai",
|
|
57
|
+
"directory": "packages/cartesia"
|
|
58
|
+
},
|
|
59
|
+
"bugs": {
|
|
60
|
+
"url": "https://github.com/vercel/ai/issues"
|
|
61
|
+
},
|
|
62
|
+
"keywords": [
|
|
63
|
+
"ai"
|
|
64
|
+
],
|
|
65
|
+
"scripts": {
|
|
66
|
+
"build": "tsup --tsconfig tsconfig.build.json",
|
|
67
|
+
"build:watch": "tsup --tsconfig tsconfig.build.json --watch",
|
|
68
|
+
"clean": "del-cli dist docs",
|
|
69
|
+
"type-check": "tsc --noEmit",
|
|
70
|
+
"test": "pnpm test:node && pnpm test:edge",
|
|
71
|
+
"test:update": "pnpm test:node -u",
|
|
72
|
+
"test:watch": "vitest --config vitest.node.config.js",
|
|
73
|
+
"test:edge": "vitest --config vitest.edge.config.js --run",
|
|
74
|
+
"test:node": "vitest --config vitest.node.config.js --run"
|
|
13
75
|
}
|
|
14
|
-
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type CartesiaTranscriptionAPITypes = {
|
|
2
|
+
/**
|
|
3
|
+
* The ID of the model to use for transcription.
|
|
4
|
+
*/
|
|
5
|
+
model: string;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The language of the audio (ISO 639-1 code). Defaults to English.
|
|
9
|
+
*/
|
|
10
|
+
language?: string;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The timestamp granularities to populate for this transcription.
|
|
14
|
+
* Currently only `word` is supported.
|
|
15
|
+
*/
|
|
16
|
+
'timestamp_granularities[]'?: 'word';
|
|
17
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FetchFunction } from '@ai-sdk/provider-utils';
|
|
2
|
+
|
|
3
|
+
export type CartesiaConfig = {
|
|
4
|
+
provider: string;
|
|
5
|
+
url: (options: { modelId: string; path: string }) => string;
|
|
6
|
+
headers?: () => Record<string, string | undefined>;
|
|
7
|
+
fetch?: FetchFunction;
|
|
8
|
+
generateId?: () => string;
|
|
9
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';
|
|
3
|
+
|
|
4
|
+
export const cartesiaErrorDataSchema = z.object({
|
|
5
|
+
error_code: z.string().nullish(),
|
|
6
|
+
title: z.string(),
|
|
7
|
+
message: z.string(),
|
|
8
|
+
request_id: z.string(),
|
|
9
|
+
doc_url: z.string().optional(),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export type CartesiaErrorData = z.infer<typeof cartesiaErrorDataSchema>;
|
|
13
|
+
|
|
14
|
+
export const cartesiaFailedResponseHandler = createJsonErrorResponseHandler({
|
|
15
|
+
errorSchema: cartesiaErrorDataSchema,
|
|
16
|
+
errorToMessage: data => `${data.title}: ${data.message}`,
|
|
17
|
+
});
|