diff --git a/Cargo.lock b/Cargo.lock index e1c956487860..cc4b5b6a76a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4690,6 +4690,7 @@ dependencies = [ "rand 0.8.6", "regex", "reqwest 0.13.4", + "rmcp", "sec1", "serde", "serde_json", diff --git a/crates/goose-providers/Cargo.toml b/crates/goose-providers/Cargo.toml index e53c11b69058..28cc3a9e9cb2 100644 --- a/crates/goose-providers/Cargo.toml +++ b/crates/goose-providers/Cargo.toml @@ -41,6 +41,7 @@ futures = { workspace = true } uuid = { workspace = true, features = ["v4"] } utoipa.workspace = true base64.workspace = true +rmcp.workspace = true [dev-dependencies] tempfile.workspace = true diff --git a/crates/goose-providers/src/provider.rs b/crates/goose-providers/src/provider.rs index 8800e25e8502..7d3d08dfac26 100644 --- a/crates/goose-providers/src/provider.rs +++ b/crates/goose-providers/src/provider.rs @@ -3,18 +3,16 @@ use crate::models; use crate::retry::RetryConfig; use async_trait::async_trait; use futures::Stream; -use goose_types::{ModelConfig, ModelInfo, ProviderUsage}; +use goose_types::{Message, ModelConfig, ModelInfo, ProviderUsage}; +use rmcp::model::Tool; use std::pin::Pin; -pub type MessageStream = Pin< +pub type MessageStream = Pin< Box, Option), ProviderError>> + Send>, >; #[async_trait] pub trait Provider: Send + Sync { - type Message: Send + Sync + 'static; - type Tool: Send + Sync + 'static; - fn get_name(&self) -> &str; async fn stream( @@ -22,9 +20,9 @@ pub trait Provider: Send + Sync { model_config: &ModelConfig, session_id: &str, system: &str, - messages: &[Self::Message], - tools: &[Self::Tool], - ) -> Result, ProviderError>; + messages: &[Message], + tools: &[Tool], + ) -> Result; fn get_model_config(&self) -> ModelConfig; diff --git a/crates/goose/src/providers/base.rs b/crates/goose/src/providers/base.rs index a684427217fe..05f7c9e34922 100644 --- a/crates/goose/src/providers/base.rs +++ b/crates/goose/src/providers/base.rs @@ -510,7 +510,7 @@ pub trait Provider: Send + Sync { /// A message stream yields partial text content but complete tool calls, all within the Message object /// So a message with text will contain potentially just a word of a longer response, but tool calls /// messages will only be yielded once concatenated. -pub type MessageStream = goose_providers::provider::MessageStream; +pub type MessageStream = goose_providers::provider::MessageStream; pub struct GooseProviderAdapter<'a> { provider: &'a dyn Provider, @@ -524,9 +524,6 @@ impl<'a> GooseProviderAdapter<'a> { #[async_trait] impl goose_providers::provider::Provider for GooseProviderAdapter<'_> { - type Message = Message; - type Tool = Tool; - fn get_name(&self) -> &str { self.provider.get_name() } @@ -536,8 +533,8 @@ impl goose_providers::provider::Provider for GooseProviderAdapter<'_> { model_config: &ModelConfig, session_id: &str, system: &str, - messages: &[Self::Message], - tools: &[Self::Tool], + messages: &[Message], + tools: &[Tool], ) -> Result { self.provider .stream(model_config, session_id, system, messages, tools)