1use codei_config::AgentConfig;
2use codei_llm::Message;
3
4use crate::compact::{compact_messages, estimate_tokens, TokenBudget};
5use crate::model::{to_llm_messages, Session};
6
7pub struct ContextBuilder;
9
10impl ContextBuilder {
11 pub fn build(session: &Session, system_prompt: &str) -> Vec<Message> {
12 Self::build_with_config(session, system_prompt, None)
13 }
14
15 pub fn build_with_config(
16 session: &Session,
17 system_prompt: &str,
18 agent: Option<&AgentConfig>,
19 ) -> Vec<Message> {
20 let messages = to_llm_messages(session, system_prompt);
21 if let Some(cfg) = agent {
22 let budget = TokenBudget {
23 max_tokens: cfg.context_window_tokens,
24 compaction_threshold: cfg.compaction_threshold,
25 };
26 compact_messages(messages, budget)
27 } else {
28 messages
29 }
30 }
31
32 pub fn estimate_session_tokens(session: &Session, system_prompt: &str) -> u32 {
33 estimate_tokens(&to_llm_messages(session, system_prompt))
34 }
35}