[core] debounce current-time reminders by elapsed time (#29659)

## Summary
- rename `reminder_interval_model_requests` to
`reminder_interval_seconds`
- read the configured time provider before every model request and
inject a reminder only after the configured number of seconds has
elapsed
- preserve immediate first delivery and forced delivery after compaction
changes the context window

## Tests
- `just test -p codex-core current_time_reminder`
This commit is contained in:
rka-oai authored and GitHub committed 2026-06-23 10:13:27 -07:00
1 parent 02c326f646
commit 9fe689783d
9 files changed
+60 -38

No files matched your search

+4 -4
View File
@@ -620,11 +620,11 @@ current_time_reminder = true
r#"
[features.current_time_reminder]
enabled = true
reminder_interval_model_requests = 4
reminder_interval_seconds = 4
clock_source = "external"
"#,
CurrentTimeReminderConfig {
reminder_interval_model_requests: 4,
reminder_interval_seconds: 4,
clock_source: CurrentTimeSource::External,
},
),
@@ -642,7 +642,7 @@ async fn load_config_rejects_zero_current_time_reminder_interval() -> std::io::R
r#"
[features.current_time_reminder]
enabled = true
reminder_interval_model_requests = 0
reminder_interval_seconds = 0
"#,
)
.await
@@ -651,7 +651,7 @@ reminder_interval_model_requests = 0
assert_eq!(error.kind(), std::io::ErrorKind::InvalidInput);
assert_eq!(
error.to_string(),
"features.current_time_reminder.reminder_interval_model_requests must be positive"
"features.current_time_reminder.reminder_interval_seconds must be positive"
);
Ok(())
}
+8 -8
View File
@@ -1115,14 +1115,14 @@ pub struct RolloutBudgetConfig {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
pub struct CurrentTimeReminderConfig {
pub reminder_interval_model_requests: u64,
pub reminder_interval_seconds: u64,
pub clock_source: CurrentTimeSource,
}
impl Default for CurrentTimeReminderConfig {
fn default() -> Self {
Self {
reminder_interval_model_requests: 1,
reminder_interval_seconds: 1,
clock_source: CurrentTimeSource::System,
}
}
@@ -2657,18 +2657,18 @@ fn resolve_current_time_reminder_config(
let base = current_time_reminder_toml_config(config_toml.features.as_ref());
let default = CurrentTimeReminderConfig::default();
let reminder_interval_model_requests = base
.and_then(|config| config.reminder_interval_model_requests)
.unwrap_or(default.reminder_interval_model_requests);
if reminder_interval_model_requests == 0 {
let reminder_interval_seconds = base
.and_then(|config| config.reminder_interval_seconds)
.unwrap_or(default.reminder_interval_seconds);
if reminder_interval_seconds == 0 {
return Err(std::io::Error::new(
std::io::ErrorKind::InvalidInput,
"features.current_time_reminder.reminder_interval_model_requests must be positive",
"features.current_time_reminder.reminder_interval_seconds must be positive",
));
}
Ok(Some(CurrentTimeReminderConfig {
reminder_interval_model_requests,
reminder_interval_seconds,
clock_source: base
.and_then(|config| config.clock_source)
.unwrap_or(default.clock_source),