En agent er en språkmodell som får lov til å gå i løkke: velge neste steg, bruke et verktøy, se resultatet og velge på nytt, helt til målet er nådd. Du gir målet. Den finner veien.
Det er ikke et nytt slags AI. Det er i hovedsak samme språkmodell, med verktøy og en løkke rundt, og med lov til å avgjøre selv hva som er neste steg.
I en chat stiller du ett spørsmål og får ett svar. Du styrer. I en agent beskriver du målet og modellen styrer. Den kan hente opplysninger, se at de ikke holder, hente flere og først da svare. Ingen har skrevet hvilke steg det blir på forhånd.
Akkurat dette er det som skiller en agent fra en arbeidsflyt. I en arbeidsflyt ligger stegene fast, og modellen fyller bare ut hvert av dem. I en agent velger modellen stegene. Ordet «agent» brukes ofte om begge deler, så spør alltid: hvem bestemmer neste steg?
En agent kan løse oppgaver som er for rotete til en fast plan, som å lete gjennom mange kilder eller rydde i data. Men hvert steg kan gå feil, og feil bygger på hverandre. Jo flere steg, jo større sjanse for at noe sklir. Hvert steg koster dessuten tokens, så en agent som går i ring blir dyr.
Hvor mye en agent får gjøre alene, er et valg, og det er ditt. Fire ting avgjør det: hvilke verktøy den har, hva den får gjøre uten å spørre, når den må spørre deg først, og når den må stoppe. En god regel er å begynne med lesetilgang og la den bare foreslå, og så gi den mer frihet etter hvert som du ser hvordan den oppfører seg.
Verktøy som kan deles mellom apper, finnes som MCP-tjenester. Og kunnskap om hvordan en bestemt jobb skal gjøres, kan pakkes som skills.
Et verktøykall alene er ikke en agent. Det som gjør det til en agent, er løkka rundt og grensene du setter på den. Under er en slik løkke med tak på antall steg, et budsjett i tokens og en logg i utskriften. Modellen er falsk: to funksjoner som svarer på forhånd, så du kan kjøre alt uten nøkkel og uten nettverk. Slik kaller du en ekte modell: se verktøy. En hel agent på 30 linjer finner du i En agent på 30 linjer.
MAKS_STEG = 5 # hardt tak: løkka stopper uansett hva modellen vil
BUDSJETT = 1000 # tokens vi tillater totalt i én kjøring
def hent_fakturaer(ar):
return f"412 rader for {ar}"
def sum_belop(rader):
return f"sum 1 284 500 kr over {rader} rader"
VERKTOY = {"hent_fakturaer": hent_fakturaer, "sum_belop": sum_belop}
def modell_normal(historikk):
"""Falsk modell: svarer på forhånd, men ser på siste resultat."""
sist = historikk[-1]["tekst"]
if sist.startswith("Mål"):
return {"verktoy": "hent_fakturaer", "args": {"ar": 2025}, "tokens": 150}
if sist.startswith("412"):
return {"verktoy": "sum_belop", "args": {"rader": 412}, "tokens": 150}
return {"svar": "Fakturaene for 2025 summerer seg til 1 284 500 kr.", "tokens": 80}
def modell_i_ring(tokens):
"""Falsk modell som ber om det samme igjen og igjen."""
return lambda historikk: {"verktoy": "hent_fakturaer", "args": {"ar": 2025}, "tokens": tokens}
def kjor_agent(modell, mal, maks_steg=MAKS_STEG, budsjett=BUDSJETT):
historikk = [{"rolle": "bruker", "tekst": "Mål: " + mal}]
brukt = 0
for steg in range(1, maks_steg + 1):
valg = modell(historikk)
brukt += valg["tokens"] # med en ekte modell: svar.usage.input_tokens + output_tokens
if brukt > budsjett: # sjekkes før verktøyet kjøres, ellers er det for sent å stoppe
print(f"steg {steg}: STOPP, {brukt} tokens er over budsjettet på {budsjett}")
return None
if "svar" in valg:
print(f"steg {steg}: ferdig, {brukt} tokens")
return valg["svar"]
resultat = VERKTOY[valg["verktoy"]](**valg["args"])
print(f"steg {steg}: {valg['verktoy']}({valg['args']}) -> {resultat} [{brukt} tokens]")
historikk.append({"rolle": "verktoy", "tekst": resultat})
print(f"STOPP: nådde {maks_steg} steg uten svar")
return None
print("--- Kjøring 1: den går som den skal")
print(kjor_agent(modell_normal, "Summer fakturaene for 2025"))
print("--- Kjøring 2: modellen løper i ring, og steg-taket stopper den")
kjor_agent(modell_i_ring(100), "Summer fakturaene for 2025")
print("--- Kjøring 3: samme feil, men dyre steg, og budsjettet stopper den først")
kjor_agent(modell_i_ring(400), "Summer fakturaene for 2025")Utskrift fra en kjøring:
--- Kjøring 1: den går som den skal
steg 1: hent_fakturaer({'ar': 2025}) -> 412 rader for 2025 [150 tokens]
steg 2: sum_belop({'rader': 412}) -> sum 1 284 500 kr over 412 rader [300 tokens]
steg 3: ferdig, 380 tokens
Fakturaene for 2025 summerer seg til 1 284 500 kr.
--- Kjøring 2: modellen løper i ring, og steg-taket stopper den
steg 1: hent_fakturaer({'ar': 2025}) -> 412 rader for 2025 [100 tokens]
steg 2: hent_fakturaer({'ar': 2025}) -> 412 rader for 2025 [200 tokens]
steg 3: hent_fakturaer({'ar': 2025}) -> 412 rader for 2025 [300 tokens]
steg 4: hent_fakturaer({'ar': 2025}) -> 412 rader for 2025 [400 tokens]
steg 5: hent_fakturaer({'ar': 2025}) -> 412 rader for 2025 [500 tokens]
STOPP: nådde 5 steg uten svar
--- Kjøring 3: samme feil, men dyre steg, og budsjettet stopper den først
steg 1: hent_fakturaer({'ar': 2025}) -> 412 rader for 2025 [400 tokens]
steg 2: hent_fakturaer({'ar': 2025}) -> 412 rader for 2025 [800 tokens]
steg 3: STOPP, 1200 tokens er over budsjettet på 1000Kjøring 2 og 3 er feilen du skal være redd for: modellen ber om det samme igjen og igjen. Steg-taket stopper den billige varianten, budsjettet den dyre. I en ekte løkke leser du tokens fra svar.usage i hvert svar. Budsjettet sjekkes rett etter at modellen har svart og før verktøyet kjøres, slik det også gjøres i den lengre agenten. Sjekker du først etterpå, kan ett dyrt verktøykall kjøres før du stopper, og det er for sent.
Kjørt her med Python 3.13 og bare standardbiblioteket, 8. oktober 2026. Utskriften er limt inn slik den kom. Modellen er falsk og viser løkka, ikke hva en ekte modell ville valgt, og fakturatallene er konstruerte. Ikke kjørt mot noe API.
Oppdatert oktober 2026. Figuren er kortet ned til to runder, og virkelige agenter går titalls. Det agenten skriver som «tenking», er en beskrivelse av valget, ikke nødvendigvis det som styrte det. Ordet agent brukes om alt fra faste arbeidsflyter til selvstendige systemer, og leverandørene definerer det litt forskjellig. Her betyr det et system der modellen selv avgjør neste steg.