{"id":564,"date":"2026-02-24T15:28:23","date_gmt":"2026-02-24T13:28:23","guid":{"rendered":"https:\/\/vittrup-graversen.dk\/?p=564"},"modified":"2026-03-28T12:10:46","modified_gmt":"2026-03-28T10:10:46","slug":"saadan-er-openclaw-bygget-op-en-arkitektur-der-koerer-24-7-paa-din-egen-hardware","status":"publish","type":"post","link":"https:\/\/vittrup-graversen.dk\/index.php\/2026\/02\/24\/saadan-er-openclaw-bygget-op-en-arkitektur-der-koerer-24-7-paa-din-egen-hardware\/","title":{"rendered":"S\u00e5dan er OpenClaw bygget op \u2014 en arkitektur der k\u00f8rer 24\/7 p\u00e5 din egen hardware"},"content":{"rendered":"\n<p>De fleste AI-chatbots lever i skyen. Du sender en besked, f\u00e5r et svar, og s\u00e5 glemmer systemet dig. OpenClaw og lignende agent-frameworks vender den model p\u00e5 hovedet: her k\u00f8rer en persistent gateway lokalt p\u00e5 din egen maskine, klar til at modtage beskeder fra alle dine kanaler d\u00f8gnet rundt.<\/p>\n\n\n\n<p>I dette indl\u00e6g dykker vi ned i den interne arkitektur \u2014 ikke kode eller ops\u00e6tning, men selve designet der g\u00f8r det muligt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Gateway-laget: \u00e9n indgang til alle kanaler<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1408\" height=\"768\" src=\"https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/02\/wp-gateway-diagram-sm.png\" alt=\"OpenClaw Gateway arkitektur\" class=\"wp-image-574\" srcset=\"https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/02\/wp-gateway-diagram-sm.png 1408w, https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/02\/wp-gateway-diagram-sm-300x164.png 300w, https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/02\/wp-gateway-diagram-sm-1024x559.png 1024w, https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/02\/wp-gateway-diagram-sm-768x419.png 768w\" sizes=\"auto, (max-width: 1408px) 100vw, 1408px\" \/><figcaption class=\"wp-element-caption\">OpenClaw Gateway arkitektur<\/figcaption><\/figure>\n\n\n\n<p>Yderst i systemet sidder en Gateway, som fungerer som ren trafikdirigent uden nogen form for intelligens. Den tager imod beskeder fra WhatsApp (via Baileys), Telegram (via grammY), Slack, Discord og iMessage \u2014 og normaliserer dem til \u00e9t f\u00e6lles format, inden de sendes videre.<\/p>\n\n\n\n<p>En <strong>Session Router<\/strong> mapper hver samtale til en isoleret agent-session. Direkte beskeder bliver til \u00e9n persistent session pr. bruger, mens gruppechat spawner separate sessioner, s\u00e5 kontekst aldrig l\u00e6kker mellem deltagere.<\/p>\n\n\n\n<p>For at sikre deterministisk afvikling bruger Gateway&#8217;en <strong>Lane Queues<\/strong>: hver session f\u00e5r sin egen eksekveringsbane med konfigurerbar concurrency (standard: \u00e9n). Det forhindrer race conditions, n\u00e5r agenten udf\u00f8rer multi-step tool chains, hvor r\u00e6kkef\u00f8lgen er afg\u00f8rende.<\/p>\n\n\n\n<p>Ved siden af k\u00f8rer en WebSocket-server, der eksponerer sessionstranscripts, afventende tool-godkendelser og agenttilstand til kontrolinterfaces \u2014 terminal-UI&#8217;er, macOS menubar-apps eller web-dashboards. Gateway&#8217;en indeholder <em>nul<\/em> agentlogik; den router beskeder og styrer sessiongr\u00e6nser. Intet andet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Agent-eksekveringsl\u00f8kken: seks trin fra besked til svar<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/02\/wp-pipeline-diagram.png\" alt=\"Agent-eksekveringsl\u00f8kken\" class=\"wp-image-569\"\/><figcaption class=\"wp-element-caption\">Agent-eksekveringsl\u00f8kken<\/figcaption><\/figure>\n\n\n\n<p>Hver brugerbesked udl\u00f8ser en streng seks-trins pipeline i Agent Runtime:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Intake<\/strong> \u2014 den normaliserede besked modtages fra lane-k\u00f8en.<\/li>\n\n\n\n<li><strong>Context Assembly<\/strong> \u2014 r\u00e6sonneringsprompten bygges op fra sessionshistorik, semantisk hukommelsess\u00f8gning, workspace-filer som AGENTS.md og SOUL.md (driftsinstruktioner og personlighed) samt skemaer for tilg\u00e6ngelige v\u00e6rkt\u00f8jer.<\/li>\n\n\n\n<li><strong>Model Inference<\/strong> \u2014 sprogmodellen genererer naturligt sprog og strukturerede tool calls via JSON Schema-baserede outputformater.<\/li>\n\n\n\n<li><strong>Tool Execution<\/strong> \u2014 validerede tool calls dispatches til deres handlers, som kan k\u00f8re i sandboxes eller direkte p\u00e5 maskinen.<\/li>\n\n\n\n<li><strong>Result Backfill<\/strong> \u2014 tool-resultater injiceres tilbage i samtalen som f\u00f8rsteklasses beskeder, synlige for efterf\u00f8lgende r\u00e6sonneringstrin.<\/li>\n\n\n\n<li><strong>Streaming Reply<\/strong> \u2014 delsvar streames til brugeren i realtid, ofte inden tool-eksekvering er f\u00e6rdig (&#8220;Jeg tjekker din kalender nu\u2026&#8221;).<\/li>\n<\/ol>\n\n\n\n<p>L\u00f8kken stopper, n\u00e5r modellen beslutter at ingen flere tool calls er n\u00f8dvendige. Ingen ekstern orkestrering styrer denne beslutning \u2014 agenten afg\u00f8r autonomt, hvorn\u00e5r opgaven er fuldf\u00f8rt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hukommelse: filsystemet som sandhedskilde<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1408\" height=\"768\" src=\"https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/02\/wp-memory-diagram-sm.png\" alt=\"Hukommelsesarkitektur\" class=\"wp-image-575\" srcset=\"https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/02\/wp-memory-diagram-sm.png 1408w, https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/02\/wp-memory-diagram-sm-300x164.png 300w, https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/02\/wp-memory-diagram-sm-1024x559.png 1024w, https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/02\/wp-memory-diagram-sm-768x419.png 768w\" sizes=\"auto, (max-width: 1408px) 100vw, 1408px\" \/><figcaption class=\"wp-element-caption\">Hukommelsesarkitektur<\/figcaption><\/figure>\n\n\n\n<p>OpenClaw frav\u00e6lger bevidst vektordatabaser. I stedet bruges et to-lags hukommelsessystem, hvor filsystemet er den autoritative kilde.<\/p>\n\n\n\n<p><strong>Korttidshukommelse<\/strong> lever i tidsstemplede daglige logfiler \u2014 simple Markdown-filer under en memory-mappe. <strong>Langtidshukommelse<\/strong> bor i MEMORY.md og SOUL.md: strukturerede filer med destilleret viden og kerneoverbevisninger. Workspace-filer som AGENTS.md indeholder uforanderlige driftsinstruktioner, der indl\u00e6ses i hvert context window uden s\u00f8gning.<\/p>\n\n\n\n<p>S\u00f8gning kombinerer BM25 n\u00f8gleordss\u00f8gning med vektorsimilaritet for semantisk genkaldelse. Men vektorindekser behandles som flygtige caches \u2014 de genbygges automatisk fra Markdown-filerne ved opstart, s\u00e5 intet data g\u00e5r tabt, selv hvis indekserne korrumperer.<\/p>\n\n\n\n<p>Hukommelsesskrivninger sker udelukkende gennem eksplicitte <code>memory_write<\/code> tool calls under agentens eksekvering \u2014 aldrig som automatiske sideeffekter. Resultatet: al agentviden forbliver menneskel\u00e6sbar, redigerbar i enhver teksteditor og versionerbar via Git.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">V\u00e6rkt\u00f8jer og skills: s\u00e5dan f\u00e5r agenten evner<\/h2>\n\n\n\n<p>V\u00e6rkt\u00f8jer definerer agentens handlingsmuligheder og f\u00f8lger et strengt registreringsm\u00f8nster. Hvert v\u00e6rkt\u00f8j deklarerer sit navn, en naturligsproglig beskrivelse, et JSON Schema-parameterspec og en eksekveringshandler.<\/p>\n\n\n\n<p>Eksekvering foreg\u00e5r enten direkte p\u00e5 maskinen eller i en valgfri Docker-sandbox med non-root brugere, read-only filsystemer og netv\u00e6rksisolering. Kritiske v\u00e6rkt\u00f8jer \u2014 sletning, finansielle transaktioner, adgang til legitimationsoplysninger \u2014 udl\u00f8ser et <strong>human-in-the-loop godkendelsesflow<\/strong>. Eksekveringen pauser, indtil brugeren bekr\u00e6fter via WebSocket-kontrolfladen.<\/p>\n\n\n\n<p><strong>Skills<\/strong> udvider modellen ved at pakke relaterede v\u00e6rkt\u00f8jer med dokumentation i distribuerbare bundles, ofte hentet fra et community-registry kaldet ClawHub. Systemet besk\u00e6rer dynamisk tool-skemaer i konteksten baseret p\u00e5 samtalens emne, s\u00e5 agenten ikke bruger tokens p\u00e5 at pr\u00e6sentere irrelevante kapabiliteter.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Context window-h\u00e5ndtering: dynamisk komprimering<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/02\/wp-context-diagram.png\" alt=\"Context window-h\u00e5ndtering\" class=\"wp-image-571\"\/><figcaption class=\"wp-element-caption\">Context window-h\u00e5ndtering<\/figcaption><\/figure>\n\n\n\n<p>I stedet for naivt at tilf\u00f8je al historik, indtil modellens gr\u00e6nse rammes, implementerer OpenClaw sofistikeret context engineering. N\u00e5r token-trykket n\u00e6rmer sig modellens kapacitet \u2014 dynamisk afl\u00e6st fra den tilsluttede providers specifikationer \u2014 udl\u00f8ses <strong>session compaction<\/strong>.<\/p>\n\n\n\n<p>Processen opsummerer de \u00e6ldste samtaletrin, mens den bevarer semantisk mening og den strukturelle integritet af tool call-resultatpar. For lange samtaler offloades historiske detaljer gradvist til daglige logfiler, mens kun de seneste trin forbliver i det aktive context window.<\/p>\n\n\n\n<p>Sessioner nulstilles automatisk ved konfigurerbare gr\u00e6nser \u2014 typisk kl. 04:00 UTC \u2014 hvilket lukker dagens log og starter et nyt context window. Kombinationen af komprimering, offloading og periodisk reset muligg\u00f8r i praksis ubegr\u00e6nset samtalel\u00e6ngde inden for faste context windows.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Browserautomatisering: semantisk DOM-forst\u00e5else<\/h2>\n\n\n\n<p>OpenClaw undg\u00e5r dyr vision-baseret browserstyring ved at udtr\u00e6kke semantiske snapshots af websider. Browser-v\u00e6rkt\u00f8jet parser den levende DOM til en struktureret tekstrepr\u00e6sentation, hvor interaktive elementer bliver tokens som <code>[btn:Submit]<\/code> for knapper eller <code>[input:email]<\/code> for formularfelter.<\/p>\n\n\n\n<p>Denne tilgang bruger ca. 500 tokens pr. side, sammenlignet med tusindvis for vision-baseret analyse. Det muligg\u00f8r hurtig inferens uden multimodale modeller. N\u00e5r h\u00f8jere fidelitet kr\u00e6ves for komplekse UI&#8217;er, kan et vision snapshot-mode falde tilbage til fuldsidescreenshots analyseret af multimodale modeller \u2014 men det forbliver opt-in grundet den 10-50x h\u00f8jere token-omkostning.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Workspace-strukturen: \u00e9n kilde til sandhed<\/h2>\n\n\n\n<p>Agentens workspace \u2014 typisk <code>~\/.openclaw\/workspace<\/code> \u2014 er den komplette tilstandsrepr\u00e6sentation af systemet:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>AGENTS.md<\/strong> \u2014 driftsinstruktioner, altid indl\u00e6st i kontekst<\/li>\n\n\n\n<li><strong>SOUL.md<\/strong> \u2014 personlighed og kerneoverbevisninger<\/li>\n\n\n\n<li><strong>MEMORY.md<\/strong> \u2014 destilleret langtidsviden<\/li>\n\n\n\n<li><strong>memory\/<\/strong> \u2014 tidsstemplede daglige logfiler (episodisk hukommelse)<\/li>\n\n\n\n<li><strong>skills\/<\/strong> \u2014 eksekverbare kapabiliteter og deres dokumentation<\/li>\n<\/ul>\n\n\n\n<p>Ingen skjult tilstand eksisterer uden for dette mappetr\u00e6. Genstart af agenten mister intet, fordi al tilstand persisterer i menneskel\u00e6sbare filer. Det muligg\u00f8r trivielle backups, versionsstyring, manuel hukommelsesredigering og fuld gennemsigtighed i, hvad agenten &#8220;ved&#8221; p\u00e5 ethvert tidspunkt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fem designprincipper bag det hele<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Streng adskillelse af ansvar<\/strong> \u2014 routing, intelligens og kapabiliteter er isolerede lag, der udvikler sig uafh\u00e6ngigt.<\/li>\n\n\n\n<li><strong>Filsystem f\u00f8rst<\/strong> \u2014 al tilstand lever i redigerbare, inspicerbare filer frem for uigennemsigtige databaser.<\/li>\n\n\n\n<li><strong>Minimal abstraktion<\/strong> \u2014 systemet undg\u00e5r komplekse orkestreringsengines til fordel for en simpel persistent l\u00f8kke.<\/li>\n\n\n\n<li><strong>Forsvar i dybden<\/strong> \u2014 sessionsisolering, valgfri sandboxing og menneskelig godkendelse lagrer sikkerhed uden at kompromittere brugervenlighed.<\/li>\n\n\n\n<li><strong>Kompositionel udvidbarhed<\/strong> \u2014 nye kapabiliteter ankommer via skill bundles frem for kernemodifikationer, hvilket bevarer opgraderingsstier.<\/li>\n<\/ol>\n\n\n\n<p>Resultatet er en arkitektur, der er sofistikeret nok til autonom v\u00e6rkt\u00f8jsbrug i den virkelige verden, men simpel nok til at k\u00f8re uoverv\u00e5get 24\/7 p\u00e5 forbrugerhardware \u2014 alt imens brugeren bevarer fuld suver\u00e6nitet over data og adf\u00e6rd.<\/p>\n\n\n","protected":false},"excerpt":{"rendered":"<p>S\u00e5dan er OpenClaw bygget op \u2014 en arkitektur der k\u00f8rer 24\/7 p\u00e5 din egen hardware. Teknisk gennemgang af komponenterne.<\/p>\n","protected":false},"author":1,"featured_media":563,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[24],"tags":[29],"class_list":["post-564","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-agentic-engineering","tag-personal-agents"],"acf":[],"_links":{"self":[{"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/posts\/564","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/comments?post=564"}],"version-history":[{"count":4,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/posts\/564\/revisions"}],"predecessor-version":[{"id":1031,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/posts\/564\/revisions\/1031"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/media\/563"}],"wp:attachment":[{"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/media?parent=564"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/categories?post=564"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/tags?post=564"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}