{"record":{"id":"e87219f7155d279f","repo":"tinyhumansai/openhuman","slug":"web-search-unavailable-no-backend-session-token","errorCode":null,"errorMessage":"Web search unavailable: no backend session token. Sign in first so the server can proxy search.","messagePattern":"Web search unavailable: no backend session token\\. Sign in first so the server can proxy search\\.","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/openhuman/search/tools/web_search.rs","lineNumber":202,"sourceCode":"\n        if let Some(direct_search) = &self.direct_search {\n            tracing::debug!(\n                query_len = query.chars().count(),\n                max_results = self.max_results,\n                timeout_secs = self.timeout_secs,\n                \"[web_search] direct Seltz search\"\n            );\n            let mut normalized_args = args;\n            if let Some(obj) = normalized_args.as_object_mut() {\n                obj.insert(\"query\".to_string(), Value::String(query.clone()));\n            }\n            return direct_search\n                .execute_with_options(normalized_args, options)\n                .await;\n        }\n\n        let client = self.client.as_ref().ok_or_else(|| {\n            anyhow::anyhow!(\n                \"Web search unavailable: no backend session token. Sign in first so the server can proxy search.\"\n            )\n        })?;\n\n        let query_fingerprint = hex::encode(Sha256::digest(query.as_bytes()));\n        tracing::debug!(\n            query_len = query.chars().count(),\n            query_fingerprint = %query_fingerprint[..16],\n            max_results = self.max_results,\n            timeout_secs = self.timeout_secs,\n            \"[web_search] backend parallel search\"\n        );\n\n        // Body matches `parallelSearchSchema` in backend-2. The legacy\n        // `numResults` / `maxCharactersPerExcerpt` aliases still work, but\n        // current fields are `maxResults` / `maxCharsPerResult`. Also dropping\n        // `timeoutSecs` — the validator does not declare it and Parallel's\n        // per-mode deadlines drive timing on the upstream side.","sourceCodeStart":184,"sourceCodeEnd":220,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/search/tools/web_search.rs#L184-L220","documentation":"Session-prerequisite guard in WebSearchTool::execute_with_options: neither a direct Seltz searcher is configured nor a backend session token is available, so the server-proxied search path cannot authenticate to the TinyHumans backend. The tool refuses to run rather than issuing an unauthenticated request; the faulting condition is being signed out with no direct provider fallback.","triggerScenarios":"Thrown at src/openhuman/search/tools/web_search.rs:202 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Sign in to the app so a backend session token is available for the proxied search.","Alternatively configure SELTZ_API_KEY / OPENHUMAN_SELTZ_API_KEY so the direct Seltz path is used.","Re-authenticate if the session token expired."],"exampleFix":null,"handlingStrategy":"fallback","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"}