{"record":{"id":"f4fd916fb6c1532a","repo":"musistudio/claude-code-router","slug":"provider-provider-name-does-not-declare-kind","errorCode":null,"errorMessage":"Provider ${provider.name} does not declare ${kind ?? \"media\"} generation support.","messagePattern":"Provider (.+?) does not declare (.+?) generation support\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/core/src/media/service.ts","lineNumber":737,"sourceCode":"  const registry = modelRegistryForConfig(config);\n  let resolved = registry.resolveProviderModel(normalizedSelector);\n  if (!resolved) {\n    const parsed = parseProviderModelSelector(normalizedSelector);\n    const provider = parsed ? registry.findProvider(parsed.provider) : undefined;\n    if (provider && isImportedGrokAgentProvider(provider) && grokMediaModelKind(parsed?.model)) {\n      resolved = { model: parsed!.model, provider };\n    }\n  }\n  if (!resolved) throw new Error(`Media model is not configured by a provider: ${normalizedSelector}`);\n  const expectedKind = operation === \"video-generate\" ? \"video\" : operation ? \"image\" : undefined;\n  const modelKind = grokMediaModelKind(resolved.model);\n  if (expectedKind && modelKind && modelKind !== expectedKind) {\n    throw new Error(`${resolved.model} is not a ${expectedKind} generation model.`);\n  }\n  const provider = resolved.provider;\n  const kind = expectedKind ?? modelKind;\n  if (!kind || !providerSupportsMediaKind(provider, kind)) {\n    throw new Error(`Provider ${provider.name} does not declare ${kind ?? \"media\"} generation support.`);\n  }\n  const protocol: GatewayMediaProtocol = kind === \"video\"\n    ? provider.capabilities?.some((item) => item.type === \"xai_video_generations\") || isImportedGrokAgentProvider(provider)\n      ? \"xai_video_generations\"\n      : \"openai_video_generations\"\n    : \"openai_image_generations\";\n  const capability = provider.capabilities?.find((item) => item.type === protocol) ??\n    (protocol === \"xai_video_generations\" && isImportedGrokAgentProvider(provider)\n      ? provider.capabilities?.find((item) => item.type === \"openai_video_generations\")\n      : undefined);\n  const providerBaseUrl = capability?.baseUrl ?? provider.baseurl ?? provider.baseUrl ?? provider.api_base_url;\n  if (!providerBaseUrl?.trim()) {\n    throw new Error(`Provider ${provider.name} does not configure a media API base URL.`);\n  }\n  const selectorProtocol = capability || isImportedGrokAgentProvider(provider)\n    ? protocol\n    : inferProtocol(provider);\n  const credential = sortProviderCredentialsForConfig(activeProviderCredentials(provider))[0];","sourceCodeStart":719,"sourceCodeEnd":755,"githubUrl":"https://github.com/musistudio/claude-code-router/blob/99f24806c6a2c660b16e53e95211c517448a6c90/packages/core/src/media/service.ts#L719-L755","documentation":"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.","triggerScenarios":"Selecting a provider whose config lacks the image/video generation capability entry for the inferred kind.","commonSituations":"Hand-written provider configs missing capabilities; custom OpenAI-compatible providers registered without declaring media capabilities.","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"],"exampleFix":"// before\n{ name: \"my-openai\", baseUrl: \"...\" }\n// after\n{ name: \"my-openai\", baseUrl: \"...\", capabilities: [{ type: \"openai_image_generations\" }] }","handlingStrategy":"validation","validationCode":"const provider = registry.findProvider(parsed.provider);\nif (!providerSupportsMediaKind(provider, kind)) throw new Error(\"capability missing\");","typeGuard":"const providerDeclaresMedia = (provider: Provider, kind: \"image\" | \"video\"): boolean => providerSupportsMediaKind(provider, kind);","tryCatchPattern":"try { resolveProviderMediaTarget(config, selector, op); } catch (e) { if (e instanceof Error && e.message.includes(\"does not declare\")) return configError(); throw e; }","preventionTips":["Declare media capabilities when adding custom providers","Validate provider capabilities in config tests"],"tags":["media","provider","capabilities"],"backgroundTag":"provider-capability-missing","analyzedSha":"99f24806c6a2c660b16e53e95211c517448a6c90","analyzedAt":"2026-08-27T04:11:01.184Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}