{"record":{"id":"ee3574005ccdee5a","repo":"aaif-goose/goose","slug":"provider-not-found-available","errorCode":null,"errorMessage":"Provider '{}' not found. Available: {}","messagePattern":"Provider '(.+?)' not found\\. Available: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/goose-cli/src/scenario_tests/scenario_runner.rs","lineNumber":62,"sourceCode":"    }\n}\n\npub async fn run_scenario<F>(\n    test_name: &str,\n    message_generator: MessageGenerator<'_>,\n    providers_to_skip: Option<&[&str]>,\n    validator: F,\n) -> Result<()>\nwhere\n    F: Fn(&ScenarioResult) -> Result<()> + Send + Sync + 'static,\n{\n    if let Ok(only_provider) = std::env::var(\"GOOSE_TEST_PROVIDER\") {\n        let active_providers = get_provider_configs();\n        let config = active_providers\n            .iter()\n            .find(|c| c.name.to_lowercase() == only_provider.to_lowercase())\n            .ok_or_else(|| {\n                anyhow::anyhow!(\n                    \"Provider '{}' not found. Available: {}\",\n                    only_provider,\n                    get_provider_configs()\n                        .iter()\n                        .map(|c| c.name)\n                        .collect::<Vec<_>>()\n                        .join(\", \")\n                )\n            })?;\n\n        println!(\"Running test '{}' for provider: {}\", test_name, config.name);\n        run_provider_scenario_with_validation(config, test_name, &message_generator, &validator)\n            .await?;\n        return Ok(());\n    }\n\n    let excluded_providers: HashSet<_> = providers_to_skip\n        .into_iter()","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/aaif-goose/goose/blob/3810898a7447ec3299be72e223d3570a7aabf0ab/crates/goose-cli/src/scenario_tests/scenario_runner.rs#L44-L80","documentation":"GOOSE_TEST_PROVIDER is set, and goose scenario runner matched it (case-insensitively) against the provider names returned by get_provider_configs() and found nothing. The error message deliberately includes the full list of valid provider names so you can correct the env var.","triggerScenarios":"Running scenario tests with GOOSE_TEST_PROVIDER=openai when the config set names providers differently (e.g. 'openai-gpt-4o', 'anthropic'), or the var was left set from an older branch where provider names changed.","commonSituations":"Provider config renamed between goose versions; copy-pasted test commands from docs referencing stale provider names; shell profiles exporting the var permanently.","solutions":["Read the 'Available: ...' list in the error and set GOOSE_TEST_PROVIDER to one of those exact names.","Unset the variable to run across all configured providers instead.","If you expected a provider to exist, check your goose provider configuration (goose configure) so it appears in get_provider_configs()."],"exampleFix":"# before\n$ GOOSE_TEST_PROVIDER=gpt4 cargo test -p goose-cli scenario\nError: Provider 'gpt4' not found. Available: openai, anthropic, google\n\n# after\n$ GOOSE_TEST_PROVIDER=openai cargo test -p goose-cli scenario","handlingStrategy":"validation","validationCode":"# bash: validate against the same config list before running\navail=$(grep -oP 'name\\s*=\\s*\"\\K[^\"]+' crates/goose-cli/src/scenario_tests/provider_config.rs | tr '\\n' ',')\n[[ \",${avail},\" == *\",${GOOSE_TEST_PROVIDER,,},\"* ]] || unset GOOSE_TEST_PROVIDER","typeGuard":null,"tryCatchPattern":"if let Err(e) = run_scenario(...).await {\n    if e.to_string().starts_with(\"Provider '\") {\n        // fix GOOSE_TEST_PROVIDER using the names listed in the error\n    }\n}","preventionTips":["Don't export GOOSE_TEST_PROVIDER in shell profiles — set it per-command.","After provider renames, grep CI scripts for stale provider names."],"tags":["testing","configuration","env-vars","providers"],"backgroundTag":null,"analyzedSha":"3810898a7447ec3299be72e223d3570a7aabf0ab","analyzedAt":"2026-08-16T10:14:26.282Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}