chore: use a Conversation type (#3735)

This commit is contained in:
Jack Amadeo
2025-08-06 22:06:13 -04:00
committed by GitHub
parent 17ea675def
commit 5eb01004a4
90 changed files with 994 additions and 790 deletions
+4 -4
View File
@@ -3,10 +3,6 @@ use goose::agents::extension::ToolInfo;
use goose::agents::ExtensionConfig;
use goose::config::permission::PermissionLevel;
use goose::config::ExtensionEntry;
use goose::message::{
ContextLengthExceeded, FrontendToolRequest, Message, MessageContent, RedactedThinkingContent,
SummarizationRequested, ThinkingContent, ToolConfirmationRequest, ToolRequest, ToolResponse,
};
use goose::permission::permission_confirmation::PrincipalType;
use goose::providers::base::{ConfigKey, ModelInfo, ProviderMetadata};
use goose::session::info::SessionInfo;
@@ -17,6 +13,10 @@ use rmcp::model::{
};
use utoipa::{OpenApi, ToSchema};
use goose::conversation::message::{
ContextLengthExceeded, FrontendToolRequest, Message, MessageContent, RedactedThinkingContent,
SummarizationRequested, ThinkingContent, ToolConfirmationRequest, ToolRequest, ToolResponse,
};
use utoipa::openapi::schema::{
AdditionalProperties, AnyOfBuilder, ArrayBuilder, ObjectBuilder, OneOfBuilder, Schema,
SchemaFormat, SchemaType,
+3 -3
View File
@@ -6,7 +6,7 @@ use axum::{
routing::post,
Json, Router,
};
use goose::message::Message;
use goose::conversation::{message::Message, Conversation};
use serde::{Deserialize, Serialize};
use std::sync::Arc;
use utoipa::ToSchema;
@@ -58,7 +58,7 @@ async fn manage_context(
.await
.map_err(|_| StatusCode::PRECONDITION_FAILED)?;
let mut processed_messages: Vec<Message> = vec![];
let mut processed_messages = Conversation::new_unvalidated(vec![]);
let mut token_counts: Vec<usize> = vec![];
if request.manage_action == "truncation" {
@@ -74,7 +74,7 @@ async fn manage_context(
}
Ok(Json(ContextManageResponse {
messages: processed_messages,
messages: processed_messages.messages().clone(),
token_counts,
}))
}
+4 -2
View File
@@ -1,7 +1,7 @@
use std::sync::Arc;
use axum::{extract::State, http::StatusCode, routing::post, Json, Router};
use goose::message::Message;
use goose::conversation::{message::Message, Conversation};
use goose::recipe::Recipe;
use goose::recipe_deeplink;
use serde::{Deserialize, Serialize};
@@ -83,7 +83,9 @@ async fn create_recipe(
.map_err(|_| (StatusCode::PRECONDITION_FAILED, Json(error_response)))?;
// Create base recipe from agent state and messages
let recipe_result = agent.create_recipe(request.messages).await;
let recipe_result = agent
.create_recipe(Conversation::new_unvalidated(request.messages))
.await;
match recipe_result {
Ok(mut recipe) => {
+11 -11
View File
@@ -9,9 +9,10 @@ use axum::{
};
use bytes::Bytes;
use futures::{stream::StreamExt, Stream};
use goose::conversation::message::{Message, MessageContent};
use goose::conversation::Conversation;
use goose::{
agents::{AgentEvent, SessionConfig},
message::{push_message, Message, MessageContent},
permission::permission_confirmation::PrincipalType,
};
use goose::{
@@ -186,7 +187,7 @@ async fn reply_handler(
let stream = ReceiverStream::new(rx);
let cancel_token = CancellationToken::new();
let messages = request.messages;
let messages = Conversation::new_unvalidated(request.messages);
let session_working_dir = request.session_working_dir.clone();
let session_id = request
@@ -221,12 +222,9 @@ async fn reply_handler(
retry_config: None,
};
// Messages will be auto-compacted in agent.reply() if needed
let messages_to_process = messages.clone();
let mut stream = match agent
.reply(
&messages_to_process,
messages.clone(),
Some(session_config),
Some(task_cancel.clone()),
)
@@ -279,15 +277,15 @@ async fn reply_handler(
match response {
Ok(Some(Ok(AgentEvent::Message(message)))) => {
for content in &message.content {
track_tool_telemetry(content, &all_messages);
}
track_tool_telemetry(content, all_messages.messages());
}
push_message(&mut all_messages, message.clone());
stream_event(MessageEvent::Message { message }, &tx, &cancel_token).await;
all_messages.push(message.clone());
stream_event(MessageEvent::Message { message }, &tx, &cancel_token).await;
}
Ok(Some(Ok(AgentEvent::HistoryReplaced(new_messages)))) => {
// Replace the message history with the compacted messages
all_messages = new_messages;
all_messages = Conversation::new_unvalidated(new_messages);
// Note: We don't send this as a stream event since it's an internal operation
// The client will see the compaction notification message that was sent before this event
}
@@ -518,6 +516,7 @@ pub fn routes(state: Arc<AppState>) -> Router {
#[cfg(test)]
mod tests {
use super::*;
use goose::conversation::message::Message;
use goose::{
agents::Agent,
model::ModelConfig,
@@ -558,6 +557,7 @@ mod tests {
mod integration_tests {
use super::*;
use axum::{body::Body, http::Request};
use goose::conversation::message::Message;
use std::sync::Arc;
use tower::ServiceExt;
+2 -2
View File
@@ -10,7 +10,7 @@ use axum::{
routing::{get, put},
Json, Router,
};
use goose::message::Message;
use goose::conversation::message::Message;
use goose::session;
use goose::session::info::{get_valid_sorted_sessions, SessionInfo, SortOrder};
use goose::session::SessionMetadata;
@@ -137,7 +137,7 @@ async fn get_session_history(
Ok(Json(SessionHistoryResponse {
session_id,
metadata,
messages,
messages: messages.messages().clone(),
}))
}