{"record":{"id":"bbbf791e1d0e921f","repo":"lfnovo/open-notebook","slug":"failed-to-discover-models","errorCode":null,"errorMessage":"Failed to discover models","messagePattern":"Failed to discover models","errorType":"http","errorClass":"HTTPException","httpStatus":500,"severity":"error","filePath":"api/routers/credentials.py","lineNumber":446,"sourceCode":"            credential_id=cred.id or \"\",\n            provider=provider,\n            discovered=[\n                DiscoveredModelResponse(\n                    name=d[\"name\"],\n                    provider=d[\"provider\"],\n                    description=d.get(\"description\"),\n                )\n                for d in discovered\n            ],\n        )\n\n    except HTTPException:\n        raise\n    except OpenNotebookError:\n        raise\n    except Exception as e:\n        logger.error(f\"Error discovering models for credential {credential_id}: {e}\")\n        raise HTTPException(status_code=500, detail=\"Failed to discover models\")\n\n\n@router.post(\"/{credential_id}/register-models\", response_model=RegisterModelsResponse)\nasync def register_models_for_credential(\n    credential_id: str, request: RegisterModelsRequest\n):\n    \"\"\"Register discovered models and link them to this credential.\"\"\"\n    try:\n        result = await register_models(credential_id, request.models)\n        return RegisterModelsResponse(**result)\n    except HTTPException:\n        raise\n    except OpenNotebookError:\n        raise\n    except Exception as e:\n        logger.error(f\"Error registering models for credential {credential_id}: {e}\")\n        raise HTTPException(status_code=500, detail=\"Failed to register models\")\n","sourceCodeStart":428,"sourceCodeEnd":464,"githubUrl":"https://github.com/lfnovo/open-notebook/blob/a7de90d38aaf18ee85fd661854d35c11e44613e2/api/routers/credentials.py#L428-L464","documentation":"Catch-all 500 from POST /api/credentials/{credential_id}/discover-models. Discovery makes live calls to the provider API using the stored credential; any unexpected failure (network error, provider schema change, auth layer crash) is wrapped as this 500.","triggerScenarios":"Clicking 'Discover models' for a credential whose provider endpoint is unreachable, an invalid/expired API key causing an unhandled client exception, or a provider returning an unexpected response shape the discovery parser cannot handle.","commonSituations":"Firewalled/offline environment blocking api.openai.com etc., revoked API key, or provider API response format change after a library update.","solutions":["Check logs for 'Error discovering models for credential <id>: ...'","Test the credential's API key and base_url directly (curl the provider's /models endpoint)","Verify network egress from the API host to the provider; fix proxy/DNS issues","If the key is invalid, update the credential with a valid key before retrying discovery"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const cred = await api.getCredential(credentialId);\nif (!cred || !cred.api_key) throw new Error('Credential needs a valid API key before discovery');\n// optional: smoke-test connectivity\nawait fetch(cred.base_url ?? defaultBaseUrl(cred.provider) + '/models', { headers: { Authorization: `Bearer ${cred.api_key}` } });","typeGuard":null,"tryCatchPattern":"try {\n  const models = await api.discoverModels(credentialId);\n} catch (e) {\n  if (e.status === 500) showError('Discovery failed — check API key, base URL and network access');\n  throw e;\n}","preventionTips":["Smoke-test the provider /models endpoint before running discovery in the UI","Confirm network egress from the API host to providers in containerized setups"],"tags":["credentials","model-discovery","network","http-500"],"backgroundTag":"provider-api-request-failed","analyzedSha":"a7de90d38aaf18ee85fd661854d35c11e44613e2","analyzedAt":"2026-08-27T02:39:58.166Z","schemaVersion":2},"datasetVersion":"2026-08-27T03:17:27.898Z"}