tinyhumansai/openhuman · error · anyhow::Error

Composio v3 auth config lookup failed: {err}

Error message

Composio v3 auth config lookup failed: {err}

What it means

Non-2xx from the v3 auth-config lookup: GET with toolkit_slug=<app>&show_disabled=true&limit=25. This runs inside the connect flow when only an app name is given (to resolve it to an auth_config_id); response_error folds status + body into {err}. It is the transport-level failure — an empty-but-200 result is the separate 'No auth config found' error.

Source

Thrown at src/openhuman/integrations/composio/tools/direct.rs:680

    async fn resolve_auth_config_id(&self, app_name: &str) -> anyhow::Result<String> {
        let url = format!("{}/auth_configs", self.base_v3);

        let resp = self
            .client()
            .get(&url)
            .header("x-api-key", &self.api_key)
            .query(&[
                ("toolkit_slug", app_name),
                ("show_disabled", "true"),
                ("limit", "25"),
            ])
            .send()
            .await?;

        if !resp.status().is_success() {
            let err = response_error(resp).await;
            anyhow::bail!("Composio v3 auth config lookup failed: {err}");
        }

        let body: ComposioAuthConfigsResponse = resp
            .json()
            .await
            .context("Failed to decode Composio v3 auth configs response")?;

        if body.items.is_empty() {
            anyhow::bail!(
                "No auth config found for toolkit '{app_name}'. Create one in Composio first."
            );
        }

        let preferred = body
            .items
            .iter()
            .find(|cfg| cfg.is_enabled())
            .or_else(|| body.items.first())

View on GitHub (pinned to 7491200858)

Solutions

  1. Inspect {err} for status and body
  2. 401: fix the API key first — the lookup cannot succeed without it
  3. Normalize the app slug (trim, lowercase) before triggering connect
  4. 429/5xx: retry the connect attempt after a short backoff
Defensive patterns

Strategy: try-catch

Validate before calling

let app_slug = app.map(str::trim).filter(|a| !a.is_empty());
if app_slug.is_none() && auth_config_id.is_none() {
    anyhow::bail!("connect needs an app slug or auth_config_id before the auth-config lookup");
}

Try / catch

match tool.get_connection_url(app, None, &entity).await {
    Ok(url) => Ok(url),
    Err(e) => {
        let msg = format!("{e:#}");
        if msg.contains("auth config lookup failed: 401") {
            ui.prompt_reenter_composio_key(); // key dead before the lookup could run
        } else {
            tracing::warn!("[composio] auth config lookup: {msg}");
        }
        Err(e)
    }
}

Prevention

When it happens

Trigger: 401 invalid API key; 400 from a malformed toolkit_slug (empty after trim, or invalid characters); 429; 5xx. Example: get_connection_url(Some("slack"), None, entity) while the key is revoked fails here before the empty-items check can even run.

Common situations: Connect attempted right after the key expired; toolkit slug with whitespace or odd casing injected from user input; Composio 5xx during the connect attempt.

Related errors


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