Den kompletta guiden till att skriva systemprompter för agenter — LĂ€rdomar frĂ„n reverse engineering av Claude Code

Jag dekompilerade Claude Codes systemprompt, studerade DeepAgents kÀllkod och byggde min egen AI-agent frÄn grunden. De flesta prompt-guider Àr bara fluff.

Feng Liu
Feng Liu
20 mars 2026·24 min lÀsning
Den kompletta guiden till att skriva systemprompter för agenter — LĂ€rdomar frĂ„n reverse engineering av Claude Code

Det pÄgÄr en massillusion inom AI just nu.

Varje tutorial sĂ€ger Ă„t dig att skriva system-prompts som om du kastade en trollformel — hitta bara rĂ€tt ramsa sĂ„ kommer modellen att lyda. "Du Ă€r en EXTREMT BEGÅVAD senior utvecklare med 20 Ă„rs erfarenhet..." LĂ„ter det bekant?

Jag har tillbringat de senaste mÄnaderna med att bygga VibeCom, en AI-rÄdgivare för startups som kör djup marknadsresearch och genererar VC-klassad analys. LÀngs vÀgen har jag reverse-engineerat Claude Codes system-prompt, plöjt igenom DeepAgents middleware-kÀllkod och brÀnt fler API-krediter Àn jag vill erkÀnna. Den största lÀxan? Det mesta folk tror spelar roll nÀr det gÀller system-prompts gör faktiskt inte det. Och de saker som faktiskt spelar roll Àr det nÀstan ingen som pratar om.

Det hĂ€r inlĂ€gget Ă€r den kompletta spelboken — inte en 5-minuters översikt, utan allt jag önskar att nĂ„gon hade berĂ€ttat för mig innan jag började. HĂ€mta en kaffe.


1. Designfilosofi: Lita pÄ modellen

"En agent Ă€r en modell. Inte ett ramverk. Inte en prompt-kedja." — shareAI-lab/learn-claude-code

Den hĂ€r insikten förĂ€ndrade allt för mig. LLM:en vet redan hur man resonerar, planerar och exekverar. Din system-prompt lĂ€r den inte att tĂ€nka — den sĂ€tter upp miljön som den ska arbeta i.

TÀnk pÄ det som att anstÀlla en senior utvecklare. Du ger dem inte en checklista pÄ 20 steg för varje uppgift. Du sÀger: det hÀr Àr vilka vi Àr, hÀr Àr grÀnserna, sÄ hÀr ser ett bra resultat ut. Sedan kliver du ur vÀgen.

Din system-prompt har exakt fyra jobb:

  • BerĂ€tta vem den Ă€r — roll och identitet
  • BerĂ€tta var vĂ€ggarna finns — sĂ€kerhetsbegrĂ€nsningar
  • BerĂ€tta hur bra ser ut — kvalitetsstandarder
  • Ge den verktyg — kapabiliteter och kunskap

Det Àr allt. Allt annat Àr brus.

"Harness"-tÀnket

Harness = Tools + Knowledge + Observation + Action Interfaces + Permissions

Din system-prompt Ă€r instruktionsboken för denna "harness" (sele/arbetsmiljö). Du designar inte en stel pipeline — du designar en miljö dĂ€r modellen kan göra sitt bĂ€sta arbete autonomt.

Skriv inte din system-prompt som ett flödesschema. Modellen kommer sjÀlv att bestÀmma exekveringsordningen.


2. Prompt-struktur och sektionsordning

Den rekommenderade strukturen (Reverse-engineerad frÄn Claude Code v2.0.14)

┌─────────────────────────────────────────────┐
│ 1. Identity                                  │  ← LĂ€s först, förankrar beteende
│ 2. Security & Safety                         │  ← VIKTIGA markörer, okrĂ€nkbara
│ 3. Tone & Style                              │  ← Kontrollerar utdataformat
│ 4. Core Workflow                             │  ← Hur arbetet ska utföras
│ 5. Tool Usage Policy                         │  ← Prioriteringar för verktygsval
│ 6. Domain Knowledge                          │  ← Vid behov, laddas inte i förvĂ€g
│ 7. Environment Info                          │  ← Runtime-kontext, injiceras dynamiskt
│ 8. Reminders                                 │  ← Upprepa kritiska regler
├──────────────────────────────────────────────
│ [Tool Definitions — system-injected]         │  ← Ej redigerbara, oftast vĂ€ldigt lĂ„nga
├──────────────────────────────────────────────
│ [User Message]                               │
└─────────────────────────────────────────────┘

Varför den hÀr ordningen spelar roll

