Skip to content

Commit 2e30a38

Browse files
charley-oaicodex
andcommitted
Narrow rollback developer context trimming
Co-authored-by: Codex <noreply@openai.com>
1 parent 9f41208 commit 2e30a38

File tree

3 files changed

+32
-1
lines changed

3 files changed

+32
-1
lines changed

codex-rs/core/src/context_manager/history.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::codex::TurnContext;
22
use crate::context_manager::normalize;
3+
use crate::event_mapping::is_contextual_dev_message_content;
34
use crate::event_mapping::is_contextual_user_message_content;
45
use crate::truncate::TruncationPolicy;
56
use crate::truncate::approx_bytes_for_tokens;
@@ -650,7 +651,8 @@ fn is_pre_turn_context_update_item(item: &ResponseItem) -> bool {
650651
return false;
651652
};
652653

653-
role == "developer" || (role == "user" && is_contextual_user_message_content(content))
654+
(role == "developer" && is_contextual_dev_message_content(content))
655+
|| (role == "user" && is_contextual_user_message_content(content))
654656
}
655657

656658
fn user_message_positions(items: &[ResponseItem]) -> Vec<usize> {

codex-rs/core/src/context_manager/history_tests.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,7 @@ fn drop_last_n_user_turns_trims_context_updates_above_rolled_back_turn() {
869869
assistant_msg("session prefix item"),
870870
user_input_text_msg("turn 1 user"),
871871
assistant_msg("turn 1 assistant"),
872+
developer_msg("Generated images are saved to /tmp as /tmp/image-1.png by default."),
872873
developer_msg("<collaboration_mode>ROLLED_BACK_DEV_INSTRUCTIONS</collaboration_mode>"),
873874
user_input_text_msg(
874875
"<environment_context><cwd>PRETURN_CONTEXT_DIFF_CWD</cwd></environment_context>",
@@ -887,6 +888,7 @@ fn drop_last_n_user_turns_trims_context_updates_above_rolled_back_turn() {
887888
assistant_msg("session prefix item"),
888889
user_input_text_msg("turn 1 user"),
889890
assistant_msg("turn 1 assistant"),
891+
developer_msg("Generated images are saved to /tmp as /tmp/image-1.png by default."),
890892
]
891893
);
892894
}

codex-rs/core/src/event_mapping.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ use codex_protocol::models::is_image_close_tag_text;
1414
use codex_protocol::models::is_image_open_tag_text;
1515
use codex_protocol::models::is_local_image_close_tag_text;
1616
use codex_protocol::models::is_local_image_open_tag_text;
17+
use codex_protocol::protocol::COLLABORATION_MODE_OPEN_TAG;
18+
use codex_protocol::protocol::REALTIME_CONVERSATION_OPEN_TAG;
1719
use codex_protocol::user_input::UserInput;
1820
use tracing::warn;
1921
use uuid::Uuid;
@@ -22,10 +24,35 @@ use crate::contextual_user_message::is_contextual_user_fragment;
2224
use crate::contextual_user_message::parse_visible_hook_prompt_message;
2325
use crate::web_search::web_search_action_detail;
2426

27+
const CONTEXTUAL_DEVELOPER_PREFIXES: &[&str] = &[
28+
"<permissions instructions>",
29+
"<model_switch>",
30+
COLLABORATION_MODE_OPEN_TAG,
31+
REALTIME_CONVERSATION_OPEN_TAG,
32+
"<personality_spec>",
33+
];
34+
2535
pub(crate) fn is_contextual_user_message_content(message: &[ContentItem]) -> bool {
2636
message.iter().any(is_contextual_user_fragment)
2737
}
2838

39+
pub(crate) fn is_contextual_dev_message_content(message: &[ContentItem]) -> bool {
40+
message.iter().any(is_contextual_dev_fragment)
41+
}
42+
43+
fn is_contextual_dev_fragment(content_item: &ContentItem) -> bool {
44+
let ContentItem::InputText { text } = content_item else {
45+
return false;
46+
};
47+
48+
let trimmed = text.trim_start();
49+
CONTEXTUAL_DEVELOPER_PREFIXES.iter().any(|prefix| {
50+
trimmed
51+
.get(..prefix.len())
52+
.is_some_and(|candidate| candidate.eq_ignore_ascii_case(prefix))
53+
})
54+
}
55+
2956
fn parse_user_message(message: &[ContentItem]) -> Option<UserMessageItem> {
3057
if is_contextual_user_message_content(message) {
3158
return None;

0 commit comments

Comments
 (0)