Hoppa till innehållet
22/30Kapitel 22 av 30

Vad en AI-agent är: fem klassiska typer, två rivaliserande definitioner

Vakuumvärlden bryts fyra gånger, och varje brott ger en av fem klassiska agent-typer. Sedan gör ett tool 39 token till 420.

På den här sidan

Här är samma fråga, ställd två gånger till samma model, med samma vikter och greedy decoding. Den enda skillnaden är att det andra gången fanns ett tool i katalogen.

TEXT
no tools in the catalogue
  turn 1  prompt=  39  out=  8  finish=stop        TEXT "The capital of France is Paris."
  => model calls=1  prompt tokens=39  output=8  wall=974 ms

one tool in the catalogue: get_temperature(city)
  turn 1  prompt= 185  out= 20  finish=tool_calls  CALL get_temperature({"city": "Paris"})
          tool  get_temperature -> {"city":"Paris","celsius":11}
  turn 2  prompt= 235  out= 18  finish=stop        TEXT "The capital of France is Paris. It is
                                                        currently at 11 degrees Celsius."
  => model calls=2  prompt tokens=420  output=38  wall=6,685 ms

Ett call blev två. Trettionio input token blev 420, en faktor på 10,8. Under en sekund blev nästan sju. Och svaret fick med ett faktum som ingen hade bett om, från ett tool som modellen valde att anropa för en fråga som aldrig nämnde vädret.

Det andra systemet är vad större delen av branschen 2026 kallar en agent. Eller så är det inte det, beroende på vilken av de två mest lästa definitionerna du öppnar — och de två säger inte samma sak. Den ena är inte ens överens med sig själv.

Den oenigheten är det här kapitlet. Det är inte ett gräl om ord: de två definitionerna drar gränsen längs olika axlar, och den axel du väljer avgör vad du bygger och vad du faktureras för. Båda står på en äldre taxonomi, och det billigaste sättet att förtjäna den är att bygga världens sämsta agent.

Visa detaljer

Vad det här kapitlet behöver från de tidigare.

  • Kapitel 13 mätte vad ett enda call kostar i tid; det här kapitlet multiplicerar det med antalet turns.
  • Kapitel 15: prompt är modellens kompletta state, eftersom inget överlever ett call.
  • Kapitel 16: input token växer med konversationens kvadrat.
  • Kapitel 18: tool-katalogen och turen fram och tillbaka där modellen frågar och din kod kör.

Inga tensors här. Kapitlet är TypeScript, där Kapitel 14:s språkregel placerar det, och dess loop är den direkta förfadern till Kapitel 23:s.

Det äldsta exemplet i fältet är en dammsugare i en värld med två rutor, A och B, där varje ruta antingen är ren eller smutsig.1 Det lever kvar i varje lärobok eftersom det är den minsta värld där en agent kan ha rätt eller fel.

Perceptet är ett par — var jag är och om det är smutsigt här — och handlingarna är SUCK, LEFT och RIGHT. Hela programmet är en rad.

reflex.tsTS
type Percept = { dirty: boolean; where?: "A" | "B" };
type Action = "SUCK" | "LEFT" | "RIGHT";

const textbook = (p: Percept): Action =>
  p.dirty ? "SUCK" : p.where === "A" ? "RIGHT" : "LEFT";   

Kör det mot varje startkonfiguration i tvårutorsvärlden:

TEXT
A dirty, B dirty, start A    -> steps=3 clean=true
A clean, B dirty, start A    -> steps=2 clean=true
A dirty, B clean, start B    -> steps=2 clean=true

Det är en simple reflex agent: den agerar enbart på det aktuella perceptet, utan minne av något före det. Inte en leksakskategori — en termostat är en, och det är även ett enda call till en language model utan någon konversation kopplad.

Bryt den nu på samma sätt som verkligheten gör. En riktig dammsugarrobot har en smutssensor och en stötfångare, inte en ruta märkt A under mattan. Ta bort positionen ur perceptet och ändra inget annat:

reflex.tsTS
const dirtOnly = (p: Percept): Action => (p.dirty ? "SUCK" : "RIGHT");
TEXT
A dirty, B dirty, start A    -> steps=3   clean=true   still dirty=0
      t=0 at=A percept={dirty:true}  -> SUCK
      t=1 at=A percept={dirty:false} -> RIGHT
      t=2 at=B percept={dirty:true}  -> SUCK

A dirty, B clean, start B    -> steps=500 clean=false  still dirty=1
      t=0 at=B percept={dirty:false} -> RIGHT
      t=1 at=B percept={dirty:false} -> RIGHT
      t=2 at=B percept={dirty:false} -> RIGHT
      t=3 at=B percept={dirty:false} -> RIGHT

Samma program, två rutor. Från ett starttillstånd blir den klar på tre steg; från ett annat kör den in i högerväggen femhundra gånger och skulle fortsätta tills batteriet dog. Den kan inte uppfatta skillnaden mellan de två situationerna, så den kan inte agera olika i dem. Russell och Norvig anger det allmänna resultatet på en rad: oändliga loopar är ofta oundvikliga för simple reflex agents i delvis observerbara miljöer.1

