vercel/ai · error · NoSuchModelError

ElevenLabs does not provide language models

Error message

ElevenLabs does not provide language models

What it means

ElevenLabs provides speech and transcription models only; its languageModel factory always throws NoSuchModelError with the custom message 'ElevenLabs does not provide language models'. The stub satisfies the Provider interface and fails fast instead of silently returning an invalid model.

Source

Thrown at packages/elevenlabs/src/elevenlabs-provider.ts:116

      url: ({ path }) => `https://api.elevenlabs.io${path}`,
      headers: getHeaders,
      fetch: options.fetch,
    });

  const provider = function (modelId: ElevenLabsTranscriptionModelId) {
    return {
      transcription: createTranscriptionModel(modelId),
    };
  };

  provider.specificationVersion = 'v4' as const;
  provider.transcription = createTranscriptionModel;
  provider.transcriptionModel = createTranscriptionModel;
  provider.speech = createSpeechModel;
  provider.speechModel = createSpeechModel;

  provider.languageModel = (modelId: string) => {
    throw new NoSuchModelError({
      modelId,
      modelType: 'languageModel',
      message: 'ElevenLabs does not provide language models',
    });
  };

  provider.embeddingModel = (modelId: string) => {
    throw new NoSuchModelError({
      modelId,
      modelType: 'embeddingModel',
      message: 'ElevenLabs does not provide embedding models',
    });
  };
  provider.textEmbeddingModel = provider.embeddingModel;

  provider.imageModel = (modelId: string) => {
    throw new NoSuchModelError({
      modelId,

View on GitHub (pinned to 69428b1f8b)

Solutions

  1. Use a chat-capable provider (e.g. @ai-sdk/openai, @ai-sdk/anthropic, @ai-sdk/deepseek) for generateText/streamText.
  2. Use elevenLabs.speech() with streamText-free speech APIs (or elevenlabs.transcription) for its actual capabilities.
  3. If chaining voice pipelines, run the LLM on another provider and pass its text output to ElevenLabs speech().

Example fix

// before
const { text } = await generateText({ model: elevenlabs.languageModel('eleven_turbo'), prompt });

// after
const { text } = await generateText({ model: openai('gpt-4o'), prompt });
const audio = await experimental_generateSpeech({ model: elevenlabs.speech('eleven_turbo_v2_5'), text });
Defensive patterns

Strategy: validation

Validate before calling

function supportsLanguageModels(provider: unknown): boolean {
  return !/elevenlabs/i.test((provider as any)?.provider ?? '');
}

Type guard

function isChatCapable(p: any): p is { languageModel: (id: string) => unknown } {
  return typeof p?.languageModel === 'function' && !/elevenlabs/i.test(p?.provider ?? '');
}

Try / catch

try {
  await generateText({ model: provider.languageModel(id), prompt });
} catch (e) {
  if (NoSuchModelError.isInstance(e) && e.modelType === 'languageModel') {
    throw new Error('ElevenLabs is audio-only; use a chat provider for generateText.');
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling generateText/streamText with elevenLabs('some-id') or invoking provider.languageModel('...') directly.

Common situations: Generic chat pipelines that map a configured provider to generateText, or developers confusing ElevenLabs' text-rendering (TTS) with LLM text generation.

Related errors


AI-assisted analysis of vercel/ai@69428b1f8b (2026-08-30). Data as JSON: /api/errors/fb2da129be8d51ad. Report an issue: GitHub.