Et verktøy er en funksjon språkmodellen kan be om å få kjørt, som å søke, regne eller hente data. Modellen ber om det. Det er appen rundt som gjør det.
Det modellen sender til appen, er tekst. At den likevel kan sjekke været, lese en fil eller regne riktig, skyldes at noen har gitt den verktøy å be om.
Når modellen trenger noe den ikke har, skriver den en strukturert forespørsel: navnet på verktøyet og opplysningene det trenger. Appen leser forespørselen, kjører verktøyet og gir resultatet tilbake som tekst. Modellen leser det og skriver svaret.
Modellen kjører ingenting selv. Det er viktigere enn det høres ut, for det betyr at noen bestemmer hvilke verktøy som finnes og hva de får lov til.
Uten verktøy gjetter modellen fra det den har lært. Med verktøy kan den slå opp, regne og handle. Søk gir den ferske opplysninger. En kalkulator gir den riktig regning, også på store tall der den ellers kan gjøre feil. Tilgang til filer, kalender eller et regnskapssystem gir den dine egne data. Verktøy er det som gjør en agent mulig. Det som gjør den til en agent, er løkka: at modellen selv velger neste steg.
Tenk på en rådgiver bak en glassvegg. Hun kan snakke og skrive lapper, men ikke selv rekke etter mappene. Hun skriver «hent kundemappe 4711», en assistent henter den, og hun svarer ut fra innholdet.
Hvilke verktøy som er tilgjengelige, og hva de får gjøre, bestemmes av appen og av deg. Mange verktøy ber om godkjenning hver gang. Regelen «lese er trygt, skrive er farlig» er ikke hele sannheten, for å lese kan også være veien inn for angrep. Bedre er tre nivåer:
Modellen kan velge feil verktøy, fylle inn feil opplysninger eller misforstå resultatet. Det siste er verst når resultatet kommer fra et sted du ikke kontrollerer. Alt et verktøy gir tilbake, er tekst modellen leser, og står det en instruks i teksten, kan modellen følge den. Det kalles prompt injection. Derfor bør verktøy som leser fra åpne nettsider eller innkommende e-post behandles med mer varsomhet enn de som leser fra egne systemer. Ingen har en fullstendig løsning på dette i dag, og OWASP har det øverst på listen over risikoer for språkmodell-applikasjoner.
Skal flere apper kunne bruke de samme verktøyene, trenger de en felles standard. Den heter MCP.
Under er hele mekanismen med Anthropics Python-SDK: én verktøydefinisjon og løkka som kjører det modellen ber om. Funksjonen vaer er falsk, så du kan bytte den ut med et ekte oppslag. Den heter «vaer» og ikke «vær» fordi verktøynavn i API-et bare kan bestå av a–z, tall, understrek og bindestrek. Figuren over skriver «vær» for å være lesbar. Installer med pip install anthropic og sett nøkkelen i miljøvariabelen ANTHROPIC_API_KEY.
# pip install anthropic (leser nøkkelen fra miljøvariabelen ANTHROPIC_API_KEY)
import anthropic
client = anthropic.Anthropic()
MODELL = "claude-opus-5-5" # sjekket 8. oktober 2026. Til et værkall holder en billigere modell, se under.
def vaer(by: str) -> str:
# Falsk funksjon. Bytt ut med et ekte oppslag mot en værtjeneste.
return {"Ålesund": "7 °C, regn"}.get(by, f"Ukjent sted: {by}")
FUNKSJONER = {"vaer": vaer}
VERKTOY = [{
"name": "vaer", # uten æ: verktøynavn kan bare ha a-z, A-Z, tall, understrek og bindestrek
"description": "Gir værmeldingen for i morgen i en norsk by. Bruk den når brukeren spør om vær.",
"input_schema": {
"type": "object",
"properties": {"by": {"type": "string", "description": "Navnet på byen, for eksempel Ålesund"}},
"required": ["by"],
},
}]
meldinger = [{"role": "user", "content": "Hva blir været i Ålesund i morgen?"}]
while True:
svar = client.messages.create(
model=MODELL, max_tokens=16000, tools=VERKTOY, messages=meldinger, # tenkingen teller med i max_tokens
)
if svar.stop_reason != "tool_use":
break
meldinger.append({"role": "assistant", "content": svar.content}) # hele svaret, ikke bare teksten
resultater = []
for blokk in svar.content:
if blokk.type == "tool_use": # modellen ber om et verktøy
ut = FUNKSJONER[blokk.name](**blokk.input) # det er VI som kjører det
resultater.append({"type": "tool_result", "tool_use_id": blokk.id, "content": ut})
meldinger.append({"role": "user", "content": resultater})
print("".join(b.text for b in svar.content if b.type == "text")) # tom hvis modellen stoppet uten tekstTre ting å se etter. Vil modellen ha noe kjørt, er stop_reason lik tool_use, og svaret har en tool_use-blokk med verktøynavn og opplysninger. Du kjører funksjonen selv og sender resultatet tilbake som tool_result med samme tool_use_id. Og du legger hele svar.content tilbake i samtalen, ikke bare teksten. description er det modellen går ut fra når den velger verktøy, så skriv den som om du forklarer verktøyet til en kollega.
Modell-ID-en claude-opus-5-5 er lest i Anthropics dokumentasjon 8. oktober 2026, og ID-er eldes. For et værkall er Opus mer enn nok og dyrere enn det trenger å være, så bytt gjerne til claude-sonnet-5-5 eller claude-haiku-5-5 (begge i modelloversikten samme dag). max_tokens er satt høyt fordi Claude Opus 5.5 tenker som standard, og tenkingen teller med. Sjekk modelloversikten før du kopierer, og les mer om verktøy i dokumentasjonen. Vil du se løkka med tak på steg og budsjett, finner du den under agent.
Ikke kjørt mot API-et her. Test med din egen nøkkel. Koden er syntakssjekket med python -m py_compile, og løkka er kjørt mot en stand-in for SDK-en som svarer med ett verktøykall og deretter tekst: to kall, og resultatet kom tilbake med riktig tool_use_id. Kjørt på nytt med koden slik den står nå, 8. oktober 2026. Bruken er sjekket mot Anthropics dokumentasjon 8. oktober 2026.
Oppdatert oktober 2026. Leverandørene kaller det ulike ting, som tool use, function calling og verktøykall, men prinsippet er det samme. Om faren for at tekst i et verktøyresultat inneholder instruksjoner, se OWASP, «LLM01:2025 Prompt Injection».