Det finns en lösning som kostar en rad och inget minne, värd att mäta innan vi sträcker oss efter något smartare.

reflex.tsTS
let seed = 12345;
const rnd = () => ((seed = (seed * 1103515245 + 12345) & 0x7fffffff) / 0x7fffffff);

const coin = (p: Percept): Action => (p.dirty ? "SUCK" : rnd() < 0.5 ? "LEFT" : "RIGHT");  

Två tusen körningar av en helt smutsig korridor i tre storlekar, med en och samma seedade generator hela vägen:

rumgenomsnittliga stegmedianvärst av 2 000blev aldrig klar
24,04130
416,614810
868,7523060

Randomisering tar bort loopen helt. Den kostar också: åtta rum kräver femton drag om du vet vad du gör, och denna agent snittar 68,7 och tog en gång 306. Det är hela kapitlet i miniatyr. Varje förmåga vi lägger till köper korrekthet i ett fall som föregående agent inte kunde hantera, och tar betalt för den i en valuta du först måste namnge.

En agent uppfattar sin miljö genom sensorer och agerar genom aktuatorer. Agent-programmet är funktionen från percept till handlingar — varje listning ovan är en sådan. Perceptsekvensen är allt som har uppfattats hittills, och en simple reflex agent ignorerar allt utom det sista objektet.

Rationalitet är ordet som de flesta artiklar får fel, och när man får det rätt blir resten av kapitlet användbart. En agent är inte rationell eller irrationell i sig. Russell och Norvig definierar en rationell agent som en som, för varje möjlig perceptsekvens, väljer den handling som förväntas maximera dess prestationsmått, givet bevisen i den sekvensen och den inbyggda kunskap den har.1 Prestationsmåttet finns inte inuti agenten: det tillhör designern, och rationalitet definieras bara relativt till det.

Specifikationen skrivs traditionellt som fyra saker, PEAS: performance measure, environment, actuators, sensors.

dammsugarrobotenen support-agent i produktion
Performance measurerena rutor per batterienhetlösta ärenden, per dollar, utan eskalering
Environmentgolvet, smutsen, möblerna, mattanärendekön, din databas, kunden
Actuatorshjul, sugtool calls
Sensorssmutssensor, stötfångareanvändarens meddelande, tool-resultat

Lägg märke till vilken rad som sticker ut. Nästan varje team som bygger agents 2026 skriver ner E, A och S — tool-scheman, integrationerna, meddelandeformatet — eftersom koden inte kör utan dem. Nästan ingen skriver ner P. Utan det har ”vår agent gör bra ifrån sig” ingen betydelse som någon kan kontrollera, och ”rationell” kan inte tillämpas på systemet alls, bara på en demonstration. Kapitel 29 handlar om att göra P till ett tal, och det är därför det finns.

TEXT
    ┌───────────────────────── the environment ─────────────────────────┐
    │                                                                   │
    │   ┌──────────────────────── the agent ─────────────────────┐      │
    │   │                                                        │      │
 ───┼──►│  sensors  ──►  the agent program  ──►  actuators  ─────┼──────┼──►
percept │                                                        │    action
    │   └────────────────────────────────────────────────────────┘      │
    └───────────────────────────────────────────────────────────────────┘

              the performance measure lives out here, in the head of
              whoever built the thing, and the agent cannot change it

Uppgiftsmiljöer klassificeras dessutom längs sju axlar, varav fem avgör det mesta av svårigheten här: helt eller delvis observerbar, deterministisk eller inte, episodisk eller sekventiell, statisk eller dynamisk, känd eller okänd.1 En agent som pratar med riktiga tools över ett riktigt nätverk befinner sig i det svåra hörnet av alla fem — icke-deterministisk även vid temperatur noll (Kapitel 17), och, den underskattade, okänd, eftersom du inte har någon tillförlitlig modell av vad dina egna tools gör med världen. Därför behöver Kapitel 23:s loop felhantering mer än planering.

Riktiga golv är inte endimensionella, så lyft världen till en plan. Fyrkanter är väggar, asterisker är smuts, och roboten startar i mittkammaren:

TEXT
        col  0 1 2 3 4 5 6
      row 0  * . . # . . *
      row 1  . # . # . # .
      row 2  . # . S . # .        S = the robot starts here
      row 3  . # . # . # .
      row 4  * . . # . . *

Den uppenbara uppgraderingen är minne. Agenten håller en karta: varje ruta den har stått på och varje ruta där stötfångaren slog till. Dess regel är att gå in i en intilliggande ruta den inte har besökt — höger, sedan ner, sedan vänster, sedan upp — och backa när allt runt den är känt. Det här är en model-based reflex agent: den upprätthåller internt state från percepthistoriken, så att den kan agera utifrån det den inte kan se just nu.

Det är en verklig förbättring, och fortfarande inte tillräckligt:

