Codex Handbook
app-server/src/models.rs 71 lines
use std::sync::Arc;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_core::ThreadManager;use codex_models_manager::manager::RefreshStrategy;use codex_protocol::openai_models::ModelPreset;use codex_protocol::openai_models::ReasoningEffortPreset;pub async fn supported_models(    thread_manager: Arc<ThreadManager>,    include_hidden: bool,) -> Vec<Model> {    thread_manager        .list_models(RefreshStrategy::OnlineIfUncached)        .await        .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(),        }),        availability_nux: preset.availability_nux.map(Into::into),        display_name: preset.display_name.to_string(),        description: preset.description.to_string(),        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,        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,        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()}