{"record":{"id":"05de3260863ba5f5","repo":"zeroclaw-labs/zeroclaw","slug":"composio-v3-tool-schema-lookup-failed-for-slug","errorCode":null,"errorMessage":"Composio v3 tool schema lookup failed for '{slug}': {err}","messagePattern":"Composio v3 tool schema lookup failed for '(.+?)': (.+?)","errorType":"http","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"crates/zeroclaw-tools/src/composio.rs","lineNumber":499,"sourceCode":"    /// Fetch full metadata for a single tool by slug, including input/output parameter schemas.\n    /// Calls `GET /api/v3/tools/{tool_slug}` which returns the detailed schema\n    /// the LLM needs to construct correct `params` for `execute`.\n    async fn get_tool_schema(&self, tool_slug: &str) -> anyhow::Result<serde_json::Value> {\n        let slug = normalize_tool_slug(tool_slug);\n        let url = format!(\"{COMPOSIO_API_BASE_V3}/tools/{slug}\");\n        ensure_https(&url)?;\n\n        let resp = self\n            .client()\n            .get(&url)\n            .header(\"x-api-key\", &self.api_key)\n            .query(&[(\"version\", COMPOSIO_TOOL_VERSION_LATEST)])\n            .send()\n            .await?;\n\n        if !resp.status().is_success() {\n            let err = response_error(resp).await;\n            anyhow::bail!(\"Composio v3 tool schema lookup failed for '{slug}': {err}\");\n        }\n\n        let body: serde_json::Value = resp\n            .json()\n            .await\n            .context(\"Failed to decode Composio v3 tool schema response\")?;\n        Ok(body)\n    }\n\n    async fn resolve_auth_config_id(&self, app_name: &str) -> anyhow::Result<String> {\n        let url = format!(\"{COMPOSIO_API_BASE_V3}/auth_configs\");\n\n        let resp = self\n            .client()\n            .get(&url)\n            .header(\"x-api-key\", &self.api_key)\n            .query(&[\n                (\"toolkit_slug\", app_name),","sourceCodeStart":481,"sourceCodeEnd":517,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-tools/src/composio.rs#L481-L517","documentation":"get_tool_schema fetches GET {v3}/tools/{slug}?version=latest (the slug is normalized to lowercase with hyphens) to retrieve a tool's input schema, and the call returned non-2xx — most often 404 for a name that is not a real v3 tool slug. Within Tool::execute this call is best-effort: after an execute failure it is invoked with .ok() to append an 'Expected input parameters' hint, so the error itself is swallowed there; its visible symptom is a missing schema-hint block in the execute error output.","triggerScenarios":"An execute failed and the fallback schema lookup used the raw action_name (a legacy alias such as GITHUB_LIST_REPOS or a free-text name) whose normalized form is not a v3 slug (404); invalid API key (401); rate limit (429); backend 5xx.","commonSituations":"Aliases that differ from catalog slugs; tools renamed upstream by Composio; the schema fetch hitting rate limits right after a failed execute inside tight agent loops.","solutions":["If you relied on the hint, get authoritative parameters from action='list' with the app filter (its [params: ...] lines) instead.","Pass the exact v3 slug so the schema lookup URL is valid.","On 401 fix the API key; on 429 back off.","Treat as non-fatal: the primary execute error and its per-candidate details are already in ToolResult.error."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// Only rely on schema hints for slugs that exist in the catalog\nlet actions = tool.list_actions(Some(app)).await?;\nlet known: Vec<&str> = actions.iter().map(|a| a.name.as_str()).collect();\nif !known.contains(&slug.as_str()) {\n    anyhow::bail!(\"'{slug}' is not a catalog slug; schema lookup would 404\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Do not depend on the 'Expected input parameters' hint being present; use action='list'","Use exact catalog slugs for schema lookups","Log schema-fetch failures separately from execute failures"],"tags":["composio","rust","schema","http","best-effort"],"backgroundTag":"schema-lookup-failed","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}