mirror of
https://github.com/openai/codex.git
synced 2026-11-13 14:46:14 +00:00
Load model context from a bounded rollout suffix (#32896)
## Why Reconstructing the latest model-visible context does not require replaying an entire paginated rollout when a usable compaction checkpoint and the associated completed-turn metadata are available. ## What changed - Add `ThreadStore::load_latest_model_context` and `StoredModelContext` for loading replay-ready model context independently of full thread history. - Reverse-scan plain paginated JSONL rollouts until the newest safe bounded suffix is found, while preserving canonical session metadata and chronological replay order. - Fall back to complete history for legacy or compressed rollouts and whenever compaction or rollback records make a bounded cutoff unsafe. ## Testing - Cover checkpoint selection, turn-metadata boundaries, agent messages, contextual user fragments, and full-history fallbacks. GitOrigin-RevId: 3572f4ecc7aa4099a6d9f0d3e72d0ef432cd9497
This commit is contained in:
1 parent
7fdf2f254b
commit
592467fb96
13 files changed
+812
-17
No files matched your search
@@ -27,6 +27,7 @@ use crate::LoadThreadHistoryParams;
|
||||
use crate::ReadThreadByRolloutPathParams;
|
||||
use crate::ReadThreadParams;
|
||||
use crate::ResumeThreadParams;
|
||||
use crate::StoredModelContext;
|
||||
use crate::StoredThread;
|
||||
use crate::StoredThreadHistory;
|
||||
use crate::ThreadMetadataPatch;
|
||||
@@ -368,6 +369,7 @@ pub struct InMemoryThreadStoreCalls {
|
||||
pub shutdown_thread: usize,
|
||||
pub discard_thread: usize,
|
||||
pub load_history: usize,
|
||||
pub load_latest_model_context: usize,
|
||||
pub read_thread: usize,
|
||||
pub read_thread_with_history: usize,
|
||||
pub read_thread_by_rollout_path: usize,
|
||||
@@ -521,6 +523,25 @@ impl InMemoryThreadStore {
|
||||
})
|
||||
}
|
||||
|
||||
async fn load_latest_model_context(
|
||||
&self,
|
||||
params: LoadThreadHistoryParams,
|
||||
) -> ThreadStoreResult<StoredModelContext> {
|
||||
let mut state = self.state.lock().await;
|
||||
state.calls.load_latest_model_context += 1;
|
||||
let items =
|
||||
state
|
||||
.histories
|
||||
.get(¶ms.thread_id)
|
||||
.ok_or(ThreadStoreError::ThreadNotFound {
|
||||
thread_id: params.thread_id,
|
||||
})?;
|
||||
Ok(StoredModelContext {
|
||||
thread_id: params.thread_id,
|
||||
items: items.clone(),
|
||||
})
|
||||
}
|
||||
|
||||
async fn read_thread(&self, params: ReadThreadParams) -> ThreadStoreResult<StoredThread> {
|
||||
let mut state = self.state.lock().await;
|
||||
state.calls.read_thread += 1;
|
||||
@@ -659,6 +680,13 @@ impl ThreadStore for InMemoryThreadStore {
|
||||
Box::pin(InMemoryThreadStore::load_history(self, params))
|
||||
}
|
||||
|
||||
fn load_latest_model_context(
|
||||
&self,
|
||||
params: LoadThreadHistoryParams,
|
||||
) -> ThreadStoreFuture<'_, StoredModelContext> {
|
||||
Box::pin(InMemoryThreadStore::load_latest_model_context(self, params))
|
||||
}
|
||||
|
||||
fn read_thread(&self, params: ReadThreadParams) -> ThreadStoreFuture<'_, StoredThread> {
|
||||
Box::pin(InMemoryThreadStore::read_thread(self, params))
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user