TEXT
5,000 steps allowed -> steps=5,000  distinct squares visited=13/25  still dirty=2/4

Fem tusen drag, halva golvet aldrig sett. Kartan är korrekt och reglerna är korrekta. Det agenten inte kan göra är att använda kartan för att ta sig någonstans: dess regler svarar bara någonsin på ”vilken av mina fyra grannar ska jag kliva in i”, så när den får slut på obesökta rutor bredvid sig har den inget sätt att uttrycka tanken det finns en obesökt ruta åtta drag bort och jag skulle vilja stå på den. Den vet var den är. Den vet inte var den vill vara.

Ett mål, och sedan en anledning att föredra en väg framför en annan

Länk till avsnittet: Ett mål, och sedan en anledning att föredra en väg framför en annan

En goal-based agent håller, ovanpå sin modell av världen, en beskrivning av den situation den vill åstadkomma, och väljer handlingar genom att söka över sekvenser av dem tills den hittar en som slutar där. Mål gör handlingsval från en uppslagning till en sökning.

Målet är ”ingen smutsig ruta återstår”. Sökningen är en bredden-först-vandring till närmaste smutsiga ruta, och vägen den returnerar är planen.

TEXT
goal-based (fewest moves)      -> moves=27  battery=52  still dirty=0
      from 2,3 -> 4,6 via 5 moves:  2,3 2,4 3,4 4,4 4,5 4,6
      from 4,6 -> 0,6 via 4 moves:  4,6 3,6 2,6 1,6 0,6
      from 0,6 -> 4,0 via 10 moves: 0,6 0,5 0,4 1,4 2,4 2,3 2,2 3,2 4,2 4,1 4,0
      from 4,0 -> 0,0 via 4 moves:  4,0 3,0 2,0 1,0 0,0

Tjugosju drag, rent golv. Men titta på batterikolumnen och planens sista etapp. Kolumn 0 är mattbelagd: att korsa en mattbelagd ruta kostar sex batterienheter, en kaklad ruta en. Agenten gick hem uppför kolumn 0 eftersom det är fyra drag i stället för åtta, och de fyra mattbelagda dragen kostade 24 där omvägen på åtta drag skulle ha kostat 13.

Den kan inte göra annorlunda. Ett mål är ett binärt test: golvet är rent eller inte. Varje plan som slutar med ett rent golv uppfyller det lika mycket, så när flera lyckas har agenten inget att välja mellan. Att föredra en framgång framför en annan kräver ett tal över utfall, och det talet är en nyttofunktion. En agent som maximerar den är en utility-based agent.

Ändringen i koden är en term inne i sökningen. Bredden-först-sökning räknar drag; låt den räkna kostnad i stället och du har Dijkstras algoritm och en annan agent:

search.tsTS
const nd = dist.get(k)! + (byCost ? cell.cost : 1);   // <- the entire difference
TEXT
goal-based    (fewest moves)   -> moves=27  battery=52  still dirty=0
utility-based (cheapest route) -> moves=31  battery=41  still dirty=0
      from 4,0 -> 0,0 via 8 moves: 4,0 4,1 4,2 3,2 2,2 1,2 0,2 0,1 0,0

Fyra extra drag, elva färre batterienheter: tjugoen procent billigare. Samma mål, samma karta, samma kod utom en term. De två agents skiljer sig bara i vad de försöker vara bra på, och de tar olika vägar hem.

Det här är också första punkten där agenten behöver något den inte kan producera. Någon måste bestämma vad en batterienhet är värd relativt ett drag. Nytta är prestationsmåttet skrivet i en form som agenten kan räkna med, och att skriva det är designerns jobb. När folk säger att en agent ”optimerade fel sak” menar de nästan aldrig en bugg. De menar att den här raden skrevs slarvigt.

Låt nu smutsen komma tillbaka. Fyra rum blir smutsiga igen i fyra olika takter, och agenten får aldrig veta dem. Den besöker ett rum per tick och ser bara det rummet. Prestationsmåttet är rums-ticks som spenderats smutsiga över 4 000 ticks — lägre är bättre.

En learning agent, i lärobokens uppdelning, är någon av ovanstående plus tre delar: ett learning element som ändrar agenten, en critic som talar om hur agenten presterar mot en fast prestationsstandard, och en problem generator som föreslår handlingar värda att pröva för vad de skulle lära ut.1 Tre policys i samma miljö. Den första lär sig inte; den andra och tredje lär sig samma sak och använder det olika.

policysmutsiga rums-ticks över 4 000jämfört med patrullen
fast round-robin-patrull, inget lärande2 290
learner A: uppskatta varje rums smutstakt, gå sedan dit smuts är mest sannolik11 8205,2× sämre
learner B: samma uppskattningar, viktade efter hur länge sedan senaste besöket1 57631 % bättre

