ignore deltas in codex_delegate (#6208)
ignore legacy deltas in codex-delegate to avoid this [issue](https://github.com/openai/codex/pull/6202).
This commit is contained in:
@@ -158,6 +158,11 @@ async fn forward_events(
|
|||||||
) {
|
) {
|
||||||
while let Ok(event) = codex.next_event().await {
|
while let Ok(event) = codex.next_event().await {
|
||||||
match event {
|
match event {
|
||||||
|
// ignore all legacy delta events
|
||||||
|
Event {
|
||||||
|
id: _,
|
||||||
|
msg: EventMsg::AgentMessageDelta(_) | EventMsg::AgentReasoningDelta(_),
|
||||||
|
} => continue,
|
||||||
Event {
|
Event {
|
||||||
id: _,
|
id: _,
|
||||||
msg: EventMsg::SessionConfigured(_),
|
msg: EventMsg::SessionConfigured(_),
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ use codex_protocol::protocol::Event;
|
|||||||
use codex_protocol::protocol::EventMsg;
|
use codex_protocol::protocol::EventMsg;
|
||||||
use codex_protocol::protocol::ExitedReviewModeEvent;
|
use codex_protocol::protocol::ExitedReviewModeEvent;
|
||||||
use codex_protocol::protocol::ItemCompletedEvent;
|
use codex_protocol::protocol::ItemCompletedEvent;
|
||||||
use codex_protocol::protocol::ReasoningContentDeltaEvent;
|
|
||||||
use codex_protocol::protocol::ReasoningRawContentDeltaEvent;
|
|
||||||
use codex_protocol::protocol::ReviewOutputEvent;
|
use codex_protocol::protocol::ReviewOutputEvent;
|
||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
|
|
||||||
@@ -124,9 +122,7 @@ async fn process_review_events(
|
|||||||
..
|
..
|
||||||
})
|
})
|
||||||
| EventMsg::AgentMessageDelta(AgentMessageDeltaEvent { .. })
|
| EventMsg::AgentMessageDelta(AgentMessageDeltaEvent { .. })
|
||||||
| EventMsg::AgentMessageContentDelta(AgentMessageContentDeltaEvent { .. })
|
| EventMsg::AgentMessageContentDelta(AgentMessageContentDeltaEvent { .. }) => {}
|
||||||
| EventMsg::ReasoningContentDelta(ReasoningContentDeltaEvent { .. })
|
|
||||||
| EventMsg::ReasoningRawContentDelta(ReasoningRawContentDeltaEvent { .. }) => {}
|
|
||||||
EventMsg::TaskComplete(task_complete) => {
|
EventMsg::TaskComplete(task_complete) => {
|
||||||
// Parse review output from the last agent message (if present).
|
// Parse review output from the last agent message (if present).
|
||||||
let out = task_complete
|
let out = task_complete
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ use core_test_support::responses::ev_apply_patch_function_call;
|
|||||||
use core_test_support::responses::ev_assistant_message;
|
use core_test_support::responses::ev_assistant_message;
|
||||||
use core_test_support::responses::ev_completed;
|
use core_test_support::responses::ev_completed;
|
||||||
use core_test_support::responses::ev_function_call;
|
use core_test_support::responses::ev_function_call;
|
||||||
|
use core_test_support::responses::ev_reasoning_item_added;
|
||||||
|
use core_test_support::responses::ev_reasoning_summary_text_delta;
|
||||||
use core_test_support::responses::ev_response_created;
|
use core_test_support::responses::ev_response_created;
|
||||||
use core_test_support::responses::mount_sse_sequence;
|
use core_test_support::responses::mount_sse_sequence;
|
||||||
use core_test_support::responses::sse;
|
use core_test_support::responses::sse;
|
||||||
@@ -15,6 +17,7 @@ use core_test_support::responses::start_mock_server;
|
|||||||
use core_test_support::skip_if_no_network;
|
use core_test_support::skip_if_no_network;
|
||||||
use core_test_support::test_codex::test_codex;
|
use core_test_support::test_codex::test_codex;
|
||||||
use core_test_support::wait_for_event;
|
use core_test_support::wait_for_event;
|
||||||
|
use pretty_assertions::assert_eq;
|
||||||
|
|
||||||
/// Delegate should surface ExecApprovalRequest from sub-agent and proceed
|
/// Delegate should surface ExecApprovalRequest from sub-agent and proceed
|
||||||
/// after parent submits an approval decision.
|
/// after parent submits an approval decision.
|
||||||
@@ -171,3 +174,52 @@ async fn codex_delegate_forwards_patch_approval_and_proceeds_on_decision() {
|
|||||||
.await;
|
.await;
|
||||||
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await;
|
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
|
async fn codex_delegate_ignores_legacy_deltas() {
|
||||||
|
skip_if_no_network!();
|
||||||
|
|
||||||
|
// Single response with reasoning summary deltas.
|
||||||
|
let sse_stream = sse(vec![
|
||||||
|
ev_response_created("resp-1"),
|
||||||
|
ev_reasoning_item_added("reason-1", &["initial"]),
|
||||||
|
ev_reasoning_summary_text_delta("think-1"),
|
||||||
|
ev_completed("resp-1"),
|
||||||
|
]);
|
||||||
|
|
||||||
|
let server = start_mock_server().await;
|
||||||
|
mount_sse_sequence(&server, vec![sse_stream]).await;
|
||||||
|
|
||||||
|
let mut builder = test_codex();
|
||||||
|
let test = builder.build(&server).await.expect("build test codex");
|
||||||
|
|
||||||
|
// Kick off review (delegated).
|
||||||
|
test.codex
|
||||||
|
.submit(Op::Review {
|
||||||
|
review_request: ReviewRequest {
|
||||||
|
prompt: "Please review".to_string(),
|
||||||
|
user_facing_hint: "review".to_string(),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.expect("submit review");
|
||||||
|
|
||||||
|
let mut reasoning_delta_count = 0;
|
||||||
|
let mut legacy_reasoning_delta_count = 0;
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let ev = wait_for_event(&test.codex, |_| true).await;
|
||||||
|
match ev {
|
||||||
|
EventMsg::ReasoningContentDelta(_) => reasoning_delta_count += 1,
|
||||||
|
EventMsg::AgentReasoningDelta(_) => legacy_reasoning_delta_count += 1,
|
||||||
|
EventMsg::TaskComplete(_) => break,
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_eq!(reasoning_delta_count, 1, "expected one new reasoning delta");
|
||||||
|
assert_eq!(
|
||||||
|
legacy_reasoning_delta_count, 1,
|
||||||
|
"expected one legacy reasoning delta"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user