{"record":{"id":"742360147e99d64e","repo":"aaif-goose/goose","slug":"cannot-resume-with-provider-or-model-changes-becau","errorCode":null,"errorMessage":"Cannot resume with provider or model changes because provider '{}' manages its own conversation context. Start a new session to use this provider or model.","messagePattern":"Cannot resume with provider or model changes because provider '(.+?)' manages its own conversation context\\. Start a new session to use this provider or model\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/goose-cli/src/session/builder.rs","lineNumber":253,"sourceCode":"\nfn validate_provider_override_context(\n    session_config: &SessionBuilderConfig,\n    saved_provider: Option<&str>,\n    saved_model: Option<&str>,\n    provider_name: &str,\n    model_name: &str,\n    provider_manages_own_context: bool,\n) -> anyhow::Result<()> {\n    let provider_changed = saved_provider\n        .map(|saved| saved != provider_name)\n        .unwrap_or_else(|| session_config.provider.is_some());\n    let model_changed = saved_model\n        .map(|saved| saved != model_name)\n        .unwrap_or_else(|| session_config.model.is_some());\n\n    if session_config.resume && provider_manages_own_context && (provider_changed || model_changed)\n    {\n        anyhow::bail!(\n            \"Cannot resume with provider or model changes because provider '{}' manages its own conversation context. Start a new session to use this provider or model.\",\n            provider_name\n        );\n    }\n\n    Ok(())\n}\n\nasync fn resolve_provider_and_model(\n    session_config: &SessionBuilderConfig,\n    config: &Config,\n    saved_provider: Option<String>,\n    saved_model_config: Option<goose_providers::model::ModelConfig>,\n) -> ResolvedProviderConfig {\n    let recipe_settings = session_config\n        .recipe\n        .as_ref()\n        .and_then(|r| r.settings.as_ref());","sourceCodeStart":235,"sourceCodeEnd":271,"githubUrl":"https://github.com/aaif-goose/goose/blob/3810898a7447ec3299be72e223d3570a7aabf0ab/crates/goose-cli/src/session/builder.rs#L235-L271","documentation":"You asked goose to resume an existing session while also changing the provider or model, but the session was created with a provider whose manages_own_context() is true (the claude_code and gemini_cli providers). Those providers store the conversation inside their own CLI backend, so goose has no transcript it can transplant into a different provider/model; resuming with a change is therefore refused. This also fires when no saved provider/model metadata exists but the session config explicitly sets one.","triggerScenarios":"`goose session resume` (or headless resume) with --provider/--model differing from the saved session while the session used claude_code or gemini_cli; or GOOSE_PROVIDER/GOOSE_MODEL env overrides taking effect on resume of such a session.","commonSituations":"Switching from a managed-context CLI provider to a direct API provider (or vice versa) mid-project; stale GOOSE_MODEL exports in the shell causing an unintended 'change' on resume.","solutions":["Resume without changing provider or model — drop the --provider/--model flags and unset GOOSE_PROVIDER/GOOSE_MODEL overrides.","If you need the other provider/model, start a new session (goose session new / fresh `goose run`) instead of resuming.","If you believe nothing changed, check saved session metadata for the original provider/model and match it exactly."],"exampleFix":"# before\n$ goose session resume --provider openai\nError: Cannot resume with provider or model changes because provider 'claude_code' manages its own conversation context. ...\n\n# after\n$ unset GOOSE_PROVIDER GOOSE_MODEL\n$ goose session resume                 # same provider/model as saved\n# or start fresh with the other provider:\n$ goose session new --provider openai","handlingStrategy":"validation","validationCode":"# before resuming, confirm no provider/model override differs from the saved session\nsaved_provider=$(jq -r '.metadata.provider // empty' ~/.config/goose/sessions/${SESSION}.json 2>/dev/null)\n[ -z \"${GOOSE_PROVIDER:-}\" ] || [ \"${GOOSE_PROVIDER}\" = \"$saved_provider\" ] \\\n  || echo \"refusing: managed-context session + provider change\"","typeGuard":null,"tryCatchPattern":"match resume_session(&id, &opts).await {\n    Err(e) if e.to_string().contains(\"manages its own conversation context\") => {\n        // hard rule: start a new session with the desired provider/model\n        new_session(&opts).await\n    }\n    r => r,\n}","preventionTips":["Don't set GOOSE_PROVIDER/GOOSE_MODEL globally; scope overrides per-command.","For managed-context providers (claude_code, gemini_cli), pick provider/model at session creation and stick with it."],"tags":["session","resume","providers","context-management","validation"],"backgroundTag":null,"analyzedSha":"3810898a7447ec3299be72e223d3570a7aabf0ab","analyzedAt":"2026-08-16T10:14:26.282Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}