loopd: replay a carried summary as an unlogged user message

Co-Authored-By: ornith-1.5-35b-a3b <agent@wntrmute.dev>
This commit is contained in:
2026-10-02 23:46:06 -07:00
co-authored by ornith-1.5-35b-a3b
parent 18039fa2e4
commit 45984b45be
4 changed files with 141 additions and 2 deletions
+18
View File
@@ -91,12 +91,30 @@ impl Baseline {
}
}
/// The heading in front of a carried summary. Built from pieces (T33).
pub const CARRY_HEADING: &str = concat!("Earlier ", "turns, summarised:");
/// The system message, then each log record replayed in order. Every record variant is named, so a
/// new one is a compile error rather than a silent skip.
pub fn messages(baseline: &Baseline, records: &[LogRecord]) -> Vec<ChatMessage> {
messages_with_carry(baseline, records, None)
}
/// Like `messages`, and when `carry` is `Some` inserts one user message after the system
/// prompt: the heading, a blank line, the summary. That user is not a `LogRecord::User`.
pub fn messages_with_carry(
baseline: &Baseline,
records: &[LogRecord],
carry: Option<&str>,
) -> Vec<ChatMessage> {
let mut out = vec![ChatMessage::System {
content: baseline.system.clone(),
}];
if let Some(summary) = carry {
out.push(ChatMessage::User {
content: format!("{CARRY_HEADING}\n\n{summary}"),
});
}
for record in records {
match record {
LogRecord::SessionStart { .. } => {}
+2 -2
View File
@@ -5,7 +5,7 @@
//! logged (M5b spec, section 8), so every later request replays the same bytes; the model's own
//! output is logged as the server returned it.
use crate::baseline::messages;
use crate::baseline::messages_with_carry;
use crate::config::Config;
use crate::llama::info::{CacheOutcome, cache_outcome};
use crate::llama::{ChatEvent, ChatRequest, Client, InferError};
@@ -140,7 +140,7 @@ pub fn run_turn(
let baseline = session.baseline();
let request = ChatRequest {
slot: rt.cfg.slots.main,
messages: messages(baseline, session.records()),
messages: messages_with_carry(baseline, session.records(), session.carry()),
tools: baseline.tools.clone(),
thinking: true,
};