tinyhumansai/openhuman · error · anyhow::Error
Composio v3 list_tool_schemas: {err}
Error message
Composio v3 list_tool_schemas: {err} What it means
Non-2xx from GET v3 /tools when used to build agent tool schemas (list_tool_schemas_v3). Same endpoint as the action listing but a different call path: the result feeds ComposioToolSchemaV3 generation, so a failure here means the agent's Composio tool catalogue cannot be built — tools silently missing from the agent surface if the caller swallows the error.
Source
Thrown at src/openhuman/integrations/composio/tools/direct.rs:354
tags: Option<&[&str]>,
) -> anyhow::Result<Vec<ComposioToolSchemaV3>> {
let url = format!("{}/tools", self.base_v3);
let params = Self::build_list_tool_schemas_v3_query(toolkits, tags);
tracing::debug!(
toolkits = toolkits.len(),
tags = tags.map(<[&str]>::len).unwrap_or(0),
"[composio-direct] list_tool_schemas_v3: GET v3 /tools query built"
);
let req = self
.client()
.get(&url)
.header("x-api-key", &self.api_key)
.query(¶ms);
let resp = req.send().await?;
if !resp.status().is_success() {
let err = response_error(resp).await;
anyhow::bail!("Composio v3 list_tool_schemas: {err}");
}
let body: ComposioToolsResponse = resp
.json()
.await
.context("Failed to decode Composio v3 tools response")?;
Ok(body
.items
.into_iter()
.map(ComposioToolSchemaV3::from_v3_tool)
.collect())
}
/// Execute a Composio action/tool with given parameters.
///
/// Uses v3 endpoint first and falls back to v2 for compatibility.
pub async fn execute_action(
&self,View on GitHub (pinned to 7491200858)
Solutions
- Read {err} (status + body) to classify: auth (401), request shape (400), rate limit (429), or transient (5xx)
- Fix the API key if 401 — the same key failure will also hit connected_accounts polling
- Check the toolkit slugs and tags being forwarded in the query params
- Retry 429/5xx with backoff; cache the last good schema list so the agent keeps working during brief outages
Defensive patterns
Strategy: try-catch
Try / catch
match tool.list_tool_schemas(toolkits, tags).await {
Ok(schemas) => registry.publish(schemas),
Err(e) => {
// Schema refresh failing must not break the agent — keep the last good set
tracing::warn!("[composio] schema refresh failed, keeping cached tools: {e:#}");
registry.keep_cached();
}
} Prevention
- Cache the last good schema list so a listing failure degrades instead of removing Composio tools from the agent
- Validate toolkit slugs and tags before the request (should_forward_tags already trims risky input)
- Back off on 429 — schema pulls for many toolkits in parallel are the usual trigger
When it happens
Trigger: 401 invalid key; 400 from malformed toolkits/tags query params (tags are forwarded only when should_forward_tags passes); 429 rate limit; 5xx. Called during tool-registry refresh or connection setup.
Common situations: Key revoked between catalog refreshes; a toolkit slug or tag list with characters Composio rejects; heavy parallel schema pulls for many toolkits tripping 429.
Related errors
- Composio v3 API error: {err}
- Composio v2 API error: {err}
- Composio v3 action execution failed: {err}
- Composio v3 connect failed: {err}
- Composio v3 connected_accounts failed: {err}
AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17).
Data as JSON: /api/errors/49ec9161446b4b6e.
Report an issue: GitHub.