suppress json text tool calls a bit jankily

This commit is contained in:
Dhanji Prasanna
2025-09-27 14:34:54 +10:00
parent 016ee80554
commit 811c642b17

View File

@@ -1169,7 +1169,7 @@ The tool will execute immediately and you'll receive the result (success or erro
break; break;
} else { } else {
// No tool call detected, continue streaming normally // No tool call detected, continue streaming normally
// Filter out stop tokens from the streaming output // But first check if we need to filter JSON tool calls from display
let clean_content = chunk let clean_content = chunk
.content .content
.replace("<|im_end|>", "") .replace("<|im_end|>", "")
@@ -1178,17 +1178,23 @@ The tool will execute immediately and you'll receive the result (success or erro
.replace("<</SYS>>", ""); .replace("<</SYS>>", "");
if !clean_content.is_empty() { if !clean_content.is_empty() {
// Replace thinking indicator with response indicator on first content // Filter out JSON tool calls from display
if !response_started { let filtered_content = filter_json_tool_calls(&clean_content);
print!("\r🤖 "); // Clear thinking indicator and show response indicator
response_started = true; // If we have any content to display
} if !filtered_content.is_empty() {
// Replace thinking indicator with response indicator on first content
if !response_started {
print!("\r🤖 "); // Clear thinking indicator and show response indicator
response_started = true;
}
debug!("Printing clean content: '{}'", clean_content); debug!("Printing filtered content: '{}'", filtered_content);
print!("{}", clean_content); print!("{}", filtered_content);
let _ = io::stdout().flush(); // Force immediate output let _ = io::stdout().flush(); // Force immediate output
debug!("Flushed {} characters to stdout", clean_content.len()); debug!("Flushed {} characters to stdout", filtered_content.len());
current_response.push_str(&clean_content); current_response.push_str(&filtered_content);
}
} }
} }
@@ -1505,6 +1511,48 @@ The tool will execute immediately and you'll receive the result (success or erro
} }
} }
// Helper function to filter JSON tool calls from display content
fn filter_json_tool_calls(content: &str) -> String {
let mut filtered_content = String::new();
let mut in_json_tool_call = false;
for line in content.lines() {
let trimmed_line = line.trim_start();
// Check if this line starts with a JSON tool call pattern
if trimmed_line.starts_with(r#"{"tool":"#) ||
trimmed_line.starts_with(r#"{ "tool":"#) ||
trimmed_line.starts_with(r#"{"tool" :"#) ||
trimmed_line.starts_with(r#"{ "tool" :"#) {
// This is the start of a JSON tool call
if !in_json_tool_call {
// First line of JSON tool call - replace with indicator
if !filtered_content.is_empty() {
filtered_content.push('\n');
}
filtered_content.push_str("<<tool call detected>>");
in_json_tool_call = true;
}
// Skip this line and any subsequent lines that are part of the JSON
} else if in_json_tool_call {
// Check if this line ends the JSON tool call
if trimmed_line.ends_with('}') || trimmed_line.trim() == "}" {
// End of JSON tool call
in_json_tool_call = false;
}
// Skip this line (it's part of the JSON tool call)
} else {
// Regular content line - add it
if !filtered_content.is_empty() {
filtered_content.push('\n');
}
filtered_content.push_str(line);
}
}
filtered_content
}
// Helper function to properly escape shell commands // Helper function to properly escape shell commands
fn shell_escape_command(command: &str) -> String { fn shell_escape_command(command: &str) -> String {
// Simple approach: if the command contains file paths with spaces, // Simple approach: if the command contains file paths with spaces,