BoundaryML/baml · error

active toolchain is a local path and has no version

Error message

active toolchain is a local path and has no version: {}

What it means

Fires when the code needs a concrete version string for the active selector (e.g. `baml --version`, status, or pinning state) but the selector is a local path. Path-based toolchains are unpacked directories built locally, not versioned downloads, so there is no version number to report. This is a sentinel error from the version-resolution guard, not a corrupted install.

Solutions

  1. If a version number is required, switch to a versioned toolchain: `baml toolchain use canary` (or nightly / a specific version)
  2. If reporting status of a local build is intended, use `baml toolchain status` which handles path selectors without needing a version
  3. To pin a version for the project, write it in baml.toml [toolchain] instead of using a path selector
Defensive patterns

Strategy: fallback

When it happens

Trigger: Thrown at baml_language/crates/baml/src/main.rs:600 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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

Appendix: source

Thrown at baml_language/crates/baml/src/main.rs:600

            return Some(candidate);
        }
        if home.as_ref().is_some_and(|home| dir == *home) || !dir.pop() {
            break;
        }
    }
    None
}

fn concrete_version_for_selector(selector: &ResolvedSelector) -> Result<String> {
    concrete_version_for_selector_with_base(selector, &baml_release::manifest_base_url())
}

fn concrete_version_for_selector_with_base(
    selector: &ResolvedSelector,
    current_base: &str,
) -> Result<String> {
    if is_path_selector(&selector.selector) {
        return Err(anyhow!(
            "active toolchain is a local path and has no version: {}",
            selector.selector
        ));
    }
    if is_channel(&selector.selector) {
        let state = read_state();
        if let Some(channel) = state.channels.get(&selector.selector) {
            if channel
                .manifest_base_url
                .as_deref()
                .is_some_and(|base| base.trim_end_matches('/') != current_base)
            {
                return Err(anyhow!(
                    "channel {} was selected from a different manifest source.\nRun: baml toolchain use {} under the current manifest source.",
                    selector.selector,
                    selector.selector
                ));
            }

View on GitHub (pinned to bd85ce9dee)