mirror of
https://github.com/openai/codex.git
synced 2026-10-22 17:58:46 +00:00
## Why The app server retains its startup model provider, but managed provider requirements can change while it is running. Catalog reads and background refreshes must check those requirements even when models are cached. ## What changed - Gate `model/list` and background refreshes through a shared catalog that validates the startup provider against current requirements. - Return JSON-RPC error `-32600` with restart guidance when the provider no longer complies, and skip background requests to that endpoint. Requirement load failures also block catalog access. - Log only the error kind for blocked refreshes to avoid exposing credentials in parser diagnostics. ## Testing Add coverage for cached catalog access after provider selection or definition changes, invalid requirements, cloud configuration load failures, and recovery when requirements allow the retained provider again. Extend refresh tests to cover startup provider overrides, blocked endpoint requests, and credential-safe logging. GitOrigin-RevId: 03127bba46f1f59f2a8b1dc37391eab75f9be23c
70 lines
2.7 KiB
Rust
70 lines
2.7 KiB
Rust
use codex_app_server_protocol::Model;
|
|
use codex_app_server_protocol::ModelServiceTier;
|
|
use codex_app_server_protocol::ModelUpgradeInfo;
|
|
use codex_app_server_protocol::ReasoningEffortOption;
|
|
use codex_protocol::openai_models::ModelPreset;
|
|
use codex_protocol::openai_models::ReasoningEffortPreset;
|
|
|
|
pub fn supported_models(models: Vec<ModelPreset>, include_hidden: bool) -> Vec<Model> {
|
|
models
|
|
.into_iter()
|
|
.filter(|preset| include_hidden || preset.show_in_picker)
|
|
.map(model_from_preset)
|
|
.collect()
|
|
}
|
|
|
|
fn model_from_preset(preset: ModelPreset) -> Model {
|
|
Model {
|
|
id: preset.id.to_string(),
|
|
model: preset.model.to_string(),
|
|
upgrade: preset.upgrade.as_ref().map(|upgrade| upgrade.id.clone()),
|
|
upgrade_info: preset.upgrade.as_ref().map(|upgrade| ModelUpgradeInfo {
|
|
model: upgrade.id.clone(),
|
|
upgrade_copy: upgrade.upgrade_copy.clone(),
|
|
model_link: upgrade.model_link.clone(),
|
|
migration_markdown: upgrade.migration_markdown.clone(),
|
|
retirement_at: upgrade
|
|
.retirement_at
|
|
.as_ref()
|
|
.map(chrono::DateTime::timestamp),
|
|
}),
|
|
availability_nux: preset.availability_nux.map(Into::into),
|
|
display_name: preset.display_name.to_string(),
|
|
description: preset.description.to_string(),
|
|
model_specialty: preset.model_specialty,
|
|
hidden: !preset.show_in_picker,
|
|
supported_reasoning_efforts: reasoning_efforts_from_preset(
|
|
preset.supported_reasoning_efforts,
|
|
),
|
|
default_reasoning_effort: preset.default_reasoning_effort,
|
|
input_modalities: preset.input_modalities,
|
|
supports_personality: preset.supports_personality,
|
|
multi_agent_version: preset.multi_agent_version.map(Into::into),
|
|
additional_speed_tiers: preset.additional_speed_tiers,
|
|
service_tiers: preset
|
|
.service_tiers
|
|
.into_iter()
|
|
.map(|service_tier| ModelServiceTier {
|
|
id: service_tier.id,
|
|
name: service_tier.name,
|
|
description: service_tier.description,
|
|
})
|
|
.collect(),
|
|
default_service_tier: preset.default_service_tier,
|
|
available_access_programs: preset.available_access_programs.map(Into::into),
|
|
is_default: preset.is_default,
|
|
}
|
|
}
|
|
|
|
fn reasoning_efforts_from_preset(
|
|
efforts: Vec<ReasoningEffortPreset>,
|
|
) -> Vec<ReasoningEffortOption> {
|
|
efforts
|
|
.into_iter()
|
|
.map(|preset| ReasoningEffortOption {
|
|
reasoning_effort: preset.effort,
|
|
description: preset.description,
|
|
})
|
|
.collect()
|
|
}
|