mirror of
https://github.com/openai/codex.git
synced 2026-11-05 16:29:31 +00:00
feat: catalog multi-agent v2 config (#26254)
## Why Model metadata can now select multi-agent v2 even when a user has not enabled `features.multi_agent_v2` in their config. Some existing configs still set the legacy `agents.max_threads` knob for v1 multi-agent behavior, so treating every v2 runtime as incompatible with `agents.max_threads` would break users whose only v2 signal came from the model catalog. The incompatible configuration is specifically enabling `features.multi_agent_v2` while also setting `agents.max_threads`. Catalog-forced v2 should use the v2 concurrency setting and ignore the legacy v1 cap instead of rejecting the config. ## What changed - Split config validation from runtime concurrency calculation: `effective_agent_max_threads` now just returns the effective cap for the resolved multi-agent runtime. - Added explicit validation for `features.multi_agent_v2` + `agents.max_threads` at session startup. - Preserved catalog-selected v2 behavior when `features.multi_agent_v2` is disabled, so existing configs with `agents.max_threads` keep starting. - Updated model-runtime selector coverage so a catalog v2 model still exposes v2 tools even when `agents.max_threads` is set and the config flag is disabled. ## Validation - `cargo check -p codex-core --lib` - `just test -p codex-core --lib -E "test(multi_agent_v2_feature_rejects_agents_max_threads) | test(catalog_v2_allows_agents_max_threads_when_feature_disabled)"`
This commit is contained in:
6 files changed
+62
-36
No files matched your search
@@ -1286,26 +1286,29 @@ impl Config {
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn validate_multi_agent_v2_config(&self) -> std::io::Result<()> {
|
||||
if self.features.enabled(Feature::MultiAgentV2) && self.agent_max_threads.is_some() {
|
||||
Err(std::io::Error::new(
|
||||
std::io::ErrorKind::InvalidInput,
|
||||
"agents.max_threads cannot be set when features.multi_agent_v2 is enabled",
|
||||
))
|
||||
} else {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn effective_agent_max_threads(
|
||||
&self,
|
||||
multi_agent_version: MultiAgentVersion,
|
||||
) -> std::io::Result<Option<usize>> {
|
||||
) -> Option<usize> {
|
||||
match multi_agent_version {
|
||||
MultiAgentVersion::V2 => {
|
||||
if self.agent_max_threads.is_some() {
|
||||
return Err(std::io::Error::new(
|
||||
std::io::ErrorKind::InvalidInput,
|
||||
"agents.max_threads cannot be set when the multi-agent runtime is v2",
|
||||
));
|
||||
}
|
||||
Ok(Some(
|
||||
self.multi_agent_v2
|
||||
.max_concurrent_threads_per_session
|
||||
.saturating_sub(1),
|
||||
))
|
||||
}
|
||||
MultiAgentVersion::V2 => Some(
|
||||
self.multi_agent_v2
|
||||
.max_concurrent_threads_per_session
|
||||
.saturating_sub(1),
|
||||
),
|
||||
MultiAgentVersion::Disabled | MultiAgentVersion::V1 => {
|
||||
Ok(self.agent_max_threads.or(DEFAULT_AGENT_MAX_THREADS))
|
||||
self.agent_max_threads.or(DEFAULT_AGENT_MAX_THREADS)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user