@ai-sdk/fish-audio 3.0.24 → 3.0.27

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 CHANGED
@@ -1,5 +1,29 @@
1
1
  # @ai-sdk/fish-audio
2
2
 
3
+ ## 3.0.27
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [af9597b]
8
+ - Updated dependencies [bc49f78]
9
+ - @ai-sdk/provider-utils@5.0.49
10
+
11
+ ## 3.0.26
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies [be877ff]
16
+ - @ai-sdk/provider-utils@5.0.48
17
+
18
+ ## 3.0.25
19
+
20
+ ### Patch Changes
21
+
22
+ - Updated dependencies [fe07867]
23
+ - Updated dependencies [a4b0940]
24
+ - Updated dependencies [771e74b]
25
+ - @ai-sdk/provider-utils@5.0.47
26
+
3
27
  ## 3.0.24
4
28
 
5
29
  ### Patch Changes
package/dist/index.js CHANGED
@@ -27,10 +27,7 @@ var fishAudioErrorDataSchema = z.object({
27
27
  });
28
28
  var fishAudioFailedResponseHandler = createJsonErrorResponseHandler({
29
29
  errorSchema: fishAudioErrorDataSchema,
30
- errorToMessage: (data) => {
31
- var _a;
32
- return (_a = data.message) != null ? _a : "Unknown Fish Audio error";
33
- }
30
+ errorToMessage: (data) => data.message ?? "Unknown Fish Audio error"
34
31
  });
35
32
 
36
33
  // src/fish-audio-speech-model-options.ts
@@ -180,7 +177,6 @@ var FishAudioSpeechModel = class _FishAudioSpeechModel {
180
177
  speed,
181
178
  providerOptions
182
179
  }) {
183
- var _a;
184
180
  const warnings = [];
185
181
  const fishAudioOptions = await parseProviderOptions({
186
182
  provider: "fishAudio",
@@ -192,7 +188,7 @@ var FishAudioSpeechModel = class _FishAudioSpeechModel {
192
188
  text,
193
189
  format
194
190
  };
195
- const referenceId = (_a = fishAudioOptions == null ? void 0 : fishAudioOptions.referenceId) != null ? _a : voice;
191
+ const referenceId = fishAudioOptions?.referenceId ?? voice;
196
192
  if (referenceId != null) {
197
193
  requestBody.reference_id = referenceId;
198
194
  }
@@ -208,10 +204,10 @@ var FishAudioSpeechModel = class _FishAudioSpeechModel {
208
204
  });
209
205
  }
210
206
  }
