mirror of
https://github.com/openai/codex.git
synced 2026-10-24 15:53:38 +00:00
## What changed - Add the experimental `turn/start.cyberAccessProgram` option with `standard`, `daybreakBlue`, and `daybreakRed` values. - Forward the selection as `access_programs.cyber` on Responses, WebSocket, and remote-compaction requests made with ChatGPT authentication, while omitting it for API-key and custom-provider requests. - Preserve the per-turn selection across recovery, compaction, and child-agent turns without making it a persistent thread setting. ## Testing - Cover app-server forwarding, authentication boundaries, WebSocket reuse, turn recovery, compaction, and child-agent inheritance. GitOrigin-RevId: d2eb468f365b2214c5099bc21741cf30f8bd2eb5
104 lines
3.7 KiB
Rust
104 lines
3.7 KiB
Rust
use std::sync::Arc;
|
|
use std::sync::OnceLock;
|
|
|
|
use super::trim_function_call_history_to_fit_context_window;
|
|
use crate::Prompt;
|
|
use crate::client::CompactConversationRequestSettings;
|
|
use crate::compact::CompactionAnalyticsDetails;
|
|
use crate::responses_metadata::CodexResponsesRequestKind;
|
|
use crate::responses_metadata::CompactionTurnMetadata;
|
|
use crate::session::session::Session;
|
|
use crate::session::step_context::StepContext;
|
|
use codex_protocol::auth::AuthMode;
|
|
use codex_protocol::error::Result as CodexResult;
|
|
use codex_protocol::models::ResponseItem;
|
|
use codex_rollout_trace::CompactionTraceContext;
|
|
use tracing::info;
|
|
|
|
pub(super) struct RemoteCompactAttempt {
|
|
pub(super) new_history: Vec<ResponseItem>,
|
|
pub(super) trace_input_history: Option<Vec<ResponseItem>>,
|
|
}
|
|
|
|
pub(super) async fn run_remote_compact_attempt(
|
|
sess: &Arc<Session>,
|
|
step_context: &Arc<StepContext>,
|
|
turn_state: Option<Arc<OnceLock<String>>>,
|
|
compaction_trace: &CompactionTraceContext,
|
|
compaction_metadata: CompactionTurnMetadata,
|
|
analytics_details: &mut CompactionAnalyticsDetails,
|
|
) -> CodexResult<RemoteCompactAttempt> {
|
|
let turn_context = &step_context.turn;
|
|
let mut history = sess.clone_history().await;
|
|
let base_instructions = sess.get_base_instructions().await;
|
|
let (rewritten_outputs, estimated_deleted_tokens) =
|
|
trim_function_call_history_to_fit_context_window(
|
|
&mut history,
|
|
turn_context.as_ref(),
|
|
&base_instructions,
|
|
);
|
|
if rewritten_outputs > 0 {
|
|
info!(
|
|
turn_id = %turn_context.sub_id,
|
|
rewritten_outputs,
|
|
"rewrote history outputs before remote compaction"
|
|
);
|
|
}
|
|
if estimated_deleted_tokens > 0 {
|
|
let max_local_deleted_tokens = sess
|
|
.estimated_tokens_after_last_model_generated_item()
|
|
.await;
|
|
analytics_details.active_context_tokens_before = analytics_details
|
|
.active_context_tokens_before
|
|
.map(|active_context_tokens_before| {
|
|
active_context_tokens_before
|
|
.saturating_sub(estimated_deleted_tokens.min(max_local_deleted_tokens))
|
|
});
|
|
}
|
|
let trace_input_history = compaction_trace
|
|
.is_enabled()
|
|
.then(|| history.raw_items().cloned().collect());
|
|
let prompt_input = history.for_prompt(&turn_context.model_info().input_modalities);
|
|
let tool_router = &step_context.tool_router;
|
|
let prompt = Prompt {
|
|
input: prompt_input,
|
|
tools: tool_router.model_visible_specs(),
|
|
parallel_tool_calls: true,
|
|
base_instructions,
|
|
output_schema: None,
|
|
output_schema_strict: true,
|
|
cyber_access_program: turn_context.cyber_access_program,
|
|
};
|
|
let responses_metadata = sess
|
|
.responses_metadata(
|
|
turn_context.as_ref(),
|
|
CodexResponsesRequestKind::Compaction(compaction_metadata),
|
|
)
|
|
.await;
|
|
let new_history = sess
|
|
.services
|
|
.model_client
|
|
.compact_conversation_history(
|
|
&prompt,
|
|
turn_context.model_info(),
|
|
turn_state,
|
|
CompactConversationRequestSettings {
|
|
effort: turn_context.reasoning_effort().cloned(),
|
|
summary: turn_context.reasoning_summary(),
|
|
service_tier: if sess.services.auth_manager.auth_mode() == Some(AuthMode::ApiKey) {
|
|
None
|
|
} else {
|
|
turn_context.config.service_tier.clone()
|
|
},
|
|
},
|
|
&turn_context.session_telemetry,
|
|
compaction_trace,
|
|
&responses_metadata,
|
|
)
|
|
.await?;
|
|
Ok(RemoteCompactAttempt {
|
|
new_history,
|
|
trace_input_history,
|
|
})
|
|
}
|