cli(config): Add GOOSE_CONTEXT_STRATEGY setting (#2666)
Co-authored-by: Michael Neale <michael.neale@gmail.com>
This commit is contained in:
committed by
GitHub
parent
601744518d
commit
78234fb103
@@ -774,56 +774,68 @@ impl Session {
|
||||
} else if let Some(MessageContent::ContextLengthExceeded(_)) = message.content.first() {
|
||||
output::hide_thinking();
|
||||
|
||||
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_result = 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")
|
||||
.item("cancel", "Cancel", "Cancel and return to chat")
|
||||
.interact();
|
||||
// Check for user-configured default context strategy
|
||||
let config = Config::global();
|
||||
let context_strategy = config.get_param::<String>("GOOSE_CONTEXT_STRATEGY")
|
||||
.unwrap_or_else(|_| if interactive { "prompt".to_string() } else { "summarize".to_string() });
|
||||
|
||||
let selected = match selected_result {
|
||||
Ok(s) => s,
|
||||
Err(e) => {
|
||||
if e.kind() == std::io::ErrorKind::Interrupted {
|
||||
"cancel" // If interrupted, set selected to cancel
|
||||
} else {
|
||||
return Err(e.into());
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
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?;
|
||||
}
|
||||
"cancel" => {
|
||||
break; // Return to main prompt
|
||||
}
|
||||
_ => {
|
||||
unreachable!()
|
||||
let selected = match context_strategy.as_str() {
|
||||
"clear" => "clear",
|
||||
"truncate" => "truncate",
|
||||
"summarize" => "summarize",
|
||||
_ => {
|
||||
if interactive {
|
||||
// In interactive mode with no default, 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();
|
||||
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()?
|
||||
} else {
|
||||
// In headless mode, default to summarize
|
||||
"summarize"
|
||||
}
|
||||
}
|
||||
} 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?;
|
||||
};
|
||||
|
||||
match selected {
|
||||
"clear" => {
|
||||
self.messages.clear();
|
||||
let msg = if context_strategy == "clear" {
|
||||
format!("Context maxed out - automatically cleared session.\n{}", "-".repeat(50))
|
||||
} else {
|
||||
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 = if context_strategy == "truncate" {
|
||||
format!("Context maxed out - automatically truncated messages.\n{}\nGoose tried its best to truncate messages for you.", "-".repeat(50))
|
||||
} else {
|
||||
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
|
||||
let message_suffix = if context_strategy == "summarize" {
|
||||
"Goose automatically summarized messages for you."
|
||||
} else if interactive {
|
||||
"Goose summarized messages for you."
|
||||
} else {
|
||||
"Goose automatically summarized messages to continue processing."
|
||||
};
|
||||
Self::summarize_context_messages(&mut self.messages, &self.agent, message_suffix).await?;
|
||||
}
|
||||
_ => {
|
||||
unreachable!()
|
||||
}
|
||||
}
|
||||
|
||||
// Restart the stream after handling ContextLengthExceeded
|
||||
|
||||
Reference in New Issue
Block a user