Artikel7. oktober 20266 min læsning

Elma: det agent-system jeg byggede på barsel

Noget af det fedeste, jeg har lavet indtil videre på min barsel, er Elma.

Elma er et værktøj til agent-orkestrering. Altså et system, der kan oprette AI-agenter og sætte dem til at løse opgaver for mig.

Jeg er langt fra den første, der laver sådan et system. Der findes allerede hundredvis af dem. Alligevel manglede jeg altid det sidste. Og nu hvor vi har AI til at hjælpe os, er det hurtigere (og sjovere) at bygge sit eget end at bruge noget færdigt eller bruge tiden på at sætte sig ind i et open source-værktøj, før man kan bygge videre på det.

Fra et par timer til rigtig mange

Elma startede som et lille værktøj, der skulle hjælpe mig med at løse konkrete opgaver, mest kodeopgaver. Planen var et par timers arbejde. Før jeg vidste af det, var der gået rigtig mange timer, og en masse nye funktioner var blevet shippet.

Planen og virkeligheden. Bjælken stopper ikke ved kanten.

En server der aldrig sover

Jeg ville have et sted, hvor mine agenter kunne arbejde, uden at min MacBook skulle stå tændt døgnet rundt. Så jeg begyndte at undersøge mulighederne. Så kom jeg i tanke om, at jeg havde en Ubuntu-VPS hos Hostinger, som jeg aldrig havde fået opsagt. Den havde tidligere kørt en Hermes-agent, men efter Grok Bot kom til, blev den ligegyldig, og jeg glemte simpelthen at opsige den.

Nu havde jeg en VPS. Men hvordan pokker får jeg en agent til at snakke med en server?

Hmm...

Løsningen var selvfølgelig at hoste hele projektet på VPS'en. Så kører det hele lokalt, og jeg kan samtidig bruge det, der ligger på serveren, som CLI-værktøjer og lokale data. Det blev også nyttigt senere, da jeg skulle lave lokale databaser.

Nu kørte værktøjet, og jeg kunne tilgå det fra min private IP herhjemme. Så langt, så godt.

Om dagen sender jeg opgaver. Om natten må MacBooken gerne sove. VPS'en arbejder videre.

Integrationer, fordi man kan

Så kom det, jeg ofte sidder med: der skulle kobles forbindelser på. GitHub, Slack, Vercel og mange, mange flere.

Nu hvor vi har AI, kunne vi lige så godt gøre det “rigtigt”. Ikke fordi der var brug for det, for systemet er mit eget og kun til mig. Men fordi det er nemt, og fordi jeg sover bedre om natten når det er helt færdigt. Så jeg byggede et helt bibliotek af integrationer. Man kan jo lige så godt tilføje en masse ting, man aldrig får brugt.

Elma i midten, integrationerne rundt om. Én af dem får aldrig et eneste kald.

Nu havde jeg tre ting på plads:

  1. En VPS, hvor mit værktøj kører.
  2. Agenter: Grok Build, som kører via CLI'en på min VPS, og DeepSeek Flash til almindelig chat og de AI-funktioner, der ligger rundt omkring i systemet.
  3. GitHub, så mine agenter har et sted at gemme deres kode.

Opdateringer med ét klik

Min næste udfordring: jeg vidste, at jeg ville blive ved med at bygge på systemet, men jeg gad ikke sidde fast i en terminal med en SSH-forbindelse til min VPS og derfra bruge Claude, Grok eller andet.

Løsningen var egentlig ret simpel. Jeg installerede Git på VPS'en og skrev et script, der holder øje med, om mit GitHub-repo har nye ændringer i forhold til den version, der kører på serveren. Er der det, dukker der en “Opdater”-knap op. Et klik, og scriptet henter ændringerne, installerer dem og genstarter hele systemet. Done.

Prøv selv: når knappen lyser, så klik på den. Ellers gør den det selv efter et par sekunder.

Bagefter lavede jeg rigtig mange ændringer, især i UI'et, for det er en af mine største kærligheder ❤️

Elmas forside: en composer øverst til at sende opgaver til agenter, og widgets nedenunder med agenter, forbrug, noter og to-dos.
Forsiden: en composer til at sende opgaver afsted og widgets med det vigtigste.

Hvad Elma kan

Lige for at opsummere, så kunne systemet nu det her:

  • Agenter, der løser opgaver i mine repos, hver på deres egen branch.
  • Integrationer til AI-modeller, GitHub, Slack, servere og meget mere.
  • Noter, gemt i et Git-repo eller på serveren.
  • Design: et bibliotek af design.md-filer og instruktioner, som agenterne følger, og som kan hentes direkte fra mine Git-repos.
  • Indstillinger med alt for mange muligheder.
  • En forside med widgets, der viser det vigtigste, og en custom composer til at sende opgaver afsted.
  • Ask, et chatinterface, hvor man bare kan chatte i stedet for at sætte agenter i gang.
  • Agent-visning, hvor jeg kan følge med i realtid i, hvad en agent laver.
  • Boxes, en liste over de servere, jeg har koblet på, med mulighed for hurtigt at starte flere op, fx hos Hostinger eller Hetzner.
  • Memory, hvor agenterne gemmer det, de lærer undervejs, fx hvordan jeg vil have tingene lavet, eller noget om mig.
  • Schedules, hvor jeg hurtigt kan sætte agenter til at køre faste opgaver, ligesom cron jobs.
Hver agent får sin egen branch ud fra main, committer løs og merger tilbage, når jeg har godkendt.

Systemet var færdigt. Det var lækkert, og det hele spillede.

Agent-visningen i Elma: en liste over de 18 skridt, en agent tog for at løse en opgave, med detaljer om model, branch og ændringer i højre side.
Agent-visningen: hvert skridt, agenten tager, i realtid. Til sidst er ændringerne klar til review.

Men der manglede noget

Alligevel ikke helt. Det føltes, som om der manglede liv. Noget, der virkede, som om det tænkte selv. Og ja, jeg er ikke Dario fra Anthropic, så jeg ved godt, at en AI ikke er levende. Heller ikke selvom den har en SOUL.md-fil.

Et system, der kører agenter døgnet rundt, burde også kunne forbedre sig selv. Både ud fra de workflows, det kører, og med tiden, når det (og jeg) ved bedre, hvor vi skal hen.

Derfor byggede jeg endnu en agent oven på mit agent-system. Den hedder Steward. Den holder øje med alt i systemet: de andre agenter, hvad de laver, og hvordan deres arbejdsgange kører. Den overvåger også mine Git-repos, mine pipelines og de fejl, der opstår. Og så lærer den, hvordan jeg arbejder.

Steward fejer hen over systemet, noterer sig, hvad den ser, og kommer med et forslag. Godkend eller sig nej tak.

Steward “lever” bare i systemet. Når den ser noget, der kan tilføjes, ændres eller fjernes, foreslår den det, og jeg godkender med et klik. Hvis jeg beskriver, hvad jeg gerne vil se på forsiden, designer den endda selv en ny widget til mig.

Stewards side i Elma: forslag til en widget og et flow, hvad den har lært om mine vaner, systemets status og en liste over flows, der kan slås til og fra.
Steward i virkeligheden: forslag, det den har lært om mig, og et øje på hele systemet.

Fremtiden er skræddersyet

Jeg tror på, at den slags modulære systemer er fremtiden. Systemer, der er skræddersyet til dig, mig eller svigermor. Systemer, der “kender” dig og derfor ved, hvad der skal laves, måske før du selv gør.

AI er fedt. Og det bliver kun federe.