{"record":{"id":"1acb3014c458d025","repo":"vercel/ai","slug":"fish-audio-does-not-provide-language-models","errorCode":null,"errorMessage":"Fish Audio does not provide language models","messagePattern":"Fish Audio does not provide language models","errorType":"exception","errorClass":"NoSuchModelError","httpStatus":null,"severity":"error","filePath":"packages/fish-audio/src/fish-audio-provider.ts","lineNumber":133,"sourceCode":"      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,","sourceCodeStart":115,"sourceCodeEnd":151,"githubUrl":"https://github.com/vercel/ai/blob/69428b1f8b037e4d118fb4853428d5c4e620493c/packages/fish-audio/src/fish-audio-provider.ts#L115-L151","documentation":"Fish Audio is a speech/transcription provider; the ProviderV4 interface requires a `languageModel` method, so the factory is implemented to always throw `NoSuchModelError` with a message explaining Fish Audio does not provide language models. Calling it is always a misuse of the provider, never a transient condition.","triggerScenarios":"Calling `fishAudio('some-id')` or `fishAudio.languageModel('some-id')` and using it with generateText/streamText/embed.","commonSituations":"Assuming fish-audio supports text generation; refactoring code that previously used an LLM provider and swapping in fishAudio; using fishAudio as a default provider for all model types.","solutions":["Use fishAudio only for its supported capabilities: speechModel (TTS) and transcription models","Use an LLM provider (e.g. @ai-sdk/openai) for generateText/streamText","Combine providers: one for text generation, fish-audio for speech/transcription"],"exampleFix":"// before\nconst model = fishAudio('speech-01');\nawait generateText({ model, prompt: 'hello' });\n// after\nconst speechModel = fishAudio.speech('speech-01');\nconst { audio } = await generateSpeech({ model: speechModel, text: 'hello' });","handlingStrategy":"try-catch","validationCode":"import { NoSuchModelError } from '@ai-sdk/provider';\n// before dispatching to fishAudio, ensure the model type is speech/transcription\nconst isSpeechUse = taskKind === 'speech' || taskKind === 'transcription';\nif (!isSpeechUse) useTextProviderInstead();","typeGuard":"function isNoSuchModelError(e: unknown): e is NoSuchModelError {\n  return NoSuchModelError.isInstance(e);\n}","tryCatchPattern":"try {\n  return await generateText({ model: fishAudio('id'), prompt });\n} catch (e) {\n  if (NoSuchModelError.isInstance(e)) {\n    return generateText({ model: openai('gpt-4o'), prompt });\n  }\n  throw e;\n}","preventionTips":["Use fish-audio only for generateSpeech and transcription workflows","Document provider capabilities in shared config to prevent misuse","For dynamic provider selection, gate on capability before calling model factories"],"tags":["unsupported-model-type","provider-api","fish-audio","typescript"],"backgroundTag":"unsupported-model-type","analyzedSha":"69428b1f8b037e4d118fb4853428d5c4e620493c","analyzedAt":"2026-08-30T12:32:21.016Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}