{"record":{"id":"56b89251e424e3e7","repo":"JuliusBrussee/caveman","slug":"name-must-not-contain-a-query-or-fragment-56b892","errorCode":null,"errorMessage":"{name} must not contain a query or fragment","messagePattern":"(.+?) must not contain a query or fragment","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"packages/sdk/python/caveman_cloud/core.py","lineNumber":323,"sourceCode":"\n\ndef _normalized_service_url(value: str, name: str) -> str:\n    if value.strip() != value:\n        raise ValueError(f\"{name} must not contain surrounding whitespace\")\n    try:\n        parsed = urlsplit(value)\n        port = parsed.port\n    except (TypeError, ValueError) as error:\n        raise ValueError(f\"{name} must be an absolute http(s) URL\") from error\n    if (\n        parsed.scheme not in (\"http\", \"https\")\n        or not parsed.hostname\n        or parsed.username is not None\n        or parsed.password is not None\n    ):\n        raise ValueError(f\"{name} must be an absolute http(s) URL without credentials\")\n    if parsed.query or parsed.fragment:\n        raise ValueError(f\"{name} must not contain a query or fragment\")\n    return value.rstrip(\"/\")\n\n\n@dataclass\nclass Cave:\n    api_key: str\n    base_url: str\n    agent: str\n    # CAVE_WORKFLOW lets a wrapper (`cave wrap --workflow x`) label every request\n    # from an SDK app without a code change. An explicit value always wins. The\n    # env value is normalized to the gateway's label rule (lowercase [a-z0-9_-],\n    # max 96); an invalid ambient value is ignored rather than 400-ing every\n    # request. Mirrors @caveman-ai/sdk (TypeScript).\n    default_workflow: str = field(default_factory=lambda: _env_workflow())\n    retention: str = \"metadata\"\n    verify_on_init: bool = False\n    # control_url is reserved for control-plane APIs and defaults to base_url.\n    control_url: str | None = None","sourceCodeStart":305,"sourceCodeEnd":341,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/27d5a3981a347890211bb1bf2439e5c821a63bc9/packages/sdk/python/caveman_cloud/core.py#L305-L341","documentation":"Error \"{name} must not contain a query or fragment\" thrown in JuliusBrussee/caveman.","triggerScenarios":"Thrown at packages/sdk/python/caveman_cloud/core.py:323 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Remove the query string and fragment from the URL."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"27d5a3981a347890211bb1bf2439e5c821a63bc9","analyzedAt":"2026-08-15T09:26:11.751Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}