Loading blog posts...
Loading blog posts...
Laden...

Pi Durable kan een agent helpen om na een heruitrol het werk te hervatten. Maar een opgeslagen gespreksgeschiedenis voorkomt niet dat de agent dezelfde factuur twee keer verstuurt.
In het kort
harness.resume aan.replay: 'safe' als herhaald uitvoeren geen kwaad kan.Stel: een agent is al 40 minuten bezig met een onderhoudstaak. Hij heeft een repository onderzocht, een plan vastgelegd en een uitrol gestart wanneer zijn container wordt vervangen. De gespreksgeschiedenis laat misschien zien wat de agent van plan was, maar voor herstel moet ook duidelijk zijn welk werk is afgerond, welke statuswijzigingen zijn vastgelegd en of die uitrol daadwerkelijk heeft plaatsgevonden.
Pi Durable biedt hiervoor persistente opslag en uitvoeringsmechanismen. De library verscheen tegelijk met Pi 1.0 en is gemaakt door de ontwikkelaars van de Pi coding agent, die nu onder Earendil valt. U bouwt er een applicatie omheen, met afzonderlijke bouwstenen voor de gespreksgeschiedenis, de applicatiestatus en onafgerond werk:
| Bouwsteen | Wat deze bevat of coördineert | Praktisch doel |
|---|---|---|
| Harness | Opslag, commits en planning | Coördineert uitvoering en herstel |
| Conversation | Gebruikersberichten, antwoorden van de assistent en toolresultaten | Bewaart de gespreksgeschiedenis |
| Task | Een werkeenheid met checkpoints | Houdt een modelbeurt, toolaanroep of aangepaste workflowstap bij |
| Document | Getypeerde JSON-applicatiestatus, gedefinieerd met defineDoc | Slaat gestructureerde voortgang buiten de gespreksgeschiedenis op |
| Submission | Een identificeerbaar stuk invoer | Laat aanroepers na een herstart eerder ingediend werk terugvinden en opnieuw op het resultaat wachten |
Een commit kan gespreksitems, Document-wijzigingen, nieuwe Tasks en Submission-updates samen vastleggen. Zo treft het herstelproces geen vastgelegde beslissing aan zonder de bijbehorende wijziging in de applicatiestatus. Die garantie houdt op bij de opslaggrens: een databasecommit en het afleveren van een externe e-mail kunnen hiermee niet als één ondeelbare bewerking worden uitgevoerd.
Begin met de pakketten uit de officiële repository:
bashnpm install --save-exact @earendil-works/pi-durable @earendil-works/pi-ai @earendil-works/chord
De optie --save-exact legt de exacte versies van directe afhankelijkheden vast. Neem zowel package.json als uw lockfile op in versiebeheer: Pi Durable is experimenteel en de API kan veranderen. Gebruik de actuele voorbeelden uit de repository voor de volledige applicatie; ga niet gokken welke argumenten constructors verwachten.
De opstartprocedure moet deze stappen doorlopen:
openNodeSqliteStorage('./agent.sqlite'), geïmporteerd uit @earendil-works/pi-durable/storage/sqlite/node.Harness.open.harness.resume aan voordat u nieuwe invoer accepteert.root.submit.Na een herstart moet de applicatie opgeslagen werk hervatten, niet het oorspronkelijke verzoek als een nieuwe taak indienen.
Geef bij een triage-agent die op webhooks reageert een stabiele requestId, zoals job-42, mee met de indiening. Volgens de documentatie en voorbeelden van Pi Durable levert een nieuwe poging met datzelfde ID de bestaande Submission op. Gebruik waar mogelijk de stabiele identificatie van het binnenkomende event. Als u voor elke afleverpoging een nieuwe identificatie genereert, werkt deduplicatie niet.

