🔧 Fix tool calling + capability awareness
Three fixes: 1. OllamaProvider now sends tools[] in native /api/chat requests 2. OllamaProvider parses tool_calls from response (OpenAI-compatible format with function.name, function.arguments) 3. System prompt now lists available tools so LLM knows it can use bash, curl, read/write files — stops saying "I cannot do that"
This commit is contained in:
@@ -154,7 +154,7 @@ impl Provider for OllamaProvider {
|
||||
})
|
||||
.collect();
|
||||
|
||||
let body = serde_json::json!({
|
||||
let mut body = serde_json::json!({
|
||||
"model": self.model,
|
||||
"messages": messages,
|
||||
"stream": false,
|
||||
@@ -163,6 +163,11 @@ impl Provider for OllamaProvider {
|
||||
}
|
||||
});
|
||||
|
||||
// Add tools if present (for function calling)
|
||||
if !context.tools.is_empty() {
|
||||
body["tools"] = serde_json::to_value(&context.tools).unwrap_or_default();
|
||||
}
|
||||
|
||||
let url = format!("{}/api/chat", self.normalized_base_url());
|
||||
let mut request = self
|
||||
.client
|
||||
@@ -192,9 +197,21 @@ impl Provider for OllamaProvider {
|
||||
.to_string();
|
||||
let finish_reason = data["done_reason"].as_str().unwrap_or("stop").to_string();
|
||||
|
||||
// Parse tool calls from response (qwen3.5 returns OpenAI-compatible format)
|
||||
let tool_calls = data["message"]["tool_calls"].as_array().map(|calls| {
|
||||
calls.iter().map(|tc| {
|
||||
let func = &tc["function"];
|
||||
gyandoot_core::ToolCall {
|
||||
id: tc["id"].as_str().unwrap_or_default().to_string(),
|
||||
name: func["name"].as_str().unwrap_or_default().to_string(),
|
||||
arguments: func["arguments"].clone(),
|
||||
}
|
||||
}).collect()
|
||||
});
|
||||
|
||||
Ok(ProviderResponse {
|
||||
content,
|
||||
tool_calls: None,
|
||||
tool_calls,
|
||||
finish_reason,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user