{"record":{"id":"2d08235576f06df4","repo":"odysseus-dev/odysseus","slug":"no-endpoints-configured-add-one-in-settings-first","errorCode":null,"errorMessage":"No endpoints configured. Add one in Settings first.","messagePattern":"No endpoints configured\\. Add one in Settings first\\.","errorType":"http","errorClass":"HTTPException","httpStatus":400,"severity":"error","filePath":"routes/research/research_routes.py","lineNumber":557,"sourceCode":"            if not ep_url:\n                ep_url, ep_model, ep_headers = resolve_endpoint(\"chat\", owner=user)\n            if not ep_url:\n                from src.database import SessionLocal\n                db = SessionLocal()\n                try:\n                    # Owner-scoped first-enabled fallback: the caller's own rows\n                    # + legacy null-owner shared rows only — never borrow another\n                    # user's private endpoint/api_key. Same fix as the\n                    # /api/v1/chat fallback (webhook_routes._first_enabled_endpoint).\n                    ep = _owned_enabled_endpoint(db, user)\n                    if ep:\n                        resolved = _resolve_endpoint_runtime(ep, owner=user)\n                        if resolved:\n                            ep_url, ep_model, ep_headers = resolved\n                finally:\n                    db.close()\n            if not ep_url:\n                raise HTTPException(400, \"No endpoints configured. Add one in Settings first.\")\n            if body.model:\n                ep_model = body.model\n\n        # max_rounds=0 → \"Auto\", let AI decide; pass 20 as the safety cap.\n        effective_max_rounds = body.max_rounds if body.max_rounds > 0 else 20\n        research_handler.start_research(\n            session_id=session_id,\n            query=body.query,\n            llm_endpoint=ep_url,\n            llm_model=ep_model,\n            max_time=body.max_time,\n            llm_headers=ep_headers,\n            max_rounds=effective_max_rounds,\n            search_provider=body.search_provider or None,\n            category=body.category or None,\n            extraction_timeout=body.extraction_timeout,\n            extraction_concurrency=body.extraction_concurrency,\n            owner=user,","sourceCodeStart":539,"sourceCodeEnd":575,"githubUrl":"https://github.com/odysseus-dev/odysseus/blob/f9235ebbf13f693a6fd29ce70b097f6ec83705bf/routes/research/research_routes.py#L539-L575","documentation":"Error \"No endpoints configured. Add one in Settings first.\" 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":["Add a model endpoint in Settings first, then retry.","Configure at least one reachable endpoint before running research."],"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"}