LLM:er har en U-formad uppmĂ€rksamhetskurva — de lĂ€gger mest mĂ€rke till början och slutet av din prompt, och tappar fokus i mitten. Detta Ă€r "Lost in the Middle"-effekten, och den Ă€r vĂ€ldokumenterad.

  • Identitet + SĂ€kerhet i toppen: Modellen etablerar roll och grĂ€nser först (primacy-effekten)
  • KĂ€rnflöde (Core Workflow) i övre mitten: Din viktigaste sektion — hur agenten utför sitt arbete
  • Verktygsdefinitioner injiceras av systemet efter din prompt: Claude Codes verktygsdefinitioner slukar ~11 438 tokens. Detta innebĂ€r att ditt anpassade innehĂ„ll faktiskt hamnar nĂ€rmare början Ă€n du kanske tror — vilket hjĂ€lper följsamheten
  • PĂ„minnelser i botten: Utnyttja "recency bias" (nĂ€rhetseffekten) för att förstĂ€rka kritiska regler

3. Att skriva varje sektion

3.1 Identitet — Vem Ă€r den hĂ€r agenten?

MÄl: Förankra modellens roll pÄ 1-3 meningar.

You are Claude Code, Anthropic's official CLI for Claude.
You are an interactive agent that helps users with software engineering tasks.

Riktlinjer:

  • HĂ„ll det kortfattat — max 1-3 meningar
  • Namnge rollen explicit (hjĂ€lper modellen att skilja pĂ„ kontexter)
  • Ange huvudansvaret ("hjĂ€lper till med X"), inte ett vagt "du Ă€r en hjĂ€lpsam assistent"
  • NĂ€mn SDK/plattform om tillĂ€mpligt ("byggd pĂ„ Anthropics Claude Agent SDK")

Anti-mönster:

  • "Du Ă€r en hjĂ€lpsam, ofarlig och Ă€rlig AI-assistent" — för generiskt, ingen förankring i rollen
  • Ett helt stycke med bakgrundshistoria och "lore" — slösar tokens, modellen behöver ingen karaktĂ€rsutveckling

3.2 SĂ€kerhet & Skydd — De hĂ„rda grĂ€nserna

MÄl: SÀtt okrÀnkbara beteendegrÀnser.

IMPORTANT: Assist with defensive security tasks only.
Refuse to create, modify, or improve code that may be used maliciously.
IMPORTANT: You must NEVER generate or guess URLs for the user.

Riktlinjer:

  • AnvĂ€nd prefixet IMPORTANT: — Claudes trĂ€ning för instruktionshierarki ger detta extra vikt
  • AnvĂ€nd absolut sprĂ„k: NEVER, MUST NOT, Refuse to
  • Ange bĂ„de vad som Ă€r tillĂ„tet OCH vad som Ă€r förbjudet (dubbelriktade grĂ€nser Ă€r tydligare)
  • Placera allra högst upp, begrav det inte i mitten
  • Upprepa kritiska sĂ€kerhetsregler pĂ„ slutet — Claude Code gör exakt detta

Varför upprepa? Primacy-effekten (början) + Recency-effekten (slutet) = dubbel förstĂ€rkning. Claude Codes sĂ€kerhetsdeklaration dyker upp bĂ„de i början och i slutet av prompten. Inte för att utvecklarna var glömska — utan för att de förstĂ„r den U-formade uppmĂ€rksamhetskurvan.

3.3 Ton & Stil — Att kontrollera output

MÄl: Kontrollera utdataformat och röst.

## Tone and style

- Your responses should be short and concise.
- Only use emojis if the user explicitly requests it.
- Use Github-flavored markdown for formatting.
- NEVER create files unless absolutely necessary.

Riktlinjer:

  • Lista specifika beteenden, inte ett vagt "var professionell"
  • Varje regel bör vara testbar som sant/falskt ("kort och koncis" vs. "försök att vara kortfattad")
  • Inkludera krav pĂ„ utdataformat (markdown? JSON? ren text?)
  • Inkludera vad den INTE ska göra — mĂ„nga stilproblem handlar om att förbjuda beteenden

Claude Codes guldklimp — Professionell objektivitet:

Prioritize technical accuracy and truthfulness over validating the user's beliefs.
Focus on facts and problem-solving, providing direct, objective technical info
without any unnecessary superlatives, praise, or emotional validation.

Det hÀr stycket Àr avgörande: det blockerar modellens tendens att vara instÀllsam (sycophancy). Om din agent behöver ge objektiva bedömningar (code review, idéutvÀrdering, arkitekturbeslut) behöver du absolut en liknande klausul.

3.4 KĂ€rnflöde (Core Workflow) — Den viktigaste sektionen

MĂ„l: LĂ€r modellen hur den ska arbeta — metodik, inte stela procedurer.

Det hÀr Àr den svÄraste sektionen att skriva bra, och den som ger mest effekt nÀr du fÄr till den.

KĂ€rnprincipen: ge principer, inte procedurer.

BerĂ€tta för LLM:en hur bra utdata ser ut och varför det Ă€r bra — lĂ„t den sjĂ€lv rĂ€kna ut hur den ska ta sig dit. Undvik att föreskriva exakta fĂ€ltantal, stegsekvenser eller format, sĂ„vida inte utdatan ska konsumeras av maskiner lĂ€ngre ner i kedjan.

