aaif-goose/goose · error

Invalid provider id: {}

Error message

Invalid provider id: {}

What it means

validate_provider_id enforces that a provider id starts with an ASCII lowercase letter, digit, or underscore. This variant is returned when the id is non-empty but its FIRST character violates that rule (uppercase letter, hyphen, dot, space, or any other symbol).

Source

Thrown at crates/goose/src/config/declarative_providers.rs:106

    while custom_dir.join(format!("{}.json", candidate_id)).exists() {
        candidate_id = format!("{}_{}", base_id, counter);
        counter += 1;
    }

    candidate_id
}

pub fn validate_provider_id(id: &str) -> Result<()> {
    let mut chars = id.chars();
    let Some(first) = chars.next() else {
        return Err(anyhow::anyhow!(
            "Invalid provider id: provider id cannot be empty"
        ));
    };

    if !(first.is_ascii_lowercase() || first.is_ascii_digit() || first == '_') {
        return Err(anyhow::anyhow!("Invalid provider id: {}", id));
    }

    if chars.all(|ch| ch.is_ascii_lowercase() || ch.is_ascii_digit() || ch == '_' || ch == '-') {
        Ok(())
    } else {
        Err(anyhow::anyhow!("Invalid provider id: {}", id))
    }
}

fn custom_provider_file_path(id: &str) -> Result<PathBuf> {
    if id.is_empty()
        || id
            .chars()
            .any(|ch| ch == '/' || ch == '\\' || ch.is_control())
    {
        return Err(anyhow::anyhow!(
            "Invalid provider id: {}",
            if id.is_empty() { "<empty>" } else { id }

View on GitHub (pinned to 3810898a74)

Solutions

  1. Make the id start with a lowercase letter, digit, or underscore (rename "-acme" to "acme" or "_acme")
  2. Give the display name a leading alphanumeric word so the generated slug starts clean

Example fix

// before
validate_provider_id("-acme")?;

// after
validate_provider_id("acme")?;
Defensive patterns

Strategy: validation

Validate before calling

fn first_char_ok(id: &str) -> bool {
    id.chars().next().is_some_and(|c| c.is_ascii_lowercase() || c.is_ascii_digit() || c == '_')
}

Type guard

fn is_valid_provider_id(id: &str) -> bool {
    let mut chars = id.chars();
    matches!(chars.next(), Some(c) if c.is_ascii_lowercase() || c.is_ascii_digit() || c == '_')
        && chars.all(|c| c.is_ascii_lowercase() || c.is_ascii_digit() || c == '_' || c == '-')
}

Prevention

When it happens

Trigger: Passing an id like "-acme", "OpenAI", ".local", or " acme" to validate_provider_id, or a display name whose slugified form begins with a hyphen (e.g. "- Acme Gateway") so generate_id yields a leading '-'.

Common situations: Hand-editing custom provider ids; provider ids copied from vendor names that start uppercase; script-generated ids that prefix a separator.

Related errors


AI-assisted analysis of aaif-goose/goose@3810898a74 (2026-08-16). Data as JSON: /api/errors/5915350f6e22808e. Report an issue: GitHub.