Journal: flat 5% context window budget, skip plan_context

Render journal entries directly with ## headers instead of going
through the plan_context/render_journal_text pipeline. 5% of
model context window (~6500 tokens for Qwen 128K). Simpler and
predictable.

Co-Authored-By: Proof of Concept <poc@bcachefs.org>
This commit is contained in:
Kent Overstreet 2026-04-02 02:00:14 -04:00
parent 7776d87d53
commit 42f1e888c4

View file

@ -816,15 +816,17 @@ impl Agent {
journal_nodes.len() journal_nodes.len()
}; };
// Walk backwards from cutoff, accumulating entries within token budget // Walk backwards from cutoff, accumulating entries within 5% of context
let count = |s: &str| self.tokenizer.encode_with_special_tokens(s).len(); let count = |s: &str| self.tokenizer.encode_with_special_tokens(s).len();
let journal_budget_tokens = 10_000; // ~8% of 128K context let context_window = crate::agent::context::model_context_window(&self.client.model);
let journal_budget = context_window * 5 / 100;
let mut entries = Vec::new(); let mut entries = Vec::new();
let mut total_tokens = 0; let mut total_tokens = 0;
for node in journal_nodes[..cutoff_idx].iter().rev() { for node in journal_nodes[..cutoff_idx].iter().rev() {
let tokens = count(&node.content); let tokens = count(&node.content);
if total_tokens + tokens > journal_budget_tokens && !entries.is_empty() { if total_tokens + tokens > journal_budget && !entries.is_empty() {
break; break;
} }
entries.push(journal::JournalEntry { entries.push(journal::JournalEntry {
@ -834,23 +836,19 @@ impl Agent {
}); });
total_tokens += tokens; total_tokens += tokens;
} }
entries.reverse(); // chronological order entries.reverse();
if entries.is_empty() { if entries.is_empty() {
return; return;
} }
let context_message = self.context.render_context_message(); // Render directly — no plan_context needed
let plan = crate::agent::context::plan_context( let mut text = String::from("[Earlier — from your journal]\n\n");
&self.context.system_prompt, for entry in &entries {
&context_message, use std::fmt::Write;
&[], writeln!(text, "## {}\n{}\n", entry.timestamp.format("%Y-%m-%dT%H:%M"), entry.content).ok();
&entries, }
&self.client.model, self.context.journal = text;
&count,
);
self.context.journal = crate::agent::context::render_journal_text(&entries, &plan);
} }
/// Re-render the context message in self.messages from live ContextState. /// Re-render the context message in self.messages from live ContextState.