Een beheeragent heeft verschillende herstelregels nodig voor tools die configuratie uitlezen, de uitrolstatus controleren of een uitrol starten.
| Toolactie | Keuze voor herhaling | Reden |
|---|---|---|
| Een configuratiebestand lezen | Markeer met replay: 'safe' als herhaald lezen geen kwaad kan | Opnieuw lezen verandert het systeem niet |
| De uitrolstatus opvragen | Markeer met replay: 'safe' als het endpoint alleen-lezen is | Een nieuwe statuscontrole kan helpen bij herstel |
| Een uitrol starten | Laat ongemarkeerd | De vorige aanroep kan de uitrol al hebben gestart |
| Een factuur versturen | Laat ongemarkeerd | Herhaling kan een dubbele externe actie veroorzaken |
Met defineTool maakt Pi Durable de veiligheid van herhaling tot een expliciete keuze. Een onderbroken tool die als veilig is gemarkeerd, kan opnieuw worden uitgevoerd. Bij een ongemarkeerde tool meldt de harness de onderbreking aan het model, zoals beschreven in de officiële aankondiging.
Dat is een verstandige standaard. Een proces kan wegvallen nadat een externe dienst een verzoek heeft geaccepteerd, maar voordat de agent het resultaat vastlegt. De uitkomst is dan onzeker.
Waarschuwing
De requestId van een Submission dedupliceert gespreksinvoer. Deze zorgt er niet voor dat externe acties precies één keer plaatsvinden. Gebruik voor betalingen, e-mails of uitrollen het idempotentiemechanisme van de aanbieder, of controleer het externe resultaat voordat u het opnieuw probeert.
Een idempotentiesleutel is een stabiele identificatie waarmee een dienst herhaalde verzoeken voor dezelfde bewerking kan herkennen. Houd die identificatie bij elke nieuwe poging gelijk.
Een Document kan voltooide acties en externe bewerkings-ID's bijhouden. Toch blijft er een kwetsbaar moment tussen het slagen van een externe actie en het lokaal vastleggen van de voltooiing. Voor herstel is een manier nodig om de uitkomst bij de aanbieder op te vragen of die onzekerheid anders weg te nemen.
Kies voor een beheeragent bij voorkeur een workflow die een uitrol start, het externe bewerkings-ID bewaart en de status afzonderlijk controleert. Is door een onderbreking niet bekend of de uitrol is gestart? Vereis dan verificatie of goedkeuring voordat de agent het opnieuw probeert.
Een container die ./agent.sqlite naar zijn tijdelijke bestandssysteem schrijft, verliest zijn persistente status zodra dat bestandssysteem verdwijnt. Zet het bestand op een persistent volume voordat u herstel gaat testen.
De officiële repository beveelt SQLite aan voor agents die langdurig draaien. Kies alleen een andere backend als daar een concrete eis voor is; een embedded database is niet per definitie te beperkt.
| Backend | Geschikt voor | Beperking |
|---|---|---|
| Memory | Tests en eenmalige uitvoeringen | De status verdwijnt zodra het proces stopt |
| SQLite | Langdurig draaiende agents | Vereist persistente opslag, back-ups en één proces als eigenaar |
| JSONL | Kleine geschiedenissen die u handmatig wilt bekijken | Houdt de volledige geschiedenis in het geheugen |
| Eigen opslagimplementatie | Een backend die uw infrastructuur vereist | U bent verantwoordelijk voor implementatie en validatie |
JSONL slaat één JSON-record per regel op. Dat leesbare formaat is handig, maar doordat de geschiedenis in het geheugen blijft, is het geen goede standaardkeuze voor een agent die onbeperkt blijft groeien. De library biedt ook een kleine opslaginterface, conformiteitstests en benchmarks voor eigen implementaties. Die helpen om een adapter te valideren; ze maken een beoogde Postgres- of key-value-backend niet automatisch productierijp.
Leg de regels voor de uitrol expliciet vast:
Pi Durable start het proces niet zelf opnieuw. Op een Linux-server is systemd met Restart=always een eenvoudige keuze; gebruik in containers een herstartbeleid en een aangekoppeld persistent volume. SQLite zorgt dat de databasegegevens bewaard blijven. Elk vervangend proces moet nog steeds harness.resume aanroepen.

