musistudio/claude-code-router · error · Error

Provider ${provider.name} does not declare ${kind ?? "media"

Error message

Provider ${provider.name} does not declare ${kind ?? "media"} generation support.

What it means

Even with a matching model kind, the provider entry must declare the corresponding generation capability (e.g. openai_image_generations / xai_video_generations) in its capabilities list. Providers without the capability declaration are rejected before protocol selection.

Source

Thrown at packages/core/src/media/service.ts:737

  const registry = modelRegistryForConfig(config);
  let resolved = registry.resolveProviderModel(normalizedSelector);
  if (!resolved) {
    const parsed = parseProviderModelSelector(normalizedSelector);
    const provider = parsed ? registry.findProvider(parsed.provider) : undefined;
    if (provider && isImportedGrokAgentProvider(provider) && grokMediaModelKind(parsed?.model)) {
      resolved = { model: parsed!.model, provider };
    }
  }
  if (!resolved) throw new Error(`Media model is not configured by a provider: ${normalizedSelector}`);
  const expectedKind = operation === "video-generate" ? "video" : operation ? "image" : undefined;
  const modelKind = grokMediaModelKind(resolved.model);
  if (expectedKind && modelKind && modelKind !== expectedKind) {
    throw new Error(`${resolved.model} is not a ${expectedKind} generation model.`);
  }
  const provider = resolved.provider;
  const kind = expectedKind ?? modelKind;
  if (!kind || !providerSupportsMediaKind(provider, kind)) {
    throw new Error(`Provider ${provider.name} does not declare ${kind ?? "media"} generation support.`);
  }
  const protocol: GatewayMediaProtocol = kind === "video"
    ? provider.capabilities?.some((item) => item.type === "xai_video_generations") || isImportedGrokAgentProvider(provider)
      ? "xai_video_generations"
      : "openai_video_generations"
    : "openai_image_generations";
  const capability = provider.capabilities?.find((item) => item.type === protocol) ??
    (protocol === "xai_video_generations" && isImportedGrokAgentProvider(provider)
      ? provider.capabilities?.find((item) => item.type === "openai_video_generations")
      : undefined);
  const providerBaseUrl = capability?.baseUrl ?? provider.baseurl ?? provider.baseUrl ?? provider.api_base_url;
  if (!providerBaseUrl?.trim()) {
    throw new Error(`Provider ${provider.name} does not configure a media API base URL.`);
  }
  const selectorProtocol = capability || isImportedGrokAgentProvider(provider)
    ? protocol
    : inferProtocol(provider);
  const credential = sortProviderCredentialsForConfig(activeProviderCredentials(provider))[0];

View on GitHub (pinned to 99f24806c6)

Solutions

  1. Add the appropriate media generation capability to the provider config
  2. Use a provider that already declares the capability
  3. Regenerate/re-import the provider config from its source

Example fix

// before
{ name: "my-openai", baseUrl: "..." }
// after
{ name: "my-openai", baseUrl: "...", capabilities: [{ type: "openai_image_generations" }] }
Defensive patterns

Strategy: validation

Validate before calling

const provider = registry.findProvider(parsed.provider);
if (!providerSupportsMediaKind(provider, kind)) throw new Error("capability missing");

Type guard

const providerDeclaresMedia = (provider: Provider, kind: "image" | "video"): boolean => providerSupportsMediaKind(provider, kind);

Try / catch

try { resolveProviderMediaTarget(config, selector, op); } catch (e) { if (e instanceof Error && e.message.includes("does not declare")) return configError(); throw e; }

Prevention

When it happens

Trigger: Selecting a provider whose config lacks the image/video generation capability entry for the inferred kind.

Common situations: Hand-written provider configs missing capabilities; custom OpenAI-compatible providers registered without declaring media capabilities.

Related errors


AI-assisted analysis of musistudio/claude-code-router@99f24806c6 (2026-08-27). Data as JSON: /api/errors/f4fd916fb6c1532a. Report an issue: GitHub.