feat: switch from mcp_core::Role to rmcp::model::Role (#3488)
This commit is contained in:
@@ -3,7 +3,7 @@ use crate::message::{Message, MessageContent};
|
||||
use crate::providers::base::Provider;
|
||||
use crate::token_counter::{AsyncTokenCounter, TokenCounter};
|
||||
use anyhow::Result;
|
||||
use mcp_core::Role;
|
||||
use rmcp::model::Role;
|
||||
use std::sync::Arc;
|
||||
|
||||
// Constants for the summarization prompt and a follow-up user message.
|
||||
@@ -220,8 +220,9 @@ mod tests {
|
||||
use crate::providers::base::{Provider, ProviderMetadata, ProviderUsage, Usage};
|
||||
use crate::providers::errors::ProviderError;
|
||||
use chrono::Utc;
|
||||
use mcp_core::{tool::Tool, Role};
|
||||
use mcp_core::tool::Tool;
|
||||
use mcp_core::{Content, TextContent, ToolCall};
|
||||
use rmcp::model::Role;
|
||||
use serde_json::json;
|
||||
use std::sync::Arc;
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
use crate::message::{Message, MessageContent};
|
||||
use crate::utils::safe_truncate;
|
||||
use anyhow::{anyhow, Result};
|
||||
use mcp_core::{Content, ResourceContents, Role};
|
||||
use mcp_core::{Content, ResourceContents};
|
||||
use rmcp::model::Role;
|
||||
use std::collections::HashSet;
|
||||
use tracing::{debug, warn};
|
||||
|
||||
|
||||
@@ -12,8 +12,8 @@ use mcp_core::content::{Content, ImageContent, TextContent};
|
||||
use mcp_core::handler::ToolResult;
|
||||
use mcp_core::prompt::{PromptMessage, PromptMessageContent, PromptMessageRole};
|
||||
use mcp_core::resource::ResourceContents;
|
||||
use mcp_core::role::Role;
|
||||
use mcp_core::tool::ToolCall;
|
||||
use rmcp::model::Role;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::Value;
|
||||
use utoipa::ToSchema;
|
||||
|
||||
@@ -82,7 +82,7 @@ fn create_check_messages(tool_requests: Vec<&ToolRequest>) -> Vec<Message> {
|
||||
.collect();
|
||||
let mut check_messages = vec![];
|
||||
check_messages.push(Message::new(
|
||||
mcp_core::Role::User,
|
||||
rmcp::model::Role::User,
|
||||
Utc::now().timestamp(),
|
||||
vec![MessageContent::Text(TextContent {
|
||||
text: format!(
|
||||
@@ -270,7 +270,8 @@ mod tests {
|
||||
use crate::providers::errors::ProviderError;
|
||||
use chrono::Utc;
|
||||
use mcp_core::ToolCall;
|
||||
use mcp_core::{tool::Tool, Role, ToolResult};
|
||||
use mcp_core::{tool::Tool, ToolResult};
|
||||
use rmcp::model::Role;
|
||||
use serde_json::json;
|
||||
use tempfile::NamedTempFile;
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ use crate::message::{Message, MessageContent};
|
||||
use crate::model::ModelConfig;
|
||||
use mcp_core::content::TextContent;
|
||||
use mcp_core::tool::Tool;
|
||||
use mcp_core::Role;
|
||||
use rmcp::model::Role;
|
||||
|
||||
pub const CLAUDE_CODE_DEFAULT_MODEL: &str = "default";
|
||||
pub const CLAUDE_CODE_KNOWN_MODELS: &[&str] = &["default"];
|
||||
@@ -330,7 +330,7 @@ impl ClaudeCodeProvider {
|
||||
// Extract the first user message text
|
||||
let description = messages
|
||||
.iter()
|
||||
.find(|m| m.role == mcp_core::Role::User)
|
||||
.find(|m| m.role == rmcp::model::Role::User)
|
||||
.and_then(|m| {
|
||||
m.content.iter().find_map(|c| match c {
|
||||
MessageContent::Text(text_content) => Some(&text_content.text),
|
||||
@@ -354,7 +354,7 @@ impl ClaudeCodeProvider {
|
||||
}
|
||||
|
||||
let message = Message::new(
|
||||
mcp_core::Role::Assistant,
|
||||
rmcp::model::Role::Assistant,
|
||||
chrono::Utc::now().timestamp(),
|
||||
vec![MessageContent::Text(mcp_core::content::TextContent {
|
||||
text: description.clone(),
|
||||
|
||||
@@ -177,7 +177,8 @@ mod tests {
|
||||
use crate::message::{Message, MessageContent};
|
||||
use crate::providers::base::{ProviderMetadata, ProviderUsage, Usage};
|
||||
use chrono::Utc;
|
||||
use mcp_core::{content::TextContent, Role};
|
||||
use mcp_core::content::TextContent;
|
||||
use rmcp::model::Role;
|
||||
use std::env;
|
||||
|
||||
#[allow(dead_code)]
|
||||
|
||||
@@ -4,8 +4,8 @@ use crate::providers::base::Usage;
|
||||
use crate::providers::errors::ProviderError;
|
||||
use anyhow::{anyhow, Result};
|
||||
use mcp_core::content::Content;
|
||||
use mcp_core::role::Role;
|
||||
use mcp_core::tool::{Tool, ToolCall};
|
||||
use rmcp::model::Role;
|
||||
use serde_json::{json, Value};
|
||||
use std::collections::HashSet;
|
||||
|
||||
@@ -538,7 +538,7 @@ where
|
||||
|
||||
// Yield partial text message
|
||||
let message = Message::new(
|
||||
mcp_core::role::Role::Assistant,
|
||||
Role::Assistant,
|
||||
chrono::Utc::now().timestamp(),
|
||||
vec![MessageContent::text(text)],
|
||||
);
|
||||
@@ -573,7 +573,7 @@ where
|
||||
format!("Could not parse tool arguments: {}", args)
|
||||
);
|
||||
let message = Message::new(
|
||||
mcp_core::role::Role::Assistant,
|
||||
Role::Assistant,
|
||||
chrono::Utc::now().timestamp(),
|
||||
vec![MessageContent::tool_request(tool_id, Err(error))],
|
||||
);
|
||||
@@ -585,7 +585,7 @@ where
|
||||
|
||||
let tool_call = ToolCall::new(&name, parsed_args);
|
||||
let message = Message::new(
|
||||
mcp_core::role::Role::Assistant,
|
||||
rmcp::model::Role::Assistant,
|
||||
chrono::Utc::now().timestamp(),
|
||||
vec![MessageContent::tool_request(tool_id, Ok(tool_call))],
|
||||
);
|
||||
|
||||
@@ -6,7 +6,8 @@ use aws_sdk_bedrockruntime::types as bedrock;
|
||||
use aws_smithy_types::{Document, Number};
|
||||
use base64::Engine;
|
||||
use chrono::Utc;
|
||||
use mcp_core::{Content, ResourceContents, Role, Tool, ToolCall, ToolError, ToolResult};
|
||||
use mcp_core::{Content, ResourceContents, Tool, ToolCall, ToolError, ToolResult};
|
||||
use rmcp::model::Role;
|
||||
use serde_json::Value;
|
||||
|
||||
use super::super::base::Usage;
|
||||
|
||||
@@ -6,7 +6,8 @@ use crate::providers::utils::{
|
||||
};
|
||||
use anyhow::{anyhow, Error};
|
||||
use mcp_core::ToolError;
|
||||
use mcp_core::{Content, Role, Tool, ToolCall};
|
||||
use mcp_core::{Content, Tool, ToolCall};
|
||||
use rmcp::model::Role;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::{json, Value};
|
||||
|
||||
|
||||
@@ -5,9 +5,9 @@ use crate::providers::errors::ProviderError;
|
||||
use crate::providers::utils::{is_valid_function_name, sanitize_function_name};
|
||||
use anyhow::Result;
|
||||
use mcp_core::content::Content;
|
||||
use mcp_core::role::Role;
|
||||
use mcp_core::tool::{Tool, ToolCall};
|
||||
use rand::{distributions::Alphanumeric, Rng};
|
||||
use rmcp::model::Role;
|
||||
use serde_json::{json, Map, Value};
|
||||
|
||||
/// Convert internal Message format to Google's API message specification
|
||||
|
||||
@@ -9,7 +9,8 @@ use anyhow::{anyhow, Error};
|
||||
use async_stream::try_stream;
|
||||
use futures::Stream;
|
||||
use mcp_core::ToolError;
|
||||
use mcp_core::{Content, Role, Tool, ToolCall};
|
||||
use mcp_core::{Content, Tool, ToolCall};
|
||||
use rmcp::model::Role;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::{json, Value};
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ use crate::providers::base::Usage;
|
||||
use crate::providers::errors::ProviderError;
|
||||
use anyhow::{anyhow, Result};
|
||||
use mcp_core::content::Content;
|
||||
use mcp_core::role::Role;
|
||||
use mcp_core::tool::{Tool, ToolCall};
|
||||
use rmcp::model::Role;
|
||||
use serde_json::{json, Value};
|
||||
use std::collections::HashSet;
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ use crate::message::{Message, MessageContent};
|
||||
use crate::model::ModelConfig;
|
||||
use mcp_core::content::TextContent;
|
||||
use mcp_core::tool::Tool;
|
||||
use mcp_core::Role;
|
||||
use rmcp::model::Role;
|
||||
|
||||
pub const GEMINI_CLI_DEFAULT_MODEL: &str = "default";
|
||||
pub const GEMINI_CLI_KNOWN_MODELS: &[&str] = &["default"];
|
||||
|
||||
@@ -455,7 +455,8 @@ mod tests {
|
||||
use crate::message::MessageContent;
|
||||
use crate::providers::base::{ProviderMetadata, ProviderUsage, Usage};
|
||||
use chrono::Utc;
|
||||
use mcp_core::{content::TextContent, Role};
|
||||
use mcp_core::content::TextContent;
|
||||
use rmcp::model::Role;
|
||||
|
||||
#[derive(Clone)]
|
||||
struct MockProvider {
|
||||
|
||||
@@ -17,7 +17,7 @@ use crate::message::{Message, MessageContent};
|
||||
use crate::model::ModelConfig;
|
||||
use chrono::Utc;
|
||||
use mcp_core::content::TextContent;
|
||||
use mcp_core::role::Role;
|
||||
use rmcp::model::Role;
|
||||
|
||||
pub const SAGEMAKER_TGI_DOC_LINK: &str =
|
||||
"https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints.html";
|
||||
|
||||
@@ -10,7 +10,8 @@ use super::base::{ConfigKey, Provider, ProviderMetadata, ProviderUsage, Usage};
|
||||
use super::errors::ProviderError;
|
||||
use crate::message::{Message, MessageContent};
|
||||
use crate::model::ModelConfig;
|
||||
use mcp_core::{tool::Tool, Role, ToolCall, ToolResult};
|
||||
use mcp_core::{tool::Tool, ToolCall, ToolResult};
|
||||
use rmcp::model::Role;
|
||||
|
||||
// ---------- Capability Flags ----------
|
||||
#[derive(Debug)]
|
||||
|
||||
@@ -1219,7 +1219,7 @@ async fn run_scheduled_job_internal(
|
||||
|
||||
match message_result {
|
||||
Ok(AgentEvent::Message(msg)) => {
|
||||
if msg.role == mcp_core::role::Role::Assistant {
|
||||
if msg.role == rmcp::model::Role::Assistant {
|
||||
tracing::info!("[Job {}] Assistant: {:?}", job.id, msg.content);
|
||||
}
|
||||
all_session_messages.push(msg);
|
||||
@@ -1331,7 +1331,8 @@ mod tests {
|
||||
providers::base::{ProviderMetadata, ProviderUsage, Usage},
|
||||
providers::errors::ProviderError,
|
||||
};
|
||||
use mcp_core::{content::TextContent, tool::Tool, Role};
|
||||
use mcp_core::{content::TextContent, tool::Tool};
|
||||
use rmcp::model::Role;
|
||||
// Removed: use crate::session::storage::{get_most_recent_session, read_metadata};
|
||||
// `read_metadata` is still used by the test itself, so keep it or its module.
|
||||
use crate::session::storage::read_metadata;
|
||||
|
||||
@@ -862,11 +862,11 @@ fn try_extract_partial_message(json_str: &str) -> Result<Message> {
|
||||
|
||||
// Try to extract role
|
||||
let role = if json_str.contains("\"role\":\"user\"") {
|
||||
mcp_core::role::Role::User
|
||||
rmcp::model::Role::User
|
||||
} else if json_str.contains("\"role\":\"assistant\"") {
|
||||
mcp_core::role::Role::Assistant
|
||||
rmcp::model::Role::Assistant
|
||||
} else {
|
||||
mcp_core::role::Role::User // Default fallback
|
||||
rmcp::model::Role::User // Default fallback
|
||||
};
|
||||
|
||||
// Try to extract text content
|
||||
@@ -901,8 +901,8 @@ fn try_extract_partial_message(json_str: &str) -> Result<Message> {
|
||||
|
||||
if !extracted_text.is_empty() {
|
||||
let message = match role {
|
||||
mcp_core::role::Role::User => Message::user(),
|
||||
mcp_core::role::Role::Assistant => Message::assistant(),
|
||||
rmcp::model::Role::User => Message::user(),
|
||||
rmcp::model::Role::Assistant => Message::assistant(),
|
||||
};
|
||||
|
||||
return Ok(message.with_text(format!("[PARTIALLY RECOVERED] {}", extracted_text)));
|
||||
@@ -1079,7 +1079,7 @@ pub async fn persist_messages_with_schedule_id(
|
||||
// Count user messages
|
||||
let user_message_count = messages
|
||||
.iter()
|
||||
.filter(|m| m.role == mcp_core::role::Role::User && !m.as_concat_text().trim().is_empty())
|
||||
.filter(|m| m.role == rmcp::model::Role::User && !m.as_concat_text().trim().is_empty())
|
||||
.count();
|
||||
|
||||
// Check if we need to update the description (after 1st or 3rd user message)
|
||||
@@ -1293,7 +1293,7 @@ pub async fn generate_description_with_schedule_id(
|
||||
// get context from messages so far, limiting each message to 300 chars for security
|
||||
let context: Vec<String> = messages
|
||||
.iter()
|
||||
.filter(|m| m.role == mcp_core::role::Role::User)
|
||||
.filter(|m| m.role == rmcp::model::Role::User)
|
||||
.take(3) // Use up to first 3 user messages for context
|
||||
.map(|m| {
|
||||
let text = m.as_concat_text();
|
||||
|
||||
@@ -371,8 +371,8 @@ pub async fn create_async_token_counter() -> Result<AsyncTokenCounter, String> {
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::message::{Message, MessageContent};
|
||||
use mcp_core::role::Role;
|
||||
use mcp_core::tool::Tool;
|
||||
use rmcp::model::Role;
|
||||
use serde_json::json;
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -635,7 +635,7 @@ mod final_output_tool_tests {
|
||||
let last_message = responses.last().unwrap();
|
||||
|
||||
// Check that the last message is an assistant message with our final output
|
||||
assert_eq!(last_message.role, mcp_core::role::Role::Assistant);
|
||||
assert_eq!(last_message.role, rmcp::model::Role::Assistant);
|
||||
let message_text = last_message.as_concat_text();
|
||||
assert_eq!(message_text, r#"{"result":"Test output"}"#);
|
||||
|
||||
@@ -753,7 +753,7 @@ mod final_output_tool_tests {
|
||||
}
|
||||
|
||||
// Check that the last message after the llm stream is the message directing the agent to continue
|
||||
assert_eq!(last_message.role, mcp_core::role::Role::User);
|
||||
assert_eq!(last_message.role, rmcp::model::Role::User);
|
||||
let message_text = last_message.as_concat_text();
|
||||
assert_eq!(message_text, FINAL_OUTPUT_CONTINUATION_MESSAGE);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user