{"record":{"id":"2b3dd3bb66d01014","repo":"musistudio/claude-code-router","slug":"media-model-is-not-configured-by-a-provider-nor","errorCode":null,"errorMessage":"Media model is not configured by a provider: ${normalizedSelector}","messagePattern":"Media model is not configured by a provider: (.+?)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/core/src/media/service.ts","lineNumber":728,"sourceCode":"function jobModelSelector(job: MediaJob, required = true): string | undefined {\n  const selector = optionalString((job as Partial<MediaJob>).modelSelector);\n  if (selector) return selector;\n  if (required) throw new Error(\"This media job has no media API model binding and cannot be resumed.\");\n  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\")","sourceCodeStart":710,"sourceCodeEnd":746,"githubUrl":"https://github.com/musistudio/claude-code-router/blob/99f24806c6a2c660b16e53e95211c517448a6c90/packages/core/src/media/service.ts#L710-L746","documentation":"resolveProviderMediaTarget maps a normalized model selector to a configured provider; if no provider in the registry matches the selector (after Grok agent special-casing), the model is considered unconfigured and the call is rejected.","triggerScenarios":"Naming a model whose provider prefix doesn't exist in config, or whose provider entry was removed/renamed; selector normalization/migration found no match.","commonSituations":"Typo'd provider prefix, sharing configs between machines with different provider lists, or provider config deleted after the selector was stored.","solutions":["Verify the provider exists and is enabled in the model registry config","Fix the selector to match provider/model spelling exactly","Re-import or re-add the provider configuration"],"exampleFix":"// before\nmodel: \"openai/gpt-image-x\"\n// after\nmodel: \"openai/gpt-image-1\"","handlingStrategy":"validation","validationCode":"const registry = modelRegistryForConfig(config);\nconst parsed = parseProviderModelSelector(selector);\nif (!parsed || !registry.findProvider(parsed.provider)) throw new Error(\"unknown provider\");","typeGuard":"const isConfiguredProvider = (sel: string, config: AppConfig): boolean => { const p = parseProviderModelSelector(sel); return Boolean(p && modelRegistryForConfig(config).findProvider(p.provider)); };","tryCatchPattern":"try { resolveProviderMediaTarget(config, selector, op); } catch (e) { if (e instanceof Error && e.message.includes(\"not configured by a provider\")) return configError(); throw e; }","preventionTips":["Lint model selectors against the registry at startup","Pin provider names in config"],"tags":["media","provider","configuration"],"backgroundTag":"provider-not-configured","analyzedSha":"99f24806c6a2c660b16e53e95211c517448a6c90","analyzedAt":"2026-08-27T04:11:01.184Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}