MCPcopy Create free account
hub / github.com/atomicdotdev/atomic / anthropic_messages

Function anthropic_messages

atomic-repository/src/ai/tools.rs:415–461  ·  view source on GitHub ↗

Convert [`ToolMessage`] list into Anthropic's messages array.

(messages: &[ToolMessage])

Source from the content-addressed store, hash-verified

413
414/// Convert [`ToolMessage`] list into Anthropic's messages array.
415fn 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
463fn flush_pending_results(pending: &mut Vec<serde_json::Value>, out: &mut Vec<serde_json::Value>) {
464 if !pending.is_empty() {

Calls 3

flush_pending_resultsFunction · 0.85
pushMethod · 0.45
is_emptyMethod · 0.45