Een coding agent die 's nachts doorwerkt, is een logische eerste toepassing. De officiële repository bevat daar al een klein voorbeeld van. Volg voor een gestructureerde planningsstatus het voorbeeld van de vakantieplanner en bewaar de voortgang in Documents.
De ingebouwde mogelijkheden en uitbreidingspunten voorzien in verschillende behoeften:
| Behoefte | Relevante API | Wat u zelf nog bepaalt |
|---|---|---|
| Lokale programmeertools | CodingTools en NodeExecutionEnv | Toegang tot het bestandssysteem, shellrechten en isolatie van de uitvoering |
| Toolbeleid | wrapTool | Logging, goedkeuringscontroles en aanroeplimieten |
| Uitbreidingen tijdens runtime | createRegistry, defineExtension en loadExtension | Welke wijzigingen veilig zijn terwijl er werk wordt uitgevoerd |
| Rechten per gesprek | thread.configure | Welke tools elk gesprek mag gebruiken |
| Contextbeheer | root.compact | Wanneer en hoe u de modelcontext verkleint |
| Live voortgang | thread.watch en thread.watchEvents | Gedrag van de gebruikersinterface en afhandeling van herverbindingen |
CodingTools, uit @earendil-works/pi-durable/tools, biedt tools voor lezen, schrijven, bewerken en bash. NodeExecutionEnv, uit @earendil-works/pi-durable/env/node, voert ze lokaal uit. De rechten van die tools zijn dus de rechten die u aan uw agent verleent.
Voor een gesprek over systeembeheer kan thread.configure({ tools: { remove: [deploy] } }) de toegang tot een uitroltool intrekken. Leg goedkeuringscontroles en auditregistratie vast in een toolwrapper. Vertrouw er niet op dat een prompt het beleid blijft bewaken.
Uitbreidingen kunnen tools, hooks, promptonderdelen via section, wrappers via wrapTool en aangepaste taken via defineTask toevoegen. Het gedocumenteerde patroon registry.install(await loadExtension('./ops.ts')) ondersteunt het laden van nieuwe uitbreidingscode terwijl de agent draait. Maar ook wijzigingen tijdens runtime verdienen hersteltests.
Het officiële voorbeeld voor contextcompactie gebruikt reserveTokens: 16384 en backgroundTokens: 32768. Compactie bepaalt wat in de context van het model terechtkomt, zonder de persistent opgeslagen geschiedenis weg te gooien.
Er zijn geen ingebouwde subagents. De voorbeelden laten zien hoe u er een als tool implementeert, waarbij api.createTask en api.waitForTask onderliggende taken ondersteunen.
Test een onderbreking van een uitrol nadat de externe dienst het verzoek heeft geaccepteerd, maar voordat de agent het resultaat opslaat. Dat is een betere test voor duurzaam herstel dan een inactief proces stoppen en controleren of de berichten weer verschijnen.
De officiële voorbeelden in packages/durable/test/examples zijn het beste startpunt: ze volgen de API nauwkeuriger dan een blogpost kan. Test daarmee uw gekozen workflow en voeg vervolgens storingen toe rond de externe effecten ervan.
Pi Durable past bij langdurige programmeertaken, gestructureerde planners, triage op basis van webhooks en beheerworkflows met expliciete herstelregels. Gebruik het niet voor eenmalige scripts, stateless chat of een team dat dit kwartaal een stabiele API nodig heeft.
U blijft zelf verantwoordelijk voor modeltoegangsgegevens, tools, de gebruikersinterface, back-ups en opschoning van de opslag, procesbewaking en beveiliging tegen ongewenste externe acties. De documentatie beschrijft ook hoe u de opslag aanpast voor Bun of een Cloudflare Durable Object; die integraties vereisen configuratie.

--save-exact en neem daarna package.json en het lockfile op in versiebeheer.requestId en controleer of dit de bestaande Submission oplevert.harness.resume het werk vanuit de persistente database hervat.packages/durable/test/examples.Pi Durable maakt het mogelijk om onderbroken werk te hervatten, maar de afspraken rond uw tools bepalen of dat veilig gebeurt. Begin met één agent met een afgebakende taak, persistente SQLite-opslag en een gerichte crashtest rond de meest risicovolle externe actie. Geef de agent pas meer autonomie als die test een verklaarbaar resultaat oplevert.