De dolda takterna var 0,35 för köket, 0,05 för hallen, 0,02 för arbetsrummet och 0,01 för vinden — och learner A hittade dem. Den identifierade korrekt köket som husets smutsigaste rum och gick sedan till köket varje tick resten av simuleringen medan de andra tre stod smutsiga för alltid. Den är fem gånger sämre än att inte lära alls, och den är inte trasig.

Lärdomen är densamma som i nyttoavsnittet. Learner A maximerade ”sannolikheten att rummet jag är på väg att besöka är smutsigt”. Prestationsmåttet var ”rums-ticks spenderade smutsiga”. Olika tal; det andra är vad critic poängsatte, och ingen berättade det för agenten. Learner B multiplicerar samma inlärda takt med tiden sedan senaste besöket — smutsen den förväntar sig att hitta snarare än chansen att hitta någon — och slår patrullen den startade från.

En implementeringsdetalj avgjorde resultatet. I den första versionen av learner B fick ett rum där ingen smuts hade dykt upp på tre besök en takt på exakt noll — och noll gånger vad som helst är noll, så det besöktes aldrig igen och uppskattningen kunde aldrig korrigeras. Att släta ut bråket, lyckade utfall plus ett över försök plus två, gjorde 11 895 till 1 576. ”Inte observerat än” och ”uppmätt och blev noll” är olika påståenden, och ett system som lagrar dem i samma fält fattar beslut det inte kan ångra.

TEXT
  1  simple reflex    percept ────────────────────────────────► rules ────► action
  2  model-based      percept ──► [state] ──────────────────► rules ────► action
  3  goal-based       percept ──► [state] ──► [goal] ──────► search ───► action
  4  utility-based    percept ──► [state] ──► [goal] ──► [U] ──► argmax ► action
  5  learning         all of the above, plus [critic] ──► changes the parts above

Var och en av de fem finns i produktion i dag under ett annat namn.

klassisk typvad den bär mellan perceptdess form 2026vad den inte kan göra
simple reflexingetett model call utan historik: en classifier, en extraction endpoint, en single-turn completionnågot som beror på föregående turn
model-based reflexinternt state byggt från percepthistorikenen chatt: transkriptet, omskickat i sin helhet vid varje callvälja var konversationen ska hamna
goal-basedstate plus en beskrivning av den önskade situationenen reason-and-act-loop med ett stoppvillkor2föredra en framgångsrik plan framför en annan
utility-basedstate, mål och ett tal över utfallevaluator–optimiser-loopar, och ranking av kandidatsvar efter ett skrivet kriterium (Kapitel 25)uppfinna kriteriet
learningallt detta, plus en critic och en problem generatorReflexion, som skriver sina egna lärdomar till en episodisk buffer i stället för att uppdatera vikter;3 bestående användarminne (Kapitel 24)välja standarden som critic poängsätter mot

Två rader är närmare än en analogi, på ett sätt som kostar pengar.

Chatten är en model-based reflex agent vars modell inte är intern. I läroboken är state en variabel inne i agent-programmet. I en chatt är det transkriptet: det lever på din sida, skickas om i sin helhet vid varje call och byggs om från noll inuti modellen varje gång. Det är Kapitel 16:s kvadratiska räkning, och det är samma objekt som läroboken ritade som en låda märkt ”state”. Här är skillnaden, mätt på en uppföljningsfråga med och utan de två meddelandena före den:

TEXT
with the transcript      prompt=67  "The current temperature in Lisbon, Portugal is 15°C."
without the transcript   prompt=29  "Lisbon is the capital of Portugal, not a city in Portugal."

Samma model, samma tre ord av användarinput, och den andra är korridorroboten som kör in i väggen. Det fanns inga tools i den körningen, så 15 är påhittat — men state är det som gör att uppföljningen betyder något alls. Du bygger om det varje gång och betalar 2,3× input token för det på en två-turn-konversation. Kapitel 16 mätte vad den multiplikatorn når vid turn fyrtio.

Reflexion är en learning agent som ändrar sin input snarare än sitt program. I lärobokens uppdelning modifierar learning element performance element. Reflexion lämnar vikterna ifred och skriver reflekterande text till en episodisk buffer som nästa försök läser.3 Learning element är en prompt, minnet en databasrad, performance element en frusen model — och diagrammet är lärobokens, oförändrat.

Och här är den ärliga gränsen för mappningen. De fem typerna klassificerar agent-programmet. År 2026 är det programmet delat på mitten: en del av det är din kod, en del av det finns i vikter du inte tränade. När en model på egen hand bestämmer sig för att anropa ett tool, ligger måltestet i ditt program eller i modellen? Taxonomin har inget svar, för när den skrevs fanns det ingen annanstans för det att vara — och just den frågan är exakt där de två moderna definitionerna går skilda vägar.

Definitionerna är argument om beteende, och mycket lättare att bedöma med en trace framför sig.

Loopen nedan skickar konversationen till en model; om svaret innehåller ett tool call kör den tool, lägger till resultatet och skickar hela saken igen. Den kör mot en lokal Qwen2.5-0.5B-Instruct bakom en OpenAI-formad endpoint på den här maskinen — sömmen från Kapitel 14, så loopen varken vet eller bryr sig om vad som finns bakom porten.

