diff --git a/crates/zeph-core/src/agent/context.rs b/crates/zeph-core/src/agent/context.rs index 0bd5e84c..1985544f 100644 --- a/crates/zeph-core/src/agent/context.rs +++ b/crates/zeph-core/src/agent/context.rs @@ -1,3 +1,5 @@ +use std::fmt::Write; + use zeph_llm::provider::MessagePart; use zeph_memory::semantic::estimate_tokens; use zeph_skills::prompt::format_skills_catalog; @@ -49,18 +51,22 @@ impl Agent "user", - Role::Assistant => "assistant", - Role::System => "system", - }; - format!("[{role}]: {}", m.content) - }) - .collect::>() - .join("\n\n"); + .map(|m| "[assistant]: ".len() + m.content.len() + 2) + .sum(); + let mut history_text = String::with_capacity(estimated_len); + for (i, m) in to_compact.iter().enumerate() { + if i > 0 { + history_text.push_str("\n\n"); + } + let role = match m.role { + Role::User => "user", + Role::Assistant => "assistant", + Role::System => "system", + }; + let _ = write!(history_text, "[{role}]: {}", m.content); + } let compaction_prompt = format!( "Summarize this conversation excerpt into a structured continuation note. \ diff --git a/crates/zeph-memory/tests/qdrant_integration.rs b/crates/zeph-memory/tests/qdrant_integration.rs index e48660cb..7a9f03c8 100644 --- a/crates/zeph-memory/tests/qdrant_integration.rs +++ b/crates/zeph-memory/tests/qdrant_integration.rs @@ -8,7 +8,7 @@ use zeph_memory::sqlite::SqliteStore; const QDRANT_GRPC_PORT: ContainerPort = ContainerPort::Tcp(6334); fn qdrant_image() -> GenericImage { - GenericImage::new("qdrant/qdrant", "v1.13.6") + GenericImage::new("qdrant/qdrant", "v1.16.0") .with_wait_for(WaitFor::message_on_stdout("gRPC listening")) .with_exposed_port(QDRANT_GRPC_PORT) }