tool call fixes
This commit is contained in:
@@ -4,7 +4,6 @@ use g3_execution::CodeExecutor;
|
|||||||
use g3_providers::{CompletionRequest, Message, MessageRole, ProviderRegistry};
|
use g3_providers::{CompletionRequest, Message, MessageRole, ProviderRegistry};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::path::Path;
|
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
use tracing::{debug, error, info, warn};
|
use tracing::{debug, error, info, warn};
|
||||||
@@ -53,9 +52,12 @@ impl StreamingToolParser {
|
|||||||
// Look for the start of a tool call pattern: {"tool":
|
// Look for the start of a tool call pattern: {"tool":
|
||||||
if !self.in_tool_call {
|
if !self.in_tool_call {
|
||||||
// Look for JSON tool call pattern - check both raw JSON and inside code blocks
|
// Look for JSON tool call pattern - check both raw JSON and inside code blocks
|
||||||
// Also handle malformed patterns like {"{""tool"":
|
// Also handle malformed patterns and whitespace variations
|
||||||
let patterns = [
|
let patterns = [
|
||||||
r#"{"tool":"#, // Normal pattern
|
r#"{"tool":"#, // Normal pattern
|
||||||
|
r#"{ "tool":"#, // Pattern with space after opening brace
|
||||||
|
r#"{"tool" :"#, // Pattern with space before colon
|
||||||
|
r#"{ "tool" :"#, // Pattern with spaces around tool
|
||||||
r#"{"{""tool"":"#, // Malformed pattern with extra brace and doubled quotes
|
r#"{"{""tool"":"#, // Malformed pattern with extra brace and doubled quotes
|
||||||
r#"{{""tool"":"#, // Alternative malformed pattern
|
r#"{{""tool"":"#, // Alternative malformed pattern
|
||||||
];
|
];
|
||||||
@@ -66,7 +68,7 @@ impl StreamingToolParser {
|
|||||||
|
|
||||||
// Check if this is inside a code block
|
// Check if this is inside a code block
|
||||||
let before_pos = &self.buffer[..pos];
|
let before_pos = &self.buffer[..pos];
|
||||||
let code_block_count = before_pos.matches("```").count();
|
let _code_block_count = before_pos.matches("```").count();
|
||||||
|
|
||||||
// Accept tool calls both inside and outside code blocks
|
// Accept tool calls both inside and outside code blocks
|
||||||
// The LLM might use either format despite our instructions
|
// The LLM might use either format despite our instructions
|
||||||
@@ -427,31 +429,28 @@ impl Agent {
|
|||||||
show_timing: bool,
|
show_timing: bool,
|
||||||
cancellation_token: CancellationToken,
|
cancellation_token: CancellationToken,
|
||||||
) -> Result<String> {
|
) -> Result<String> {
|
||||||
info!("Executing task: {}", description);
|
|
||||||
|
|
||||||
let _provider = self.providers.get(None)?;
|
let _provider = self.providers.get(None)?;
|
||||||
|
|
||||||
// Only add system message if this is the first interaction (empty conversation history)
|
// Only add system message if this is the first interaction (empty conversation history)
|
||||||
if self.context_window.conversation_history.is_empty() {
|
if self.context_window.conversation_history.is_empty() {
|
||||||
let system_prompt = format!(
|
let system_prompt = "You are G3, a general-purpose AI agent. Your goal is to analyze and solve problems by writing code.
|
||||||
"You are G3, a general-purpose AI agent. Your goal is to analyze and solve problems by writing code.
|
|
||||||
|
|
||||||
# Tool Call Format
|
# Tool Call Format
|
||||||
|
|
||||||
When you need to execute a tool, write ONLY the JSON tool call on a new line:
|
When you need to execute a tool, write ONLY the JSON tool call on a new line:
|
||||||
|
|
||||||
{{\"tool\": \"tool_name\", \"args\": {{\"param\": \"value\"}}}}
|
{\"tool\": \"tool_name\", \"args\": {\"param\": \"value\"}}
|
||||||
|
|
||||||
The tool will execute immediately and you'll receive the result (success or error) to continue with.
|
The tool will execute immediately and you'll receive the result (success or error) to continue with.
|
||||||
|
|
||||||
# Available Tools
|
# Available Tools
|
||||||
|
|
||||||
- **shell**: Execute shell commands
|
- **shell**: Execute shell commands
|
||||||
- Format: {{\"tool\": \"shell\", \"args\": {{\"command\": \"your_command_here\"}}}}
|
- Format: {\"tool\": \"shell\", \"args\": {\"command\": \"your_command_here\"}}
|
||||||
- Example: {{\"tool\": \"shell\", \"args\": {{\"command\": \"ls ~/Downloads\"}}}}
|
- Example: {\"tool\": \"shell\", \"args\": {\"command\": \"ls ~/Downloads\"}}
|
||||||
|
|
||||||
- **final_output**: Signal task completion with a detailed summary of work done in markdown format
|
- **final_output**: Signal task completion with a detailed summary of work done in markdown format
|
||||||
- Format: {{\"tool\": \"final_output\", \"args\": {{\"summary\": \"what_was_accomplished\"}}}}
|
- Format: {\"tool\": \"final_output\", \"args\": {\"summary\": \"what_was_accomplished\"}}
|
||||||
|
|
||||||
# Instructions
|
# Instructions
|
||||||
|
|
||||||
@@ -465,7 +464,7 @@ The tool will execute immediately and you'll receive the result (success or erro
|
|||||||
- Use Markdown formatting for all responses except tool calls.
|
- Use Markdown formatting for all responses except tool calls.
|
||||||
- Whenever taking actions, use the pronoun 'I'
|
- Whenever taking actions, use the pronoun 'I'
|
||||||
|
|
||||||
");
|
".to_string();
|
||||||
|
|
||||||
if show_prompt {
|
if show_prompt {
|
||||||
println!("🔍 System Prompt:");
|
println!("🔍 System Prompt:");
|
||||||
@@ -968,7 +967,7 @@ fn shell_escape_command(command: &str) -> String {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let cmd = parts[0];
|
let cmd = parts[0];
|
||||||
let args = &parts[1..];
|
let _args = &parts[1..];
|
||||||
|
|
||||||
// Commands that typically take file paths as arguments
|
// Commands that typically take file paths as arguments
|
||||||
let file_commands = [
|
let file_commands = [
|
||||||
|
|||||||
Reference in New Issue
Block a user