use std::sync::Arc;
use async_trait::async_trait;
use agentyk::{Agent, ContextAssembler, Message, ModelSpec, Result, SessionId, SimDriver, SimTurn};
struct KeepLast {
keep: usize,
}
#[async_trait]
impl ContextAssembler for KeepLast {
async fn assemble(&self, _session_id: SessionId, messages: &[Message]) -> Vec<Message> {
let start = messages.len().saturating_sub(self.keep);
messages[start..].to_vec()
}
}
#[tokio::test]
async fn default_passthrough_sends_full_history() -> Result<()> {
let sim = Arc::new(SimDriver::new([
SimTurn::text("first"),
SimTurn::text("second"),
]));
let agent = Agent::builder()
.model(ModelSpec::llmsim())
.driver(ForwardingDriver(sim.clone()))
.build()?;
let mut session = agent.session();
session.run("one").await?;
session.run("two").await?;
let requests = sim.recorded_requests();
assert_eq!(requests[1].messages.len(), 3);
Ok(())
}
#[tokio::test]
async fn custom_assembler_trims_what_is_sent_without_touching_the_log() -> Result<()> {
let sim = Arc::new(SimDriver::new([
SimTurn::text("first"),
SimTurn::text("second"),
SimTurn::text("third"),
]));
let agent = Agent::builder()
.model(ModelSpec::llmsim())
.driver(ForwardingDriver(sim.clone()))
.context_assembler(KeepLast { keep: 1 })
.build()?;
let mut session = agent.session();
session.run("one").await?;
session.run("two").await?;
session.run("three").await?;
let requests = sim.recorded_requests();
assert!(requests.iter().all(|r| r.messages.len() == 1));
assert_eq!(session.messages().len(), 6); Ok(())
}
struct ForwardingDriver(Arc<SimDriver>);
#[async_trait]
impl agentyk::ChatDriver for ForwardingDriver {
fn id(&self) -> agentyk::DriverId {
self.0.id()
}
async fn complete(&self, request: agentyk::ChatRequest) -> Result<agentyk::ChatResponse> {
self.0.complete(request).await
}
}