Claude Codes tillvÀgagÄngssÀtt:

## Doing tasks

The user will primarily request software engineering tasks.
For these tasks the following steps are recommended:

- Use the TodoWrite tool to plan the task if required

LĂ€gg mĂ€rke till ordet "recommended" (rekommenderas) — inte "du mĂ„ste följa dessa exakta steg". Det enda ordvalet ger modellen utrymme att anpassa sig.

En bra definition av arbetsflödet:

1. Understand first — read existing code before modifying it
2. Plan first — break complex tasks into steps before executing
3. Minimal changes — only change what's necessary, don't "refactor while you're in there"
4. Verify — confirm your changes work (run tests, lint, etc.)

Varje regel har ett implicit "varför" — modellen kan förstĂ„ avsikten och generalisera till nya scenarier.

Anti-mönster:

  • En stel procedur pĂ„ 20 steg — modellen kommer att exekvera mekaniskt och frysa vid ovĂ€ntad input
  • "Gör först A, gör sedan B, gör sedan C" — det Ă€r en prompt-kedja, inte en agent-prompt
  • Att överstyra saker som LLM:en redan Ă€r bra pĂ„ — slösar tokens

Jag lÀrde mig detta den hÄrda vÀgen med VibeCom. Tidiga versioner hade ett research-flöde pÄ 10 steg. Modellen utförde plikttroget alla 10 steg Àven nÀr steg 3 redan hade besvarat anvÀndarens frÄga. NÀr jag bytte till principer ("researcha tills du har tillrÀckligt med bevis, syntetisera sedan") gick kvaliteten upp och token-kostnaderna ner.

Undantaget: NÀr utdatan konsumeras av maskiner lÀngre ner i kedjan (kommunikation mellan agenter, API-svarsformat) bör du definiera strikta format. Principer Àr för beteende; scheman Àr för grÀnssnitt.

3.5 Policy för verktygsanvĂ€ndning — Att lösa tvetydigheter

MÄl: NÀr flera verktyg kan göra samma sak, berÀtta för modellen vilket den ska föredra.

## Tool usage policy

- Use specialized tools instead of bash commands:
  - Read for reading files instead of cat/head/tail
  - Edit for editing instead of sed/awk
  - Grep for searching instead of grep/rg
- You can call multiple tools in a single response. If independent, call in parallel.
- Use the Task tool for file search to reduce context usage.

Riktlinjer:

  • AnvĂ€nd "istĂ€llet för" (instead of) för att uttrycka prioritet (A istĂ€llet för B)
  • Förklara varför den ska föredra vissa verktyg ("ger en bĂ€ttre anvĂ€ndarupplevelse", "minskar kontextanvĂ€ndningen")
  • Definiera strategi för parallellism (oberoende → parallellt, beroende → sekventiellt)
  • Lista sĂ€kerhetsbegrĂ€nsningar för verktygsanvĂ€ndning (sökvĂ€gsvalidering, behörighetskontroller)

Den avgörande relationen mellan verktyg och prompts:

Verktygsdefinitioner injiceras vanligtvis av systemet och du kan inte redigera dem direkt. Claude Codes verktygsdefinitioner Àr pÄ ~11 438 tokens. Detta innebÀr:

  • Upprepa inte information som redan finns i verktygsdefinitionerna
  • AnvĂ€nd system-prompten för strategisk vĂ€gledning: nĂ€r varje verktyg ska anvĂ€ndas, varför man ska föredra ett framför ett annat, prioriteringsordning
  • Kvaliteten pĂ„ verktygsdefinitionen pĂ„verkar direkt agentens effektivitet — om du bygger din egen agent, investera tid i att skriva utmĂ€rkta verktygsbeskrivningar

3.6 DomĂ€nkunskap — Ladda vid behov, inte i förvĂ€g

MÄl: TillhandahÄll specialiserad kunskap som modellens trÀningsdata kanske saknar.

KÀrnprincipen: progressivt avslöjande (progressive disclosure), inte kunskapsdumpar.

❌ Paste all 200 API endpoints into the system prompt → token explosion
✅ Give the model a tool to look things up → "Load knowledge when you need it"

Denna strategi delas av Claude Codes Skills-system och DeepAgents Progressive Disclosure-middleware. BÄda laddar kunskap vid behov genom verktygsanrop snarare Àn att ladda allt i förvÀg.

Implementeringsmetoder:

  1. LÀgg in pekare i system-prompten: "AnvÀnd verktyget get_api_docs för att hÀmta dokumentation vid behov"
  2. AnvĂ€nd CLAUDE.md / AGENTS.md för projektkontext — laddas vid runtime, hĂ„rdkodas inte
  3. AnvĂ€nd Skills / SKILL.md för upptĂ€ckt av kapabiliteter — modellen ser en meny av tillgĂ€ngliga fĂ€rdigheter och hĂ€mtar fullstĂ€ndiga specifikationer vid behov

3.7 Miljöinformation — Runtime-kontext

