tinyhumansai/openhuman · error

composio backend mode unavailable: no backend session token.

Error message

composio backend mode unavailable: no backend session token. Sign in first (auth_store_session).

What it means

create_composio_client in backend mode (the default) found no stored backend session token, so the backend-proxied Composio client cannot be built. Signing in is a prerequisite: the backend proxies Composio calls using the session token.

Source

Thrown at src/openhuman/integrations/composio/client.rs:811

///   stored key takes precedence so the encrypted keychain remains the
///   source of truth — `config.toml` is a fallback for power users.
///
/// Any other mode string is rejected with an explicit error so a typo
/// in `config.toml` fails loud instead of silently downgrading.
pub fn create_composio_client(
    config: &crate::openhuman::config::Config,
) -> anyhow::Result<ComposioClientKind> {
    let mode = config.composio.mode.trim();
    tracing::debug!(mode = %mode, "[composio-factory] resolving client");

    match mode {
        // Empty string is treated as the default for forward compatibility
        // with hand-edited configs that omit the field — `serde(default)`
        // already gives us "backend" for missing fields, but a literal
        // empty string in TOML would otherwise be rejected.
        "" | MODE_BACKEND_PAT => {
            let client = build_composio_client(config).ok_or_else(|| {
                anyhow::anyhow!(
                    "composio backend mode unavailable: no backend session token. \
                     Sign in first (auth_store_session)."
                )
            })?;
            tracing::debug!("[composio-factory] resolved backend variant");
            Ok(ComposioClientKind::Backend(client))
        }
        MODE_DIRECT_PAT => {
            // Prefer keychain-stored key; fall back to `config.toml`.
            let stored = crate::openhuman::security::credentials::get_composio_api_key(config)
                .map_err(|e| anyhow::anyhow!("failed to read stored composio api key: {e}"))?;
            let api_key = stored
                .or_else(|| {
                    config
                        .composio
                        .api_key
                        .as_ref()
                        .map(|k| k.trim().to_string())

View on GitHub (pinned to 7491200858)

Solutions

  1. Sign in first via auth_store_session (the desktop sign-in flow)
  2. Switch config.composio.mode to "direct" and configure a Composio API key if backend proxying is not wanted
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at src/openhuman/integrations/composio/client.rs:811 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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