loop.tsTS
const BASE = process.env.LLM_BASE_URL ?? "http://127.0.0.1:8799/v1";

async function loop(question: string, maxTurns = 6) {
  const messages: Msg[] = [
    { role: "system", content: SYSTEM },
    { role: "user", content: question },
  ];

  for (let turn = 1; turn <= maxTurns; turn++) {
    const reply = await call(messages, TOOLS);
    const calls = reply.choices[0].message.tool_calls ?? [];
    messages.push(reply.choices[0].message);

    if (!calls.length) return messages;                      

    for (const c of calls) {
      const out = runTool(c.function.name, JSON.parse(c.function.arguments));
      messages.push({ role: "tool", name: c.function.name, content: out });
    }
  }
  throw new Error("turn cap reached");                       
}

Två rader bär hela idén, och båda är markerade; resten är bokföring. Alla tre beteenden syns i en körning. Fråga om något den kan göra själv, och modellen svarar. Fråga om något den inte kan, och den anropar:

TEXT
=== a question the model cannot answer, one tool available
  turn 1  prompt= 187  out= 21  finish=tool_calls  CALL get_temperature({"city": "Oslo"})
          tool  get_temperature -> {"city":"Oslo","celsius":4}
  turn 2  prompt= 238  out= 12  finish=stop        TEXT "The current temperature in Oslo is 4
                                                        degrees Celsius."
  => model calls=2  prompt tokens=425  output=33  wall=6,257 ms
  => stopped by: the model produced text instead of a call

Och den stannar — det tredje beteendet, och det lättaste att missa, eftersom det ser ut som att ingenting händer. Loopen slutar eftersom turn 2 kom tillbaka utan ett tool call. Ingen bestämde det; modellen gjorde det, genom att avge prosa. Termineringsvillkoret för detta program är tecknet på en frånvaro.

Två körningar till är värda utrymmet. När modellen ombeds jämföra två städer utfärdar den båda tool calls i en turn, får tillbaka båda mätningarna och får jämförelsen fel:

TEXT
  turn 1  prompt= 188  out= 43  finish=tool_calls  CALL get_temperature({"city": "Oslo"}),
                                                        get_temperature({"city": "Lisbon"})
          tool  get_temperature -> {"city":"Oslo","celsius":4}
          tool  get_temperature -> {"city":"Lisbon","celsius":19}
  turn 2  prompt= 284  out= 13  finish=stop        TEXT "Oslo is currently warmer than Lisbon
                                                        at 4°C."

Tools fungerade. Det parallella call fungerade. Loopen fungerade. Svaret är falskt, med båda korrekta siffrorna sittande i transkriptet. Att slå in en model i en loop får den inte att resonera; det ger en model som har fel förmågan att agera på att den har fel — vilket är Kapitel 30 i förväg, och halva Kapitel 29.

Radera nu det markerade return och låt loopen köra till sitt tak i stället. Samma fråga, samma model:

TEXT
  turn 1  prompt= 187  out= 21  CALL get_temperature({"city": "Oslo"})
  turn 2  prompt= 238  out= 12  TEXT "The current temperature in Oslo is 4 degrees Celsius."
  turn 3  prompt= 261  out= 30  TEXT "Could you please specify the exact location you're..."
  turn 4  prompt= 302  out= 14  TEXT "Sure! Could you tell me which city you're interested in?"
  turn 5  prompt= 327  out= 35  TEXT "I'm sorry, but I need more details to provide an..."
  turn 6  prompt= 373  out= 12  TEXT "Which city would you like to know the temperature for?"
  => model calls=6  prompt tokens=1,688  output=124  wall=25,261 ms  stopped by: turn cap

Fyra gånger input token, fyra gånger väggklockan, och ett slut där agenten har glömt vad den blev frågad och förhör användaren om en fråga de svarade på i turn ett. Det korrekta svaret stod på skärmen vid turn 2, och varje turn efter det gjorde transkriptet sämre.

Så en agent är inte en loop. Den är en loop plus en regel för att lämna den, och den här har exakt en sådan regel. Kapitel 23 hittar fem, och visar vad som går sönder när var och en saknas.

Båda citerade snarare än parafraserade, eftersom parafraserna är där förvirringen tillverkas.

Definition ett lägger gränsen vid vem som styr flödet. Anthropics Building effective agents namnger tvetydigheten och avgör den:

”At Anthropic, we categorize all these variations as agentic systems, but draw an important architectural distinction between workflows and agents: Workflows are systems where LLMs and tools are orchestrated through predefined code paths. Agents, on the other hand, are systems where LLMs dynamically direct their own processes and tool usage, maintaining control over how they accomplish tasks.”4

Testet är en fråga om din källkod: vem valde nästa steg? En switch i ditt program: workflow. Modellen: agent. Samma dokument säger att agents ”are typically just LLMs using tools based on environmental feedback in a loop” — vilket är exakt listningen ovan.

