BoundaryML/baml · error
usage: baml toolchain install <canary|nightly|version>
Error message
usage: baml toolchain install <canary|nightly|version>
What it means
`baml toolchain install` requires exactly one selector argument naming which toolchain to install: `canary`, `nightly`, or a specific version. When the selector argument is missing entirely, the `toolchain` function throws this usage error via `args.get(1).ok_or_else(...)`.
Source
Thrown at baml_language/crates/baml/src/main.rs:358
fs::create_dir_all(parent)?;
}
let tmp = path.with_extension("tmp");
fs::write(&tmp, toml::to_string_pretty(value)?)?;
fs::rename(tmp, path)?;
Ok(())
}
fn toolchain(args: Vec<String>) -> Result<()> {
let (args, manifest_base_url) = parse_manifest_base_url(args)?;
match args.first().map(String::as_str) {
Some("--help" | "-h" | "help") | None => {
print!("{TOOLCHAIN_HELP}");
Ok(())
}
Some("install") => {
let selector = args
.get(1)
.ok_or_else(|| anyhow!("usage: baml toolchain install <canary|nightly|version>"))?;
let force = args.iter().any(|arg| arg == "--force");
install_toolchain(selector, false, manifest_base_url.as_deref(), force)
}
Some("use") => {
let selector = args.get(1).ok_or_else(|| {
anyhow!("usage: baml toolchain use <canary|nightly|version|path>")
})?;
use_toolchain(selector, manifest_base_url.as_deref())
}
Some("pin") => {
let selector = args.get(1).ok_or_else(|| {
anyhow!("usage: baml toolchain pin <canary|nightly|version|path>")
})?;
if args.len() > 2 {
return Err(anyhow!(
"usage: baml toolchain pin <canary|nightly|version|path>\nunexpected arguments: {}",
args[2..].join(" ")
));View on GitHub (pinned to bd85ce9dee)
Solutions
- Provide a selector: `baml toolchain install canary`, `baml toolchain install nightly`, or `baml toolchain install <version>` (e.g. `0.210.0`).
- Run `baml toolchain install --help` or `baml toolchain --help` for usage.
- If the selector comes from a shell variable, verify it is non-empty before invoking.
Example fix
# before baml toolchain install --force # after baml toolchain install canary --force
Defensive patterns
Strategy: validation
Validate before calling
selector="${SELECTOR:?SELECTOR must be set (canary|nightly|version)}"
case "$selector" in canary|nightly|[0-9]*.[0-9]*.[0-9]*) ;; *) echo "invalid selector: $selector" >&2; exit 1;; esac
baml toolchain install "$selector" Type guard
function isValidInstallSelector(s: string): boolean {
return s === "canary" || s === "nightly" || /^\d+\.\d+\.\d+$/.test(s);
} Try / catch
try:
subprocess.run(["baml", "toolchain", "install", selector], check=True)
except subprocess.CalledProcessError as e:
if "usage: baml toolchain install" in e.stderr.decode():
raise SystemExit("Selector missing — pass canary, nightly, or a version") Prevention
- Always pass an explicit selector after `toolchain install`.
- Validate shell variables for emptiness before interpolating into the command.
- Remember `--force` is optional but the selector is not.
When it happens
Trigger: Running `baml toolchain install` with no further arguments, or with only flags like `baml toolchain install --force` (the flag is scanned later but the selector slot is empty).
Common situations: Users forgetting the version selector, scripts calling `baml toolchain install` with an unset variable, or mistyping the subcommand so the selector lands in the wrong position.
Understand the failure class
Background: "no subcommand specified" and "... is required": CLI errors when a required argument is missing — this error's family across 13 libraries.
Related errors
- usage: baml toolchain use <canary|nightly|version|path>
- usage: baml toolchain pin <canary|nightly|version|path>
- usage: baml toolchain uninstall <version>
- usage: baml toolchain pin <canary|nightly|version|path> unex
- unknown toolchain command {other:?} {TOOLCHAIN_HELP}
AI-assisted analysis of BoundaryML/baml@bd85ce9dee (2026-09-12).
Data as JSON: /api/errors/acb7c0b22661bd4c.
Report an issue: GitHub.