1#![deny(missing_docs)]
2
3mod agent;
10mod backoff;
11mod client;
12mod error;
13mod json_schema;
14mod sse;
15mod types;
16
17pub use agent::{
18 Agent, Budget, FileSystem, IntermediateToolResult, Mount, MountHierarchy, Tool, ToolCallback,
19 ToolResult, ToolSearchFileSystem,
20};
21pub use client::Anthropic;
22pub use error::{Error, Result};
23pub use json_schema::JsonSchema;
24pub use types::*;
25
26pub fn push_or_merge_message(messages: &mut Vec<MessageParam>, to_push: MessageParam) {
31 if let Some(last) = messages.last_mut() {
32 if last.role != to_push.role {
33 messages.push(to_push);
34 } else {
35 merge_message_content(&mut last.content, to_push.content);
36 }
37 } else {
38 messages.push(to_push);
39 }
40}
41
42pub fn merge_message_content(existing: &mut MessageParamContent, new: MessageParamContent) {
47 match (&mut *existing, new) {
48 (MessageParamContent::Array(existing_blocks), MessageParamContent::Array(new_blocks)) => {
49 existing_blocks.extend(new_blocks);
50 }
51 (MessageParamContent::Array(existing_blocks), MessageParamContent::String(new_string)) => {
52 existing_blocks.push(ContentBlock::Text(crate::TextBlock::new(new_string)));
53 }
54 (MessageParamContent::String(existing_string), MessageParamContent::Array(new_blocks)) => {
55 let mut combined = vec![ContentBlock::Text(crate::TextBlock::new(
56 existing_string.clone(),
57 ))];
58 combined.extend(new_blocks);
59 *existing = MessageParamContent::Array(combined);
60 }
61 (MessageParamContent::String(existing_string), MessageParamContent::String(new_string)) => {
62 existing_string.push_str(&new_string);
63 }
64 }
65}