fix: track message id to keep like with like (#3572)

This commit is contained in:
Michael Neale
2025-07-22 11:56:32 +10:00
committed by GitHub
parent 0a98f431c6
commit f0b4f74071
@@ -467,6 +467,7 @@ where
let mut accumulated_tool_calls: std::collections::HashMap<String, (String, String)> = std::collections::HashMap::new();
let mut current_tool_id: Option<String> = None;
let mut final_usage: Option<crate::providers::base::ProviderUsage> = None;
let mut message_id: Option<String> = None;
while let Some(line_result) = stream.next().await {
let line = line_result?;
@@ -496,6 +497,11 @@ where
"message_start" => {
// Message started, we can extract initial metadata and usage if needed
if let Some(message_data) = event.data.get("message") {
// Extract message ID
if let Some(id) = message_data.get("id").and_then(|v| v.as_str()) {
message_id = Some(id.to_string());
}
if let Some(usage_data) = message_data.get("usage") {
let usage = get_usage(usage_data).unwrap_or_default();
tracing::debug!("🔍 Anthropic message_start parsed usage: input_tokens={:?}, output_tokens={:?}, total_tokens={:?}",
@@ -532,12 +538,13 @@ where
if let Some(text) = delta.get("text").and_then(|v| v.as_str()) {
accumulated_text.push_str(text);
// Yield partial text message
let message = Message::new(
// Yield partial text message with the same ID from message_start
let mut message = Message::new(
Role::Assistant,
chrono::Utc::now().timestamp(),
vec![MessageContent::text(text)],
);
message.id = message_id.clone();
yield (Some(message), None);
}
} else if delta.get("type") == Some(&json!("input_json_delta")) {
@@ -568,11 +575,12 @@ where
let error = mcp_core::handler::ToolError::InvalidParameters(
format!("Could not parse tool arguments: {}", args)
);
let message = Message::new(
let mut message = Message::new(
Role::Assistant,
chrono::Utc::now().timestamp(),
vec![MessageContent::tool_request(tool_id, Err(error))],
);
message.id = message_id.clone();
yield (Some(message), None);
continue;
}
@@ -580,11 +588,12 @@ where
};
let tool_call = ToolCall::new(&name, parsed_args);
let message = Message::new(
let mut message = Message::new(
rmcp::model::Role::Assistant,
chrono::Utc::now().timestamp(),
vec![MessageContent::tool_request(tool_id, Ok(tool_call))],
);
message.id = message_id.clone();
yield (Some(message), None);
}
}