vercel/ai · error · NoSuchModelError

No such embeddingModel: ${modelId}

Error message

No such embeddingModel: ${modelId}

What it means

The xAI provider does not implement an embedding model, so its `embeddingModel`/`textEmbeddingModel` factory deliberately throws NoSuchModelError for every modelId. xAI's API surface supported here covers language, image, and video models only. Calling xai.embeddingModel('...') or xai.textEmbeddingModel('...'), or invoking embed/embedMany with an xai model string, produces this error.

Source

Thrown at packages/xai/src/xai-provider.ts:260

  ) as RealtimeFactoryV4;

  const createFiles = () =>
    new XaiFiles({
      provider: 'xai.files',
      baseURL,
      headers: getHeaders,
      fetch: options.fetch,
    });

  const provider = (modelId: XaiResponsesModelId) =>
    createResponsesLanguageModel(modelId);

  provider.specificationVersion = 'v4' as const;
  provider.languageModel = createResponsesLanguageModel;
  provider.chat = createChatLanguageModel;
  provider.responses = createResponsesLanguageModel;
  provider.embeddingModel = (modelId: string) => {
    throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });
  };
  provider.textEmbeddingModel = provider.embeddingModel;
  provider.imageModel = createImageModel;
  provider.image = createImageModel;
  provider.videoModel = createVideoModel;
  provider.video = createVideoModel;
  provider.experimental_realtime = experimentalRealtimeFactory;
  provider.speechModel = createSpeechModel;
  provider.speech = createSpeechModel;
  provider.transcriptionModel = createTranscriptionModel;
  provider.transcription = createTranscriptionModel;
  provider.files = createFiles;
  provider.tools = xaiTools;

  return provider;
}

export const xai = createXai();

View on GitHub (pinned to 69428b1f8b)

Solutions

  1. Use a provider that implements embeddings, e.g. openai.textEmbeddingModel('text-embedding-3-small') or another supported embedding provider.
  2. Call embed/embedMany with a textEmbedding model from a capable provider instead of xai.
  3. If xAI embedding support is needed, check for a newer @ai-sdk/xai release or file/track a feature request.

Example fix

// before
const { embedding } = await embed({ model: xai.textEmbeddingModel('grok-embed'), value: 'hi' });

// after
import { createOpenAI } from '@ai-sdk/openai';
const openai = createOpenAI();
const { embedding } = await embed({ model: openai.textEmbeddingModel('text-embedding-3-small'), value: 'hi' });
Defensive patterns

Strategy: fallback

Validate before calling

const XAI_SUPPORTS_EMBEDDINGS = false;
function resolveEmbeddingModel(provider: 'xai' | 'openai') {
  if (provider === 'xai' && !XAI_SUPPORTS_EMBEDDINGS) {
    return openai.textEmbeddingModel('text-embedding-3-small');
  }
  // ...
}

Type guard

function providerSupportsEmbeddings(p: unknown): p is { textEmbeddingModel: (id: string) => unknown } {
  return typeof (p as any)?.textEmbeddingModel === 'function' &&
    !(p as any).textEmbeddingModel.toString().includes('NoSuchModelError');
}

Try / catch

try {
  return await embed({ model: xai.textEmbeddingModel(id), value });
} catch (e) {
  if (NoSuchModelError.isInstance(e) && e.modelType === 'embeddingModel') {
    return await embed({ model: openai.textEmbeddingModel('text-embedding-3-small'), value });
  }
  throw e;
}

Prevention

When it happens

Trigger: xai.embeddingModel('grok-embedding') or xai.textEmbeddingModel('...') called directly; embed()/embedMany() with model: xai('some-id'); provider factory strings like xai.embeddingModel in generic model-selection code.

Common situations: Mistaking xAI for a provider with embedding support; switching a project's embedding provider from OpenAI to xAI without checking capability; generic code that resolves models by provider string without capability checks.

Related errors


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