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
- Verify the GitHub release actually exists and is published (not draft) and has uploaded assets.
- Check the API URL / release tag being requested points to the correct release.
- 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
- Only query published releases with uploaded assets
- Pin to a known-good release tag
- Validate release payload shape before parsing
- Keep release CI uploading all required binaries
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
- No download URL for asset
- No download URL for checksum asset
- Failed to parse JSON response: {e}
- `{BAML_JSON_JSON}` is declared by the stdlib
- Failed to deserialize value: {e}
AI-assisted analysis of BoundaryML/baml@bd85ce9dee (2026-09-12).
Data as JSON: /api/errors/31b4fa6f4c5611a3.
Report an issue: GitHub.