Skip to content

Commit 96be4f8

Browse files
committed
fix: normalize anthropic tool results
1 parent f7ba8cc commit 96be4f8

7 files changed

Lines changed: 425 additions & 40 deletions

File tree

Cargo.lock

Lines changed: 24 additions & 24 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ resolver = "3"
3232
edition = "2024"
3333
license = "MIT"
3434
rust-version = "1.85"
35-
version = "0.1.14"
35+
version = "0.1.15"
3636

3737
[workspace.dependencies]
3838
ansi-to-tui = "7.0.0"

crates/core/src/history/mod.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -329,13 +329,15 @@ impl History {
329329
}
330330
}
331331
merge_consecutive_assistant_messages(&mut messages);
332+
devo_protocol::normalize_tool_result_messages(&mut messages);
332333
return messages;
333334
}
334335

335336
let mut items = normalize::filter_by_modality(&self.items, modalities);
336337
normalize::pair_tool_call_items(&mut items);
337338
let mut messages: Vec<RequestMessage> = items.into_iter().map(Into::into).collect();
338339
merge_consecutive_assistant_messages(&mut messages);
340+
devo_protocol::normalize_tool_result_messages(&mut messages);
339341
messages
340342
}
341343

@@ -709,7 +711,7 @@ mod tests {
709711
}
710712

711713
#[test]
712-
fn for_prompt_merges_consecutive_assistant_messages_only() {
714+
fn for_prompt_merges_assistant_tool_calls_and_groups_tool_results() {
713715
let mut h = History::new(test_context());
714716

715717
// User message
@@ -744,8 +746,8 @@ mod tests {
744746

745747
let msgs = h.for_prompt(&[InputModality::Text]);
746748

747-
// Should produce: user, assistant(merged), user, user.
748-
assert_eq!(msgs.len(), 4);
749+
// Should produce: user, assistant(merged), user(grouped tool results).
750+
assert_eq!(msgs.len(), 3);
749751

750752
// Second message: assistant with text + both tool calls merged
751753
assert_eq!(msgs[1].role, "assistant");
@@ -758,16 +760,14 @@ mod tests {
758760
matches!(&msgs[1].content[2], RequestContent::ToolUse { id, .. } if id == "call-2")
759761
);
760762

761-
// Third and fourth messages: user tool results stay distinct.
763+
// Third message: user tool results are grouped for provider adjacency.
762764
assert_eq!(msgs[2].role, "user");
763-
assert_eq!(msgs[2].content.len(), 1);
765+
assert_eq!(msgs[2].content.len(), 2);
764766
assert!(
765767
matches!(&msgs[2].content[0], RequestContent::ToolResult { tool_use_id, .. } if tool_use_id == "call-1")
766768
);
767-
assert_eq!(msgs[3].role, "user");
768-
assert_eq!(msgs[3].content.len(), 1);
769769
assert!(
770-
matches!(&msgs[3].content[0], RequestContent::ToolResult { tool_use_id, .. } if tool_use_id == "call-2")
770+
matches!(&msgs[2].content[1], RequestContent::ToolResult { tool_use_id, .. } if tool_use_id == "call-2")
771771
);
772772
}
773773

crates/protocol/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ mod permissions;
1212
pub mod protocol;
1313
mod provider_vendor;
1414
mod reference_search;
15+
mod request_normalize;
1516
mod request_user_input;
1617
mod response;
1718
mod role;
@@ -36,6 +37,7 @@ pub use permissions::*;
3637
pub use protocol::*;
3738
pub use provider_vendor::*;
3839
pub use reference_search::*;
40+
pub use request_normalize::*;
3941
pub use request_user_input::*;
4042
pub use response::*;
4143
pub use role::*;

0 commit comments

Comments
 (0)