BoundaryML/baml · error

No assets in release metadata

Error message

No assets in release metadata

What it means

After parsing the release metadata, get_playground_dist accesses release["assets"].as_array(). If the JSON has no "assets" key or it is not an array (e.g. GitHub returned an error object or a message payload), this error is thrown. It is a structural guard ensuring release metadata looks like a normal GitHub release response.

Source

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

            .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...");
    let release: serde_json::Value = resp
        .json()
        .await
        .map_err(|e| anyhow::anyhow!("Failed to parse JSON response: {e}"))?;

    // Find the main asset
    let assets = release["assets"]
        .as_array()
        .ok_or_else(|| anyhow::anyhow!("No assets in release metadata"))?;
    let asset = assets
        .iter()
        .find(|a| a["name"].as_str() == Some(&web_panel_asset_name))
        .ok_or_else(|| anyhow::anyhow!("No asset named '{}' in release", web_panel_asset_name))?;
    let download_url = asset["browser_download_url"]
        .as_str()
        .ok_or_else(|| anyhow::anyhow!("No download URL for asset"))?;

    // Find the checksum asset
    let checksum_asset = assets
        .iter()
        .find(|a| a["name"].as_str() == Some(&checksum_asset_name))
        .ok_or_else(|| {
            anyhow::anyhow!(
                "No checksum asset named '{}' in release",
                checksum_asset_name
            )
        })?;

View on GitHub (pinned to bd85ce9dee)

Solutions

  1. Verify the GitHub release actually exists and is published (not draft) and has uploaded assets.
  2. Check the API URL / release tag being requested points to the correct release.
  3. Log the full release JSON to confirm the payload shape and update the parsing logic if GitHub changed the schema.
Defensive patterns

Strategy: validation

Validate before calling

// preflight: confirm the release is published and has assets
let v: serde_json::Value = reqwest::get(&api_url).await?.json().await?;
if v["assets"].as_array().map_or(true, |a| a.is_empty()) {
    eprintln!("Release has no assets (draft or empty?) — abort early");
}

Type guard

// check release payload shape
fn has_assets(release: &serde_json::Value) -> bool {
    release.get("assets").and_then(|a| a.as_array()).map_or(false, |a| !a.is_empty())
}

Try / catch

match get_playground_dist().await {
    Err(e) if e.to_string().contains("No assets in release metadata") => {
        eprintln!("Draft or asset-less release; pin a published release");
    }
    other => other?,
}

Prevention

When it happens

Trigger: The parsed JSON lacks an assets array — e.g. GitHub returned {"message": "Not Found"} with a 200 from a cache, a draft release with no assets, or an unexpected API response shape.

Common situations: Querying a draft release (assets not visible via the public API); an unexpected API payload version; a release published without uploading the playground binaries.

Understand the failure class

Background: "invalid response format", "malformed payload", "missing data field": when an API returns 200 but the response shape is wrong — this error's family across 23 libraries.

Related errors


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