Compare commits

...

5 Commits

Author SHA1 Message Date
jif-oai
ceb53f27ae Merge branch 'main' into jif/compact-v2-for-oai 2026-05-20 18:44:33 +02:00
jif-oai
cd9f92e046 test: keep realtime compact snapshots on v1 path 2026-05-20 16:51:40 +01:00
jif-oai
c20888e793 test: update app-server compaction v2 mock 2026-05-20 15:49:56 +01:00
jif-oai
9567418bdd inline and simplify 2026-05-20 15:10:51 +01:00
jif-oai
d7bee6bf55 feat: compact v2 for OpenAI 2026-05-20 15:09:20 +01:00
5 changed files with 23 additions and 33 deletions

View File

@@ -29,8 +29,6 @@ use codex_app_server_protocol::TurnStartParams;
use codex_app_server_protocol::TurnStartResponse;
use codex_app_server_protocol::UserInput as V2UserInput;
use codex_config::types::AuthCredentialsStoreMode;
use codex_protocol::models::ContentItem;
use codex_protocol::models::ResponseItem;
use core_test_support::responses;
use core_test_support::skip_if_no_network;
use pretty_assertions::assert_eq;
@@ -122,29 +120,20 @@ async fn auto_compaction_remote_emits_started_and_completed_items() -> Result<()
responses::ev_completed_with_tokens("r2", /*total_tokens*/ 330_000),
]);
let sse3 = responses::sse(vec![
responses::ev_assistant_message("m3", "FINAL_REPLY"),
responses::ev_completed_with_tokens("r3", /*total_tokens*/ 120),
serde_json::json!({
"type": "response.output_item.done",
"item": {
"type": "compaction",
"encrypted_content": "ENCRYPTED_COMPACTION_SUMMARY",
}
}),
responses::ev_completed("r3"),
]);
let responses_log = responses::mount_sse_sequence(&server, vec![sse1, sse2, sse3]).await;
let compacted_history = vec![
ResponseItem::Message {
id: None,
role: "assistant".to_string(),
content: vec![ContentItem::OutputText {
text: "REMOTE_COMPACT_SUMMARY".to_string(),
}],
phase: None,
},
ResponseItem::Compaction {
encrypted_content: "ENCRYPTED_COMPACTION_SUMMARY".to_string(),
},
];
let compact_mock = responses::mount_compact_json_once(
&server,
serde_json::json!({ "output": compacted_history }),
)
.await;
let sse4 = responses::sse(vec![
responses::ev_assistant_message("m3", "FINAL_REPLY"),
responses::ev_completed_with_tokens("r4", /*total_tokens*/ 120),
]);
let responses_log = responses::mount_sse_sequence(&server, vec![sse1, sse2, sse3, sse4]).await;
let codex_home = TempDir::new()?;
write_mock_responses_config_toml(
@@ -184,12 +173,8 @@ async fn auto_compaction_remote_emits_started_and_completed_items() -> Result<()
assert_eq!(completed.thread_id, thread_id);
assert_eq!(started_id, completed_id);
let compact_requests = compact_mock.requests();
assert_eq!(compact_requests.len(), 1);
assert_eq!(compact_requests[0].path(), "/v1/responses/compact");
let response_requests = responses_log.requests();
assert_eq!(response_requests.len(), 3);
assert_eq!(response_requests.len(), 4);
Ok(())
}

View File

@@ -239,6 +239,7 @@ fn should_use_remote_compact_task_for_azure_provider() {
assert!(should_use_remote_compact_task(&provider));
}
#[tokio::test]
async fn process_compacted_history_replaces_developer_messages() {
let compacted_history = vec![

View File

@@ -799,7 +799,9 @@ async fn run_auto_compact(
phase: CompactionPhase,
) -> CodexResult<bool> {
if should_use_remote_compact_task(turn_context.provider.info()) {
if turn_context.features.enabled(Feature::RemoteCompactionV2) {
if turn_context.provider.info().is_openai()
|| turn_context.features.enabled(Feature::RemoteCompactionV2)
{
run_inline_remote_auto_compact_task_v2(
Arc::clone(sess),
Arc::clone(turn_context),

View File

@@ -33,9 +33,10 @@ impl SessionTask for CompactTask {
/*inc*/ 1,
&[("type", "remote")],
);
if ctx
.features
.enabled(codex_features::Feature::RemoteCompactionV2)
if ctx.provider.info().is_openai()
|| ctx
.features
.enabled(codex_features::Feature::RemoteCompactionV2)
{
crate::compact_remote_v2::run_remote_compact_task(session.clone(), ctx).await
} else {

View File

@@ -161,6 +161,7 @@ fn remote_realtime_test_codex_builder(
test_codex()
.with_auth(CodexAuth::from_api_key("dummy"))
.with_config(move |config| {
config.model_provider.name = "Azure".to_string();
config.experimental_realtime_ws_base_url = Some(realtime_base_url);
})
}