Hmbown/CodeWhale · error

` ` has no local runtime provider, so there is no local key…

Error message

`{provider}` has no local runtime provider, so there is no local key to copy. Use `--api-key-stdin` or the hidden prompt

What it means

Thrown by the cloud `keys` set command when `--from-local` is passed but the provider catalog has no local runtime provider for the given provider id (`row.local_kind()` returns None). There is no locally-known key type to copy from, so the operation aborts and directs the user to supply the key directly via `--api-key-stdin` or the hidden prompt.

Solutions

  1. Drop `--from-local` and supply the key with `--api-key-stdin` or the hidden interactive prompt instead.
  2. Check the provider id with `validate_provider_id` / the provider catalog to confirm its `local_kind`.
  3. If the provider should have a local runtime, update the provider catalog mapping.

Example fix

// before
codewhale cloud keys set --provider openai --from-local
// after
codewhale cloud keys set --provider openai --api-key-stdin < key.txt
Defensive patterns

Strategy: validation

Validate before calling

// Before --from-local, confirm the catalog row has a local kind
let row = catalog_row(&catalog, &provider)?;
if row.local_kind().is_none() { eprintln!("{} has no local runtime provider", provider); }

Try / catch

match set_key_from_local(provider) {
    Err(e) if e.to_string().contains("no local runtime provider") => {
        // fall back to --api-key-stdin or prompt
    }
    other => other?,
}

Prevention

When it happens

Trigger: Running something like `codewhale cloud keys set --provider <id> --from-local` where `<id>` resolves to a catalog row whose `local_kind()` is None (provider has no local runtime equivalent).

Common situations: Typo'd or unsupported provider id passed to `--provider`; provider is cloud-only with no local runtime counterpart; catalog updated and the provider's local runtime support was removed.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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

Appendix: source

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

                            .filter(|value| !value.is_empty())
                        {
                            Some(reported) => format!("set ({reported})"),
                            None => "set".to_string(),
                        },
                        _ => "not set".to_string(),
                    };
                    writeln!(out, "{}: {status} — {}", row.id, row.display_label())?;
                }
                Ok(())
            }
            CloudKeysCommand::Set(set) => {
                let provider = validate_provider_id(&set.provider)?;
                let user = client.me()?;
                let catalog = client.provider_catalog()?;
                let row = catalog_row(&catalog, &provider)?;
                let key = if set.from_local {
                    let kind = row.local_kind().ok_or_else(|| {
                        anyhow!(
                            "`{provider}` has no local runtime provider, so there is no local key to copy. Use `--api-key-stdin` or the hidden prompt"
                        )
                    })?;
                    resolve_local_key(config, provider_secrets, kind)?.ok_or_else(|| {
                        anyhow!(
                            "No local {} API key was found in config, the secret store, or the environment",
                            kind.as_str()
                        )
                    })?
                } else if set.api_key_stdin {
                    key_reader(KeyReadMode::Stdin)?
                } else {
                    key_reader(KeyReadMode::HiddenPrompt(provider.clone()))?
                };
                let key = key.trim().to_string();
                validate_api_key(&key)?;
                let label = validate_label(&set.label)?;
                client.set_key(&provider, &key, &label)?;

View on GitHub (pinned to 73e0f67d83)