{"record":{"id":"42fadcff9682cf9a","repo":"odysseus-dev/odysseus","slug":"base-url-is-required","errorCode":null,"errorMessage":"Base URL is required","messagePattern":"Base URL is required","errorType":"http","errorClass":"HTTPException","httpStatus":400,"severity":"error","filePath":"routes/model_routes.py","lineNumber":2013,"sourceCode":"        skip_probe: str = Form(\"false\"),\n        require_models: str = Form(\"false\"),\n        model_type: str = Form(\"llm\"),\n        endpoint_kind: str = Form(\"auto\"),\n        model_refresh_mode: str = Form(\"\"),\n        model_refresh_interval: str = Form(\"\"),\n        model_refresh_timeout: str = Form(\"\"),\n        supports_tools: str = Form(\"\"),  # \"true\"/\"false\"/\"\" (unknown)\n        pinned_models: str = Form(\"\"),  # admin-pinned IDs: list/JSON/comma/newline\n        container_local: str = Form(\"false\"),\n        # Default `shared=true` → endpoints are visible to all users (the\n        # app's historical behaviour). Admins can pass `shared=false` to\n        # scope a new endpoint to their own account only.\n        shared: str = Form(\"true\"),\n    ):\n        require_admin(request)\n        base_url = _normalize_base(base_url)\n        if not base_url:\n            raise HTTPException(400, \"Base URL is required\")\n        # Resolve hostname via Tailscale if DNS fails\n        from src.endpoint_resolver import resolve_url\n        base_url = resolve_url(base_url)\n        # In Docker, manually added loopback URLs usually point at a host-local\n        # server. Cookbook local serves are launched inside Odysseus itself, so\n        # keep those container-local when the frontend marks them as such.\n        base_url = _rewrite_loopback_for_docker(base_url, container_local=_truthy(container_local))\n\n        # Auto-generate name from URL if not provided\n        if not name.strip():\n            name = base_url.replace(\"http://\", \"\").replace(\"https://\", \"\").split(\"/\")[0]\n\n        requested_kind = _normalize_endpoint_kind(endpoint_kind)\n        refresh_mode = _normalize_endpoint_refresh_mode(model_refresh_mode, requested_kind, base_url)\n        refresh_interval = _parse_positive_int(model_refresh_interval, minimum=30, maximum=86400)\n        refresh_timeout = _parse_positive_int(model_refresh_timeout, minimum=1, maximum=60)\n        require_model_list = _truthy(require_models)\n        should_probe = (","sourceCodeStart":1995,"sourceCodeEnd":2031,"githubUrl":"https://github.com/odysseus-dev/odysseus/blob/f9235ebbf13f693a6fd29ce70b097f6ec83705bf/routes/model_routes.py#L1995-L2031","documentation":"Error \"Base URL is required\" thrown in odysseus-dev/odysseus.","triggerScenarios":"Triggered when the corresponding server-side validation or runtime check at the recorded location rejects the request or operation and returns this error message to the caller.","commonSituations":"See trigger scenarios.","solutions":["Fill in the Base URL field for the endpoint.","Provide a base_url in the request payload."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"f9235ebbf13f693a6fd29ce70b097f6ec83705bf","analyzedAt":"2026-08-14T21:47:48.359Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}