Hmbown/CodeWhale · error

ModelsUpdatePartial

ModelsUpdatePartial

Error message

{}

What it means

run_models prints a translated ModelsUpdatePartial message via anyhow::bail! after the models update flow when one or more provider fetches failed (failed > 0) while others succeeded. The dynamic message text is the whole error message, so this error represents a partially-successful update: some routes/providers updated, at least one did not.

Solutions

  1. Inspect the printed per-provider receipts/logs to see which provider failed and why, then fix that provider's credentials or endpoint and re-run the update
  2. Check network connectivity / proxy settings if the failing provider is remote
  3. If a provider is intentionally unused, remove or disable its route so the update no longer counts it as failed

Example fix

// the failure is in the per-provider receipts; re-run after fixing that provider
// before: codex-cli key expired for one provider
// after: export the fresh key / re-auth that provider, then re-run:
models update
Defensive patterns

Strategy: try-catch

Validate before calling

// before running models update, confirm all configured providers are reachable/authorized
for route in config.provider_routes() {
    if !provider_reachable(route) { eprintln!("{} unreachable; update will be partial", route); }
}

Try / catch

match run_models(/* update mode */).await {
    Err(e) if e.to_string().contains("partial") || failed_receipts_exist => {
        eprintln!("Some providers failed: inspect receipts, fix credentials/network, retry update");
    }
    Ok(()) => (),
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: run_models (models update path) when the per-receipt failure count is greater than 0 — at least one provider/route fetch or update failed during the update pass; called from models_listing_is_offline_and_update_never_forwards_another_routes_cli_key coverage.

Common situations: A provider endpoint is unreachable or returns an error while others succeed; stale or invalid credentials for one provider cause its fetch to fail; offline/partial network during 'models update'; a provider's upstream API changed shape and its fetch errors.

Understand the failure class

Background: 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause — this error's family across 28 libraries.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@433685b202 (2026-09-15). Data as JSON: /api/errors/619d9e86d25279c4. Report an issue: GitHub.

Appendix: source

Thrown at crates/tui/src/provider_lake.rs:1701

                    receipt
                        .observed_at
                        .map_or_else(|| "unknown".to_string(), |timestamp| timestamp.to_string()),
                    receipt.source,
                    serde_json::to_string(&receipt.status)?,
                    receipt
                        .error
                        .map_or_else(String::new, |error| format!("\terror={error}"))
                );
            }
            if receipts
                .iter()
                .any(|receipt| matches!(receipt.source, "codex_cli_cache" | "codex_app_server"))
            {
                println!("{}", tr(locale, MessageId::ModelsCodexHint));
            }
        }
        if failed > 0 {
            anyhow::bail!("{}", tr(locale, MessageId::ModelsUpdatePartial));
        }
        return Ok(());
    }
    let identity = &identities[0];
    let mut route_config = config.clone();
    route_config.scope_to_provider_identity(identity);
    let mut models = configured_catalog_models_for_route(
        config,
        identity.provider,
        &identity.key,
        &route_config.deepseek_base_url(),
    );
    let default_model = route_config.default_model();
    if !default_model.is_empty() && !default_model.eq_ignore_ascii_case("auto") {
        push_unique_model(&mut models, &default_model);
    }
    models.sort();
    models.dedup();

View on GitHub (pinned to 433685b202)