Ce face Tool calling (apelarea uneltelor) în Ollama
Tool calling (function calling) permite unui model să invoce unelte și să folosească rezultatele în răspuns. Trimiți în /api/chat câmpul tools, o listă de funcții descrise cu type: function, nume, descriere și o schemă JSON pentru parametri. Dacă modelul decide să folosească o unealtă, răspunsul conține message.tool_calls, cu numele funcției și argumentele.
Aplicația ta execută funcția și adaugă în messages mesajul asistentului cu tool_calls, apoi un mesaj cu role: tool, tool_name și rezultatul în content. A doua cerere produce răspunsul final. Documentația mai descrie apeluri paralele, bucle de agent cu mai multe ture și tool calling cu streaming.
Funcționează doar cu modele care suportă unelte (lista: ollama.com/search?c=tool). SDK-ul Python acceptă direct funcții Python ca unelte, iar /v1/chat/completions acceptă tools pentru clienții OpenAI (fără tool_choice).
Sintaxă și opțiuni
| Opțiune / Parametru | Descriere |
|---|---|
tools |
Lista uneltelor, în cerere. |
message.tool_calls |
Apelurile cerute de model, în răspuns (function.name, function.arguments). |
role: tool |
Rolul mesajului cu rezultatul uneltei. |
tool_name |
Numele uneltei al cărei rezultat îl trimiți. |
Exemple practice
Exemplul 1: Cererea cu o unealtă
curl -s http://localhost:11434/api/chat -H "Content-Type: application/json" -d '{
"model": "qwen3",
"messages": [{"role": "user", "content": "What is the temperature in New York?"}],
"stream": false,
"tools": [{
"type": "function",
"function": {
"name": "get_temperature",
"description": "Get the current temperature for a city",
"parameters": {
"type": "object",
"required": ["city"],
"properties": {"city": {"type": "string", "description": "The name of the city"}}
}
}
}]
}'
Exemplul 2: Trimiterea rezultatului înapoi
curl -s http://localhost:11434/api/chat -H "Content-Type: application/json" -d '{
"model": "qwen3",
"messages": [
{"role": "user", "content": "What is the temperature in New York?"},
{"role": "assistant", "tool_calls": [{"type": "function", "function": {"index": 0, "name": "get_temperature", "arguments": {"city": "New York"}}}]},
{"role": "tool", "tool_name": "get_temperature", "content": "22°C"}
],
"stream": false
}'
Exemplul 3: Cu SDK-ul Python (funcția ca unealtă)
from ollama import chat
def get_temperature(city: str) -> str:
"""Get the current temperature for a city
Args:
city: The name of the city
"""
return {"New York": "22°C"}.get(city, "Unknown")
messages = [{"role": "user", "content": "What is the temperature in New York?"}]
response = chat(model="qwen3", messages=messages, tools=[get_temperature])
messages.append(response.message)
if response.message.tool_calls:
call = response.message.tool_calls[0]
result = get_temperature(**call.function.arguments)
messages.append({"role": "tool", "tool_name": call.function.name, "content": str(result)})
final = chat(model="qwen3", messages=messages, tools=[get_temperature])
print(final.message.content)
Greșeli frecvente și bune practici
- Trimiți rezultatul uneltei fără mesajul asistentului care conține
tool_calls. Modelul are nevoie de ambele în istoric. - Iei doar primul apel când modelul cere mai multe. Documentația spune că varianta cu primul apel este recomandată doar pentru modele care întorc un singur apel.
- Folosești un model fără suport pentru unelte. Alege unul din lista de modele cu unelte de pe ollama.com.