Definition två lägger gränsen vid oberoende från användaren. OpenAI:s A practical guide to building agents öppnar sin definitionssida så här:

”While conventional software enables users to streamline and automate workflows, agents are able to perform the same workflows on the users' behalf with a high degree of independence. Agents are systems that independently accomplish tasks on your behalf.”5

Två meningar senare, på samma sida, utesluter den:

”Applications that integrate LLMs but don't use them to control workflow execution—think simple chatbots, single-turn LLMs, or sentiment classifiers—are not agents.”5

Läs de citaten i ordning. De inledande meningarna drar linjen vid oberoende: går den här saken iväg och slutför jobbet utan mig? Den fjärde drar den vid kontroll över exekveringen, vilket är exakt Anthropics linje. Olika tester, samma sida, och det finns verkliga system där de säger emot varandra.

Under detta finns en vokabulärkrock, och den orsakar gräl i riktiga möten. I det första dokumentet är ett workflow en arkitektur, och det är det som inte är en agent. I det andra är ett workflow ”a sequence of steps that must be executed to meet the user's goal” — själva jobbet, som varje agent har ett av. ”Vi ersatte workflow med en agent” är sammanhängande enligt den första definitionen och nära meningslöst enligt den andra.

Tre system som finns 2026, under båda definitionerna.

Du beskriver en uppgift; den läser filer, kör testsviten, redigerar, kör dem igen och stannar när de passerar eller när den ger upp. Ingenting i din kod bestämmer att nästa steg är ”kör testerna” — modellen gör det, utifrån vad det senaste tool returnerade.

Definition ett: agent, eftersom modellen styr sin egen process. Definition två: agent, eftersom den självständigt slutför uppgiften, känner igen slutförande och lämnar tillbaka kontrollen. Båda dokumenten citerar denna form som sitt centrala exempel.

För varje nytt supportärende, tre model calls i en fast ordning — klassificera, extrahera fälten, utkast till svar — och sedan skickar den. Ingen model väljer någonsin vad som händer härnäst; en for-loop gör det. Den kör 03:00 och ingen tittar på.

Definition ett: inte en agent. Det är prompt chaining, listat vid namn som ett workflow. Definition två: båda svaren. Enligt öppningsmeningarna slutför den självständigt uppgifter för din räkning; enligt den fjärde använder den inte modellen för att styra workflow-exekvering, och utesluts. Det här systemet är anledningen till att du läser hela sidan i stället för pull quote.

En användar-turn. Modellen bestämmer själv om den ska söka innan den svarar, svarar sedan och väntar på dig.

Definition ett: agent, eftersom modellen dynamiskt styr sin egen tool usage baserat på resultat från miljön, vilket är det uttalade testet. Definition två: inte en agent, eftersom det inte finns något oberoende — en turn, sedan lämnar den tillbaka — och ”simple chatbots” finns uttryckligen i uteslutningslistan.

Två av de tre byter sida. Det är inte ett misslyckande för något av dokumenten. Det är en varning om en sorts möte där två personer som är helt överens om vad ett system gör ägnar en timme åt att vara oense om vad det ska kallas.

Definitionerna kolliderar eftersom var och en pressar ihop två oberoende frågor till ett ord. Separera dem och oenigheten blir en tabell, vilket är mer användbart än en dom.

din kod väljer nästa stegmodellen väljer nästa steg
en person tittar på varje turnett formulär med en model inuti: classifiers, extraction, single-turn completionen chatt med tools — definition ett säger agent, definition två säger nej
ingen tittar förrän den är klaren pipeline — definition tvås öppning säger agent, dess fjärde mening säger nejalla är överens: en agent

Varje definition ifrågasätter en annan cell, och de andra två är inte omstridda alls. Så när etiketten spelar roll — i ett kontrakt, en riskgranskning, en postmortem — är de två meningarna värda att skriva inte ”är det en agent” utan vem valde nästa steg och vem tittade på. Båda går att besvara genom att läsa kod, ingen kräver någons definition, och tillsammans bär de varje konsekvens som etiketten stod för.

Inget av detta är nytt. Wooldridge och Jennings kartlade de konkurrerande betydelserna av ”agent” 1995;6 Franklin och Graesser ställde detta kapitels fråga 1996, samlade de definitioner som cirkulerade och fann att de var oense.7 En survey från 2023 definierar fortfarande agents från första principer — ”artificial entities that sense their environment, make decisions, and take actions”8 — eftersom det inte fanns någon fastslagen modern definition att citera, och CoALA beskriver delar snarare än att dra en gräns alls.9 Trettio år av att avstå från att enas säger att ordet gör mer än ett jobb.

Nu konsekvensen som kommer före filosofin, nämligen räkningen.

