Zum Inhalt springen

Tool Calling

Mehrere lokale Modelle unterstützen OpenAI-kompatibles Tool Calling, mit dem das Modell von Ihnen definierte Funktionen aufrufen kann.

ModellTool Calling
gemma4-26bJa
qwen3.6Ja
qwen3.5-27bJa
devstral-small-2Ja
ministral-3-14bNein

Das Modell kann nicht selbst das Wetter prüfen — aber mit einem Tool kann es eine echte API aufrufen. Dieses Beispiel nutzt Open-Meteo (kostenlos, kein API-Key nötig):

import json
import requests
from openai import OpenAI
client = OpenAI(
base_url="https://maki.uni-mannheim.de/v1",
api_key="your-api-key",
)
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Aktuelles Wetter für eine Stadt abrufen",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Stadtname, z.B. 'Mannheim'",
}
},
"required": ["city"],
},
},
}
]
def get_weather(city: str) -> str:
"""Open-Meteo API aufrufen, um aktuelles Wetter abzufragen."""
geo = requests.get(
"https://geocoding-api.open-meteo.com/v1/search",
params={"name": city, "count": 1},
).json()
loc = geo["results"][0]
weather = requests.get(
"https://api.open-meteo.com/v1/forecast",
params={
"latitude": loc["latitude"],
"longitude": loc["longitude"],
"current": "temperature_2m,wind_speed_10m",
},
).json()["current"]
return json.dumps({
"city": loc["name"],
"temperature_c": weather["temperature_2m"],
"wind_speed_kmh": weather["wind_speed_10m"],
})
messages = [
{"role": "user", "content": "Wie ist das Wetter in Mannheim?"}
]
# Schritt 1: Das Modell entscheidet, dass es das Wetter-Tool braucht
response = client.chat.completions.create(
model="gemma4-26b",
messages=messages,
tools=tools,
)
message = response.choices[0].message
# Schritt 2: Tool-Aufruf ausführen und Ergebnis zurücksenden
if message.tool_calls:
call = message.tool_calls[0]
args = json.loads(call.function.arguments)
# Echte API aufrufen
result = get_weather(args["city"])
# Ergebnis an das Modell zurücksenden
messages.append(message)
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": result,
})
# Schritt 3: Das Modell nutzt das Ergebnis für die Antwort
final = client.chat.completions.create(
model="gemma4-26b",
messages=messages,
tools=tools,
)
print(final.choices[0].message.content)
# "In Mannheim sind es aktuell 18,3 °C bei 12,5 km/h Wind."

PydanticAI übernimmt die Tool-Calling-Schleife automatisch — du markierst eine Funktion mit einem Decorator und das Framework erledigt den Rest:

import json
import requests
from pydantic_ai import Agent
from pydantic_ai.models.openai import OpenAIChatModel
from pydantic_ai.providers.openai import OpenAIProvider
model = OpenAIChatModel(
"gemma4-26b",
provider=OpenAIProvider(
base_url="https://maki.uni-mannheim.de/v1",
api_key="your-api-key",
),
)
agent = Agent(model)
@agent.tool_plain
def get_weather(city: str) -> str:
"""Aktuelles Wetter für eine Stadt abrufen.
Args:
city: Stadtname, z.B. 'Mannheim'.
"""
geo = requests.get(
"https://geocoding-api.open-meteo.com/v1/search",
params={"name": city, "count": 1},
).json()
loc = geo["results"][0]
weather = requests.get(
"https://api.open-meteo.com/v1/forecast",
params={
"latitude": loc["latitude"],
"longitude": loc["longitude"],
"current": "temperature_2m,wind_speed_10m",
},
).json()["current"]
return json.dumps({
"city": loc["name"],
"temperature_c": weather["temperature_2m"],
"wind_speed_kmh": weather["wind_speed_10m"],
})
result = agent.run_sync("Wie ist das Wetter in Mannheim?")
print(result.output)
# "In Mannheim sind es aktuell 18,3 °C bei 12,5 km/h Wind."