{"record":{"id":"0e411155dcf203c5","repo":"musistudio/claude-code-router","slug":"provider-provider-name-does-not-configure-a-med","errorCode":null,"errorMessage":"Provider ${provider.name} does not configure a media API base URL.","messagePattern":"Provider (.+?) does not configure a media API base URL\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/core/src/media/service.ts","lineNumber":750,"sourceCode":"    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];\n  return {\n    model: resolved.model,\n    protocol,\n    providerBaseUrl: providerBaseUrl.trim(),\n    providerName: provider.name,\n    providerSelector: credential\n      ? providerCredentialInternalName(provider, selectorProtocol, credential)\n      : capability || isImportedGrokAgentProvider(provider)\n        ? providerCapabilityInternalName(provider, protocol)\n        : providerRuntimeId(provider)\n  };\n}\n","sourceCodeStart":732,"sourceCodeEnd":768,"githubUrl":"https://github.com/musistudio/claude-code-router/blob/99f24806c6a2c660b16e53e95211c517448a6c90/packages/core/src/media/service.ts#L732-L768","documentation":"Once protocol and capability are resolved, the provider needs a base URL for media API calls, sourced from the capability's baseUrl or provider baseurl/baseUrl/api_base_url fields. All-empty values throw before any HTTP request.","triggerScenarios":"Provider entry has none of baseurl, baseUrl, api_base_url, and the matched capability has no baseUrl either.","commonSituations":"Env-var-based base URL not set in the runtime environment; provider YAML key misspelled; capability object copied without its baseUrl.","solutions":["Set baseUrl (or baseurl/api_base_url) on the provider config","Set baseUrl on the specific media capability entry","Verify env interpolation for the base URL resolves in the running environment"],"exampleFix":"// before\n{ name: \"my-openai\", capabilities: [{ type: \"openai_image_generations\" }] }\n// after\n{ name: \"my-openai\", baseUrl: \"https://api.example.com/v1\", capabilities: [{ type: \"openai_image_generations\" }] }","handlingStrategy":"validation","validationCode":"const p = registry.findProvider(parsed.provider);\nconst cap = p?.capabilities?.find(c => c.type === protocol);\nconst base = cap?.baseUrl ?? p?.baseurl ?? p?.baseUrl ?? p?.api_base_url;\nif (!base?.trim()) throw new Error(\"missing media base URL\");","typeGuard":"const hasMediaBaseUrl = (provider: Provider, protocol: string): boolean => Boolean((provider.capabilities?.find(c => c.type === protocol)?.baseUrl ?? provider.baseurl ?? provider.baseUrl ?? provider.api_base_url ?? \"\").trim());","tryCatchPattern":"try { await call(); } catch (e) { if (e instanceof Error && e.message.includes(\"media API base URL\")) return configError(); throw e; }","preventionTips":["Set baseUrl on every provider entry","Test env-var interpolation in CI"],"tags":["media","provider","base-url","configuration"],"backgroundTag":"missing-base-url","analyzedSha":"99f24806c6a2c660b16e53e95211c517448a6c90","analyzedAt":"2026-08-27T04:11:01.184Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}