Hmbown/CodeWhale · error

` ` is not a provider this Codewhale account can connect…

Error message

`{provider}` is not a provider this Codewhale account can connect. Known providers: {known}

What it means

The CLI looks up the provider name supplied on the command line in the provider catalog fetched from the Codewhale account. If the name is not present in the catalog, it throws this error listing every known provider id so the developer can correct the name.

Solutions

  1. Run the list command (or read the error's `Known providers:` suffix) and use an exact provider id.
  2. Check provider spelling and casing.
  3. Refresh the account catalog (`codewhale account providers list` or re-login) if a newly added provider is missing.

Example fix

// before
codewhale account providers connect openai-chat
// after
codewhale account providers connect openai
Defensive patterns

Strategy: validation

Validate before calling

let known: Vec<&str> = catalog.iter().map(|r| r.id.as_str()).collect();
if !known.contains(&provider) {
    eprintln!("unknown provider; known: {}", known.join(", "));
}

Prevention

When it happens

Trigger: Calling a cloud provider-connect command (e.g. `codewhale account providers connect <provider>`) with a provider string that does not exactly match any `row.id` in the account's provider catalog.

Common situations: Typo or wrong casing in the provider id; using a provider the account is not provisioned for; an outdated catalog cache after new providers were added.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@73e0f67d83 (2026-09-22). Data as JSON: /api/errors/c86565843a4f4ce7. Report an issue: GitHub.

Appendix: source

Thrown at crates/cli/src/cloud.rs:1172

fn is_ascii_control(character: char) -> bool {
    character <= '\u{001f}' || character == '\u{007f}'
}

/// Find one catalog row by id, or fail naming what the account does offer.
///
/// A catalog miss is the common typo, so the message lists the ids rather than
/// leaving the user to guess or read a 404.
fn catalog_row<'a>(catalog: &'a [CatalogProvider], provider: &str) -> Result<&'a CatalogProvider> {
    catalog
        .iter()
        .find(|row| row.id == provider)
        .ok_or_else(|| {
            let known = catalog
                .iter()
                .map(|row| row.id.as_str())
                .collect::<Vec<_>>()
                .join(", ");
            anyhow!("`{provider}` is not a provider this Codewhale account can connect. Known providers: {known}")
        })
}

fn resolve_local_key(
    config: &ConfigStore,
    secrets: &Secrets,
    kind: ProviderKind,
) -> Result<Option<String>> {
    let provider_config = config.config.providers.for_provider(kind);
    let from_config = provider_config.api_key.clone().or_else(|| {
        (kind == ProviderKind::Deepseek)
            .then(|| config.config.api_key.clone())
            .flatten()
    });
    if let Some(value) = from_config
        .and_then(resolve_config_key_reference)
        .filter(|value| !value.trim().is_empty())
    {

View on GitHub (pinned to 73e0f67d83)