{"record":{"id":"88f8e3f3825319c0","repo":"JuliusBrussee/caveman","slug":"compat-upstream-q-base-url-w-88f8e3","errorCode":null,"errorMessage":"compat upstream %q base_url: %w","messagePattern":"compat upstream %q base_url: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"proxy/providers/openaicompat/openaicompat.go","lineNumber":232,"sourceCode":"\nfunc inspectOpenAICompatible(ctx context.Context, base providers.Base, body providers.BodyReader, headers http.Header) (providers.RequestMetadata, error) {\n\tmeta, err := base.InspectRequest(ctx, body, headers)\n\tif path := headers.Get(\"x-cave-route-path\"); path != \"\" {\n\t\tmeta.Endpoint = path\n\t}\n\treturn meta, err\n}\n\n// NewNamed builds a dedicated OpenAI-compatible upstream mounted at\n// /compat/<name>/. The provider enum intentionally stays openai_compatible so\n// usage/cost telemetry keeps using the shared OpenAI-shape parser.\nfunc NewNamed(name, baseURL string) (providers.Adapter, error) {\n\tif err := ValidateName(name); err != nil {\n\t\treturn nil, err\n\t}\n\tbaseURL = strings.TrimSpace(baseURL)\n\tif err := ValidateBaseURL(baseURL); err != nil {\n\t\treturn nil, fmt.Errorf(\"compat upstream %q base_url: %w\", name, err)\n\t}\n\tprefix := \"/compat/\" + name\n\treturn namedAdapter{\n\t\tBase: providers.Base{\n\t\t\tProvider: \"openai_compatible\",\n\t\t\tBaseURL:  baseURL,\n\t\t\tRoutes:   []string{prefix + \"/\"},\n\t\t},\n\t\tprefix: prefix,\n\t}, nil\n}\n\nfunc ValidateName(name string) error {\n\tif !validName.MatchString(name) {\n\t\treturn fmt.Errorf(\"compat upstream name %q must match [a-z0-9][a-z0-9._-]{0,63}\", name)\n\t}\n\tswitch name {\n\tcase \"stub\", \"openai-compatible\":","sourceCodeStart":214,"sourceCodeEnd":250,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/5184b3d11ac6a1acb7d44b9bfaa31698157cff97/proxy/providers/openaicompat/openaicompat.go#L214-L250","documentation":"Wrap in NewNamed: ValidateBaseURL rejected the upstream's base_url (scheme, host, userinfo, or path-shape failure). The named compat upstream's base_url configuration is at fault; the wrapped error carries the specifics.","triggerScenarios":"Thrown at proxy/providers/openaicompat/openaicompat.go:189 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Set an absolute http(s) base URL without userinfo, fragment, or encoded path tricks","Check the compat upstream config / CAVE_COMPAT_UPSTREAMS value for typos"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"5184b3d11ac6a1acb7d44b9bfaa31698157cff97","analyzedAt":"2026-08-18T03:14:35.516Z","contentChangedAt":"2026-08-18T03:14:35.516Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}