auto session-reset when context large and cache is cold
This commit is contained in:
parent
80dd5bb69e
commit
44c903f265
2 changed files with 131 additions and 11 deletions
|
|
@ -9,7 +9,7 @@
|
|||
//! showing "connecting…" until the first event arrives.
|
||||
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::sync::atomic::{AtomicBool, AtomicU64, Ordering};
|
||||
use std::sync::atomic::{AtomicBool, AtomicI64, AtomicU64, Ordering};
|
||||
use std::sync::{Arc, Mutex};
|
||||
|
||||
use rusqlite::{Connection, params};
|
||||
|
|
@ -323,6 +323,11 @@ pub struct Bus {
|
|||
/// `tool_call_count` + `tool_call_breakdown_json` columns on the
|
||||
/// per-turn stats sink.
|
||||
tool_calls: Arc<Mutex<std::collections::HashMap<String, u64>>>,
|
||||
/// Unix timestamp of the most recent completed turn (set by
|
||||
/// `record_turn_usage`). Used by the auto-reset heuristic in
|
||||
/// `turn.rs` to compute how long the session has been idle and
|
||||
/// whether the prompt cache has gone cold. `0` = no turn yet.
|
||||
last_turn_ended_unix: Arc<AtomicI64>,
|
||||
}
|
||||
|
||||
impl Bus {
|
||||
|
|
@ -350,6 +355,7 @@ impl Bus {
|
|||
last_cost_usage: Arc::new(Mutex::new(None)),
|
||||
skip_continue_once: Arc::new(AtomicBool::new(false)),
|
||||
tool_calls: Arc::new(Mutex::new(std::collections::HashMap::new())),
|
||||
last_turn_ended_unix: Arc::new(AtomicI64::new(0)),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -422,9 +428,17 @@ impl Bus {
|
|||
pub fn record_turn_usage(&self, ctx: TokenUsage, cost: TokenUsage) {
|
||||
*self.last_ctx_usage.lock().unwrap() = Some(ctx);
|
||||
*self.last_cost_usage.lock().unwrap() = Some(cost);
|
||||
self.last_turn_ended_unix.store(now_unix(), Ordering::Relaxed);
|
||||
self.emit(LiveEvent::TokenUsageChanged { ctx, cost });
|
||||
}
|
||||
|
||||
/// Unix timestamp of the most recent completed turn (`record_turn_usage`
|
||||
/// call), or `0` if no turn has finished yet.
|
||||
#[must_use]
|
||||
pub fn last_turn_ended_unix(&self) -> i64 {
|
||||
self.last_turn_ended_unix.load(Ordering::Relaxed)
|
||||
}
|
||||
|
||||
/// Walk a stream-json value for `tool_use` blocks and bump the
|
||||
/// per-turn counter for each one we find. Called by the stdout
|
||||
/// pump on every parsed line. Cheap when the line isn't an
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue