{"record":{"id":"7f88e095c8e19559","repo":"aaif-goose/goose","slug":"could-not-configure-agent-missing-provider","errorCode":null,"errorMessage":"Could not configure agent: missing provider","messagePattern":"Could not configure agent: missing provider","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/goose/src/agents/agent.rs","lineNumber":3548,"sourceCode":"            .model_config_for_session(session_id)\n            .await?\n            .with_thinking_effort(effort);\n\n        self.recreate_provider_for_session(session_id, &provider_name, model_config)\n            .await\n    }\n\n    /// Restore the provider from session data or fall back to global config\n    /// This is used when resuming a session to restore the provider state\n    /// Returns true if the session's provider was replaced with a fallback.\n    pub async fn restore_provider_from_session(&self, session: &Session) -> Result<bool> {\n        let config = Config::global();\n\n        let provider_name = session\n            .provider_name\n            .clone()\n            .or_else(|| config.get_goose_provider().ok())\n            .ok_or_else(|| anyhow!(\"Could not configure agent: missing provider\"))?;\n\n        let mut model_config = match session.model_config.clone() {\n            Some(saved_config) => saved_config,\n            None => {\n                let model_name = config\n                    .get_goose_model()\n                    .ok()\n                    .ok_or_else(|| anyhow!(\"Could not configure agent: missing model\"))?;\n                crate::model_config::model_config_from_user_config(&provider_name, &model_name)\n                    .map_err(|e| anyhow!(\"Could not configure agent: invalid model {}\", e))?\n            }\n        };\n\n        // if the saved model is the ACP sentinel \"current\", only preserve this if the provider\n        // uses this sentinel to indicate it's an ACP provider that manages its model\n        if model_config.model_name == crate::acp::ACP_CURRENT_MODEL {\n            if let Ok(entry) = crate::providers::get_from_registry(&provider_name).await {\n                if entry.metadata().default_model != crate::acp::ACP_CURRENT_MODEL {","sourceCodeStart":3530,"sourceCodeEnd":3566,"githubUrl":"https://github.com/aaif-goose/goose/blob/3810898a7447ec3299be72e223d3570a7aabf0ab/crates/goose/src/agents/agent.rs#L3530-L3566","documentation":"Thrown by Agent::restore_provider_from_session when a session is resumed and no provider can be resolved. Goose resolves the provider as session.provider_name first, then falls back to the global config key GOOSE_PROVIDER; when both are absent the agent cannot construct a provider and session restore aborts. It is a configuration error, not a transient failure.","triggerScenarios":"Calling any resume path (goose session resume / --continue, desktop session restore, or Agent::restore_provider_from_session directly) with a session whose persisted metadata has no provider_name while GOOSE_PROVIDER is unset in ~/.config/goose/config.yaml and in the environment.","commonSituations":"Resuming sessions created by older goose versions that did not persist provider metadata; a fresh install where 'goose configure' was never run; config.yaml deleted or the GOOSE_PROVIDER key removed; launching the desktop app from a shell that lacks the exported env var.","solutions":["Run 'goose configure' (or 'export GOOSE_PROVIDER=<name>', e.g. openai) and resume the session again","Verify the key exists: check ~/.config/goose/config.yaml or run 'goose config read' for GOOSE_PROVIDER","If the session file predates provider persistence, start a new session instead of resuming","For embedded usage, call Agent::update_provider explicitly before invoking restore_provider_from_session"],"exampleFix":"# before\n$ goose session resume\nError: Could not configure agent: missing provider\n\n# after\n$ export GOOSE_PROVIDER=openai\n$ export GOOSE_MODEL=gpt-4o\n$ goose session resume","handlingStrategy":"validation","validationCode":"// Rust — before resuming, ensure a provider is resolvable\nlet provider = session.provider_name.clone()\n    .or_else(|| Config::global().get_goose_provider().ok());\nif provider.is_none() {\n    // set GOOSE_PROVIDER or call agent.update_provider(...) before restore\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always run 'goose configure' once after install so GOOSE_PROVIDER and GOOSE_MODEL are persisted","Export GOOSE_PROVIDER/GOOSE_MODEL in CI or service environments that resume sessions","Treat sessions older than the current goose major version as suspect for provider metadata"],"tags":["configuration","session-restore","provider","startup"],"backgroundTag":null,"analyzedSha":"3810898a7447ec3299be72e223d3570a7aabf0ab","analyzedAt":"2026-08-16T10:14:26.282Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}