tinyhumansai/openhuman · error

Exa request failed: {e}

Error message

Exa request failed: {e}

What it means

Raised in ExaClient::post when the reqwest POST to the Exa API fails at the transport layer — DNS failure, connection refused/reset, TLS handshake error, or timeout — before any HTTP status is obtained. The x-api-key header and JSON body were already attached, and the egress-spine disclosure (emit_external_transfer) has already run, so this error only covers 'the request never got a response'. It propagates to all Exa tool executions (search, find similar, contents).

Source

Thrown at src/openhuman/search/tools/exa.rs:226

            "[exa] POST {url} (direct BYOK)"
        );

        // Egress spine (privacy epic S2, #4436): disclose the destination before
        // contacting Exa. `local_only_block` has already refused the call if the
        // live policy forbids it.
        crate::openhuman::security::egress::emit_external_transfer(self.egress_descriptor());

        let resp = client
            .post(&url)
            .header("x-api-key", api_key)
            .header("Content-Type", "application/json")
            .header("Accept", "application/json")
            .json(&body)
            .send()
            .await
            .map_err(|e| {
                tracing::warn!("[exa] request to {path} failed: {e}");
                anyhow::anyhow!("Exa request failed: {e}")
            })?;

        let status = resp.status();
        if !status.is_success() {
            // Read and drop the body: Exa echoes the query back in errors and
            // the message reaches the agent transcript.
            let body_len = resp.text().await.unwrap_or_default().len();
            tracing::warn!(status = %status, body_len, "[exa] non-2xx response");
            if status == reqwest::StatusCode::UNAUTHORIZED
                || status == reqwest::StatusCode::FORBIDDEN
            {
                anyhow::bail!(
                    "Exa rejected the configured API key (HTTP {status}). \
                     Check your Exa API key under Connections > Search engine."
                );
            }
            anyhow::bail!("Exa returned non-2xx status {status}");
        }

View on GitHub (pinned to 7491200858)

Solutions

  1. Check network connectivity and that https://api.exa.ai (or the configured api_url) is reachable.
  2. Verify corporate proxy / firewall settings; the request honors the app's proxy-aware HTTP client config.
  3. Retry — transient network failures are often short-lived; back off before repeated attempts.
  4. If using a custom exa api_url in config, confirm the endpoint is correct and alive.
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at src/openhuman/search/tools/exa.rs:226 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/361d2311cf8046ad. Report an issue: GitHub.