211
- if ((fishAudioOptions == null ? void 0 : fishAudioOptions.volume) != null) {
207
+ if (fishAudioOptions?.volume != null) {
212
208
  prosody.volume = fishAudioOptions.volume;
213
209
  }
214
- if ((fishAudioOptions == null ? void 0 : fishAudioOptions.normalizeLoudness) != null) {
210
+ if (fishAudioOptions?.normalizeLoudness != null) {
215
211
  if (this.modelId === "s1") {
216
212
  warnings.push({
217
213
  type: "unsupported",
@@ -302,8 +298,7 @@ var FishAudioSpeechModel = class _FishAudioSpeechModel {
302
298
  return { requestBody, warnings };
303
299
  }
304
300
  async doGenerate(options) {
305
- var _a, _b, _c, _d, _e;
306
- const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
301
+ const currentDate = this.config._internal?.currentDate?.() ?? /* @__PURE__ */ new Date();
307
302
  const { requestBody, warnings } = await this.getArgs(options);
308
303
  const {
309
304
  value: audio,
@@ -314,7 +309,7 @@ var FishAudioSpeechModel = class _FishAudioSpeechModel {
314
309
  // Fish Audio selects the TTS model with a `model` HTTP header rather
315
310
  // than a request body field.
316
311
  headers: combineHeaders(
317
- (_e = (_d = this.config).headers) == null ? void 0 : _e.call(_d),
312
+ this.config.headers?.(),
318
313
  { model: this.modelId },
319
314
  options.headers
320
315
  ),
@@ -401,7 +396,6 @@ var FishAudioTranscriptionModel = class _FishAudioTranscriptionModel {
401
396
  mediaType,
402
397
  providerOptions
403
398
  }) {
404
- var _a;
405
399
  const warnings = [];
406
400
  const fishAudioOptions = await parseProviderOptions2({
407
401
  provider: "fishAudio",
@@ -415,18 +409,17 @@ var FishAudioTranscriptionModel = class _FishAudioTranscriptionModel {
415
409
  new File([blob], "audio", { type: mediaType }),
416
410
  `audio.${mediaTypeToExtension(mediaType)}`
417
411
  );
418
- if ((fishAudioOptions == null ? void 0 : fishAudioOptions.language) != null) {
412
+ if (fishAudioOptions?.language != null) {
419
413
  formData.append("language", fishAudioOptions.language);
420
414
  }
421
415
  formData.append(
422
416
  "ignore_timestamps",
423
- String((_a = fishAudioOptions == null ? void 0 : fishAudioOptions.ignoreTimestamps) != null ? _a : false)
417
+ String(fishAudioOptions?.ignoreTimestamps ?? false)
424
418
  );
425
419
  return { formData, warnings };
426
420
  }
427
421
  async doGenerate(options) {
428
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
429
- const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
422
+ const currentDate = this.config._internal?.currentDate?.() ?? /* @__PURE__ */ new Date();
430
423
  const { formData, warnings } = await this.getArgs(options);
431
424
  const {
432
425
  value: response,
@@ -434,7 +427,7 @@ var FishAudioTranscriptionModel = class _FishAudioTranscriptionModel {
434
427
  rawValue: rawResponse
435
428
  } = await postFormDataToApi({
436
429
  url: this.config.url({ path: "/v1/asr", modelId: this.modelId }),
437
- headers: combineHeaders2((_e = (_d = this.config).headers) == null ? void 0 : _e.call(_d), options.headers),
430
+ headers: combineHeaders2(this.config.headers?.(), options.headers),
438
431
  formData,
439
432
  failedResponseHandler: fishAudioFailedResponseHandler,
440
433
  successfulResponseHandler: createJsonResponseHandler(
@@ -443,19 +436,19 @@ var FishAudioTranscriptionModel = class _FishAudioTranscriptionModel {
443
436
  abortSignal: options.abortSignal,
444
437
  fetch: this.config.fetch
445
438
  });
446
- const segments = (_g = (_f = response.segments) == null ? void 0 : _f.map((segment) => ({
439
+ const segments = response.segments?.map((segment) => ({
447
440
  text: segment.text,
448
441
  startSecond: segment.start,
449
442
  endSecond: segment.end
450
- }))) != null ? _g : [];
443
+ })) ?? [];
451
444
  return {
452
445
  text: response.text,
453
446
  segments,
454
447
  // `language_code` is absent from the documented response schema but is
455
448
  // returned in practice, and reflects the detected language rather than
456
449
  // the requested one.
457
- language: (_h = response.language_code) != null ? _h : void 0,
458
- durationInSeconds: (_i = response.duration) != null ? _i : void 0,
450
+ language: response.language_code ?? void 0,
451
+ durationInSeconds: response.duration ?? void 0,
459
452
  warnings,
460
453
  response: {
461
454
  timestamp: currentDate,
@@ -494,13 +487,12 @@ var fishAudioTranscriptionResponseSchema = z4.object({
494
487
  });
495
488
 
496
489
  // src/version.ts
497
- var VERSION = true ? "3.0.24" : "0.0.0-test";
490
+ var VERSION = true ? "3.0.27" : "0.0.0-test";
498
491
 
499
492
  // src/fish-audio-provider.ts
500
493
  var DEFAULT_BASE_URL = "https://api.fish.audio";
501
494
  function createFishAudio(options = {}) {
502
- var _a, _b;
503
- const baseURL = (_b = (_a = options.baseURL) == null ? void 0 : _a.replace(/\/$/, "")) != null ? _b : DEFAULT_BASE_URL;
495
+ const baseURL = options.baseURL?.replace(/\/$/, "") ?? DEFAULT_BASE_URL;
504
496
  const getHeaders = () => withUserAgentSuffix(
505
497
  {
506
498
  Authorization: `Bearer ${loadApiKey({
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fish-audio-provider.ts","../src/fish-audio-speech-model.ts","../src/fish-audio-error.ts","../src/fish-audio-speech-model-options.ts","../src/fish-audio-transcription-model.ts","../src/fish-audio-transcription-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type ProviderV4,\n type SpeechModelV4,\n type TranscriptionModelV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { FishAudioSpeechModel } from './fish-audio-speech-model';\nimport type { FishAudioSpeechModelId } from './fish-audio-speech-options';\nimport { FishAudioTranscriptionModel } from './fish-audio-transcription-model';\nimport type { FishAudioTranscriptionModelId } from './fish-audio-transcription-options';\nimport { VERSION } from './version';\n\nexport interface FishAudioProvider extends ProviderV4 {\n (\n modelId: FishAudioSpeechModelId,\n settings?: {},\n ): {\n speech: FishAudioSpeechModel;\n };\n\n /**\n * Creates a model for speech generation.\n */\n speech(modelId: FishAudioSpeechModelId): SpeechModelV4;\n\n /**\n * Creates a model for speech generation.\n *\n * Narrowed to required: Fish Audio always provides speech models.\n */\n speechModel(modelId: FishAudioSpeechModelId): SpeechModelV4;\n\n /**\n * Creates a model for transcription.\n */\n transcription(modelId?: FishAudioTranscriptionModelId): TranscriptionModelV4;\n\n /**\n * Creates a model for transcription.\n *\n * Narrowed to required: Fish Audio always provides a transcription model.\n */\n transcriptionModel(\n modelId?: FishAudioTranscriptionModelId,\n ): TranscriptionModelV4;\n}\n\nexport interface FishAudioProviderSettings {\n /**\n * API key for authenticating requests.\n */\n apiKey?: string;\n\n /**\n * Base URL for the API calls.\n */\n baseURL?: 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\nconst DEFAULT_BASE_URL = 'https://api.fish.audio';\n\n/**\n * Create a Fish Audio provider instance.\n */\nexport function createFishAudio(\n options: FishAudioProviderSettings = {},\n): FishAudioProvider {\n const baseURL = options.baseURL?.replace(/\\/$/, '') ?? DEFAULT_BASE_URL;\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'FISH_AUDIO_API_KEY',\n description: 'Fish Audio',\n })}`,\n ...options.headers,\n },\n `ai-sdk/fish-audio/${VERSION}`,\n );\n\n const createSpeechModel = (modelId: FishAudioSpeechModelId) =>\n new FishAudioSpeechModel(modelId, {\n provider: 'fish-audio.speech',\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n // `/v1/asr` has no model selector, so the model ID is a routing label and\n // defaults to `transcribe-1`.\n const createTranscriptionModel = (\n modelId: FishAudioTranscriptionModelId = 'transcribe-1',\n ) =>\n new FishAudioTranscriptionModel(modelId, {\n provider: 'fish-audio.transcription',\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider = function (modelId: FishAudioSpeechModelId) {\n return {\n speech: createSpeechModel(modelId),\n };\n };\n\n provider.specificationVersion = 'v4' as const;\n provider.speech = createSpeechModel;\n provider.speechModel = createSpeechModel;\n provider.transcription = createTranscriptionModel;\n provider.transcriptionModel = createTranscriptionModel;\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: 'Fish Audio does not provide language models',\n });\n };\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n message: 'Fish Audio 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: 'Fish Audio does not provide image models',\n });\n };\n\n return provider as FishAudioProvider;\n}\n\n/**\n * Default Fish Audio provider instance.\n */\nexport const fishAudio = createFishAudio();\n","import type { SharedV4Warning, SpeechModelV4 } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createBinaryResponseHandler,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_DESERIALIZE,\n WORKFLOW_SERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport type { FishAudioConfig } from './fish-audio-config';\nimport { fishAudioFailedResponseHandler } from './fish-audio-error';\nimport type {\n FishAudioSpeechAPITypes,\n FishAudioSpeechFormat,\n FishAudioProsodyControl,\n} from './fish-audio-speech-api-types';\nimport { fishAudioSpeechModelOptionsSchema } from './fish-audio-speech-model-options';\nimport type { FishAudioSpeechModelId } from './fish-audio-speech-options';\n\ninterface FishAudioSpeechModelConfig extends FishAudioConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nconst SUPPORTED_FORMATS: FishAudioSpeechFormat[] = [\n 'wav',\n 'pcm',\n 'mp3',\n 'opus',\n];\n\nconst DEFAULT_FORMAT: FishAudioSpeechFormat = 'mp3';\n\n// Fish Audio accepts `prosody.speed` between 0.5 and 2.0.\nconst MIN_SPEED = 0.5;\nconst MAX_SPEED = 2;\n\nfunction resolveFormat({\n outputFormat,\n warnings,\n}: {\n outputFormat: string | undefined;\n warnings: SharedV4Warning[];\n}): FishAudioSpeechFormat {\n if (outputFormat == null) {\n return DEFAULT_FORMAT;\n }\n\n const normalized = outputFormat.toLowerCase();\n const matched = SUPPORTED_FORMATS.find(format => format === normalized);\n\n if (matched == null) {\n warnings.push({\n type: 'unsupported',\n feature: 'outputFormat',\n details: `Fish Audio does not support the output format \"${outputFormat}\". Falling back to ${DEFAULT_FORMAT}. Supported formats are ${SUPPORTED_FORMATS.join(', ')}.`,\n });\n return DEFAULT_FORMAT;\n }\n\n return matched;\n}\n\nexport class FishAudioSpeechModel implements SpeechModelV4 {\n readonly specificationVersion = 'v4';\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: FishAudioSpeechModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: FishAudioSpeechModelId;\n config: FishAudioSpeechModelConfig;\n }) {\n return new FishAudioSpeechModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: FishAudioSpeechModelId,\n private readonly config: FishAudioSpeechModelConfig,\n ) {}\n\n private async getArgs({\n text,\n voice,\n outputFormat,\n instructions,\n language,\n speed,\n providerOptions,\n }: Parameters<SpeechModelV4['doGenerate']>[0]) {\n const warnings: SharedV4Warning[] = [];\n\n const fishAudioOptions = await parseProviderOptions({\n provider: 'fishAudio',\n providerOptions,\n schema: fishAudioSpeechModelOptionsSchema,\n });\n\n const format = resolveFormat({ outputFormat, warnings });\n\n const requestBody: FishAudioSpeechAPITypes = {\n text,\n format,\n };\n\n // `providerOptions.fishAudio.referenceId` wins over the generic `voice` so\n // that multi-speaker arrays are expressible.\n const referenceId = fishAudioOptions?.referenceId ?? voice;\n if (referenceId != null) {\n requestBody.reference_id = referenceId;\n }\n\n const prosody: FishAudioProsodyControl = {};\n\n if (speed != null) {\n if (speed >= MIN_SPEED && speed <= MAX_SPEED) {\n prosody.speed = speed;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'speed',\n details: `Fish Audio speed must be between ${MIN_SPEED} and ${MAX_SPEED}. The speed option was ignored.`,\n });\n }\n }\n\n if (fishAudioOptions?.volume != null) {\n prosody.volume = fishAudioOptions.volume;\n }\n\n if (fishAudioOptions?.normalizeLoudness != null) {\n // Fish Audio accepts `normalize_loudness` on s1 but ignores it, so warn\n // rather than let it silently do nothing. Only s1 is known to ignore it;\n // unrecognized model IDs are left alone.\n if (this.modelId === 's1') {\n warnings.push({\n type: 'unsupported',\n feature: 'providerOptions.fishAudio.normalizeLoudness',\n details:\n 'Fish Audio ignores normalizeLoudness on s1. It is supported by the S2 family (s2-pro, s2.1-pro).',\n });\n } else {\n prosody.normalize_loudness = fishAudioOptions.normalizeLoudness;\n }\n }\n\n if (Object.keys(prosody).length > 0) {\n requestBody.prosody = prosody;\n }\n\n if (language != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'language',\n details:\n 'Fish Audio infers the language from the input text and the selected voice, and has no language parameter. The language option was ignored.',\n });\n }\n\n if (instructions != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'instructions',\n details:\n 'Fish Audio does not support instructions. The instructions option was ignored.',\n });\n }\n\n if (fishAudioOptions != null) {\n if (fishAudioOptions.sampleRate != null) {\n requestBody.sample_rate = fishAudioOptions.sampleRate;\n }\n\n if (fishAudioOptions.mp3Bitrate != null) {\n if (format === 'mp3') {\n requestBody.mp3_bitrate = fishAudioOptions.mp3Bitrate;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'providerOptions.fishAudio.mp3Bitrate',\n details: `mp3Bitrate only applies to mp3 output. The option was ignored for ${format} output.`,\n });\n }\n }\n\n if (fishAudioOptions.opusBitrate != null) {\n if (format === 'opus') {\n requestBody.opus_bitrate = fishAudioOptions.opusBitrate;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'providerOptions.fishAudio.opusBitrate',\n details: `opusBitrate only applies to opus output. The option was ignored for ${format} output.`,\n });\n }\n }\n\n if (fishAudioOptions.latency != null) {\n requestBody.latency = fishAudioOptions.latency;\n }\n\n if (fishAudioOptions.temperature != null) {\n requestBody.temperature = fishAudioOptions.temperature;\n }\n\n if (fishAudioOptions.topP != null) {\n requestBody.top_p = fishAudioOptions.topP;\n }\n\n if (fishAudioOptions.chunkLength != null) {\n requestBody.chunk_length = fishAudioOptions.chunkLength;\n }\n\n if (fishAudioOptions.minChunkLength != null) {\n requestBody.min_chunk_length = fishAudioOptions.minChunkLength;\n }\n\n if (fishAudioOptions.normalize != null) {\n requestBody.normalize = fishAudioOptions.normalize;\n }\n\n if (fishAudioOptions.maxNewTokens != null) {\n requestBody.max_new_tokens = fishAudioOptions.maxNewTokens;\n }\n\n if (fishAudioOptions.repetitionPenalty != null) {\n requestBody.repetition_penalty = fishAudioOptions.repetitionPenalty;\n }\n\n if (fishAudioOptions.conditionOnPreviousChunks != null) {\n requestBody.condition_on_previous_chunks =\n fishAudioOptions.conditionOnPreviousChunks;\n }\n\n if (fishAudioOptions.earlyStopThreshold != null) {\n requestBody.early_stop_threshold = fishAudioOptions.earlyStopThreshold;\n }\n\n if (fishAudioOptions.features != null) {\n requestBody.features = fishAudioOptions.features;\n }\n }\n\n return { requestBody, warnings };\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({ path: '/v1/tts', modelId: this.modelId }),\n // Fish Audio selects the TTS model with a `model` HTTP header rather\n // than a request body field.\n headers: combineHeaders(\n this.config.headers?.(),\n { model: this.modelId },\n options.headers,\n ),\n body: requestBody,\n failedResponseHandler: fishAudioFailedResponseHandler,\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 { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// Fish Audio returns `{ status, message }` for documented error responses\n// (401 no permission, 402 no payment).\n// https://docs.fish.audio/api-reference/endpoint/openapi-v1/text-to-speech\nexport const fishAudioErrorDataSchema = z.object({\n status: z.number().nullish(),\n message: z.string().nullish(),\n});\n\nexport type FishAudioErrorData = z.infer<typeof fishAudioErrorDataSchema>;\n\nexport const fishAudioFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: fishAudioErrorDataSchema,\n errorToMessage: data => data.message ?? 'Unknown Fish Audio error',\n});\n","import { z } from 'zod/v4';\n\n// https://docs.fish.audio/api-reference/endpoint/openapi-v1/text-to-speech\nexport const fishAudioSpeechModelOptionsSchema = z.object({\n /**\n * Voice model ID(s). A single ID selects one speaker; an array enables\n * multi-speaker dialogue (S2-Pro models), in which case the text must mark\n * turns with speaker tokens such as `<|speaker:0|>`. The speaker index maps\n * to the position in this array.\n *\n * Takes precedence over the top-level `voice` option.\n */\n referenceId: z.union([z.string(), z.array(z.string())]).optional(),\n\n /**\n * Output sample rate in Hz. Falls back to the format default when unset\n * (44100 Hz for wav/pcm/mp3, 48000 Hz for opus).\n */\n sampleRate: z.number().int().positive().optional(),\n\n /**\n * Bitrate in kbps for mp3 output. Ignored for other formats.\n */\n mp3Bitrate: z\n .union([z.literal(64), z.literal(128), z.literal(192)])\n .optional(),\n\n /**\n * Bitrate in bps for opus output, where `-1000` selects automatic. Ignored\n * for other formats.\n */\n opusBitrate: z\n .union([\n z.literal(-1000),\n z.literal(24_000),\n z.literal(32_000),\n z.literal(48_000),\n z.literal(64_000),\n ])\n .optional(),\n\n /**\n * Latency/quality tradeoff. `normal` gives the best quality, `balanced`\n * reduces latency, and `low` is the fastest.\n */\n latency: z.enum(['low', 'normal', 'balanced']).optional(),\n\n /**\n * Volume offset in dB. Negative values are quieter.\n */\n volume: z.number().optional(),\n\n /**\n * Loudness normalization. Supported by the S2 family (`s2-pro` and\n * `s2.1-pro`). Fish Audio accepts it on `s1` but ignores it, so the provider\n * emits a warning in that case.\n */\n normalizeLoudness: z.boolean().optional(),\n\n /**\n * Governs expressiveness. Higher values are more varied, lower values more\n * consistent.\n */\n temperature: z.number().min(0).max(1).optional(),\n\n /**\n * Controls diversity via nucleus sampling.\n */\n topP: z.number().min(0).max(1).optional(),\n\n /**\n * Text segment size for processing.\n */\n chunkLength: z.number().int().min(100).max(300).optional(),\n\n /**\n * Minimum characters before splitting into a new chunk.\n */\n minChunkLength: z.number().int().min(0).max(100).optional(),\n\n /**\n * Text normalization for English and Chinese. Helps stability with numbers.\n */\n normalize: z.boolean().optional(),\n\n /**\n * Maximum audio tokens to generate per text chunk.\n */\n maxNewTokens: z.number().int().positive().optional(),\n\n /**\n * Values above 1.0 discourage repeated audio patterns.\n */\n repetitionPenalty: z.number().optional(),\n\n /**\n * Reuse prior audio as context for voice consistency across chunks.\n */\n conditionOnPreviousChunks: z.boolean().optional(),\n\n /**\n * Early-stop threshold used in batch processing.\n */\n earlyStopThreshold: z.number().min(0).max(1).optional(),\n\n /**\n * Request-scoped flags passed through to the inference backend, e.g.\n * `['quality-guard']`.\n */\n features: z.array(z.string()).optional(),\n});\n\nexport type FishAudioSpeechModelOptions = z.infer<\n typeof fishAudioSpeechModelOptionsSchema\n>;\n","import type { SharedV4Warning, TranscriptionModelV4 } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertBase64ToUint8Array,\n createJsonResponseHandler,\n mediaTypeToExtension,\n parseProviderOptions,\n postFormDataToApi,\n serializeModelOptions,\n WORKFLOW_DESERIALIZE,\n WORKFLOW_SERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { FishAudioConfig } from './fish-audio-config';\nimport { fishAudioFailedResponseHandler } from './fish-audio-error';\nimport { fishAudioTranscriptionModelOptionsSchema } from './fish-audio-transcription-model-options';\nimport type { FishAudioTranscriptionModelId } from './fish-audio-transcription-options';\n\ninterface FishAudioTranscriptionModelConfig extends FishAudioConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FishAudioTranscriptionModel implements TranscriptionModelV4 {\n readonly specificationVersion = 'v4';\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: FishAudioTranscriptionModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: FishAudioTranscriptionModelId;\n config: FishAudioTranscriptionModelConfig;\n }) {\n return new FishAudioTranscriptionModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: FishAudioTranscriptionModelId,\n private readonly config: FishAudioTranscriptionModelConfig,\n ) {}\n\n private async getArgs({\n audio,\n mediaType,\n providerOptions,\n }: Parameters<TranscriptionModelV4['doGenerate']>[0]) {\n const warnings: SharedV4Warning[] = [];\n\n const fishAudioOptions = await parseProviderOptions({\n provider: 'fishAudio',\n providerOptions,\n schema: fishAudioTranscriptionModelOptionsSchema,\n });\n\n const formData = new FormData();\n const blob =\n audio instanceof Uint8Array\n ? new Blob([audio])\n : new Blob([convertBase64ToUint8Array(audio)]);\n\n formData.append(\n 'audio',\n new File([blob], 'audio', { type: mediaType }),\n `audio.${mediaTypeToExtension(mediaType)}`,\n );\n\n if (fishAudioOptions?.language != null) {\n formData.append('language', fishAudioOptions.language);\n }\n\n // Fish Audio defaults `ignore_timestamps` to true, which leaves the\n // transcription result without segments. Request timestamps by default and\n // let callers opt back out.\n formData.append(\n 'ignore_timestamps',\n String(fishAudioOptions?.ignoreTimestamps ?? false),\n );\n\n return { formData, warnings };\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({ path: '/v1/asr', modelId: this.modelId }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n formData,\n failedResponseHandler: fishAudioFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n fishAudioTranscriptionResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const segments =\n response.segments?.map(segment => ({\n text: segment.text,\n startSecond: segment.start,\n endSecond: segment.end,\n })) ?? [];\n\n return {\n text: response.text,\n segments,\n // `language_code` is absent from the documented response schema but is\n // returned in practice, and reflects the detected language rather than\n // the requested one.\n language: response.language_code ?? 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 ...(response.language != null && {\n providerMetadata: {\n fishAudio: {\n // Human-readable display name, e.g. `English`. Its exact form is\n // not guaranteed, so `language` above (the ISO-639-1 code) is the\n // value to branch on.\n language: response.language,\n },\n },\n }),\n };\n }\n}\n\nconst fishAudioTranscriptionResponseSchema = z.object({\n text: z.string(),\n // `language` and `language_code` are undocumented but returned in practice.\n // Human-readable name, e.g. `English`.\n language: z.string().nullish(),\n // ISO-639-1 code, e.g. `en`.\n language_code: z.string().nullish(),\n duration: z.number().nullish(),\n segments: z\n .array(\n z.object({\n text: z.string(),\n start: z.number(),\n end: z.number(),\n }),\n )\n .nullish(),\n});\n","import { z } from 'zod/v4';\n\n// https://docs.fish.audio/api-reference/endpoint/openapi-v1/speech-to-text\nexport const fishAudioTranscriptionModelOptionsSchema = z.object({\n /**\n * Language of the audio.\n *\n * A hint only. Fish Audio passes it to the model, but auto-detection is\n * authoritative and overrides it, so this changes neither the transcript nor\n * the reported language. The detected language is reported as\n * `result.language`.\n */\n language: z.string().optional(),\n\n /**\n * Whether to skip precise timestamps. Mirrors the Fish Audio\n * `ignore_timestamps` parameter, whose API default is `true`.\n *\n * This provider defaults it to `false` so that `result.segments` is\n * populated. Fish Audio documents an added latency cost for audio shorter\n * than 30 seconds; set this to `true` to trade segments for that latency.\n */\n ignoreTimestamps: z.boolean().optional(),\n});\n\nexport type FishAudioTranscriptionModelOptions = z.infer<\n typeof fishAudioTranscriptionModelOptionsSchema\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":";AAAA;AAAA,EACE;AAAA,OAIK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAEK;;;ACTP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACTP,SAAS,sCAAsC;AAC/C,SAAS,SAAS;AAKX,IAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,QAAQ,EAAE,OAAO,EAAE,QAAQ;AAAA,EAC3B,SAAS,EAAE,OAAO,EAAE,QAAQ;AAC9B,CAAC;AAIM,IAAM,iCAAiC,+BAA+B;AAAA,EAC3E,aAAa;AAAA,EACb,gBAAgB,UAAK;AAfvB;AAe0B,sBAAK,YAAL,YAAgB;AAAA;AAC1C,CAAC;;;AChBD,SAAS,KAAAA,UAAS;AAGX,IAAM,oCAAoCA,GAAE,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASxD,aAAaA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,MAAMA,GAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjE,YAAYA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKjD,YAAYA,GACT,MAAM,CAACA,GAAE,QAAQ,EAAE,GAAGA,GAAE,QAAQ,GAAG,GAAGA,GAAE,QAAQ,GAAG,CAAC,CAAC,EACrD,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,aAAaA,GACV,MAAM;AAAA,IACLA,GAAE,QAAQ,IAAK;AAAA,IACfA,GAAE,QAAQ,IAAM;AAAA,IAChBA,GAAE,QAAQ,IAAM;AAAA,IAChBA,GAAE,QAAQ,IAAM;AAAA,IAChBA,GAAE,QAAQ,IAAM;AAAA,EAClB,CAAC,EACA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,SAASA,GAAE,KAAK,CAAC,OAAO,UAAU,UAAU,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKxD,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO5B,mBAAmBA,GAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMxC,aAAaA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAK/C,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKxC,aAAaA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKzD,gBAAgBA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAK1D,WAAWA,GAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKhC,cAAcA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKnD,mBAAmBA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKvC,2BAA2BA,GAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKhD,oBAAoBA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMtD,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AACzC,CAAC;;;AFpFD,IAAM,oBAA6C;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,iBAAwC;AAG9C,IAAM,YAAY;AAClB,IAAM,YAAY;AAElB,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AACF,GAG0B;AACxB,MAAI,gBAAgB,MAAM;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,aAAa,YAAY;AAC5C,QAAM,UAAU,kBAAkB,KAAK,YAAU,WAAW,UAAU;AAEtE,MAAI,WAAW,MAAM;AACnB,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,kDAAkD,YAAY,sBAAsB,cAAc,2BAA2B,kBAAkB,KAAK,IAAI,CAAC;AAAA,IACpK,CAAC;AACD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,IAAM,uBAAN,MAAM,sBAA8C;AAAA,EAqBzD,YACW,SACQ,QACjB;AAFS;AACQ;AAtBnB,SAAS,uBAAuB;AAAA,EAuB7B;AAAA,EArBH,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,QAAQ,kBAAkB,EAAE,OAA6B;AACvD,WAAO,sBAAsB;AAAA,MAC3B,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ,oBAAoB,EAAE,SAG3B;AACD,WAAO,IAAI,sBAAqB,QAAQ,SAAS,QAAQ,MAAM;AAAA,EACjE;AAAA,EAOA,MAAc,QAAQ;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAA+C;AAnGjD;AAoGI,UAAM,WAA8B,CAAC;AAErC,UAAM,mBAAmB,MAAM,qBAAqB;AAAA,MAClD,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,SAAS,cAAc,EAAE,cAAc,SAAS,CAAC;AAEvD,UAAM,cAAuC;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAIA,UAAM,eAAc,0DAAkB,gBAAlB,YAAiC;AACrD,QAAI,eAAe,MAAM;AACvB,kBAAY,eAAe;AAAA,IAC7B;AAEA,UAAM,UAAmC,CAAC;AAE1C,QAAI,SAAS,MAAM;AACjB,UAAI,SAAS,aAAa,SAAS,WAAW;AAC5C,gBAAQ,QAAQ;AAAA,MAClB,OAAO;AACL,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,oCAAoC,SAAS,QAAQ,SAAS;AAAA,QACzE,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAI,qDAAkB,WAAU,MAAM;AACpC,cAAQ,SAAS,iBAAiB;AAAA,IACpC;AAEA,SAAI,qDAAkB,sBAAqB,MAAM;AAI/C,UAAI,KAAK,YAAY,MAAM;AACzB,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SACE;AAAA,QACJ,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ,qBAAqB,iBAAiB;AAAA,MAChD;AAAA,IACF;AAEA,QAAI,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AACnC,kBAAY,UAAU;AAAA,IACxB;AAEA,QAAI,YAAY,MAAM;AACpB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,QAAI,gBAAgB,MAAM;AACxB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,QAAI,oBAAoB,MAAM;AAC5B,UAAI,iBAAiB,cAAc,MAAM;AACvC,oBAAY,cAAc,iBAAiB;AAAA,MAC7C;AAEA,UAAI,iBAAiB,cAAc,MAAM;AACvC,YAAI,WAAW,OAAO;AACpB,sBAAY,cAAc,iBAAiB;AAAA,QAC7C,OAAO;AACL,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,qEAAqE,MAAM;AAAA,UACtF,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,iBAAiB,eAAe,MAAM;AACxC,YAAI,WAAW,QAAQ;AACrB,sBAAY,eAAe,iBAAiB;AAAA,QAC9C,OAAO;AACL,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,uEAAuE,MAAM;AAAA,UACxF,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,iBAAiB,WAAW,MAAM;AACpC,oBAAY,UAAU,iBAAiB;AAAA,MACzC;AAEA,UAAI,iBAAiB,eAAe,MAAM;AACxC,oBAAY,cAAc,iBAAiB;AAAA,MAC7C;AAEA,UAAI,iBAAiB,QAAQ,MAAM;AACjC,oBAAY,QAAQ,iBAAiB;AAAA,MACvC;AAEA,UAAI,iBAAiB,eAAe,MAAM;AACxC,oBAAY,eAAe,iBAAiB;AAAA,MAC9C;AAEA,UAAI,iBAAiB,kBAAkB,MAAM;AAC3C,oBAAY,mBAAmB,iBAAiB;AAAA,MAClD;AAEA,UAAI,iBAAiB,aAAa,MAAM;AACtC,oBAAY,YAAY,iBAAiB;AAAA,MAC3C;AAEA,UAAI,iBAAiB,gBAAgB,MAAM;AACzC,oBAAY,iBAAiB,iBAAiB;AAAA,MAChD;AAEA,UAAI,iBAAiB,qBAAqB,MAAM;AAC9C,oBAAY,qBAAqB,iBAAiB;AAAA,MACpD;AAEA,UAAI,iBAAiB,6BAA6B,MAAM;AACtD,oBAAY,+BACV,iBAAiB;AAAA,MACrB;AAEA,UAAI,iBAAiB,sBAAsB,MAAM;AAC/C,oBAAY,uBAAuB,iBAAiB;AAAA,MACtD;AAEA,UAAI,iBAAiB,YAAY,MAAM;AACrC,oBAAY,WAAW,iBAAiB;AAAA,MAC1C;AAAA,IACF;AAEA,WAAO,EAAE,aAAa,SAAS;AAAA,EACjC;AAAA,EAEA,MAAM,WACJ,SAC2D;AAlQ/D;AAmQI,UAAM,eAAc,sBAAK,OAAO,cAAZ,mBAAuB,gBAAvB,4CAA0C,oBAAI,KAAK;AACvE,UAAM,EAAE,aAAa,SAAS,IAAI,MAAM,KAAK,QAAQ,OAAO;AAE5D,UAAM;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,MACA,UAAU;AAAA,IACZ,IAAI,MAAM,cAAc;AAAA,MACtB,KAAK,KAAK,OAAO,IAAI,EAAE,MAAM,WAAW,SAAS,KAAK,QAAQ,CAAC;AAAA;AAAA;AAAA,MAG/D,SAAS;AAAA,SACP,gBAAK,QAAO,YAAZ;AAAA,QACA,EAAE,OAAO,KAAK,QAAQ;AAAA,QACtB,QAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,MACN,uBAAuB;AAAA,MACvB,2BAA2B,4BAA4B;AAAA,MACvD,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS;AAAA,QACP,MAAM,KAAK,UAAU,WAAW;AAAA,MAClC;AAAA,MACA,UAAU;AAAA,QACR,WAAW;AAAA,QACX,SAAS,KAAK;AAAA,QACd,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;;;AGvSA;AAAA,EACE,kBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,wBAAAC;AAAA,EACA;AAAA,EACA,yBAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,sBAAAC;AAAA,OACK;AACP,SAAS,KAAAC,UAAS;;;ACZlB,SAAS,KAAAC,UAAS;AAGX,IAAM,2CAA2CA,GAAE,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS/D,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU9B,kBAAkBA,GAAE,QAAQ,EAAE,SAAS;AACzC,CAAC;;;ADCM,IAAM,8BAAN,MAAM,6BAA4D;AAAA,EAqBvE,YACW,SACQ,QACjB;AAFS;AACQ;AAtBnB,SAAS,uBAAuB;AAAA,EAuB7B;AAAA,EArBH,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,QAAQC,mBAAkB,EAAE,OAAoC;AAC9D,WAAOC,uBAAsB;AAAA,MAC3B,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEA,QAAQC,qBAAoB,EAAE,SAG3B;AACD,WAAO,IAAI,6BAA4B,QAAQ,SAAS,QAAQ,MAAM;AAAA,EACxE;AAAA,EAOA,MAAc,QAAQ;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAsD;AAtDxD;AAuDI,UAAM,WAA8B,CAAC;AAErC,UAAM,mBAAmB,MAAMC,sBAAqB;AAAA,MAClD,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,WAAW,IAAI,SAAS;AAC9B,UAAM,OACJ,iBAAiB,aACb,IAAI,KAAK,CAAC,KAAK,CAAC,IAChB,IAAI,KAAK,CAAC,0BAA0B,KAAK,CAAC,CAAC;AAEjD,aAAS;AAAA,MACP;AAAA,MACA,IAAI,KAAK,CAAC,IAAI,GAAG,SAAS,EAAE,MAAM,UAAU,CAAC;AAAA,MAC7C,SAAS,qBAAqB,SAAS,CAAC;AAAA,IAC1C;AAEA,SAAI,qDAAkB,aAAY,MAAM;AACtC,eAAS,OAAO,YAAY,iBAAiB,QAAQ;AAAA,IACvD;AAKA,aAAS;AAAA,MACP;AAAA,MACA,QAAO,0DAAkB,qBAAlB,YAAsC,KAAK;AAAA,IACpD;AAEA,WAAO,EAAE,UAAU,SAAS;AAAA,EAC9B;AAAA,EAEA,MAAM,WACJ,SACkE;AA5FtE;AA6FI,UAAM,eAAc,sBAAK,OAAO,cAAZ,mBAAuB,gBAAvB,4CAA0C,oBAAI,KAAK;AACvE,UAAM,EAAE,UAAU,SAAS,IAAI,MAAM,KAAK,QAAQ,OAAO;AAEzD,UAAM;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,MACA,UAAU;AAAA,IACZ,IAAI,MAAM,kBAAkB;AAAA,MAC1B,KAAK,KAAK,OAAO,IAAI,EAAE,MAAM,WAAW,SAAS,KAAK,QAAQ,CAAC;AAAA,MAC/D,SAASC,iBAAe,gBAAK,QAAO,YAAZ,6BAAyB,QAAQ,OAAO;AAAA,MAChE;AAAA,MACA,uBAAuB;AAAA,MACvB,2BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,YACJ,oBAAS,aAAT,mBAAmB,IAAI,cAAY;AAAA,MACjC,MAAM,QAAQ;AAAA,MACd,aAAa,QAAQ;AAAA,MACrB,WAAW,QAAQ;AAAA,IACrB,QAJA,YAIO,CAAC;AAEV,WAAO;AAAA,MACL,MAAM,SAAS;AAAA,MACf;AAAA;AAAA;AAAA;AAAA,MAIA,WAAU,cAAS,kBAAT,YAA0B;AAAA,MACpC,oBAAmB,cAAS,aAAT,YAAqB;AAAA,MACxC;AAAA,MACA,UAAU;AAAA,QACR,WAAW;AAAA,QACX,SAAS,KAAK;AAAA,QACd,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,MACA,GAAI,SAAS,YAAY,QAAQ;AAAA,QAC/B,kBAAkB;AAAA,UAChB,WAAW;AAAA;AAAA;AAAA;AAAA,YAIT,UAAU,SAAS;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,uCAAuCC,GAAE,OAAO;AAAA,EACpD,MAAMA,GAAE,OAAO;AAAA;AAAA;AAAA,EAGf,UAAUA,GAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,EAE7B,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAClC,UAAUA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC7B,UAAUA,GACP;AAAA,IACCA,GAAE,OAAO;AAAA,MACP,MAAMA,GAAE,OAAO;AAAA,MACf,OAAOA,GAAE,OAAO;AAAA,MAChB,KAAKA,GAAE,OAAO;AAAA,IAChB,CAAC;AAAA,EACH,EACC,QAAQ;AACb,CAAC;;;AEnKM,IAAM,UACX,OACI,WACA;;;ANsEN,IAAM,mBAAmB;AAKlB,SAAS,gBACd,UAAqC,CAAC,GACnB;AAlFrB;AAmFE,QAAM,WAAU,mBAAQ,YAAR,mBAAiB,QAAQ,OAAO,QAAhC,YAAuC;AAEvD,QAAM,aAAa,MACjB;AAAA,IACE;AAAA,MACE,eAAe,UAAU,WAAW;AAAA,QAClC,QAAQ,QAAQ;AAAA,QAChB,yBAAyB;AAAA,QACzB,aAAa;AAAA,MACf,CAAC,CAAC;AAAA,MACF,GAAG,QAAQ;AAAA,IACb;AAAA,IACA,qBAAqB,OAAO;AAAA,EAC9B;AAEF,QAAM,oBAAoB,CAAC,YACzB,IAAI,qBAAqB,SAAS;AAAA,IAChC,UAAU;AAAA,IACV,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,GAAG,IAAI;AAAA,IACpC,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAIH,QAAM,2BAA2B,CAC/B,UAAyC,mBAEzC,IAAI,4BAA4B,SAAS;AAAA,IACvC,UAAU;AAAA,IACV,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,GAAG,IAAI;AAAA,IACpC,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAEH,QAAM,WAAW,SAAU,SAAiC;AAC1D,WAAO;AAAA,MACL,QAAQ,kBAAkB,OAAO;AAAA,IACnC;AAAA,EACF;AAEA,WAAS,uBAAuB;AAChC,WAAS,SAAS;AAClB,WAAS,cAAc;AACvB,WAAS,gBAAgB;AACzB,WAAS,qBAAqB;AAG9B,WAAS,gBAAgB,CAAC,YAAoB;AAC5C,UAAM,IAAI,iBAAiB;AAAA,MACzB;AAAA,MACA,WAAW;AAAA,MACX,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,WAAS,iBAAiB,CAAC,YAAoB;AAC7C,UAAM,IAAI,iBAAiB;AAAA,MACzB;AAAA,MACA,WAAW;AAAA,MACX,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,WAAS,qBAAqB,SAAS;AAEvC,WAAS,aAAa,CAAC,YAAoB;AACzC,UAAM,IAAI,iBAAiB;AAAA,MACzB;AAAA,MACA,WAAW;AAAA,MACX,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKO,IAAM,YAAY,gBAAgB;","names":["z","combineHeaders","parseProviderOptions","serializeModelOptions","WORKFLOW_DESERIALIZE","WORKFLOW_SERIALIZE","z","z","WORKFLOW_SERIALIZE","serializeModelOptions","WORKFLOW_DESERIALIZE","parseProviderOptions","combineHeaders","z"]}
1
+ {"version":3,"sources":["../src/fish-audio-provider.ts","../src/fish-audio-speech-model.ts","../src/fish-audio-error.ts","../src/fish-audio-speech-model-options.ts","../src/fish-audio-transcription-model.ts","../src/fish-audio-transcription-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type ProviderV4,\n type SpeechModelV4,\n type TranscriptionModelV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { FishAudioSpeechModel } from './fish-audio-speech-model';\nimport type { FishAudioSpeechModelId } from './fish-audio-speech-options';\nimport { FishAudioTranscriptionModel } from './fish-audio-transcription-model';\nimport type { FishAudioTranscriptionModelId } from './fish-audio-transcription-options';\nimport { VERSION } from './version';\n\nexport interface FishAudioProvider extends ProviderV4 {\n (\n modelId: FishAudioSpeechModelId,\n settings?: {},\n ): {\n speech: FishAudioSpeechModel;\n };\n\n /**\n * Creates a model for speech generation.\n */\n speech(modelId: FishAudioSpeechModelId): SpeechModelV4;\n\n /**\n * Creates a model for speech generation.\n *\n * Narrowed to required: Fish Audio always provides speech models.\n */\n speechModel(modelId: FishAudioSpeechModelId): SpeechModelV4;\n\n /**\n * Creates a model for transcription.\n */\n transcription(modelId?: FishAudioTranscriptionModelId): TranscriptionModelV4;\n\n /**\n * Creates a model for transcription.\n *\n * Narrowed to required: Fish Audio always provides a transcription model.\n */\n transcriptionModel(\n modelId?: FishAudioTranscriptionModelId,\n ): TranscriptionModelV4;\n}\n\nexport interface FishAudioProviderSettings {\n /**\n * API key for authenticating requests.\n */\n apiKey?: string;\n\n /**\n * Base URL for the API calls.\n */\n baseURL?: 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\nconst DEFAULT_BASE_URL = 'https://api.fish.audio';\n\n/**\n * Create a Fish Audio provider instance.\n */\nexport function createFishAudio(\n options: FishAudioProviderSettings = {},\n): FishAudioProvider {\n const baseURL = options.baseURL?.replace(/\\/$/, '') ?? DEFAULT_BASE_URL;\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'FISH_AUDIO_API_KEY',\n description: 'Fish Audio',\n })}`,\n ...options.headers,\n },\n `ai-sdk/fish-audio/${VERSION}`,\n );\n\n const createSpeechModel = (modelId: FishAudioSpeechModelId) =>\n new FishAudioSpeechModel(modelId, {\n provider: 'fish-audio.speech',\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n // `/v1/asr` has no model selector, so the model ID is a routing label and\n // defaults to `transcribe-1`.\n const createTranscriptionModel = (\n modelId: FishAudioTranscriptionModelId = 'transcribe-1',\n ) =>\n new FishAudioTranscriptionModel(modelId, {\n provider: 'fish-audio.transcription',\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider = function (modelId: FishAudioSpeechModelId) {\n return {\n speech: createSpeechModel(modelId),\n };\n };\n\n provider.specificationVersion = 'v4' as const;\n provider.speech = createSpeechModel;\n provider.speechModel = createSpeechModel;\n provider.transcription = createTranscriptionModel;\n provider.transcriptionModel = createTranscriptionModel;\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: 'Fish Audio does not provide language models',\n });\n };\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n message: 'Fish Audio 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: 'Fish Audio does not provide image models',\n });\n };\n\n return provider as FishAudioProvider;\n}\n\n/**\n * Default Fish Audio provider instance.\n */\nexport const fishAudio = createFishAudio();\n","import type { SharedV4Warning, SpeechModelV4 } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createBinaryResponseHandler,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_DESERIALIZE,\n WORKFLOW_SERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport type { FishAudioConfig } from './fish-audio-config';\nimport { fishAudioFailedResponseHandler } from './fish-audio-error';\nimport type {\n FishAudioSpeechAPITypes,\n FishAudioSpeechFormat,\n FishAudioProsodyControl,\n} from './fish-audio-speech-api-types';\nimport { fishAudioSpeechModelOptionsSchema } from './fish-audio-speech-model-options';\nimport type { FishAudioSpeechModelId } from './fish-audio-speech-options';\n\ninterface FishAudioSpeechModelConfig extends FishAudioConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nconst SUPPORTED_FORMATS: FishAudioSpeechFormat[] = [\n 'wav',\n 'pcm',\n 'mp3',\n 'opus',\n];\n\nconst DEFAULT_FORMAT: FishAudioSpeechFormat = 'mp3';\n\n// Fish Audio accepts `prosody.speed` between 0.5 and 2.0.\nconst MIN_SPEED = 0.5;\nconst MAX_SPEED = 2;\n\nfunction resolveFormat({\n outputFormat,\n warnings,\n}: {\n outputFormat: string | undefined;\n warnings: SharedV4Warning[];\n}): FishAudioSpeechFormat {\n if (outputFormat == null) {\n return DEFAULT_FORMAT;\n }\n\n const normalized = outputFormat.toLowerCase();\n const matched = SUPPORTED_FORMATS.find(format => format === normalized);\n\n if (matched == null) {\n warnings.push({\n type: 'unsupported',\n feature: 'outputFormat',\n details: `Fish Audio does not support the output format \"${outputFormat}\". Falling back to ${DEFAULT_FORMAT}. Supported formats are ${SUPPORTED_FORMATS.join(', ')}.`,\n });\n return DEFAULT_FORMAT;\n }\n\n return matched;\n}\n\nexport class FishAudioSpeechModel implements SpeechModelV4 {\n readonly specificationVersion = 'v4';\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: FishAudioSpeechModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: FishAudioSpeechModelId;\n config: FishAudioSpeechModelConfig;\n }) {\n return new FishAudioSpeechModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: FishAudioSpeechModelId,\n private readonly config: FishAudioSpeechModelConfig,\n ) {}\n\n private async getArgs({\n text,\n voice,\n outputFormat,\n instructions,\n language,\n speed,\n providerOptions,\n }: Parameters<SpeechModelV4['doGenerate']>[0]) {\n const warnings: SharedV4Warning[] = [];\n\n const fishAudioOptions = await parseProviderOptions({\n provider: 'fishAudio',\n providerOptions,\n schema: fishAudioSpeechModelOptionsSchema,\n });\n\n const format = resolveFormat({ outputFormat, warnings });\n\n const requestBody: FishAudioSpeechAPITypes = {\n text,\n format,\n };\n\n // `providerOptions.fishAudio.referenceId` wins over the generic `voice` so\n // that multi-speaker arrays are expressible.\n const referenceId = fishAudioOptions?.referenceId ?? voice;\n if (referenceId != null) {\n requestBody.reference_id = referenceId;\n }\n\n const prosody: FishAudioProsodyControl = {};\n\n if (speed != null) {\n if (speed >= MIN_SPEED && speed <= MAX_SPEED) {\n prosody.speed = speed;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'speed',\n details: `Fish Audio speed must be between ${MIN_SPEED} and ${MAX_SPEED}. The speed option was ignored.`,\n });\n }\n }\n\n if (fishAudioOptions?.volume != null) {\n prosody.volume = fishAudioOptions.volume;\n }\n\n if (fishAudioOptions?.normalizeLoudness != null) {\n // Fish Audio accepts `normalize_loudness` on s1 but ignores it, so warn\n // rather than let it silently do nothing. Only s1 is known to ignore it;\n // unrecognized model IDs are left alone.\n if (this.modelId === 's1') {\n warnings.push({\n type: 'unsupported',\n feature: 'providerOptions.fishAudio.normalizeLoudness',\n details:\n 'Fish Audio ignores normalizeLoudness on s1. It is supported by the S2 family (s2-pro, s2.1-pro).',\n });\n } else {\n prosody.normalize_loudness = fishAudioOptions.normalizeLoudness;\n }\n }\n\n if (Object.keys(prosody).length > 0) {\n requestBody.prosody = prosody;\n }\n\n if (language != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'language',\n details:\n 'Fish Audio infers the language from the input text and the selected voice, and has no language parameter. The language option was ignored.',\n });\n }\n\n if (instructions != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'instructions',\n details:\n 'Fish Audio does not support instructions. The instructions option was ignored.',\n });\n }\n\n if (fishAudioOptions != null) {\n if (fishAudioOptions.sampleRate != null) {\n requestBody.sample_rate = fishAudioOptions.sampleRate;\n }\n\n if (fishAudioOptions.mp3Bitrate != null) {\n if (format === 'mp3') {\n requestBody.mp3_bitrate = fishAudioOptions.mp3Bitrate;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'providerOptions.fishAudio.mp3Bitrate',\n details: `mp3Bitrate only applies to mp3 output. The option was ignored for ${format} output.`,\n });\n }\n }\n\n if (fishAudioOptions.opusBitrate != null) {\n if (format === 'opus') {\n requestBody.opus_bitrate = fishAudioOptions.opusBitrate;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'providerOptions.fishAudio.opusBitrate',\n details: `opusBitrate only applies to opus output. The option was ignored for ${format} output.`,\n });\n }\n }\n\n if (fishAudioOptions.latency != null) {\n requestBody.latency = fishAudioOptions.latency;\n }\n\n if (fishAudioOptions.temperature != null) {\n requestBody.temperature = fishAudioOptions.temperature;\n }\n\n if (fishAudioOptions.topP != null) {\n requestBody.top_p = fishAudioOptions.topP;\n }\n\n if (fishAudioOptions.chunkLength != null) {\n requestBody.chunk_length = fishAudioOptions.chunkLength;\n }\n\n if (fishAudioOptions.minChunkLength != null) {\n requestBody.min_chunk_length = fishAudioOptions.minChunkLength;\n }\n\n if (fishAudioOptions.normalize != null) {\n requestBody.normalize = fishAudioOptions.normalize;\n }\n\n if (fishAudioOptions.maxNewTokens != null) {\n requestBody.max_new_tokens = fishAudioOptions.maxNewTokens;\n }\n\n if (fishAudioOptions.repetitionPenalty != null) {\n requestBody.repetition_penalty = fishAudioOptions.repetitionPenalty;\n }\n\n if (fishAudioOptions.conditionOnPreviousChunks != null) {\n requestBody.condition_on_previous_chunks =\n fishAudioOptions.conditionOnPreviousChunks;\n }\n\n if (fishAudioOptions.earlyStopThreshold != null) {\n requestBody.early_stop_threshold = fishAudioOptions.earlyStopThreshold;\n }\n\n if (fishAudioOptions.features != null) {\n requestBody.features = fishAudioOptions.features;\n }\n }\n\n return { requestBody, warnings };\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({ path: '/v1/tts', modelId: this.modelId }),\n // Fish Audio selects the TTS model with a `model` HTTP header rather\n // than a request body field.\n headers: combineHeaders(\n this.config.headers?.(),\n { model: this.modelId },\n options.headers,\n ),\n body: requestBody,\n failedResponseHandler: fishAudioFailedResponseHandler,\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 { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// Fish Audio returns `{ status, message }` for documented error responses\n// (401 no permission, 402 no payment).\n// https://docs.fish.audio/api-reference/endpoint/openapi-v1/text-to-speech\nexport const fishAudioErrorDataSchema = z.object({\n status: z.number().nullish(),\n message: z.string().nullish(),\n});\n\nexport type FishAudioErrorData = z.infer<typeof fishAudioErrorDataSchema>;\n\nexport const fishAudioFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: fishAudioErrorDataSchema,\n errorToMessage: data => data.message ?? 'Unknown Fish Audio error',\n});\n","import { z } from 'zod/v4';\n\n// https://docs.fish.audio/api-reference/endpoint/openapi-v1/text-to-speech\nexport const fishAudioSpeechModelOptionsSchema = z.object({\n /**\n * Voice model ID(s). A single ID selects one speaker; an array enables\n * multi-speaker dialogue (S2-Pro models), in which case the text must mark\n * turns with speaker tokens such as `<|speaker:0|>`. The speaker index maps\n * to the position in this array.\n *\n * Takes precedence over the top-level `voice` option.\n */\n referenceId: z.union([z.string(), z.array(z.string())]).optional(),\n\n /**\n * Output sample rate in Hz. Falls back to the format default when unset\n * (44100 Hz for wav/pcm/mp3, 48000 Hz for opus).\n */\n sampleRate: z.number().int().positive().optional(),\n\n /**\n * Bitrate in kbps for mp3 output. Ignored for other formats.\n */\n mp3Bitrate: z\n .union([z.literal(64), z.literal(128), z.literal(192)])\n .optional(),\n\n /**\n * Bitrate in bps for opus output, where `-1000` selects automatic. Ignored\n * for other formats.\n */\n opusBitrate: z\n .union([\n z.literal(-1000),\n z.literal(24_000),\n z.literal(32_000),\n z.literal(48_000),\n z.literal(64_000),\n ])\n .optional(),\n\n /**\n * Latency/quality tradeoff. `normal` gives the best quality, `balanced`\n * reduces latency, and `low` is the fastest.\n */\n latency: z.enum(['low', 'normal', 'balanced']).optional(),\n\n /**\n * Volume offset in dB. Negative values are quieter.\n */\n volume: z.number().optional(),\n\n /**\n * Loudness normalization. Supported by the S2 family (`s2-pro` and\n * `s2.1-pro`). Fish Audio accepts it on `s1` but ignores it, so the provider\n * emits a warning in that case.\n */\n normalizeLoudness: z.boolean().optional(),\n\n /**\n * Governs expressiveness. Higher values are more varied, lower values more\n * consistent.\n */\n temperature: z.number().min(0).max(1).optional(),\n\n /**\n * Controls diversity via nucleus sampling.\n */\n topP: z.number().min(0).max(1).optional(),\n\n /**\n * Text segment size for processing.\n */\n chunkLength: z.number().int().min(100).max(300).optional(),\n\n /**\n * Minimum characters before splitting into a new chunk.\n */\n minChunkLength: z.number().int().min(0).max(100).optional(),\n\n /**\n * Text normalization for English and Chinese. Helps stability with numbers.\n */\n normalize: z.boolean().optional(),\n\n /**\n * Maximum audio tokens to generate per text chunk.\n */\n maxNewTokens: z.number().int().positive().optional(),\n\n /**\n * Values above 1.0 discourage repeated audio patterns.\n */\n repetitionPenalty: z.number().optional(),\n\n /**\n * Reuse prior audio as context for voice consistency across chunks.\n */\n conditionOnPreviousChunks: z.boolean().optional(),\n\n /**\n * Early-stop threshold used in batch processing.\n */\n earlyStopThreshold: z.number().min(0).max(1).optional(),\n\n /**\n * Request-scoped flags passed through to the inference backend, e.g.\n * `['quality-guard']`.\n */\n features: z.array(z.string()).optional(),\n});\n\nexport type FishAudioSpeechModelOptions = z.infer<\n typeof fishAudioSpeechModelOptionsSchema\n>;\n","import type { SharedV4Warning, TranscriptionModelV4 } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertBase64ToUint8Array,\n createJsonResponseHandler,\n mediaTypeToExtension,\n parseProviderOptions,\n postFormDataToApi,\n serializeModelOptions,\n WORKFLOW_DESERIALIZE,\n WORKFLOW_SERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { FishAudioConfig } from './fish-audio-config';\nimport { fishAudioFailedResponseHandler } from './fish-audio-error';\nimport { fishAudioTranscriptionModelOptionsSchema } from './fish-audio-transcription-model-options';\nimport type { FishAudioTranscriptionModelId } from './fish-audio-transcription-options';\n\ninterface FishAudioTranscriptionModelConfig extends FishAudioConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FishAudioTranscriptionModel implements TranscriptionModelV4 {\n readonly specificationVersion = 'v4';\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: FishAudioTranscriptionModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: FishAudioTranscriptionModelId;\n config: FishAudioTranscriptionModelConfig;\n }) {\n return new FishAudioTranscriptionModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: FishAudioTranscriptionModelId,\n private readonly config: FishAudioTranscriptionModelConfig,\n ) {}\n\n private async getArgs({\n audio,\n mediaType,\n providerOptions,\n }: Parameters<TranscriptionModelV4['doGenerate']>[0]) {\n const warnings: SharedV4Warning[] = [];\n\n const fishAudioOptions = await parseProviderOptions({\n provider: 'fishAudio',\n providerOptions,\n schema: fishAudioTranscriptionModelOptionsSchema,\n });\n\n const formData = new FormData();\n const blob =\n audio instanceof Uint8Array\n ? new Blob([audio])\n : new Blob([convertBase64ToUint8Array(audio)]);\n\n formData.append(\n 'audio',\n new File([blob], 'audio', { type: mediaType }),\n `audio.${mediaTypeToExtension(mediaType)}`,\n );\n\n if (fishAudioOptions?.language != null) {\n formData.append('language', fishAudioOptions.language);\n }\n\n // Fish Audio defaults `ignore_timestamps` to true, which leaves the\n // transcription result without segments. Request timestamps by default and\n // let callers opt back out.\n formData.append(\n 'ignore_timestamps',\n String(fishAudioOptions?.ignoreTimestamps ?? false),\n );\n\n return { formData, warnings };\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({ path: '/v1/asr', modelId: this.modelId }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n formData,\n failedResponseHandler: fishAudioFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n fishAudioTranscriptionResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const segments =\n response.segments?.map(segment => ({\n text: segment.text,\n startSecond: segment.start,\n endSecond: segment.end,\n })) ?? [];\n\n return {\n text: response.text,\n segments,\n // `language_code` is absent from the documented response schema but is\n // returned in practice, and reflects the detected language rather than\n // the requested one.\n language: response.language_code ?? 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 ...(response.language != null && {\n providerMetadata: {\n fishAudio: {\n // Human-readable display name, e.g. `English`. Its exact form is\n // not guaranteed, so `language` above (the ISO-639-1 code) is the\n // value to branch on.\n language: response.language,\n },\n },\n }),\n };\n }\n}\n\nconst fishAudioTranscriptionResponseSchema = z.object({\n text: z.string(),\n // `language` and `language_code` are undocumented but returned in practice.\n // Human-readable name, e.g. `English`.\n language: z.string().nullish(),\n // ISO-639-1 code, e.g. `en`.\n language_code: z.string().nullish(),\n duration: z.number().nullish(),\n segments: z\n .array(\n z.object({\n text: z.string(),\n start: z.number(),\n end: z.number(),\n }),\n )\n .nullish(),\n});\n","import { z } from 'zod/v4';\n\n// https://docs.fish.audio/api-reference/endpoint/openapi-v1/speech-to-text\nexport const fishAudioTranscriptionModelOptionsSchema = z.object({\n /**\n * Language of the audio.\n *\n * A hint only. Fish Audio passes it to the model, but auto-detection is\n * authoritative and overrides it, so this changes neither the transcript nor\n * the reported language. The detected language is reported as\n * `result.language`.\n */\n language: z.string().optional(),\n\n /**\n * Whether to skip precise timestamps. Mirrors the Fish Audio\n * `ignore_timestamps` parameter, whose API default is `true`.\n *\n * This provider defaults it to `false` so that `result.segments` is\n * populated. Fish Audio documents an added latency cost for audio shorter\n * than 30 seconds; set this to `true` to trade segments for that latency.\n */\n ignoreTimestamps: z.boolean().optional(),\n});\n\nexport type FishAudioTranscriptionModelOptions = z.infer<\n typeof fishAudioTranscriptionModelOptionsSchema\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","combineHeaders","parseProviderOptions","serializeModelOptions","WORKFLOW_DESERIALIZE","WORKFLOW_SERIALIZE","z","z","WORKFLOW_SERIALIZE","serializeModelOptions","WORKFLOW_DESERIALIZE","parseProviderOptions","combineHeaders","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/fish-audio",
3
- "version": "3.0.24",
3
+ "version": "3.0.27",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "sideEffects": false,
@@ -30,10 +30,10 @@
30
30
  },
31
31
  "dependencies": {
32
32
  "@ai-sdk/provider": "4.0.18",
33
- "@ai-sdk/provider-utils": "5.0.46"
33
+ "@ai-sdk/provider-utils": "5.0.49"
34
34
  },
35
35
  "devDependencies": {
36
- "@ai-sdk/test-server": "2.0.1",
36
+ "@ai-sdk/test-server": "2.0.2",
37
37
  "@types/node": "22.19.19",
38
38
  "@vercel/ai-tsconfig": "0.0.0",
39
39
  "tsup": "^8.5.1",