tinyhumansai/openhuman · error
failed to build integration HTTP client
Error message
failed to build integration HTTP client
What it means
Panic payload on the reqwest client build for IntegrationClient (/agent-integrations/* traffic): after sanitizing the backend URL and selecting the platform TLS backend (schannel on Windows, rustls elsewhere) plus product-identity headers, builder.build() failed. Client construction is deterministic from config, so failure means malformed proxy/TLS configuration; the expect aborts client creation.
Source
Thrown at src/openhuman/integrations/client.rs:344
// to fix up the input so the regression is observable in logs.
let backend_url = sanitize_backend_url(&backend_url);
// Platform-appropriate TLS backend — see [`crate::openhuman::util::tls`].
// Windows uses schannel (native-tls) to honor the OS cert store;
// macOS / Linux keep rustls which avoids the OpenSSL runtime dep and
// has historically been more reliable on staging TLS handshakes.
//
// `/agent-integrations/*` is backend traffic like any other, so it
// carries the same product identity as `BackendOAuthClient`. The SDK
// merges its own default headers into every request, so `http_client`
// needs nothing beyond `with_default_headers` below.
let product_headers = crate::api::product::product_identity_headers();
let http_client = crate::openhuman::util::tls::tls_client_builder()
.http1_only()
.timeout(Duration::from_secs(60))
.connect_timeout(Duration::from_secs(15))
.build()
.expect("failed to build integration HTTP client");
let sdk = TinyHumansClient::new(&backend_url)
.with_token(Some(auth_token.clone()))
.with_http_client(http_client.clone())
.with_default_headers(product_headers);
// `download_client` deliberately does NOT carry the product identity.
// Its one caller (`get_bytes`) fetches
// `/agent-integrations/file-storage/files/{id}/download`, which answers
// a 302 to a presigned S3 URL. reqwest follows redirects by default and
// strips only *sensitive* headers (Authorization, Cookie, …) when the
// host changes — a custom header like `x-sdk-name` survives the hop, so
// tagging this transport would disclose the product identity to the
// storage provider. Attaching it per-request would not help: redirected
// requests carry the original request headers too.
//
// The lost attribution is deliberate and cheap: the header cannot be
// scoped to the first hop without hand-rolling redirect following, and
// any session that downloads a file has already made SDK-path calls that
// are tagged.View on GitHub (pinned to 7491200858)
Solutions
- Inspect proxy and TLS settings in the effective config for malformed values
- Verify the schannel/rustls feature set matches the platform build
- Replace the expect with error propagation so integrations degrade gracefully when the client cannot build
Defensive patterns
Strategy: try-catch
When it happens
Trigger: Thrown at src/openhuman/integrations/client.rs:344 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/0e9578d37cf9bc74.
Report an issue: GitHub.