diff --git a/crates/goose-cli/src/session/mod.rs b/crates/goose-cli/src/session/mod.rs index bf0f258504..da5af1544b 100644 --- a/crates/goose-cli/src/session/mod.rs +++ b/crates/goose-cli/src/session/mod.rs @@ -122,6 +122,21 @@ impl Session { } } + /// Helper function to summarize context messages + async fn summarize_context_messages( + messages: &mut Vec, + agent: &Agent, + message_suffix: &str, + ) -> Result<()> { + // Summarize messages to fit within context length + let (summarized_messages, _) = agent.summarize_context(messages).await?; + let msg = format!("Context maxed out\n{}\n{}", "-".repeat(50), message_suffix); + output::render_text(&msg, Some(Color::Yellow), true); + *messages = summarized_messages; + + Ok(()) + } + /// Add a stdio extension to the session /// /// # Arguments @@ -703,39 +718,43 @@ impl Session { } else if let Some(MessageContent::ContextLengthExceeded(_)) = message.content.first() { output::hide_thinking(); - let prompt = "The model's context length is maxed out. You will need to reduce the # msgs. Do you want to?".to_string(); - let selected = cliclack::select(prompt) - .item("clear", "Clear Session", "Removes all messages from Goose's memory") - .item("truncate", "Truncate Messages", "Removes old messages till context is within limits") - .item("summarize", "Summarize Session", "Summarize the session to reduce context length") - .interact()?; + if interactive { + // In interactive mode, ask the user what to do + let prompt = "The model's context length is maxed out. You will need to reduce the # msgs. Do you want to?".to_string(); + let selected = cliclack::select(prompt) + .item("clear", "Clear Session", "Removes all messages from Goose's memory") + .item("truncate", "Truncate Messages", "Removes old messages till context is within limits") + .item("summarize", "Summarize Session", "Summarize the session to reduce context length") + .interact()?; - match selected { - "clear" => { - self.messages.clear(); - let msg = format!("Session cleared.\n{}", "-".repeat(50)); - output::render_text(&msg, Some(Color::Yellow), true); - break; // exit the loop to hand back control to the user - } - "truncate" => { - // Truncate messages to fit within context length - let (truncated_messages, _) = self.agent.truncate_context(&self.messages).await?; - let msg = format!("Context maxed out\n{}\nGoose tried its best to truncate messages for you.", "-".repeat(50)); - output::render_text("", Some(Color::Yellow), true); - output::render_text(&msg, Some(Color::Yellow), true); - self.messages = truncated_messages; - } - "summarize" => { - // Summarize messages to fit within context length - let (summarized_messages, _) = self.agent.summarize_context(&self.messages).await?; - let msg = format!("Context maxed out\n{}\nGoose summarized messages for you.", "-".repeat(50)); - output::render_text(&msg, Some(Color::Yellow), true); - self.messages = summarized_messages; - } - _ => { - unreachable!() + match selected { + "clear" => { + self.messages.clear(); + let msg = format!("Session cleared.\n{}", "-".repeat(50)); + output::render_text(&msg, Some(Color::Yellow), true); + break; // exit the loop to hand back control to the user + } + "truncate" => { + // Truncate messages to fit within context length + let (truncated_messages, _) = self.agent.truncate_context(&self.messages).await?; + let msg = format!("Context maxed out\n{}\nGoose tried its best to truncate messages for you.", "-".repeat(50)); + output::render_text("", Some(Color::Yellow), true); + output::render_text(&msg, Some(Color::Yellow), true); + self.messages = truncated_messages; + } + "summarize" => { + // Use the helper function to summarize context + Self::summarize_context_messages(&mut self.messages, &self.agent, "Goose summarized messages for you.").await?; + } + _ => { + unreachable!() + } } + } else { + // In headless mode (goose run), automatically use summarize + Self::summarize_context_messages(&mut self.messages, &self.agent, "Goose automatically summarized messages to continue processing.").await?; } + // Restart the stream after handling ContextLengthExceeded stream = self .agent