MÄl: Ge modellen medvetenhet om sin exekveringsmiljö.

<env>
Working directory: /Users/fengliu/Desktop/tfm/vibecom
Is directory a git repo: true
Platform: darwin
Today's date: 2026-03-21
</env>
You are powered by the model named Claude Opus 4.6.

Riktlinjer:

  • Generera dynamiskt, hĂ„rdkoda aldrig
  • Inkludera: arbetskatalog, plattform, datum, modellnamn, git-status
  • AnvĂ€nd strukturerat format (XML-taggar eller kodblock) för enkel parsning
  • Datum spelar roll — modellen behöver veta nĂ€r "nu" Ă€r för att bedöma hur fĂ€rsk informationen Ă€r

3.8 PĂ„minnelser — Den sista förstĂ€rkningen

MÄl: Upprepa de mest kritiska reglerna i slutet av prompten.

Claude Code upprepar sin sÀkerhetsbegrÀnsning och TodoWrite-krav i botten:

IMPORTANT: Assist with defensive security tasks only. [repeated]
IMPORTANT: Always use the TodoWrite tool to plan and track tasks. [repeated]

Riktlinjer:

  • Upprepa bara 2-3 av de allra viktigaste reglerna — duplicera inte allt
  • Utnyttja recency bias — modellen minns nyligen lĂ€st innehĂ„ll starkare
  • BĂ€sta kandidaterna: sĂ€kerhetsgrĂ€nser, regler som oftast bryts, pĂ„minnelser om kĂ€rnflödet

4. Token-budget och kontexthantering

Referens för budgetallokering

SektionRekommenderade tokensAnteckningar
Identitet + SÀkerhet200-500Kortfattat men okrÀnkbart
Ton & Stil300-800Regler mÄste vara specifika, men svamla inte
KÀrnflöde500-2 000Viktigaste sektionen, vÀrd investeringen
Policy för verktyg300-1 000Beror pÄ antalet verktyg
DomÀnkunskap0-1 000Laddning vid behov föredras
Miljöinformation100-300Genereras dynamiskt
PÄminnelser100-300Upprepa bara det allra viktigaste
Din total1 500-6 000
Verktygsdefinitioner (system)5 000-15 000Utom din kontroll

Kontextens nedbrytningskurva

Community-tester (Reddit u/CodeMonke_) har kartlagt hur följsamheten faktiskt bryts ner i praktiken:

  • < 80K tokens: Prompt-följsamheten förblir stabil
  • 80K - 120K tokens: FörmĂ„gan att följa instruktioner börjar försĂ€mras
  • > 120K tokens: Betydande försĂ€mring — modellen "glömmer" tidiga instruktioner
  • > 180K tokens: Allvarlig försĂ€mring

Ditt kontextfönster pĂ„ 200K ≠ 200K av effektiv kontext. Planera dĂ€refter.

Strategier för att mildra detta:

  • HĂ„ll din system-prompt slimmad (< 6 000 tokens för din del)
  • AnvĂ€nd summering för att komprimera konversationshistoriken (DeepAgents triggar vid ~80K tecken)
  • Placera kritiska regler i bĂ„da Ă€ndarna av prompten (U-formad uppmĂ€rksamhet)
  • Injicera <system-reminder>-taggar mitt i konversationen (mer om detta i sektion 8)

5. Skrivprinciper

5.1 Ge principer, inte procedurer

❌ "Step 1: Read the file. Step 2: Find the bug. Step 3: Fix it. Step 4: Run tests."
✅ "Always understand existing code before modifying it. Verify your changes work."

Principer gÄr att generalisera. Procedurer kan bara följas mekaniskt. NÀr modellen stöter pÄ en situation du inte förutsett, vÀgleder principer till rÀtt beslut. Det gör inte procedurer.

Undantag: NĂ€r utdata konsumeras av maskiner (kommunikation mellan agenter, API-format), definiera strikta scheman.

5.2 AnvÀnd absolut sprÄk för hÄrda grÀnser

StyrkaSprÄkAnvÀnds för
Absolut förbudNEVER, MUST NOTSÀkerhet, oÄterkalleliga operationer
Starkt kravALWAYS, MUSTRegler för kÀrnflödet
Rekommendationrecommended, preferBest practices med undantag
Förslagconsider, you mayValfria optimeringar

Claude Code-exempel:

  • NEVER update the git config — absolut förbud
  • ALWAYS prefer editing an existing file — starkt, men undantag finns
  • The following steps are recommended — föreslaget arbetsflöde

5.3 AnvÀnd exempel istÀllet för förklaringar

## Code References

When referencing specific functions or pieces of code include
the pattern `file_path:line_number`.

<example>
user: Where are errors from the client handled?
assistant: Clients are marked as failed in the `connectToServer`
function in src/services/process.ts:712.
</example>

