BoundaryML/baml · error

Failed to fetch release metadata

Error message

Failed to fetch release metadata: {e}

What it means

get_playground_dist sends a GET request to the GitHub API to list the latest release. If the request fails at the transport level (DNS failure, connection refused/reset, timeout, TLS error), reqwest's error is wrapped with this message. It means the GitHub metadata request never produced an HTTP response.

Solutions

  1. Verify network access to api.github.com from the host (curl -v https://api.github.com).
  2. Configure proxy support (HTTPS_PROXY env var) if behind a corporate proxy.
  3. Retry after confirming GitHub status (https://www.githubstatus.com) if it is a transient outage or timeout.
  4. Fix DNS in the container/host (check /etc/resolv.conf) if name resolution fails.
  5. Pre-bundle the playground dist so the download path is not needed on machines without internet.
Defensive patterns

Strategy: retry

Validate before calling

// preflight connectivity check before invoking the server feature
let ok = tokio::net::TcpStream::connect("api.github.com:443").await.is_ok();
if !ok { eprintln!("api.github.com unreachable; use bundled dist"); }

Try / catch

// retry with backoff on transport errors
for attempt in 0..3 {
    match get_playground_dist().await {
        Ok(d) => return Ok(d),
        Err(e) if e.to_string().contains("Failed to fetch release metadata") => {
            tokio::time::sleep(Duration::from_secs(2u64.pow(attempt))).await;
        }
        Err(e) => return Err(e),
    }
}

Prevention

When it happens

Trigger: client.get(&api_url).send() returns Err — no DNS resolution, network outage, firewall blocking api.github.com, or the 30s request / 10s connect timeout elapsing.

Common situations: Running the playground server in an air-gapped or firewalled environment with no access to api.github.com; corporate proxies blocking the request; transient GitHub outages; slow networks tripping the 10s connect timeout; DNS misconfiguration in containers.

Related errors


AI-assisted analysis of BoundaryML/baml@bd85ce9dee (2026-09-12). Data as JSON: /api/errors/a2a27a570c55dc0b. Report an issue: GitHub.

Appendix: source

Thrown at engine/playground-server/src/server.rs:134

    // Build the GitHub API URL using the version as the release tag
    let api_url = format!("https://api.github.com/repos/{github_repo}/releases/tags/{version}");
    tracing::info!("Fetching web-panel release metadata from: {}", api_url);

    // Fetch release metadata with timeout
    let client = reqwest::Client::builder()
        .timeout(Duration::from_secs(30))
        .connect_timeout(Duration::from_secs(10))
        .build()
        .map_err(|e| anyhow::anyhow!("Failed to create HTTP client: {e}"))?;

    tracing::info!("Sending request to GitHub API...");
    let resp = client
        .get(&api_url)
        .header("User-Agent", "baml-playground-server")
        .send()
        .await
        .map_err(|e| anyhow::anyhow!("Failed to fetch release metadata: {e}"))?;

    tracing::info!("Received response with status: {}", resp.status());

    // Check if the response is successful
    if !resp.status().is_success() {
        let status = resp.status();
        let body = resp
            .text()
            .await
            .unwrap_or_else(|_| "Failed to read response body".to_string());
        return Err(anyhow::anyhow!(
            "GitHub API request failed with status {}: {}",
            status,
            body
        ));
    }

    tracing::info!("Parsing JSON response...");

View on GitHub (pinned to bd85ce9dee)