{"record":{"id":"59dec332bbb2c97c","repo":"musistudio/claude-code-router","slug":"resolved-model-is-not-a-expectedkind-generat","errorCode":null,"errorMessage":"${resolved.model} is not a ${expectedKind} generation model.","messagePattern":"(.+?) is not a (.+?) generation model\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/core/src/media/service.ts","lineNumber":732,"sourceCode":"  return undefined;\n}\n\nexport function resolveProviderMediaTarget(config: AppConfig, selector: string, operation?: MediaOperation): GatewayMediaTarget {\n  const normalizedSelector = normalizeMediaModelSelector(config, selector, operation);\n  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.`);","sourceCodeStart":714,"sourceCodeEnd":750,"githubUrl":"https://github.com/musistudio/claude-code-router/blob/99f24806c6a2c660b16e53e95211c517448a6c90/packages/core/src/media/service.ts#L714-L750","documentation":"After resolving the provider, the service checks that a known model kind (image vs video) matches the operation: an image model cannot serve video-generate and vice versa. Only applies when the model's kind is recognizable.","triggerScenarios":"Using an image generation model for a video-generate operation, or a video model for an image operation.","commonSituations":"Switching operations but reusing the previous model selector; fallback lists shared between image and video operations.","solutions":["Use a video model for video-generate and an image model for image operations","Set operation-specific model/fallback chains","Fix the model id to the correct family variant"],"exampleFix":"// before\n{ operation: \"video-generate\", model: \"openai/gpt-image-1\" }\n// after\n{ operation: \"video-generate\", model: \"openai/sora-video\" }","handlingStrategy":"validation","validationCode":"const kind = operation === \"video-generate\" ? \"video\" : \"image\";\nif (grokMediaModelKind(model) && grokMediaModelKind(model) !== kind) throw new Error(\"wrong kind\");","typeGuard":"const modelMatchesOperation = (model: string, op?: MediaOperation): boolean => { const k = grokMediaModelKind(model); return !k || (op === \"video-generate\" ? k === \"video\" : k === \"image\"); };","tryCatchPattern":"try { await call(); } catch (e) { if (e instanceof Error && /is not a (image|video) generation model/.test(e.message)) return wrongModel(); throw e; }","preventionTips":["Keep separate image and video model configs","Name models explicitly per operation"],"tags":["media","model-kind","configuration"],"backgroundTag":"model-capability-mismatch","analyzedSha":"99f24806c6a2c660b16e53e95211c517448a6c90","analyzedAt":"2026-08-27T04:11:01.184Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}