Ett exempel lÀr ut mer Àn 100 ord av förklaringar:

  • Modeller lĂ€r sig mönster frĂ„n exempel mer tillförlitligt Ă€n frĂ„n abstrakta beskrivningar
  • SlĂ„ in i <example>-taggar för att separera frĂ„n regler
  • Ge bĂ„de positiva ("gör sĂ„ hĂ€r") och negativa ("gör inte sĂ„ hĂ€r") exempel
  • AnvĂ€nd riktiga, specifika exempel — inte "foo/bar"-platshĂ„llare

5.4 Dubbelriktade grÀnser

✅ "Use dedicated tools: Read for reading files, Edit for editing files."
✅ "Do NOT use bash for file operations (cat, head, tail, sed, awk)."

Att bara sĂ€ga "gör detta" → modellen vet inte nĂ€r den INTE ska göra det. Att bara sĂ€ga "gör inte detta" → modellen kĂ€nner inte till alternativet. Dubbelriktat → tydligt och otvetydigt.

5.5 Förklara varför, inte bara vad

❌ "Don't use git commit --amend."
✅ "Avoid git commit --amend. ONLY use --amend when either
   (1) user explicitly requested amend OR
   (2) adding edits from pre-commit hook.
   Reason: amending may overwrite others' commits."

Att förklara varför lĂ„ter modellen göra korrekta bedömningar i edge cases. Claude Codes git-sĂ€kerhetsprotokoll Ă€r en masterclass — varje regel antyder sin egen logik.

