aaif-goose/goose · error

Could not configure agent: missing provider

Error message

Could not configure agent: missing provider

What it means

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.

Source

Thrown at crates/goose/src/agents/agent.rs:3548

            .model_config_for_session(session_id)
            .await?
            .with_thinking_effort(effort);

        self.recreate_provider_for_session(session_id, &provider_name, model_config)
            .await
    }

    /// Restore the provider from session data or fall back to global config
    /// This is used when resuming a session to restore the provider state
    /// Returns true if the session's provider was replaced with a fallback.
    pub async fn restore_provider_from_session(&self, session: &Session) -> Result<bool> {
        let config = Config::global();

        let provider_name = session
            .provider_name
            .clone()
            .or_else(|| config.get_goose_provider().ok())
            .ok_or_else(|| anyhow!("Could not configure agent: missing provider"))?;

        let mut model_config = match session.model_config.clone() {
            Some(saved_config) => saved_config,
            None => {
                let model_name = config
                    .get_goose_model()
                    .ok()
                    .ok_or_else(|| anyhow!("Could not configure agent: missing model"))?;
                crate::model_config::model_config_from_user_config(&provider_name, &model_name)
                    .map_err(|e| anyhow!("Could not configure agent: invalid model {}", e))?
            }
        };

        // if the saved model is the ACP sentinel "current", only preserve this if the provider
        // uses this sentinel to indicate it's an ACP provider that manages its model
        if model_config.model_name == crate::acp::ACP_CURRENT_MODEL {
            if let Ok(entry) = crate::providers::get_from_registry(&provider_name).await {
                if entry.metadata().default_model != crate::acp::ACP_CURRENT_MODEL {

View on GitHub (pinned to 3810898a74)

Solutions

  1. Run 'goose configure' (or 'export GOOSE_PROVIDER=<name>', e.g. openai) and resume the session again
  2. Verify the key exists: check ~/.config/goose/config.yaml or run 'goose config read' for GOOSE_PROVIDER
  3. If the session file predates provider persistence, start a new session instead of resuming
  4. For embedded usage, call Agent::update_provider explicitly before invoking restore_provider_from_session

Example fix

# before
$ goose session resume
Error: Could not configure agent: missing provider

# after
$ export GOOSE_PROVIDER=openai
$ export GOOSE_MODEL=gpt-4o
$ goose session resume
Defensive patterns

Strategy: validation

Validate before calling

// Rust — before resuming, ensure a provider is resolvable
let provider = session.provider_name.clone()
    .or_else(|| Config::global().get_goose_provider().ok());
if provider.is_none() {
    // set GOOSE_PROVIDER or call agent.update_provider(...) before restore
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of aaif-goose/goose@3810898a74 (2026-08-16). Data as JSON: /api/errors/7f88e095c8e19559. Report an issue: GitHub.