Gate content item kinds behind a feature flag (#40450)

## What changed

- Add the under-development `content_item_kinds` feature, disabled by default.
- Strip content item classifications from Responses input when the feature is
  disabled while preserving other passthrough metadata.

## Testing

- Add coverage that disables the feature and verifies requests omit content item
  kinds without removing the turn ID.

GitOrigin-RevId: f938feb2895d766d979b1666fc7b97fd128fe8a7
This commit is contained in:
pakrym-oai
2026-08-24 18:22:13 +00:00
committed by copyberry
parent 2126f93617
commit 4aa52f2cb2
14 changed files with 94 additions and 0 deletions
+4
View File
@@ -1339,6 +1339,10 @@ pub fn test_codex() -> TestCodexBuilder {
.features
.disable(Feature::ShellSnapshot)
.expect("test config should allow ShellSnapshot override");
config
.features
.enable(Feature::ContentItemKinds)
.expect("test config should allow ContentItemKinds override");
})],
auth: CodexAuth::from_api_key("dummy"),
pre_build_hooks: vec![],
+4
View File
@@ -4,6 +4,7 @@ use std::sync::Arc;
use codex_core::ModelClient;
use codex_core::Prompt;
use codex_core::ResponseEvent;
use codex_features::Feature;
use codex_login::CodexAuth;
use codex_login::auth::AgentIdentityAuthPolicy;
use codex_model_provider_info::ModelProviderInfo;
@@ -128,6 +129,7 @@ async fn responses_stream_includes_subagent_header_on_review() {
session_source.clone(),
"test_originator".to_string(),
config.model_verbosity,
config.features.enabled(Feature::ContentItemKinds),
/*enable_request_compression*/ false,
/*include_timing_metrics*/ false,
/*beta_features_header*/ None,
@@ -264,6 +266,7 @@ async fn responses_stream_includes_subagent_header_on_other() {
session_source.clone(),
"test_originator".to_string(),
config.model_verbosity,
config.features.enabled(Feature::ContentItemKinds),
/*enable_request_compression*/ false,
/*include_timing_metrics*/ false,
/*beta_features_header*/ None,
@@ -385,6 +388,7 @@ async fn responses_respects_model_info_overrides_from_config() {
session_source.clone(),
"test_originator".to_string(),
config.model_verbosity,
config.features.enabled(Feature::ContentItemKinds),
/*enable_request_compression*/ false,
/*include_timing_metrics*/ false,
/*beta_features_header*/ None,
+4
View File
@@ -1375,6 +1375,10 @@ async fn fork_injects_changed_agents_md_once() -> Result<()> {
fork_config.model_provider = parent.config.model_provider.clone();
fork_config.model_catalog = parent.config.model_catalog.clone();
fork_config.codex_self_exe = parent.config.codex_self_exe.clone();
fork_config
.features
.enable(Feature::ContentItemKinds)
.expect("test config should allow ContentItemKinds override");
let forked = parent
.thread_manager
.fork_thread(
+2
View File
@@ -1524,6 +1524,7 @@ async fn send_request_with_provider(provider: ModelProviderInfo) {
SessionSource::Exec,
"test_originator".to_string(),
config.model_verbosity,
config.features.enabled(Feature::ContentItemKinds),
/*enable_request_compression*/ false,
/*include_timing_metrics*/ false,
/*beta_features_header*/ None,
@@ -3009,6 +3010,7 @@ async fn azure_responses_request_does_not_store_and_preserves_prefixed_item_ids(
SessionSource::Exec,
"test_originator".to_string(),
config.model_verbosity,
config.features.enabled(Feature::ContentItemKinds),
/*enable_request_compression*/ false,
/*include_timing_metrics*/ false,
/*beta_features_header*/ None,
@@ -2514,6 +2514,7 @@ async fn websocket_harness_with_provider_options_and_auth(
SessionSource::Exec,
"test_originator".to_string(),
config.model_verbosity,
config.features.enabled(Feature::ContentItemKinds),
/*enable_request_compression*/ false,
runtime_metrics_enabled,
/*beta_features_header*/ None,
@@ -215,3 +215,39 @@ async fn first_request_item_types_roles_and_content_annotations() -> Result<()>
Ok(())
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn content_item_kinds_are_omitted_when_feature_disabled() -> Result<()> {
skip_if_no_network!(Ok(()));
let server = start_mock_server().await;
let response = mount_sse_once(
&server,
sse(vec![ev_response_created("resp-1"), ev_completed("resp-1")]),
)
.await;
let test = test_codex()
.with_config(|config| {
config.developer_instructions = Some("Keep other metadata intact.".into());
config
.features
.disable(Feature::ContentItemKinds)
.expect("test config should allow ContentItemKinds override");
})
.build_with_auto_env(&server)
.await?;
test.submit_text_turn("inspect request metadata").await?;
let input = response.single_request().input();
assert!(input.iter().all(|item| {
item.pointer("/internal_chat_message_metadata_passthrough/content_item_kinds")
.is_none()
}));
assert!(input.iter().any(|item| {
item.pointer("/internal_chat_message_metadata_passthrough/turn_id")
.is_some()
}));
Ok(())
}