5.6 Struktur framför prosa

  • Markdown-rubriker (##, ###) — modeller kĂ€nner igen hierarki
  • Punktlistor framför textstycken — varje regel kan testas oberoende
  • XML-taggar för speciellt innehĂ„ll: <example>, <env>, <system-reminder>
  • Tabeller för jĂ€mförelser och mappningar
  • Dumpa aldrig ostrukturerad text — strukturerade prompts övertrĂ€ffar konsekvent naturlig prosa i tester av följsamhet

6. Anti-mönster som slösar dina tokens

Prompt-kedjor förklÀdda till agenter

"First call tool A to get data.
Then call tool B with the result.
Then format the output as JSON.
Then save to file."

Det hĂ€r Ă€r ingen agent-prompt — det Ă€r ett pipeline-script. Modellen kommer att exekvera mekaniskt och förlora sin autonoma planeringsförmĂ„ga.

Lösningen: BerÀtta för modellen vad mÄlet och begrÀnsningarna Àr. LÄt den sjÀlv bestÀmma stegen.

Smicker-engineering (Flattery Engineering)

"You are an EXTREMELY TALENTED and INCREDIBLY EXPERIENCED
senior software engineer with 20 years of experience..."

Komplimanger och superlativ förbÀttrar inte utdatakvaliteten. Modellen har inget ego som behöver boostas. Spara de 15 tokens till en faktisk regel.

Kunskapsdumpar

"Here is the complete API documentation for our 200 endpoints..."

Detta slukar ditt kontextfönster och pÄskyndar kontextröta (context rot). ErsÀtt med laddning vid behov:

"Use the get_api_docs tool to retrieve API documentation when needed."

Att upprepa verktygsbeskrivningar

Om verktygsdefinitionen redan sĂ€ger "Read-verktyget lĂ€ser en fil frĂ„n filsystemet", sĂ€g det inte igen i din system-prompt. LĂ€gg bara till strategisk vĂ€gledning som verktygsdefinitionen inte tĂ€cker — nĂ€r det ska anvĂ€ndas, varför man ska föredra det, prioriteringsordning.

Saknad felhantering

Utan explicit vÀgledning kommer modeller att försöka göra om misslyckade verktygsanrop i en oÀndlig loop. Inkludera alltid:

"If a tool call is denied, do not re-attempt the exact same call.
Think about why it was denied and adjust your approach."

Att ignorera kontextfönstrets förfall

200K kontextfönster ≠ 200K effektiv kontext. Tester i verkligheten visar att försĂ€mringen börjar vid 80K. Du behöver en strategi för summering.


7. Injiceringspunkter och prioritet

Claude Codes tre anpassningsmetoder

MetodErsÀtterPlaceringBÀst för
Output Styles"Tone and style" + "Doing tasks"-sektionernaPrecis före verktygsdefinitionernaAtt Àndra interaktionsstil
--append-system-promptIngenting (additivt)Efter output style, före verktygsdefinitionerAtt lÀgga till specifika beteenden
--system-promptHela system-promptenBehÄller verktygsdefinitioner + en identitetsradFullstÀndig anpassning (the nuclear option)

Om du anvĂ€nder flera: Output Style → Append Prompt → Tool Definitions

Instruktionshierarki

Claude Àr specifikt trÀnad med en instruktionshierarki:

1. User's explicit instructions (CLAUDE.md, direct requests)  ← Högsta prioritet
2. Custom system prompt additions                               ← Hög
3. Default system prompt                                        ← Medium
4. Tool definitions                                             ← ReferensnivĂ„

Detta innebÀr:

  • CLAUDE.md-regler Ă„sidosĂ€tter standardbeteendet i system-prompten
  • AnvĂ€ndarens direkta förfrĂ„gningar Ă„sidosĂ€tter allt
  • Din anpassade prompt Ă„sidosĂ€tter standardprompten

Dynamiska injiceringsmekanismer

  • <system-reminder> — injicera i valfritt meddelande mitt i konversationen för att pĂ„minna modellen om kritiska regler
  • CLAUDE.md / AGENTS.md — laddas vid runtime frĂ„n filer, lĂ€ggs till i system-prompten
  • Skills / SKILL.md — laddas vid behov via verktygsanrop, noll avtryck i system-prompten

8. Injicering mitt i konversationen — Det hemliga vapnet

System-prompten dyker bara upp en gÄng, allra först i meddelande-arrayen. Men LLM:er accepterar hela meddelande-arrayen (alternerande anvÀndar- / assistent- / verktygsmeddelanden) som input, och du kan injicera prompts i anvÀndarmeddelanden och verktygsresultat ocksÄ. Claude Code anvÀnder denna teknik flitigt i produktion.

Varför det Àr nödvÀndigt

Att bekÀmpa kontextröta. NÀr konversationer blir lÀngre försÀmras modellens förmÄga att följa system-promptens instruktioner (mÀrkbart vid 80K+ tokens). Att injicera pÄminnelser mitt i konversationen = att uppdatera reglerna via recency bias.

Den mentala modellen:

  • System-prompt = grundlagen (etableras en gĂ„ng, lĂ„ngsiktig auktoritet)
  • PĂ„minnelser i anvĂ€ndarmeddelanden = PM/Memos (skickas periodiskt, upprĂ€tthĂ„ller efterlevnad)

Tre injiceringspunkter i meddelande-arrayen

Messages Array:
┌─────────────────────────────────────┐
│ System-prompt                       │ ← Syns en gĂ„ng, primacy-effekt
│   (identity, safety, workflow...)   │
├──────────────────────────────────────
│ AnvĂ€ndarmeddelande 1                │
│ Assistentmeddelande 1               │
│ AnvĂ€ndarmeddelande 2 + <system-reminder>  │ ← Injicering mitt i konversationen
│ Assistentmeddelande 2               │
│ Verktygsresultat + <system-reminder>     │ ← Kan injiceras i verktygsresultat ocksĂ„
│ ...                                 │
│ AnvĂ€ndarmeddelande N + <system-reminder>  │ ← Senaste meddelandet, starkast recency-effekt
└─────────────────────────────────────┘
PlatsFördelNackdel
System promptPrimacy-effekt, lÀses förstSyns en gÄng, "glöms bort" i lÄnga konversationer
User message injectionRecency bias, periodisk uppdateringVarje injicering kostar tokens
Tool result injectionMest naturliga injiceringspunktenFungerar bara nÀr verktyg anropas

Hur Claude Code faktiskt anvÀnder det

FörutsĂ€ttning — deklarera taggarna i system-prompten:

Tool results and user messages may include <system-reminder> tags.
<system-reminder> tags contain useful information and reminders.
They are automatically added by the system, and bear no direct
relation to the specific tool results or user messages in which they appear.

Detta steg Àr kritiskt: det talar om för modellen att dessa taggar Àr systeminjicerade, inte anvÀndarens tal.

AnvÀndning 1: BeteendepÄminnelser (periodisk regeluppdatering)

<system-reminder>
The task tools haven't been used recently. If you're working on tasks
that would benefit from tracking progress, consider using TaskCreate...
</system-reminder>

Claude Code anvĂ€nder detta för att pĂ„minna modellen om att planera med TodoWrite — eftersom modeller tenderar att "glömma" planeringen och bara börja koda.

AnvÀndning 2: LÀgesvÀxling (Plan Mode)

<system-reminder>
Plan mode is active. The user indicated that they do not want you to
execute yet -- you MUST NOT make any edits, run any non-readonly tools,
or otherwise make any changes to the system.
</system-reminder>

Plan mode (planeringslÀge) implementeras inte i system-prompten. Det Àr en tagg som injiceras i nÀsta anvÀndarmeddelande. Detta lÄter dig vÀxla lÀgen dynamiskt utan att modifiera system-prompten. Genialiskt.

AnvÀndning 3: Notifieringar om filÀndringar

<system-reminder>
Note: /path/to/file.ts was modified, either by the user or by a linter.
This change was intentional, so make sure to take it into account.
</system-reminder>

NĂ€r en extern process (linter, formaterare, manuell redigering) modifierar en fil, meddelar systemet modellen via en pĂ„minnelse — vilket förhindrar beslut baserade pĂ„ inaktuellt filinnehĂ„ll.

AnvÀndning 4: Dynamisk kontext (datum, projektregler)

<system-reminder>
Today's date is 2026-03-21.
Current branch: dev
claudeMd: [CLAUDE.md content injected here]
</system-reminder>

Runtime-kontext (datum, git-status, projektregler) injiceras via anvÀndarmeddelanden, den hÄrdkodas inte i system-prompten.

Riktlinjer för att skriva pÄminnelser

  • SlĂ„ in i XML-taggar (<system-reminder>) — modellen kan skilja systeminjicering frĂ„n anvĂ€ndarens tal
  • Fördeklarera taggar i system-prompten — annars kan modellen försöka svara pĂ„ pĂ„minnelsen
  • Injicera inte i varje meddelande — varje injicering kostar tokens, injicera bara nĂ€r det behövs
  • HĂ„ll det kort — en pĂ„minnelse Ă€r inte en andra system-prompt, bara 1-2 kritiska regler
  • MotsĂ€g inte system-prompten — pĂ„minnelser kompletterar och förstĂ€rker, de Ă„sidosĂ€tter inte
  • AnvĂ€nd för dynamisk vĂ€xling — plan mode, readonly mode, feature flags

NÀr man ska anvÀnda System Prompt vs. User Message Reminder

ScenarioSystem PromptUser Message Reminder
Rolldefinition✅❌
SĂ€kerhetsgrĂ€nser✅ Första deklarationen✅ Periodisk upprepning
Arbetsflödesmetodik✅❌
LĂ€gesvĂ€xling (plan mode)❌✅
Notifieringar om filĂ€ndringar❌✅
Datum / miljöinformation✅ Initialt vĂ€rde✅ Uppdaterat vĂ€rde
Beteendekorrigering❌✅
PĂ„minnelser om verktygsanvĂ€ndning✅ Regeldefinition✅ Exekveringsknuffar (nudges)

9. Prompt Cache — Spara 90% pĂ„ Ă„terkommande tokens

Anthropics prompt caching lĂ„ter dig cacha det statiska prefixet av din meddelande-array. NĂ€r efterföljande förfrĂ„gningar delar samma prefix trĂ€ffar de cachen — vilket sparar pengar och minskar latensen.

För agenter spelar detta stor roll: du skickar om system-prompten + verktygsdefinitionerna vid varje enskilt LLM-anrop inom en konversation.

Viktiga siffror

MÀtvÀrdeVÀrde
Kostnad vid cache-trÀff10% av normalpriset (90% besparing)
Kostnad för cache-skrivning125% av normalpriset (25% pÄslag vid första skrivningen)
Cache TTL5 minuter (löper ut om inga förfrÄgningar görs)
Minsta cachebara lÀngd1 024 tokens (Claude 3.5+)
Cache-granularitetPrefix-matchning — frĂ„n början till en markerad brytpunkt (breakpoint)
Maximala brytpunkter4

Hur detta förÀndrar prompt-design

KÀrnprincip: statiskt innehÄll först, dynamiskt innehÄll sist.

✅ Cache-vĂ€nlig layout:
  System-prompt (statisk)      ← Cache-brytpunkt 1
  Verktygsdefinitioner (statiska)   ← Cache-brytpunkt 2
  CLAUDE.md / projektregler   ← Cache-brytpunkt 3 (Ă€ndras ibland)
  Konversationshistorik         ← Brytpunkt 4 för rullande fönster

❌ Cache-förstörande layout:
  System-prompt
  DYNAMIC TIMESTAMP            ← Ändras vid varje request, allt efter = cache-miss
  Verktygsdefinitioner
  Konversationshistorik

FÀllan ingen varnar dig för: Om du lÀgger en dynamisk tidsstÀmpel mitt i din system-prompt blir allt efter den en cache-miss. Vid. Varje. Request. En tidsstÀmpel pÄ fel stÀlle och du betalar fullt pris för tusentals tokens.

API-anvÀndning

const response = await anthropic.messages.create({
  model: "claude-sonnet-4-6",
  system: [
    {
      type: "text",
      text: "You are a startup advisor...",
      cache_control: { type: "ephemeral" }  // ← markerar en cache-brytpunkt
    }
  ],
  messages: [...]
});

Strategi för flera brytpunkter

Brytpunkt 1: System-prompt           ← Ändras nĂ€stan aldrig
Brytpunkt 2: Verktygsdefinitioner         ← Ändras nĂ€stan aldrig
Brytpunkt 3: Projektregler / CLAUDE.md ← Ändras ibland
Brytpunkt 4: De första N historikmeddelandena  ← Rullande fönster-cache

Även nĂ€r konversationshistoriken Ă€ndras, trĂ€ffar de första 3 brytpunkterna fortfarande. En konversation pĂ„ 10 turer sparar ungefĂ€r 40-60% pĂ„ input-token-kostnader.

Designrekommendationer

  • Inga högfrekventa dynamiska vĂ€rden i system-prompten — datum Ă€r okej (Ă€ndras dagligen), exakta tidsstĂ€mplar Ă€r det inte
  • LĂ€gg dynamisk kontext (git-status, etc.) i injiceringar i anvĂ€ndarmeddelanden — inte i system-prompten, annars förstör du cachen
  • HĂ„ll verktygsdefinitioner stabila — lĂ€gg inte till/ta bort verktyg dynamiskt vid runtime
  • AnvĂ€nd rullande fönster för konversationshistorik — cacha de första N meddelandena, bara det nyaste meddelandet blir en cache-miss

10. Checklistan

Efter att du har skrivit din system-prompt, granska den mot den hÀr checklistan:

Struktur

  • Ligger identiteten allra högst upp?
  • Är sĂ€kerhetsgrĂ€nserna markerade med IMPORTANT och upprepade pĂ„ slutet?
  • Tydlig sektionsuppdelning med rubriker?
  • Är exempel inslagna i <example>-taggar?

Token-budget

  • Är din del < 6 000 tokens?
  • Upprepar du inte information som redan finns i verktygsdefinitionerna?
  • Laddas domĂ€nkunskap vid behov, istĂ€llet för att laddas i förvĂ€g?
  • Ingen onödigt lĂ„ng "lore" eller karaktĂ€rsbakgrund?

Regelkvalitet

  • Är varje regel testbar som sant/falskt?
  • AnvĂ€nder hĂ„rda grĂ€nser absolut sprĂ„k (NEVER/MUST)?
  • AnvĂ€nder mjuka förslag rekommendationssprĂ„k (recommended/prefer)?
  • Förklarar kritiska regler varför, inte bara vad?
  • Dubbelriktade grĂ€nser (gör detta + gör inte detta)?

Agentbeteende

  • Ges principer, inte stela steg-för-steg-procedurer?
  • Har du hanterat scenariot "verktygsanrop nekades"?
  • Har du hanterat strategin för "stötte pĂ„ hinder" (försök inte tvinga igenom det med brute-force)?
  • Finns en strategi för kontexthantering pĂ„ plats (tröskelvĂ€rde för summering)?

Vad du INTE ska göra

  • Inget smicker eller superlativa adjektiv?
  • Inga överflödiga "du Ă€r en hjĂ€lpsam AI"-deklarationer?
  • Inte skriven som en prompt-kedja?
  • Ingen over-engineering (funktioner ingen bett om)?

Om jag började idag

HÀr Àr exakt vad jag skulle göra:

  1. Börja med identitet + sÀkerhet pÄ de första 3 raderna. TvÄ meningar för vem agenten Àr. HÄrda grÀnser med NEVER/MUST. Upprepa sÀkerhetsreglerna pÄ slutet.

  2. Skriv ditt kÀrnflöde som principer, inte steg. Max 4-5 punkter. AnvÀnd "recommended" och "prefer" för mjuka regler, "NEVER" och "MUST" för hÄrda.

  3. Budgetera 1 500-6 000 tokens för din del. Verktygsdefinitioner kommer att lÀgga till 5 000-15 000 till. Om du Àr över 6K dumpar du förmodligen kunskap som borde laddas vid behov.

  4. Strukturera allt. Markdown-rubriker, punktlistor, XML-taggar för exempel. En strukturerad prompt slÄr naturlig prosa varje gÄng.

  5. Bygg in pÄminnelser mitt i konversationen frÄn dag ett. Deklarera <system-reminder> i din system-prompt. Injicera pÄminnelser för kritiska regler, lÀgesvÀxlingar och kontextuppdateringar.

  6. Designa för cache. Statiskt innehÄll först, dynamiskt innehÄll sist. LÀgg aldrig förÀnderliga vÀrden i sjÀlva system-prompten.


Ironin i allt detta arbete? De bÀsta system-promptarna Àr korta. Claude Codes anpassade instruktioner (exklusive verktygsdefinitioner) Àr förvÄnansvÀrt koncisa. Varje rad förtjÀnar sin plats.

Jag brukade tro att prompt engineering handlade om att hitta smarta trick. Nu tror jag att det handlar om disciplin — att sĂ€ga mindre, sĂ€ga det exakt, och lita pĂ„ att modellen rĂ€knar ut resten. Modellen Ă€r smartare Ă€n din prompt. Designa miljön, inte beteendet.


Referenser

KĂ€llaNyckelinsikt
Claude Code v2.0.14 System PromptReferens för prompt-struktur för agenter i produktion
Reddit: Understanding Claude Code's 3 System Prompt MethodsDjupdykning i Output Styles / --append / --system-prompt, verklig data pÄ kontextröta
shareAI-lab/learn-claude-codeFilosofin "modellen Àr agenten", metodik för harness engineering
Anthropic Prompt Engineering DocsOfficiella best practices för prompts
DeepAgents FrameworkMiddleware för summering, progressivt avslöjande av fÀrdigheter (skills)
ai agent system promptsprompt engineering guideclaude code system promptbuilding ai agentsllm prompt optimization

Dela detta

Feng Liu

Skrivet av Feng Liu

shenjian8628@gmail.com

Den kompletta guiden till att skriva systemprompter för agenter — LĂ€rdomar frĂ„n reverse engineering av Claude Code | Feng Liu