chore: upgrade to rmcp 0.14.0 (#6674)
This commit is contained in:
@@ -971,7 +971,7 @@ mod tests {
|
||||
use super::*;
|
||||
use crate::conversation::message::Message;
|
||||
use jsonwebtoken::{Algorithm, EncodingKey, Header};
|
||||
use rmcp::model::{CallToolRequestParam, CallToolResult, Content, ErrorCode, ErrorData};
|
||||
use rmcp::model::{CallToolRequestParams, CallToolResult, Content, ErrorCode, ErrorData};
|
||||
use rmcp::object;
|
||||
use test_case::test_case;
|
||||
use wiremock::matchers::{body_string_contains, method, path};
|
||||
@@ -1003,8 +1003,8 @@ mod tests {
|
||||
Message::user().with_text("user text"),
|
||||
Message::assistant().with_text("assistant prelude").with_tool_request(
|
||||
"call-1",
|
||||
Ok(CallToolRequestParam {
|
||||
task: None,
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None, task: None,
|
||||
name: "tool_name".into(),
|
||||
arguments: Some(object!({"param": "value"})),
|
||||
}),
|
||||
@@ -1029,8 +1029,8 @@ mod tests {
|
||||
Message::user().with_text("user text"),
|
||||
Message::assistant().with_tool_request(
|
||||
"call-1",
|
||||
Ok(CallToolRequestParam {
|
||||
task: None,
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None, task: None,
|
||||
name: "tool_name".into(),
|
||||
arguments: Some(object!({"param": "value"})),
|
||||
}),
|
||||
@@ -1054,8 +1054,8 @@ mod tests {
|
||||
Message::user().with_text("user text"),
|
||||
Message::assistant().with_tool_request(
|
||||
"call-1",
|
||||
Ok(CallToolRequestParam {
|
||||
task: None,
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None, task: None,
|
||||
name: "tool_name".into(),
|
||||
arguments: Some(object!({"param": "value"})),
|
||||
}),
|
||||
|
||||
@@ -4,7 +4,7 @@ use crate::providers::base::Usage;
|
||||
use crate::providers::errors::ProviderError;
|
||||
use crate::providers::utils::{convert_image, ImageFormat};
|
||||
use anyhow::{anyhow, Result};
|
||||
use rmcp::model::{object, CallToolRequestParam, ErrorCode, ErrorData, JsonObject, Role, Tool};
|
||||
use rmcp::model::{object, CallToolRequestParams, ErrorCode, ErrorData, JsonObject, Role, Tool};
|
||||
use rmcp::object as json_object;
|
||||
use serde_json::{json, Value};
|
||||
use std::collections::HashSet;
|
||||
@@ -249,7 +249,8 @@ pub fn response_to_message(response: &Value) -> Result<Message> {
|
||||
.get(INPUT_FIELD)
|
||||
.ok_or_else(|| anyhow!("Missing tool_use input"))?;
|
||||
|
||||
let tool_call = CallToolRequestParam {
|
||||
let tool_call = CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: name.into(),
|
||||
arguments: Some(object(input.clone())),
|
||||
@@ -613,8 +614,8 @@ where
|
||||
}
|
||||
};
|
||||
|
||||
let tool_call = CallToolRequestParam{
|
||||
task: None,
|
||||
let tool_call = CallToolRequestParams{
|
||||
meta: None, task: None,
|
||||
name: name.into(),
|
||||
arguments: Some(object(parsed_args))
|
||||
};
|
||||
@@ -982,7 +983,8 @@ mod tests {
|
||||
let messages = vec![
|
||||
Message::assistant().with_tool_request(
|
||||
"tool_1",
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: "calculator".into(),
|
||||
arguments: Some(object!({"expression": "2 + 2"})),
|
||||
|
||||
@@ -9,7 +9,7 @@ use aws_smithy_types::{Document, Number};
|
||||
use base64::Engine;
|
||||
use chrono::Utc;
|
||||
use rmcp::model::{
|
||||
object, CallToolRequestParam, Content, ErrorCode, ErrorData, RawContent, ResourceContents,
|
||||
object, CallToolRequestParams, Content, ErrorCode, ErrorData, RawContent, ResourceContents,
|
||||
Role, Tool,
|
||||
};
|
||||
use serde_json::Value;
|
||||
@@ -300,7 +300,8 @@ pub fn from_bedrock_content_block(block: &bedrock::ContentBlock) -> Result<Messa
|
||||
bedrock::ContentBlock::Text(text) => MessageContent::text(text),
|
||||
bedrock::ContentBlock::ToolUse(tool_use) => MessageContent::tool_request(
|
||||
tool_use.tool_use_id.to_string(),
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: tool_use.name.clone().into(),
|
||||
arguments: Some(object(from_bedrock_json(&tool_use.input.clone())?)),
|
||||
|
||||
@@ -7,7 +7,7 @@ use crate::providers::utils::{
|
||||
};
|
||||
use anyhow::{anyhow, Error};
|
||||
use rmcp::model::{
|
||||
object, AnnotateAble, CallToolRequestParam, Content, ErrorCode, ErrorData, RawContent,
|
||||
object, AnnotateAble, CallToolRequestParams, Content, ErrorCode, ErrorData, RawContent,
|
||||
ResourceContents, Role, Tool,
|
||||
};
|
||||
use serde::Serialize;
|
||||
@@ -340,7 +340,8 @@ pub fn response_to_message(response: &Value) -> anyhow::Result<Message> {
|
||||
Ok(params) => {
|
||||
content.push(MessageContent::tool_request(
|
||||
id,
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: function_name.into(),
|
||||
arguments: Some(object(params)),
|
||||
@@ -735,7 +736,8 @@ mod tests {
|
||||
Message::user().with_text("How are you?"),
|
||||
Message::assistant().with_tool_request(
|
||||
"tool1",
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: "example".into(),
|
||||
arguments: Some(object!({"param1": "value1"})),
|
||||
@@ -781,7 +783,8 @@ mod tests {
|
||||
fn test_format_messages_multiple_content() -> anyhow::Result<()> {
|
||||
let mut messages = vec![Message::assistant().with_tool_request(
|
||||
"tool1",
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: "example".into(),
|
||||
arguments: Some(object!({"param1": "value1"})),
|
||||
@@ -1160,7 +1163,8 @@ mod tests {
|
||||
// Test that tool calls with None arguments are formatted as "{}" string
|
||||
let message = Message::assistant().with_tool_request(
|
||||
"tool1",
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: "test_tool".into(),
|
||||
arguments: None, // This is the key case the fix addresses
|
||||
@@ -1190,7 +1194,8 @@ mod tests {
|
||||
// Test that tool calls with Some arguments are properly JSON-serialized
|
||||
let message = Message::assistant().with_tool_request(
|
||||
"tool1",
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: "test_tool".into(),
|
||||
arguments: Some(object!({"param": "value", "number": 42})),
|
||||
|
||||
@@ -4,7 +4,7 @@ use crate::providers::errors::ProviderError;
|
||||
use crate::providers::utils::{is_valid_function_name, sanitize_function_name};
|
||||
use anyhow::Result;
|
||||
use rmcp::model::{
|
||||
object, AnnotateAble, CallToolRequestParam, ErrorCode, ErrorData, RawContent, Role, Tool,
|
||||
object, AnnotateAble, CallToolRequestParams, ErrorCode, ErrorData, RawContent, Role, Tool,
|
||||
};
|
||||
use serde::Serialize;
|
||||
use std::borrow::Cow;
|
||||
@@ -421,7 +421,8 @@ fn process_response_part_impl(
|
||||
|
||||
Some(MessageContent::tool_request_with_metadata(
|
||||
id,
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: name.to_string().into(),
|
||||
arguments,
|
||||
@@ -688,7 +689,7 @@ pub fn create_request(
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::conversation::message::Message;
|
||||
use rmcp::model::{CallToolRequestParam, CallToolResult};
|
||||
use rmcp::model::{CallToolRequestParams, CallToolResult};
|
||||
use rmcp::{model::Content, object};
|
||||
use serde_json::json;
|
||||
|
||||
@@ -696,7 +697,7 @@ mod tests {
|
||||
Message::new(role, 0, vec![MessageContent::text(text.to_string())])
|
||||
}
|
||||
|
||||
fn set_up_tool_request_message(id: &str, tool_call: CallToolRequestParam) -> Message {
|
||||
fn set_up_tool_request_message(id: &str, tool_call: CallToolRequestParams) -> Message {
|
||||
Message::new(
|
||||
Role::User,
|
||||
0,
|
||||
@@ -704,7 +705,7 @@ mod tests {
|
||||
)
|
||||
}
|
||||
|
||||
fn set_up_action_required_message(id: &str, tool_call: CallToolRequestParam) -> Message {
|
||||
fn set_up_action_required_message(id: &str, tool_call: CallToolRequestParams) -> Message {
|
||||
Message::new(
|
||||
Role::User,
|
||||
0,
|
||||
@@ -770,7 +771,8 @@ mod tests {
|
||||
let messages = vec![
|
||||
set_up_tool_request_message(
|
||||
"id",
|
||||
CallToolRequestParam {
|
||||
CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: "tool_name".into(),
|
||||
arguments: Some(object(arguments.clone())),
|
||||
@@ -778,7 +780,8 @@ mod tests {
|
||||
),
|
||||
set_up_action_required_message(
|
||||
"id2",
|
||||
CallToolRequestParam {
|
||||
CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: "tool_name_2".into(),
|
||||
arguments: Some(object(arguments.clone())),
|
||||
|
||||
@@ -10,7 +10,7 @@ use async_stream::try_stream;
|
||||
use chrono;
|
||||
use futures::Stream;
|
||||
use rmcp::model::{
|
||||
object, AnnotateAble, CallToolRequestParam, Content, ErrorCode, ErrorData, RawContent,
|
||||
object, AnnotateAble, CallToolRequestParams, Content, ErrorCode, ErrorData, RawContent,
|
||||
ResourceContents, Role, Tool,
|
||||
};
|
||||
use serde::{Deserialize, Serialize};
|
||||
@@ -339,7 +339,8 @@ pub fn response_to_message(response: &Value) -> anyhow::Result<Message> {
|
||||
Ok(params) => {
|
||||
content.push(MessageContent::tool_request(
|
||||
id,
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: function_name.into(),
|
||||
arguments: Some(object(params)),
|
||||
@@ -574,8 +575,8 @@ where
|
||||
Ok(params) => {
|
||||
MessageContent::tool_request_with_metadata(
|
||||
id.clone(),
|
||||
Ok(CallToolRequestParam {
|
||||
task: None,
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None, task: None,
|
||||
name: function_name.clone().into(),
|
||||
arguments: Some(object(params))
|
||||
}),
|
||||
@@ -880,7 +881,8 @@ mod tests {
|
||||
Message::user().with_text("How are you?"),
|
||||
Message::assistant().with_tool_request(
|
||||
"tool1",
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: "example".into(),
|
||||
arguments: Some(object!({"param1": "value1"})),
|
||||
@@ -925,7 +927,8 @@ mod tests {
|
||||
fn test_format_messages_multiple_content() -> anyhow::Result<()> {
|
||||
let mut messages = vec![Message::assistant().with_tool_request(
|
||||
"tool1",
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: "example".into(),
|
||||
arguments: Some(object!({"param1": "value1"})),
|
||||
@@ -1165,7 +1168,8 @@ mod tests {
|
||||
// Test that tool calls with None arguments are formatted as "{}" string
|
||||
let message = Message::assistant().with_tool_request(
|
||||
"tool1",
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: "test_tool".into(),
|
||||
arguments: None, // This is the key case the fix addresses
|
||||
@@ -1193,7 +1197,8 @@ mod tests {
|
||||
// Test that tool calls with Some arguments are properly JSON-serialized
|
||||
let message = Message::assistant().with_tool_request(
|
||||
"tool1",
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: "test_tool".into(),
|
||||
arguments: Some(object!({"param": "value", "number": 42})),
|
||||
@@ -1224,7 +1229,8 @@ mod tests {
|
||||
// Test that FrontendToolRequest with None arguments are formatted as "{}" string
|
||||
let message = Message::assistant().with_frontend_tool_request(
|
||||
"frontend_tool1",
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: "frontend_test_tool".into(),
|
||||
arguments: None, // This is the key case the fix addresses
|
||||
@@ -1252,7 +1258,8 @@ mod tests {
|
||||
// Test that FrontendToolRequest with Some arguments are properly JSON-serialized
|
||||
let message = Message::assistant().with_frontend_tool_request(
|
||||
"frontend_tool1",
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: "frontend_test_tool".into(),
|
||||
arguments: Some(object!({"action": "click", "element": "button"})),
|
||||
|
||||
@@ -5,7 +5,7 @@ use anyhow::{anyhow, Error};
|
||||
use async_stream::try_stream;
|
||||
use chrono;
|
||||
use futures::Stream;
|
||||
use rmcp::model::{object, CallToolRequestParam, RawContent, Role, Tool};
|
||||
use rmcp::model::{object, CallToolRequestParams, RawContent, Role, Tool};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::{json, Value};
|
||||
use std::ops::Deref;
|
||||
@@ -440,7 +440,8 @@ pub fn responses_api_to_message(response: &ResponsesApiResponse) -> anyhow::Resu
|
||||
ResponseContentBlock::ToolCall { id, name, input } => {
|
||||
content.push(MessageContent::tool_request(
|
||||
id.clone(),
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: name.clone().into(),
|
||||
arguments: Some(object(input.clone())),
|
||||
@@ -465,7 +466,8 @@ pub fn responses_api_to_message(response: &ResponsesApiResponse) -> anyhow::Resu
|
||||
|
||||
content.push(MessageContent::tool_request(
|
||||
id.clone(),
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: name.clone().into(),
|
||||
arguments: Some(object(parsed_args)),
|
||||
@@ -524,7 +526,8 @@ fn process_streaming_output_items(
|
||||
|
||||
content.push(MessageContent::tool_request(
|
||||
id,
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: name.into(),
|
||||
arguments: Some(object(parsed_args)),
|
||||
@@ -548,7 +551,8 @@ fn process_streaming_output_items(
|
||||
|
||||
content.push(MessageContent::tool_request(
|
||||
call_id,
|
||||
Ok(CallToolRequestParam {
|
||||
Ok(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: name.into(),
|
||||
arguments: Some(object(parsed_args)),
|
||||
|
||||
@@ -3,7 +3,7 @@ use crate::model::ModelConfig;
|
||||
use crate::providers::base::Usage;
|
||||
use crate::providers::errors::ProviderError;
|
||||
use anyhow::{anyhow, Result};
|
||||
use rmcp::model::{object, CallToolRequestParam, Role, Tool};
|
||||
use rmcp::model::{object, CallToolRequestParams, Role, Tool};
|
||||
use rmcp::object;
|
||||
use serde_json::{json, Value};
|
||||
use std::collections::HashSet;
|
||||
@@ -184,7 +184,8 @@ pub fn parse_streaming_response(sse_data: &str) -> Result<Message> {
|
||||
if !tool_input.is_empty() {
|
||||
let input_value = serde_json::from_str::<Value>(&tool_input)
|
||||
.unwrap_or_else(|_| Value::String(tool_input.clone()));
|
||||
let tool_call = CallToolRequestParam {
|
||||
let tool_call = CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: name.into(),
|
||||
arguments: Some(object(input_value)),
|
||||
@@ -192,7 +193,8 @@ pub fn parse_streaming_response(sse_data: &str) -> Result<Message> {
|
||||
message = message.with_tool_request(&id, Ok(tool_call));
|
||||
} else {
|
||||
// Tool with no input - use empty object
|
||||
let tool_call = CallToolRequestParam {
|
||||
let tool_call = CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: name.into(),
|
||||
arguments: Some(object!({})),
|
||||
@@ -253,7 +255,8 @@ pub fn response_to_message(response: &Value) -> Result<Message> {
|
||||
.ok_or_else(|| anyhow!("Missing tool input"))?
|
||||
.clone();
|
||||
|
||||
let tool_call = CallToolRequestParam {
|
||||
let tool_call = CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: name.into(),
|
||||
arguments: Some(object(input)),
|
||||
@@ -693,7 +696,8 @@ data: {"id":"a9537c2c-2017-4906-9817-2456168d89fa","model":"claude-sonnet-4-2025
|
||||
use crate::conversation::message::Message;
|
||||
|
||||
// Create a conversation with text, tool requests, and tool responses
|
||||
let tool_call = CallToolRequestParam {
|
||||
let tool_call = CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: "calculator".into(),
|
||||
arguments: Some(object!({"expression": "2 + 2"})),
|
||||
|
||||
@@ -39,7 +39,7 @@ use crate::model::ModelConfig;
|
||||
use crate::providers::formats::openai::create_request;
|
||||
use anyhow::Result;
|
||||
use reqwest::Client;
|
||||
use rmcp::model::{object, CallToolRequestParam, RawContent, Tool};
|
||||
use rmcp::model::{object, CallToolRequestParams, RawContent, Tool};
|
||||
use serde_json::{json, Value};
|
||||
use std::ops::Deref;
|
||||
use std::time::Duration;
|
||||
@@ -59,7 +59,7 @@ pub trait ToolInterpreter {
|
||||
&self,
|
||||
content: &str,
|
||||
tools: &[Tool],
|
||||
) -> Result<Vec<CallToolRequestParam>, ProviderError>;
|
||||
) -> Result<Vec<CallToolRequestParams>, ProviderError>;
|
||||
}
|
||||
|
||||
/// Ollama-specific implementation of the ToolInterpreter trait
|
||||
@@ -200,7 +200,7 @@ impl OllamaInterpreter {
|
||||
|
||||
fn process_interpreter_response(
|
||||
response: &Value,
|
||||
) -> Result<Vec<CallToolRequestParam>, ProviderError> {
|
||||
) -> Result<Vec<CallToolRequestParams>, ProviderError> {
|
||||
let mut tool_calls = Vec::new();
|
||||
tracing::info!(
|
||||
"Tool interpreter response is {}",
|
||||
@@ -225,7 +225,8 @@ impl OllamaInterpreter {
|
||||
let arguments = item["arguments"].clone();
|
||||
|
||||
// Add the tool call to our result vector
|
||||
tool_calls.push(CallToolRequestParam {
|
||||
tool_calls.push(CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: name.into(),
|
||||
arguments: Some(object(arguments)),
|
||||
@@ -247,7 +248,7 @@ impl ToolInterpreter for OllamaInterpreter {
|
||||
&self,
|
||||
last_assistant_msg: &str,
|
||||
tools: &[Tool],
|
||||
) -> Result<Vec<CallToolRequestParam>, ProviderError> {
|
||||
) -> Result<Vec<CallToolRequestParams>, ProviderError> {
|
||||
if tools.is_empty() {
|
||||
return Ok(vec![]);
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ use crate::conversation::message::{Message, MessageContent};
|
||||
|
||||
use crate::mcp_utils::ToolResult;
|
||||
use crate::model::ModelConfig;
|
||||
use rmcp::model::{object, CallToolRequestParam, Role, Tool};
|
||||
use rmcp::model::{object, CallToolRequestParams, Role, Tool};
|
||||
|
||||
// ---------- Capability Flags ----------
|
||||
#[derive(Debug)]
|
||||
@@ -475,7 +475,8 @@ impl Provider for VeniceProvider {
|
||||
function["arguments"].clone()
|
||||
};
|
||||
|
||||
let tool_call = CallToolRequestParam {
|
||||
let tool_call = CallToolRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
name: name.into(),
|
||||
arguments: Some(object(arguments)),
|
||||
|
||||
Reference in New Issue
Block a user