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
- Make the id start with a lowercase letter, digit, or underscore (rename "-acme" to "acme" or "_acme")
- 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
- Normalize ids to lowercase before validation
- Strip leading separators/spaces from display names before slug generation
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
- Invalid provider id: provider id cannot be empty
- Unknown provider: ${providerId}
- Some providers in skip list don't exist
- Cannot resume with provider or model changes because provide
- Required environment variable {} is not set
AI-assisted analysis of aaif-goose/goose@3810898a74 (2026-08-16).
Data as JSON: /api/errors/5915350f6e22808e.
Report an issue: GitHub.