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(&params);

        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

  1. Read {err} (status + body) to classify: auth (401), request shape (400), rate limit (429), or transient (5xx)
  2. Fix the API key if 401 — the same key failure will also hit connected_accounts polling
  3. Check the toolkit slugs and tags being forwarded in the query params
  4. 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

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


AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17). Data as JSON: /api/errors/49ec9161446b4b6e. Report an issue: GitHub.