Convert [`ToolMessage`] list into Anthropic's messages array.
(messages: &[ToolMessage])
| 413 | |
| 414 | /// Convert [`ToolMessage`] list into Anthropic's messages array. |
| 415 | fn anthropic_messages(messages: &[ToolMessage]) -> Vec<serde_json::Value> { |
| 416 | let mut out = Vec::new(); |
| 417 | // Collect consecutive ToolResult messages into a single "user" turn. |
| 418 | let mut pending_results: Vec<serde_json::Value> = Vec::new(); |
| 419 | |
| 420 | for msg in messages { |
| 421 | match msg { |
| 422 | ToolMessage::System { .. } => { /* handled separately */ } |
| 423 | ToolMessage::User { content } => { |
| 424 | flush_pending_results(&mut pending_results, &mut out); |
| 425 | out.push(json!({ "role": "user", "content": content })); |
| 426 | } |
| 427 | ToolMessage::Assistant { |
| 428 | content, |
| 429 | tool_calls, |
| 430 | } => { |
| 431 | flush_pending_results(&mut pending_results, &mut out); |
| 432 | let mut blocks: Vec<serde_json::Value> = Vec::new(); |
| 433 | if !content.is_empty() { |
| 434 | blocks.push(json!({ "type": "text", "text": content })); |
| 435 | } |
| 436 | for tc in tool_calls { |
| 437 | blocks.push(json!({ |
| 438 | "type": "tool_use", |
| 439 | "id": tc.id, |
| 440 | "name": tc.name, |
| 441 | "input": tc.arguments, |
| 442 | })); |
| 443 | } |
| 444 | out.push(json!({ "role": "assistant", "content": blocks })); |
| 445 | } |
| 446 | ToolMessage::ToolResult { |
| 447 | tool_call_id, |
| 448 | content, |
| 449 | .. |
| 450 | } => { |
| 451 | pending_results.push(json!({ |
| 452 | "type": "tool_result", |
| 453 | "tool_use_id": tool_call_id, |
| 454 | "content": content, |
| 455 | })); |
| 456 | } |
| 457 | } |
| 458 | } |
| 459 | flush_pending_results(&mut pending_results, &mut out); |
| 460 | out |
| 461 | } |
| 462 | |
| 463 | fn flush_pending_results(pending: &mut Vec<serde_json::Value>, out: &mut Vec<serde_json::Value>) { |
| 464 | if !pending.is_empty() { |