LLMs können mehr als Text generieren — mit Tool Calling führen sie Aktionen aus, und mit Structured Output liefern sie typsichere, maschinenlesbare Daten. Beides zusammen macht aus einem Chatbot eine vollwertige Anwendung.
Das LLM entscheidet basierend auf der Nutzeranfrage, welches Tool (Funktion) aufgerufen werden soll, und generiert die passenden Parameter. Die eigentliche Ausführung passiert in Ihrem Code.
import { tool } from 'ai'
import { z } from 'zod'
const weatherTool = tool({
description: 'Ruft das aktuelle Wetter für eine Stadt ab',
parameters: z.object({
city: z.string().describe('Der Name der Stadt'),
unit: z.enum(['celsius', 'fahrenheit']).default('celsius'),
}),
execute: async ({ city, unit }) => {
const data = await fetchWeatherAPI(city, unit)
return { temperature: data.temp, condition: data.condition }
},
})
import { streamText } from 'ai'
import { openai } from '@ai-sdk/openai'
export async function POST(req: Request) {
const { messages } = await req.json()
const result = streamText({
model: openai('gpt-4.1'),
messages,
tools: {
getWeather: weatherTool,
searchProducts: productSearchTool,
createOrder: orderTool,
},
})
return result.toDataStreamResponse()
}
Das LLM entscheidet selbst, welches Tool für die Anfrage relevant ist:
getWeathersearchProductscreateOrderFür komplexe Aufgaben ruft das LLM mehrere Tools nacheinander auf:
const result = streamText({
model: openai('gpt-4.1'),
messages,
tools: { getWeather, searchHotels, bookHotel },
maxSteps: 5, // Erlaubt bis zu 5 Tool-Aufrufe
onStepFinish: ({ stepType, toolResults }) => {
console.log(`Step: ${stepType}`, toolResults)
},
})
Beispiel-Ablauf:
getWeather({ city: 'München' }) → "15°C, sonnig"searchHotels({ city: 'München', dates: '...' }) → 5 HotelsbookHotel({ hotelId: '...', dates: '...' }) → BuchungsbestätigungStatt unstrukturierten Text zu generieren, liefert generateObject Zod-validierte Objekte:
import { generateObject } from 'ai'
import { z } from 'zod'
const { object } = await generateObject({
model: openai('gpt-4.1'),
schema: z.object({
title: z.string(),
summary: z.string().max(200),
tags: z.array(z.string()).max(5),
sentiment: z.enum(['positive', 'neutral', 'negative']),
confidence: z.number().min(0).max(1),
}),
prompt: 'Analysiere diesen Kundenkommentar: "Das Produkt ist fantastisch!"',
})
// object ist typsicher: { title: string, summary: string, ... }
Für große Objekte oder progressive UIs:
import { streamObject } from 'ai'
const result = streamObject({
model: openai('gpt-4.1'),
schema: productAnalysisSchema,
prompt: 'Analysiere die Top-5 Produkte...',
})
for await (const partialObject of result.partialObjectStream) {
// UI progressiv aktualisieren
updateUI(partialObject)
}
Das AI SDK + Zod ermöglicht vollständige Typsicherheit von der Schemadefinition bis zur UI:
typeof schema._type → TypeScript-Type| Modus | Beschreibung | Ideal für |
|---|---|---|
| json | Vollständiges JSON-Objekt | Komplexe Analysen, Datenextraktion |
| tool | Als Tool-Call-Parameter | Integration in Tool-Workflows |
Best Practice: Nutzen Sie
generateObjectstattgenerateText+ manuelles JSON-Parsing. Das AI SDK garantiert schema-konforme Ausgaben und wirft typesafe Errors bei Validierungsfehlern.