{"record":{"id":"09bbc3d1db02fa6d","repo":"tinyhumansai/openhuman","slug":"dashboard-model-health-e","errorCode":null,"errorMessage":"dashboard_model_health: {e}","messagePattern":"dashboard_model_health: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/openhuman/desktop/dashboard/tools.rs","lineNumber":43,"sourceCode":"impl Tool for DashboardModelHealthTool {\n    fn name(&self) -> &str {\n        \"dashboard_model_health\"\n    }\n\n    fn description(&self) -> &str {\n        \"Return the model-health table the dashboard shows: per-model status and \\\n         the active routing configuration. Use to advise on which models are \\\n         healthy/available.\"\n    }\n\n    fn parameters_schema(&self) -> serde_json::Value {\n        json!({ \"type\": \"object\", \"properties\": {} })\n    }\n\n    async fn execute(&self, _args: serde_json::Value) -> anyhow::Result<ToolResult> {\n        log::debug!(\"[tool][dashboard] model_health invoked\");\n        let outcome = ops::model_health(&self.config)\n            .map_err(|e| anyhow::anyhow!(\"dashboard_model_health: {e}\"))?;\n        Ok(ToolResult::success(serde_json::to_string(&outcome.value)?))\n    }\n\n    fn is_concurrency_safe(&self, _args: &serde_json::Value) -> bool {\n        true\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::openhuman::tools::traits::{PermissionLevel, ToolScope};\n\n    #[test]\n    fn metadata() {\n        let t = DashboardModelHealthTool::new(Arc::new(Config::default()));\n        assert_eq!(t.name(), \"dashboard_model_health\");\n        assert_eq!(t.permission_level(), PermissionLevel::ReadOnly);","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/desktop/dashboard/tools.rs#L25-L61","documentation":"The dashboard_model_health tool failed to assemble the model-health table (per-model status plus active routing configuration); the ops-layer error is wrapped with the tool name. The tool takes no arguments, so the failure is in reading routing/inference status, not in caller input.","triggerScenarios":"Thrown at src/openhuman/desktop/dashboard/tools.rs:43 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Inspect the wrapped error for the routing/inference cause","Verify inference routing config is loadable","Retry once the inference subsystem is healthy"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}