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
- Add the appropriate media generation capability to the provider config
- Use a provider that already declares the capability
- 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
- Declare media capabilities when adding custom providers
- Validate provider capabilities in config tests
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
- Remote media result has no URL.
- Media model is not configured by a provider: ${normalizedSel
- Provider ${provider.name} does not configure a media API bas
- No Bot Gateway conversationRef is available for media respon
- The CCR artifact endpoint returned a non-media content type.
AI-assisted analysis of musistudio/claude-code-router@99f24806c6 (2026-08-27).
Data as JSON: /api/errors/f4fd916fb6c1532a.
Report an issue: GitHub.