Varje mätning här har samma form. Det enskilda call kostade 39 input token; samma fråga med ett tool kostade 420 över två calls; loopen utan sin stoppregel kostade 1 688 över sex. Tillväxten är värre än linjär, eftersom turn n bär med sig varje tidigare turn: prompt-kolumnen i den sex-turn-körningen lyder 187, 238, 261, 302, 327, 373. Kapitel 16 härledde att totalen är Θ(n2)\Theta(n^2) och anpassade kurvan på en riktig konversation. En agent gör varje uppgift till den konversationen, oavsett om en människa någonsin ser den.

Om de uppmätta token-antalet hade gått till en kommersiell endpoint till de priser Kapitel 16 läste den 6 september 2026 — $2.00 per miljon input token och $12.00 per miljon output — skulle de fyra körningarna prissättas så här:

körningmodel callsinput tokenoutput tokenkostnad
frågan, inga tools1398$0.000174
samma fråga, ett tool i katalogen242038$0.001296
en fråga som behöver tool242533$0.001246
samma, med stoppregeln borttagen61 688124$0.004864

Rad två jämfört med rad ett är talet att behålla. Sju och en halv gånger kostnaden, för ett sämre svar på en fråga som modellen redan kunde. Ingenting var felkonfigurerat: ett tool fanns, så modellen använde det — och Kapitel 18:s fynd, att det är priset på en katalog och inte dess träffsäkerhet som gör ont, får sin billigaste demonstration här med en katalog på ett.

Det är därför den användbara halvan av båda dokumenten är halvan om att inte bygga detta. Anthropics är rak: hitta den enklaste möjliga lösningen och lägg bara till komplexitet när det behövs, vilket ”might mean not building agentic systems at all”, eftersom agentic systems ”trade latency and cost for better task performance” och ”for many applications, optimizing single LLM calls with retrieval and in-context examples is usually enough”.4 Dess argument för en agent är smalt: öppna problem där du inte kan förutse antalet steg och inte kan hårdkoda en väg, i en miljö du litar på, med acceptans för ”higher costs, and the potential for compounding errors”.4 OpenAI:s skärm är spegelbilden — komplex bedömning, regeluppsättningar som inte går att underhålla, ostrukturerad data — och slutar på samma sätt: ”otherwise, a deterministic solution may suffice”.5

Så, i detta kapitels taxonomi: ett fast antal steg i en fast ordning är en pipeline, och att kalla den en agent gör den inte snabbare. Om antalet steg beror på vad du hittar på vägen vill du ha en loop — och du köper den flexibiliteten med N calls, ett kvadratiskt transkript och ett system som kan ha fel N gånger i stället för en.

Du har nu taxonomin, båda moderna definitionerna, de två axlarna som gör dem kompatibla, och en kort loop som svarar, anropar och stannar.

Den loopen har ett sätt att sluta: modellen slutar be om tools. Kapitel 23 bryter den med flit, sju gånger, och varje brott lägger till en bit. En omöjlig uppgift, och den tar aldrig slut — ett turn cap. En natts körning, och räkningen kommer — en budget i dollar. Ett tool som misslyckas — ett fel som modellen kan agera på. Samma call två gånger — en idempotency key. En fil den inte borde ha rört — ett human approval. En omstart halvvägs — session persistence. Ett tool som tar tre minuter i tystnad — progress och cancellation. Det som kommer ut är en harness, filen som resten av den här kursen kör på.

Kvar är frågan som detta kapitels omstridda diagonal egentligen handlade om. En loop som bestämmer sitt eget nästa steg måste bestämma när den ska stanna, och vi har just sett vad som händer när den inte kan: sex turns, fyra gånger räkningen, och en agent som förhör användaren om en fråga den redan hade besvarat. Att stanna är inte ett villkor. Hur många finns det, och vilket utlöses först?


Lilian Wengs LLM Powered Autonomous Agents (2023) är den mest kända uppdelningen av en language agent i planning, memory och tool use, och är rätt nästa läsning bredvid de två leverantörsdokumenten; dess tre komponenter är Kapitel 23, 24 och 18 i denna kurs, i den ordningen.

