diff --git a/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json b/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json index 17f8cf9b33..fd52d09408 100644 --- a/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json +++ b/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json @@ -13590,6 +13590,17 @@ "null" ] }, + "multiAgentVersion": { + "anyOf": [ + { + "$ref": "#/definitions/v2/MultiAgentVersion" + }, + { + "type": "null" + } + ], + "description": "Multi-agent runtime declared by this model, when available." + }, "serviceTiers": { "default": [], "items": { @@ -13924,6 +13935,15 @@ } ] }, + "MultiAgentVersion": { + "description": "Multi-agent runtime supported by a model.", + "enum": [ + "disabled", + "v1", + "v2" + ], + "type": "string" + }, "NetworkAccess": { "enum": [ "restricted", diff --git a/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json b/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json index 79660f0d49..523ebf1db7 100644 --- a/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json +++ b/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json @@ -9927,6 +9927,17 @@ "null" ] }, + "multiAgentVersion": { + "anyOf": [ + { + "$ref": "#/definitions/MultiAgentVersion" + }, + { + "type": "null" + } + ], + "description": "Multi-agent runtime declared by this model, when available." + }, "serviceTiers": { "default": [], "items": { @@ -10261,6 +10272,15 @@ } ] }, + "MultiAgentVersion": { + "description": "Multi-agent runtime supported by a model.", + "enum": [ + "disabled", + "v1", + "v2" + ], + "type": "string" + }, "NetworkAccess": { "enum": [ "restricted", diff --git a/codex-rs/app-server-protocol/schema/json/v2/ModelListResponse.json b/codex-rs/app-server-protocol/schema/json/v2/ModelListResponse.json index 46a0d255b1..534dc963ad 100644 --- a/codex-rs/app-server-protocol/schema/json/v2/ModelListResponse.json +++ b/codex-rs/app-server-protocol/schema/json/v2/ModelListResponse.json @@ -93,6 +93,17 @@ "null" ] }, + "multiAgentVersion": { + "anyOf": [ + { + "$ref": "#/definitions/MultiAgentVersion" + }, + { + "type": "null" + } + ], + "description": "Multi-agent runtime declared by this model, when available." + }, "serviceTiers": { "default": [], "items": { @@ -198,6 +209,15 @@ ], "type": "object" }, + "MultiAgentVersion": { + "description": "Multi-agent runtime supported by a model.", + "enum": [ + "disabled", + "v1", + "v2" + ], + "type": "string" + }, "ReasoningEffort": { "description": "A non-empty reasoning effort value advertised by the model.", "minLength": 1, diff --git a/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-experimental.json.zst b/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-experimental.json.zst index 9ecf2ae3c9..5f5bd2782a 100644 Binary files a/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-experimental.json.zst and b/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-experimental.json.zst differ diff --git a/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-stable.json.zst b/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-stable.json.zst index dbbe54b60f..5175c675ef 100644 Binary files a/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-stable.json.zst and b/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-stable.json.zst differ diff --git a/codex-rs/app-server-protocol/schema/typescript/v2/Model.ts b/codex-rs/app-server-protocol/schema/typescript/v2/Model.ts index cb15add8dc..29defcdb3d 100644 --- a/codex-rs/app-server-protocol/schema/typescript/v2/Model.ts +++ b/codex-rs/app-server-protocol/schema/typescript/v2/Model.ts @@ -6,9 +6,14 @@ import type { ReasoningEffort } from "../ReasoningEffort"; import type { ModelAvailabilityNux } from "./ModelAvailabilityNux"; import type { ModelServiceTier } from "./ModelServiceTier"; import type { ModelUpgradeInfo } from "./ModelUpgradeInfo"; +import type { MultiAgentVersion } from "./MultiAgentVersion"; import type { ReasoningEffortOption } from "./ReasoningEffortOption"; export type Model = { id: string, model: string, upgrade: string | null, upgradeInfo: ModelUpgradeInfo | null, availabilityNux: ModelAvailabilityNux | null, displayName: string, description: string, modelSpecialty: string | null, hidden: boolean, supportedReasoningEfforts: Array, defaultReasoningEffort: ReasoningEffort, inputModalities: Array, supportsPersonality: boolean, +/** + * Multi-agent runtime declared by this model, when available. + */ +multiAgentVersion: MultiAgentVersion | null, /** * Deprecated: use `serviceTiers` instead. */ diff --git a/codex-rs/app-server-protocol/schema/typescript/v2/MultiAgentVersion.ts b/codex-rs/app-server-protocol/schema/typescript/v2/MultiAgentVersion.ts new file mode 100644 index 0000000000..b71323eb83 --- /dev/null +++ b/codex-rs/app-server-protocol/schema/typescript/v2/MultiAgentVersion.ts @@ -0,0 +1,8 @@ +// GENERATED CODE! DO NOT MODIFY BY HAND! + +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Multi-agent runtime supported by a model. + */ +export type MultiAgentVersion = "disabled" | "v1" | "v2"; diff --git a/codex-rs/app-server-protocol/schema/typescript/v2/index.ts b/codex-rs/app-server-protocol/schema/typescript/v2/index.ts index 7f5536853b..7e0b8d1cfd 100644 --- a/codex-rs/app-server-protocol/schema/typescript/v2/index.ts +++ b/codex-rs/app-server-protocol/schema/typescript/v2/index.ts @@ -288,6 +288,7 @@ export type { ModelUpgradeInfo } from "./ModelUpgradeInfo"; export type { ModelVerification } from "./ModelVerification"; export type { ModelVerificationNotification } from "./ModelVerificationNotification"; export type { ModelsRequirements } from "./ModelsRequirements"; +export type { MultiAgentVersion } from "./MultiAgentVersion"; export type { NetworkAccess } from "./NetworkAccess"; export type { NetworkApprovalContext } from "./NetworkApprovalContext"; export type { NetworkApprovalProtocol } from "./NetworkApprovalProtocol"; diff --git a/codex-rs/app-server-protocol/src/protocol/v2/model.rs b/codex-rs/app-server-protocol/src/protocol/v2/model.rs index c299593c03..3b77f8e607 100644 --- a/codex-rs/app-server-protocol/src/protocol/v2/model.rs +++ b/codex-rs/app-server-protocol/src/protocol/v2/model.rs @@ -7,6 +7,7 @@ use codex_protocol::openai_models::ReasoningEffort; use codex_protocol::openai_models::default_input_modalities; use codex_protocol::protocol::ModelRerouteReason as CoreModelRerouteReason; use codex_protocol::protocol::ModelVerification as CoreModelVerification; +use codex_protocol::protocol::MultiAgentVersion as CoreMultiAgentVersion; use serde::Deserialize; use serde::Serialize; use serde_json::Value as JsonValue; @@ -23,6 +24,15 @@ v2_enum_from_core!( } ); +v2_enum_from_core!( + /// Multi-agent runtime supported by a model. + pub enum MultiAgentVersion from CoreMultiAgentVersion { + Disabled, + V1, + V2 + } +); + #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Default, JsonSchema, TS)] #[serde(rename_all = "camelCase")] #[ts(export_to = "v2/")] @@ -96,6 +106,8 @@ pub struct Model { pub input_modalities: Vec, #[serde(default)] pub supports_personality: bool, + /// Multi-agent runtime declared by this model, when available. + pub multi_agent_version: Option, /// Deprecated: use `serviceTiers` instead. #[serde(default)] pub additional_speed_tiers: Vec, diff --git a/codex-rs/app-server/README.md b/codex-rs/app-server/README.md index 5bd8d77099..c07fe571df 100644 --- a/codex-rs/app-server/README.md +++ b/codex-rs/app-server/README.md @@ -228,7 +228,7 @@ Example with notification opt-out: - `fs/watch` — subscribe this connection to filesystem change notifications for an absolute file or directory path and caller-provided `watchId`; returns the canonicalized `path`. - `fs/unwatch` — stop sending notifications for a prior `fs/watch`; returns `{}`. - `fs/changed` — notification emitted when watched paths change, including the `watchId` and `changedPaths`. -- `model/list` — list available models (set `includeHidden: true` to include entries with `hidden: true`), with model-advertised string reasoning effort options in the catalog's intended progression order, optional `modelSpecialty`, `additionalSpeedTiers`, `serviceTiers`, optional `defaultServiceTier`, optional legacy `upgrade` model ids, optional `upgradeInfo` metadata (`model`, `upgradeCopy`, `modelLink`, `migrationMarkdown`), and optional `availabilityNux` metadata. Clients should preserve the `supportedReasoningEfforts` array order rather than deriving order from the effort names. +- `model/list` — list available models (set `includeHidden: true` to include entries with `hidden: true`), with model-advertised string reasoning effort options in the catalog's intended progression order, optional `modelSpecialty`, nullable `multiAgentVersion` (`disabled`, `v1`, or `v2`), `additionalSpeedTiers`, `serviceTiers`, optional `defaultServiceTier`, optional legacy `upgrade` model ids, optional `upgradeInfo` metadata (`model`, `upgradeCopy`, `modelLink`, `migrationMarkdown`), and optional `availabilityNux` metadata. Clients should preserve the `supportedReasoningEfforts` array order rather than deriving order from the effort names. - `modelProvider/capabilities/read` — read provider-level capabilities for the currently configured model provider. - `experimentalFeature/list` — list feature flags with stage metadata (`beta`, `underDevelopment`, `stable`, etc.), enabled/default-enabled state, and cursor pagination. Pass `threadId` when showing feature state for an existing loaded thread so `enabled` is computed from that thread's refreshed config, including project-local config for the thread's cwd; if omitted, the server uses its default config resolution context. For non-beta flags, `displayName`/`description`/`announcement` are `null`. - `permissionProfile/list` — beta; list available permission profile ids with optional display `description` text and an `allowed` flag reflecting effective requirements, using cursor pagination. Pass `cwd` when the caller needs project-local `[permissions.]` entries to be included in the current catalog view. diff --git a/codex-rs/app-server/src/models.rs b/codex-rs/app-server/src/models.rs index 30cebbf5ce..5f4a796326 100644 --- a/codex-rs/app-server/src/models.rs +++ b/codex-rs/app-server/src/models.rs @@ -46,6 +46,7 @@ fn model_from_preset(preset: ModelPreset) -> Model { 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 diff --git a/codex-rs/app-server/tests/common/models_cache.rs b/codex-rs/app-server/tests/common/models_cache.rs index 61b72e72e3..86ce5e6801 100644 --- a/codex-rs/app-server/tests/common/models_cache.rs +++ b/codex-rs/app-server/tests/common/models_cache.rs @@ -68,7 +68,7 @@ fn preset_to_info(preset: &ModelPreset, priority: i32) -> ModelInfo { auto_review_model_override: None, model_specialty: None, tool_mode: None, - multi_agent_version: None, + multi_agent_version: preset.multi_agent_version, } } diff --git a/codex-rs/app-server/tests/suite/v2/model_list.rs b/codex-rs/app-server/tests/suite/v2/model_list.rs index c5bdb21d84..1a287ea7c5 100644 --- a/codex-rs/app-server/tests/suite/v2/model_list.rs +++ b/codex-rs/app-server/tests/suite/v2/model_list.rs @@ -61,6 +61,7 @@ fn model_from_preset(preset: &ModelPreset) -> Model { // cache report `supports_personality = false`. // todo(sayan): fix, maybe make roundtrip use ModelInfo only supports_personality: false, + multi_agent_version: preset.multi_agent_version.map(Into::into), additional_speed_tiers: preset.additional_speed_tiers.clone(), service_tiers: preset .service_tiers @@ -177,6 +178,7 @@ async fn list_models_uses_chatgpt_remote_catalog_as_source_of_truth() -> Result< "truncation_policy": {"mode": "bytes", "limit": 10_000}, "supports_parallel_tool_calls": false, "supports_image_detail_original": false, + "multi_agent_version": "v2", "context_window": 272_000, "max_context_window": 272_000, "experimental_supported_tools": [],