{"record":{"id":"c76aa7638a1d465f","repo":"lfnovo/open-notebook","slug":"error-updating-default-models-str-e","errorCode":null,"errorMessage":"Error updating default models: {str(e)}","messagePattern":"Error updating default models: (.+?)","errorType":"http","errorClass":"HTTPException","httpStatus":500,"severity":"error","filePath":"api/routers/models.py","lineNumber":382,"sourceCode":"\n        # No cache refresh needed - next access will fetch fresh data from DB\n\n        return DefaultModelsResponse(\n            default_chat_model=defaults.default_chat_model,  # type: ignore[attr-defined]\n            default_transformation_model=defaults.default_transformation_model,  # type: ignore[attr-defined]\n            large_context_model=defaults.large_context_model,  # type: ignore[attr-defined]\n            default_text_to_speech_model=defaults.default_text_to_speech_model,  # type: ignore[attr-defined]\n            default_speech_to_text_model=defaults.default_speech_to_text_model,  # type: ignore[attr-defined]\n            default_embedding_model=defaults.default_embedding_model,  # type: ignore[attr-defined]\n            default_tools_model=defaults.default_tools_model,  # type: ignore[attr-defined]\n        )\n    except HTTPException:\n        raise\n    except OpenNotebookError:\n        raise\n    except Exception as e:\n        logger.error(f\"Error updating default models: {str(e)}\")\n        raise HTTPException(\n            status_code=500, detail=f\"Error updating default models: {str(e)}\"\n        )\n\n\n@router.get(\"/models/providers\", response_model=ProviderAvailabilityResponse)\nasync def get_provider_availability():\n    \"\"\"Get provider availability based on database config and environment variables.\"\"\"\n    try:\n        # Check which providers have credentials in the database or env vars\n        # For each provider, check DB credentials first, then env vars as fallback\n\n        # Simple env var mapping for backward compatibility\n        env_var_map = {\n            \"openai\": \"OPENAI_API_KEY\",\n            \"anthropic\": \"ANTHROPIC_API_KEY\",\n            \"google\": \"GOOGLE_API_KEY\",\n            \"groq\": \"GROQ_API_KEY\",\n            \"mistral\": \"MISTRAL_API_KEY\",","sourceCodeStart":364,"sourceCodeEnd":400,"githubUrl":"https://github.com/lfnovo/open-notebook/blob/a7de90d38aaf18ee85fd661854d35c11e44613e2/api/routers/models.py#L364-L400","documentation":"Generic 500 from PATCH /api/v1/models/defaults when updating default assignments fails unexpectedly. Domain errors (including InvalidInputError → 400) are re-raised; this wraps DB write failures or unexpected errors during defaults.update().","triggerScenarios":"PATCH /models/defaults referencing a model id that fails on update, or while SurrealDB is down.","commonSituations":"Assigning a default to a model that was just deleted in another session; DB outage; concurrency conflict on the defaults record.","solutions":["Check API logs for 'Error updating default models'","Verify every model id in the body exists (GET /models) before assigning","Verify DB connectivity and retry the update"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const models = await api.getModels();\nconst ids = new Set(models.map(m => m.id));\nfor (const [k,v] of Object.entries(patch)) if (v && !ids.has(v)) throw new Error(`${k}: unknown model ${v}`);","typeGuard":null,"tryCatchPattern":"try { await api.updateDefaults(patch); } catch (e) { if (e.status === 500) { checkLogs(); await retry(); } }","preventionTips":["Verify model ids exist before assigning","Avoid deleting models that are current defaults","Retry on transient DB errors"],"tags":["models","defaults","http-500"],"backgroundTag":"internal-server-error","analyzedSha":"a7de90d38aaf18ee85fd661854d35c11e44613e2","analyzedAt":"2026-08-27T02:39:58.166Z","schemaVersion":2},"datasetVersion":"2026-08-27T03:17:27.898Z"}