Varje tal i detta kapitel producerades på den här maskinen och inget uppskattades. Korridoren, planlösningen, de fyra agents som går den och de tre patrullpolicys är TypeScript-koden ovan, körd på Node 22; den randomiserade agentens siffror är medelvärden över 2 000 seedade körningar vardera och patrullsiffrorna är enskilda seedade körningar på 4 000 ticks. Modellspåren kommer från Qwen2.5-0.5B-Instruct i float32 på CPU med greedy decoding, serverad över loopback av en liten lokal Python-endpoint som laddar vikterna och talar OpenAI chat-completions-formen — sömmen igen, med tensors på Python-sidan och loopen på TypeScript-sidan — så token-antalet är den modellens tokenizer och latenserna är den maskinens. De enda siffrorna hämtade någon annanstans ifrån är de två priserna i kostnadstabellen, vilka är de priser Kapitel 16 läste från OpenAI:s prissida den 6 september 2026, tillämpade här på lokalt uppmätta token-antal som illustration och inte som en observerad faktura.

  1. Russell, S. och Norvig, P. Artificial Intelligence: A Modern Approach, 4:e upplagan, kapitel 2, Intelligent Agents. Källa till vakuumvärlden, PEAS-specifikationen, definitionen av rationalitet relativt ett prestationsmått, de sju egenskaperna hos uppgiftsmiljöer, de fem agent-typerna som används här, och observationen att oändliga loopar ofta är oundvikliga för simple reflex agents i delvis observerbara miljöer. Bokens companion code är aimacode/aima-python på GitHub (8 806 stars, senast pushad 30 juni 2026, läst 7 september 2026) — värd att namnge exakt för vad den är. Det är en boks tillhörande repository, inte en reference implementation som andra projekt bygger på på det sätt som karpathy/micrograd (17 412) och karpathy/nanoGPT (62 852) är. Därför citerar och länkar detta kapitel till den snarare än översätter den, och därför gäller inte ekosystemargumentet som höll Kapitel 5 i Python här: inget i detta kapitel rör en tensor, och loopen skriven ovan är den direkta förfadern till Kapitel 23:s. 2 3 4 5

  2. Yao, S., Zhao, J., Yu, D., Du, N., Shafran, I., Narasimhan, K. och Cao, Y. ReAct: Synergizing Reasoning and Acting in Language Models. arXiv:2210.03629 (2022). Den sammanflätning av reasoning traces och handlingar som den goal-based raden i mappningstabellen syftar på.

  3. Shinn, N., Cassano, F., Berman, E., Gopinath, A., Narasimhan, K. och Yao, S. Reflexion: Language Agents with Verbal Reinforcement Learning. arXiv:2303.11366 (2023). Artikelns egen sammanfattning av mekanismen är skälet till att den mappar till learning agent: den förstärker agents ”not by updating weights, but instead through linguistic feedback”, med agents som ”verbally reflect on task feedback signals, then maintain their own reflective text in an episodic memory buffer to induce better decision-making in subsequent trials”. 2

  4. Anthropic, Building effective agents, 19 december 2024, anthropic.com/engineering/building-effective-agents, läst 7 september 2026. Källa till workflow/agent-distinktionen citerad ovan, till paraplytermen ”agentic systems”, till beskrivningen av agents som ”typically just LLMs using tools based on environmental feedback in a loop”, till rådet att hitta den enklaste möjliga lösningen och att detta ”might mean not building agentic systems at all”, och till argumentet för och emot agents, inklusive ”higher costs, and the potential for compounding errors” och rekommendationen om stoppvillkor ”such as a maximum number of iterations” för att behålla kontrollen. 2 3

  5. OpenAI, A practical guide to building agents, sidorna 4 till 7, läst 7 september 2026. Källa till ”Agents are systems that independently accomplish tasks on your behalf”, till uteslutningen av ”simple chatbots, single-turn LLMs, or sentiment classifiers”, till definitionen av ett workflow som ”a sequence of steps that must be executed to meet the user's goal”, till de två kärnegenskaperna hos en agent, till de tre komponenterna — model, tools, instructions — och till screeningskriterierna för när man ska bygga en, som slutar i ”otherwise, a deterministic solution may suffice”. 2 3

  6. Wooldridge, M. och Jennings, N. R. Intelligent Agents: Theory and Practice. The Knowledge Engineering Review, volym 10, nummer 2 (1995). Översikten som delade fältets användning i en svag notion of agency — autonomi, social förmåga, reaktivitet, proaktivitet — och starkare betydelser som lånade mental vokabulär. Läst i dag är den ett protokoll över samma argument som detta kapitels två dokument fortfarande för.

  7. Franklin, S. och Graesser, A. Is It an Agent, or Just a Program? A Taxonomy for Autonomous Agents. Proceedings of the Third International Workshop on Agent Theories, Architectures, and Languages, Springer (1996). Citerad här för vad den är snarare än för ett citat: en översikt som samlade de definitioner av ”agent” som då cirkulerade, fann att de var oense och föreslog en taxonomi för att ersätta argumentet. Trettio år senare finns argumentet i bättre designad dokumentation och är i övrigt oförändrat.

  8. Xi, Z. et al. The Rise and Potential of Large Language Model Based Agents: A Survey. arXiv:2309.07864 (2023). Citerad ovan för sin inledande definition, ”AI agents are artificial entities that sense their environment, make decisions, and take actions”, vilket är läroboksdefinitionen upprepad 2023 eftersom det inte fanns någon överenskommen modern definition att citera.

  9. Sumers, T. R., Yao, S., Narasimhan, K. och Griffiths, T. L. Cognitive Architectures for Language Agents. arXiv:2309.02427 (2023). Organiserar language agents som ”modular memory components, a structured action space to interact with internal memory and external environments, and a generalized decision-making process to choose actions”, och placerar dem uttryckligen i historien om symbolisk AI och kognitionsvetenskap. Minnestaxonomin återkommer i Kapitel 24, där tabellen med tre stores är dess praktiska skugga.

Redo att låta LIA välja åt dig?

Bygg med alla AI-modeller på ett ställe – kom igång gratis i dag.