E· Universitetagenter-verktyg· ca 60 min· utvecklande· verifierad 2026-09-20
Verktygsschema, validering och felhantering
Kunna definiera verktyg med JSON-schema och hantera ogiltiga anrop robust.
Förkunskaper
Intuition
Ett verktygsschema är ett kontrakt mellan modellen och din kod. Ju striktare kontraktet är, desto färre sätt finns det att bryta mot det.
Fyra saker som gör schemat bra:
enumi stället för fri sträng där värdemängden är känd — då kan modellen inte hitta på kategorier.- Gränser på tal och längder (
minimum,maxLength) — fångar orimliga anrop innan de körs. requiredochadditionalProperties: false— inga saknade eller påhittade fält.- Beskrivningar som modellen läser —
descriptionär inte dokumentation för människor, det är en del av prompten.
Modellen ser bara schemat. Ett fält som heter q utan beskrivning kommer att användas fel.
Kod
from typing import Literal
from pydantic import BaseModel, Field, ValidationError
import json
class SokArenden(BaseModel):
"""Sök ärenden i supportsystemet. Returnerar högst 50 träffar."""
status: Literal["oppen", "stangd", "vantar"] = Field(description="Ärendets aktuella status")
aldre_an_dagar: int | None = Field(default=None, ge=0, le=365,
description="Endast ärenden äldre än detta antal dagar")
fritext: str | None = Field(default=None, max_length=200,
description="Sökord i ärendets titel eller beskrivning")
model_config = {"extra": "forbid"} # additionalProperties: false
VERKTYG = {"sok_arenden": (SokArenden, sok_arenden_impl)}
def spec():
return [{"type": "function", "function": {
"name": namn,
"description": (modell.__doc__ or "").strip(),
"parameters": modell.model_json_schema()}}
for namn, (modell, _) in VERKTYG.items()]
def kor(namn: str, argument: str) -> dict:
if namn not in VERKTYG:
return {"error": f"okänt verktyg '{namn}'. Tillgängliga: {sorted(VERKTYG)}"}
schema, fn = VERKTYG[namn]
try:
args = schema.model_validate_json(argument)
except ValidationError as e:
fel = [{"fält": ".".join(str(x) for x in f["loc"]), "problem": f["msg"]} for f in e.errors()]
return {"error": "ogiltiga argument", "detaljer": fel} # strukturerat → modellen kan rätta
except json.JSONDecodeError as e:
return {"error": f"argumenten är inte giltig JSON: {e}"}
try:
return fn(args)
except Exception as e:
return {"error": f"verktyget misslyckades: {type(e).__name__}"} # läck aldrig stack trace
Felmeddelandet är en del av gränssnittet. «ogiltiga argument» hjälper ingen; {"fält": "aldre_an_dagar", "problem": "Input should be less than or equal to 365"} gör att modellen rättar sig i nästa varv. Skicka tillbaka felet som verktygsresultat i stället för att avbryta.
Behärskning innebär
- Definierar verktyg med JSON-schema
- Validerar argument och hanterar ogiltiga anrop
- Designar felmeddelanden modellen kan rätta sig efter
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- JSON Schema — fri läsning
- Anthropic — Tool use — dokumentation, fri läsning