Tool Calling
Mehrere lokale Modelle unterstützen OpenAI-kompatibles Tool Calling, mit dem das Modell von Ihnen definierte Funktionen aufrufen kann.
Unterstützte Modelle
Abschnitt betitelt „Unterstützte Modelle“| Modell | Tool Calling |
|---|---|
gemma4-26b | Ja |
qwen3.6 | Ja |
qwen3.5-27b | Ja |
devstral-small-2 | Ja |
ministral-3-14b | Nein |
Beispiel
Abschnitt betitelt „Beispiel“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 jsonimport requestsfrom 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 brauchtresponse = 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ücksendenif 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."Mit PydanticAI
Abschnitt betitelt „Mit PydanticAI“PydanticAI übernimmt die Tool-Calling-Schleife automatisch — du markierst eine Funktion mit einem Decorator und das Framework erledigt den Rest:
import jsonimport requestsfrom pydantic_ai import Agentfrom pydantic_ai.models.openai import OpenAIChatModelfrom 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_plaindef 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."