Frühere Beiträge dieser Reihe bereiten den Weg: Die Entwicklung von „JSON Schema“, „Function Calling“ und „MCP“ erklärt, warum es sie gibt; Der JSON-Datenfluss von Tool Calling zu MCP verfolgt, wohin sich Bytes bewegen; ob das JSON-Schema zum Standard-Agent-Vertrag wird, der die Ökosystemkonvergenz abdeckt. Dieser Artikel konzentriert sich auf eine praktische Frage: Warum „Tool Calling“ fast zwangsläufig vom „JSON-Schema“ abhängt und wie Parameter- und Typfehler klassifiziert und validiert werden.
Wenn ein Modell ein Werkzeug auswählt und Parameter ausfüllt, kann der Host nicht „auf Glück vertrauen“ – er muss vor der Ausführung „schnell ausfallen“ anhand desselben Schemas. Ein halluziniertes Argument kann Daten löschen, die falsche E-Mail senden oder die nächste Runde vergiften. Fazit: JSON Schema ist der einzige Parametervertrag, der von Modell-APIs, MCP und Host-Laufzeiten gleichermaßen verstanden wird; Validieren Sie nach dem Parsen und vor der Ausführung und geben Sie strukturierte Fehler zur Wiederholung zurück.
Warum Tool-Aufruf vom JSON-Schema abhängt
Tool Calling (gleicher Datenfluss wie Function Calling) bedeutet: Das Modell wählt ein Tool und gibt JSON-Argumente aus, die einem Vertrag entsprechen. Drei Parteien müssen sich einigen:
- Model APIs: OpenAI, Gemini, and Anthropic Tools APIs describe
parameterswith JSON Schema; some vendors also constrain decoding with Schema. - MCP: each Tool’s
inputSchemais JSON Schema; Hosts often pass it through or trim to a subset when mapping to model APIs. - Host-Programme: benötigen maschinenlesbare, versionierbare, CI-überprüfbare Verträge – ajv, Python jsonschema usw. schlagen das „JSON-Format in der Eingabeaufforderung“ um Größenordnungen.
Without Schema, hosts regex-parse or prompt-parse arguments—that breaks at Agent scale. Schema gives shape (which fields), types, and constraints (enum, minimum, pattern)—everything you need syntactically before calling HTTP/DB/MCP. Business rules (“does priority=high violate SLA?”) still need code; Schema blocks most hallucinations at the syntax layer.
User intent → model reads JSON Schema in tools[]
→ outputs tool_calls[].function.arguments (JSON string)
→ host JSON.parse + Schema validate
→ only then call MCP / HTTP / DB
Schema befindet sich an drei Stellen in der Anrufkette
| Bühne | Schemarolle | Typischer Fehler |
|---|---|---|
| Werkzeugregistrierung (Werkzeuge / MCP-Liste) | Teilt dem Modell mit, welche Tools vorhanden sind und welche Argumente sie benötigen | Ungültiges Schema, nicht übereinstimmende Entwürfe, irreführende Beschreibung |
| Modellausgabe (tool_calls.arguments) | Beschränkt den generierten Parameter JSON | Fehlende Pflichtfelder, falsche Typen, erfundene Felder |
| Tool-Ergebnis (Meldungen) | Optional: Ergebnisform vor Kontext einschränken | Nicht-JSON-Antwort, Felddrift |
Vs. Strukturierte Ausgabe: Structured Output constrains the final user-facing JSON reply; Tool Calling Schema constrains execution parameters. You can share one Schema source (Pydantic / Zod), but validate Tool arguments on every tool_calls before execute.
Parameterfehler: fehlende, zusätzliche, falsche Namen, falsche Syntax
Parameterfehler bedeuten, dass JSON möglicherweise analysiert (oder vor der Analyse fehlschlägt), aber gegen Schemaschlüssel und erforderliche Regeln verstößt:
| Fehler | Beispiel | Schema-Schlüsselwort | Schadensbegrenzung |
|---|---|---|---|
| Fehlt erforderlich | Schema needs title, args only have priority | required | Rückspeisefehler; Klarstellung in der Beschreibung erforderlich |
| Zusätzliche Felder | Model invents urgent: true | additionalProperties: false | OpenAI streng wird oft erzwungen; andernfalls abziehen oder aussortieren |
| Falsche Schreibweise der Tasten | titel vs title | properties keys | Konsistente Benennung; starke Beschreibungen |
| JSON-Syntax | Nachgestelltes Komma, einfache Anführungszeichen | (Parse-Ebene) | JSON.parse zuerst; Strukturierte Ausgabe reduziert Syntaxfehler |
| Leere Argumente | {} but Schema has required | required, minProperties | Zero-arg tools: explicit properties: {} |
// Schema fragment
{
"type": "object",
"properties": {
"ticket_id": { "type": "string", "description": "Ticket ID" },
"note": { "type": "string" }
},
"required": ["ticket_id"],
"additionalProperties": false
}
// Model output (missing ticket_id) → validation fails
{ "note": "Please handle ASAP" }
Typfehler: Nichtübereinstimmungen, enum, Verschachtelung, Zwang
Typfehler: Felder sind vorhanden, aber der JSON-Typ oder das JSON-Format der Werte verstößt gegen das Schema:
| Fehler | Beispiel | Gemeinsame Ursache |
|---|---|---|
| Primitiver Typ | limit: "10" should be number | Modelle verketten oft Zahlen |
| enum-Verstoß | priority: "urgent", enum is low/medium/high | In der Beschreibung wurden die zulässigen Werte nicht aufgeführt |
| Verschachteltes Array/Objekt | Expected tags: [], got string | Schema zu komplex für Modellteilmenge |
| Formatzeichenfolge | email fails format: email | Halluzinierte E-Mail- oder Datumsformate |
| oneOf/anyOf | Polymorphes Argument stimmt mit keinem Zweig überein | Überkomplexes Schema für die Ziel-API |
Coercion: some validators coerce "10" to 10. In production Agents, prefer coercion off—silent fixes hide systematic drift. If you must coerce, document it and lock behavior in CI samples.
// Type error example
Schema: { "limit": { "type": "integer", "minimum": 1, "maximum": 100 } }
Model: { "limit": " fifty " } // string, not numeric → fail
Validierung: Syntax, Argumente, strenger Modus
1. Validieren Sie das Schema selbst
Before registering tools, meta-validate parameters / inputSchema (draft 2020-12, etc.). JSON Toolbox in the browser works locally—don’t ship invalid Schema to model APIs.
2. Validieren Sie „Argumente“ anhand des Schemas
After JSON.parse(arguments), validate with the same Schema used at registration:
- JavaScript / TypeScript: ajv (mind draft and
strictoptions) - Python: jsonschema, Pydantic (
model_validateafter JSON parse) - Codegen: Zod / Pydantic → JSON Schema Einzelquelle
3. Hersteller strenger Modus
OpenAI strict: true requires a stricter subset (e.g. all objects with additionalProperties: false). That reduces model-side errors but does not replace host validation—dialects differ by vendor; see the Vertragsartikel.
4. Stichprobengesteuertes CI
Pro Tool: gültige Argumentbeispiele + absichtliche Fehler in CI. Schemaänderungen machen API-Änderungen kaputt – versionieren Sie sie.
End-to-End-Pipeline und Fehler-Feedback
Minimale Pipeline (erweitert den Artikel zum Datenfluss):
1. tools/list or static register → validate each inputSchema syntax
2. On tool_calls → JSON.parse(arguments)
├─ parse fail → tool message "JSON syntax error: …" → model retry
└─ parse ok → ajv/jsonschema validate
├─ fail → structured errors (missing, type, enum) → feed back
└─ ok → execute + optional business rules
3. Tool result → optional result Schema before append to messages
4. Log: schema version, raw arguments, error codes (no secrets)
Error feedback must be machine-readable: “ticket_id is required” beats “bad params, retry”. Many frameworks format validation errors as JSON in the tool role for self-correction.
Die Ausführung erfordert weiterhin Authentifizierung und Idempotenz – das Schema garantiert die Form, nicht „diese Ticket-ID gehört dem Benutzer“.
Praktische Empfehlungen
- Einzelne Schemaquelle: Pydantic / Zod → MCP inputSchema + OpenAI Tools.
- Beschreibungen sind Eingabeaufforderungen: Sie steuern enum und die erforderliche Konformität – überprüfen Sie Schemas wie API-Code.
- Einfaches Schema, strikte Validierung: oneOf/$ref-Tiefe auf Ziel-API-Teilmenge zuschneiden; scheitern schnell, keine stillen Korrekturen.
- Zwei obligatorische Prüfpunkte: nach tool_calls vor der Ausführung; nach MCP Rückkehr vor dem Kontext (wenn Ergebnisse das Modell füttern).
- Zuerst lokal validieren: Fügen Sie Schema + Beispielargumente vor der Produktion in die JSON Toolbox ein.
- Von „Strukturierter Ausgabe“ trennen: Benutzerantwortschema vs. Tools-Schema – nicht zusammenführen.
FAQ
Kann Tool Calling das JSON-Schema überspringen und natürliche Sprache für Parameter verwenden?
Prototypen ja; Produktionsnr. Natürliche Sprache kann nicht „fail-fast“ oder CI-Version sein; Modelle lassen Felder und Drifttypen weg. Mainstream-APIs und MCP verwenden standardmäßig Schema.
Sind Argumente eine Zeichenfolge oder ein Objekt?
Die meisten Chat Completions-APIs verwenden eine JSON-Zeichenfolge – hosten JSON.parse und validieren dann. Einige neuere APIs geben Objekte zurück; So oder so, validieren Sie mit demselben Schema.
Wie viele Wiederholungsversuche bei fehlgeschlagener Validierung?
Oft 1–3 mit strukturiertem Fehlerfeedback, dann klären oder eskalieren. Unendliche Wiederholungsversuche verbrennen Token und können zu Halluzinationen führen.
ajv vs. Pydantic?
Knoten-/TS-Hosts: ajv auf JSON Schema direkt. Python mit „Pydantic“-Modellen: Schema + model_validate zur Laufzeit generieren. Dieselbe Quelle wie das modellbezogene Schema.
Wenn der strenge Modus aktiviert ist, noch auf dem Host validieren?
Ja. streng reduziert Modellfehler; Schmutzige MCP-Ergebnisse, Schema-/Codeabweichungen oder Verstöße gegen Geschäftsregeln werden dadurch nicht gestoppt.
Wie validiere ich Schema und „Argumente“ lokal?
Fügen Sie Schema und Beispiel-JSON in die JSON Toolbox ein – browser-lokale Validierung, nichts hochgeladen.
Zusammenfassung und nächste Schritte
Tool Calling hängt vom JSON Schema ab, da es sich um den gemeinsamen, überprüfbaren Parametervertrag für Modelle, MCP und Hosts handelt. Parameterfehler (fehlend, überzählig, falscher Name, Syntax) und Typfehler (Typen, enum, Verschachtelung) klassifizieren; Vor der Ausführung abfangen und strukturierte Fehler zur Selbstkorrektur einspeisen.
Als nächstes: Wählen Sie ein echtes Tool (z. B. Ticketerstellung), schreiben Sie Schema + gültige/ungültige Beispiele, validieren Sie lokal in der JSON Toolbox und verbinden Sie dann den Agent. Reihenreihenfolge: Evolution → Datenfluss → Vertrag → dieser Artikel (Validierung).