claudius/
lib.rs

1mod agent;
2mod backoff;
3mod client;
4mod error;
5mod json_schema;
6mod types;
7
8pub use agent::{
9    Agent, Budget, FileSystem, IntermediateToolResult, Mount, MountHierarchy, Tool, ToolCallback,
10    ToolResult, ToolSearchFileSystem,
11};
12pub use client::Anthropic;
13pub use error::{Error, Result};
14pub use json_schema::JsonSchema;
15pub use types::*;
16
17pub fn push_or_merge_message(messages: &mut Vec<MessageParam>, to_push: MessageParam) {
18    if let Some(last) = messages.last_mut() {
19        if last.role != to_push.role {
20            messages.push(to_push);
21        } else {
22            merge_message_content(&mut last.content, to_push.content);
23        }
24    } else {
25        messages.push(to_push);
26    }
27}
28
29pub fn merge_message_content(existing: &mut MessageParamContent, new: MessageParamContent) {
30    match (&mut *existing, new) {
31        (MessageParamContent::Array(existing_blocks), MessageParamContent::Array(new_blocks)) => {
32            existing_blocks.extend(new_blocks);
33        }
34        (MessageParamContent::Array(existing_blocks), MessageParamContent::String(new_string)) => {
35            existing_blocks.push(ContentBlock::Text(crate::TextBlock::new(new_string)));
36        }
37        (MessageParamContent::String(existing_string), MessageParamContent::Array(new_blocks)) => {
38            let mut combined = vec![ContentBlock::Text(crate::TextBlock::new(
39                existing_string.clone(),
40            ))];
41            combined.extend(new_blocks);
42            *existing = MessageParamContent::Array(combined);
43        }
44        (MessageParamContent::String(existing_string), MessageParamContent::String(new_string)) => {
45            existing_string.push_str(&new_string);
46        }
47    }
48}