09/Documentation
Das SDK für persistente Agenten (experimentell)
Das npm-Paket @colliepwa/durable-sdk im Detail: Einstiegspunkte und Laufzeitumgebungen, openCollie, die Bereichsmethoden, die vier Fragetypen und requireApproval, Hooks, Verlauf, Berechtigungen, die Hilfsfunktionen, die Pi-Anbindung und die Versionen
Experimentell. Das Paket, seine API und das Protokoll, das es spricht, können sich in einer späteren Minor-Version ändern, oder die Funktion kann entfernt werden. Versionen beschreibt, was das für Ihren Durable Agent bedeutet.
@colliepwa/durable-sdk ist das npm-Paket, das ein Durable Agent nutzt, um sich über Collie auf Ihrem Smartphone anzuzeigen. Diese Seite führt alle Bestandteile auf. Persistente Agenten enthält die Schnellanleitung sowie die Einrichtung auf Collie-Seite, und Das Durable-Wire erklärt die Übertragung zwischen beiden.
Installation und Einstiegspunkte
Eine Installation liefert fünf Einstiegspunkte: den Root-Import für die meisten Durable Agents und vier für spezifischere Anforderungen.
npm install @colliepwa/durable-sdk@experimental
# or
bun add @colliepwa/durable-sdk@experimental| Import | was er enthält |
|---|---|
@colliepwa/durable-sdk | openCollie und die gesamte API. Unter Bun stellt es den Socket mit dem Bun-Server bereit, andernorts mit dem node:http-Server |
@colliepwa/durable-sdk/bun | Dieselbe API, immer mit dem Bun-Server |
@colliepwa/durable-sdk/node | Dieselbe API, immer mit dem node:http-Server, plus NO_DESCENDANT_CHECK, die Zeile, die es beim Start schreibt |
@colliepwa/durable-sdk/core | Das Layout und die Leitung als eine Funktion, handle(request), für einen langlebigen Agenten mit eigenem Transport. Kein Laufzeit-Import, läuft also überall dort, wo ein Web-Request läuft |
@colliepwa/durable-sdk/pi | Der Verbindungscode für einen langlebigen Agenten auf Basis von Pi Durable (Die Pi-Hilfsfunktionen) |
Das Paket erfordert Node 22.19 oder neuer oder Bun 1.4 oder neuer und hat keine Laufzeitabhängigkeit. ./pi erfordert @earendil-works/pi-durable, @earendil-works/pi-ai und @earendil-works/chord, 1.1 oder neuer und unter 2. Der Einstiegspunkt ist mit Pi Durable 1.1.0 und 1.2.0 getestet. Die drei sind optionale Peer-Abhängigkeiten: Ein langlebiger Agent, der ./pi nie importiert, installiert keine davon.
Die Laufzeitumgebung entscheidet, ob der langlebige Agent erkennen kann, wer antwortet. Die Nachfahrenprüfung verweigert Aktionen des langlebigen Agenten selbst oder eines von ihm gestarteten Prozesses mit 403 caller-refused. Sie deckt answer, send, stop, action, rename, close, reopen und starter ab. Lesezugriffe bleiben offen.
| Laufzeitumgebung | die Nachfahrenprüfung | was Sie setzen |
|---|---|---|
| Bun unter Linux | Standardmäßig aktiv. Bun liest die Prozess-ID des Aufrufers vom Socket | Nichts. callerCheck: "off" schaltet sie ab |
| Bun unter macOS oder jedem anderen System außer Linux | Kann nicht ausgeführt werden. Der Start schlägt mit einem Fehler fehl, der callerCheck nennt | callerCheck: "off" |
| Node, jedes System | Kann nicht ausgeführt werden: Node kann den Aufrufer eines Sockets nicht lesen. Der langlebige Agent schreibt beim Start eine Zeile, die dies mitteilt | Nichts. callerCheck wird nicht gelesen |
Ohne die Prüfung kann jeder Prozess Ihres Benutzers eine Karte beantworten, einschließlich eines vom Agenten ausgeführten Werkzeugs. Führen Sie die Werkzeuge des Agenten in einer Sandbox aus, die den Socket nicht erreichen kann. Der Socket erfordert ein System mit Dateieigentümern; unter Windows bricht openCollie daher beim Start ab. Ein langlebiger Agent stellt dort stattdessen ./core hinter TLS mit einem Token bereit (Zwei Wege, einen langlebigen Agenten zu erreichen).
Verbindung öffnen
openCollie erstellt den privaten Socket, und das zurückgegebene Handle bestimmt das Layout der Smartphone-Anzeige.
import { openCollie } from "@colliepwa/durable-sdk";
const collie = await openCollie({ hostName: "desk" });
const space = collie.workspace("support", { title: "Support" });
const tab = space.tab("main", { title: "Tickets" });
const pane = tab.pane("ticket-1", { title: "Maria Lopez", harness: "desk" });
collie.ready();Ohne die Option socket stammt der Pfad aus COLLIE_DURABLE_SOCKET, der Variable, die auch Collie liest.
| Option | Funktion | Standard |
|---|---|---|
socket | Der Socket-Pfad: absolut, maximal 103 Bytes. Sein Ordner wird mit Modus 0700 erstellt oder muss Ihnen bereits mit Modus 0700 gehören | Die Variable COLLIE_DURABLE_SOCKET. Ist keine gesetzt, schlägt der Start fehl |
hostName | Der eigene Name des langlebigen Agenten in seinem Hello, gekürzt auf 64 Bytes. Erforderlich | Keine |
tailLimit | Wie viele Rohereignisse jeder Bereich für die Lesezugriffe von Collie vorhält | 500, maximal 1000 |
caps | Was der langlebige Agent laut eigener Angabe kann (Fähigkeiten) | Alles, was das SDK kann |
callerCheck | descendant oder off. Wird nur unter Bun gelesen | descendant |
hooks | Ein benannter Ort für jeden Vorgang, den das Telefon sendet (Hooks und Verlauf) | Keine |
warn | Wohin das SDK seine einzeiligen Notizen schreibt, beispielsweise über ein Collie, das eine andere Wire-Version verwendet | console.warn |
onRename | Veraltet. Der alte Name von hooks.onRename, für ein Release beibehalten, ohne die Anfrage-ID | Keine |
Zwei weitere Optionen existieren nur bei createCore, nicht bei openCollie: receipts und allowAlways (Fragen).
| auf dem Handle | Beschreibung |
|---|---|
address | Der Socket-Pfad, auf dem gelauscht wird |
epoch | Neu und zufällig bei jedem Start, 128 Bit |
core | Der Kern hinter dem Socket. Ein Test oder ein zweiter Transport ruft core.handle direkt auf |
workspace(id, { title, cwd? }) | Ein Arbeitsbereich, einmal pro ID erstellt. Sein tab(id, { title }) liefert einen Tab und das pane(id, options) des Tabs einen Bereich |
starters(list) | Was das Telefon über die Neu-Seite starten kann, maximal 50. Jeder Eintrag ist { id, label, run }, und run löst sich zu { paneId } des angezeigten Bereichs auf |
history(provider) | Die eigenen Aufzeichnungen des dauerhaften Agenten über seine Konversationen ausliefern (Hooks und Verlauf) |
ready() | Einmal aufrufen, sobald jeder Bereich angezeigt wird, und nach einem Neustart, sobald jede offene Anfrage erneut gestellt wurde. Bis dahin antwortet jede Route außer hello mit 503 starting |
close() | Den Server stoppen. Antworten, die bereits unterwegs sind, werden noch gesendet, höchstens 2 s lang; danach wird die Socket-Datei entfernt |
close() lässt offene Anfragen absichtlich offen: Ein Herunterfahren ist keine Antwort, und der dauerhafte Agent entscheidet, was mit der darauf wartenden Arbeit geschieht.
tab.pane(id, { title, harness, cwd?, sessionId? }) gibt den Bereich mit dieser ID zurück, falls vorhanden, sodass ein dauerhafter Agent eine Konversation zweimal ohne zweiten Bereich anzeigen kann. Titel werden auf 256 Bytes gekürzt und harness auf 64. cwd ist ein absoluter Pfad, andernfalls wird er weggelassen.
Jede ID folgt der ID-Regel: 1 bis 128 Bytes, kein Steuerzeichen, kein Leerraum und keines von /, ? oder #. Eine ungültige ID ist ein TypeError. Eine Arbeitsbereichs- oder Tab-ID darf : nicht enthalten, da das Wire einen Tab als <workspace>:<tab> benennt.
Bereiche
Ein Bereich entspricht einer Konversation, und seine Methoden legen fest, was das Telefon dafür anzeigt.
| Methode | was das Telefon anzeigt | Limit |
|---|---|---|
state(s) | working, waiting oder idle. Eine Änderung an working beginnt einen neuen Zug | Solange eine Anfrage offen ist, zeigt der Bereich waiting an |
event(e) | Chat-Elemente: Ereignisse für item, remove, settled, reset und synced | Siehe die Elementtabelle unten |
subtitle(text) | Eine Zeile unter dem Titel. null leert sie | 120 Zeichen |
badge(value) | { count } oder { text } neben dem Titel. null leert das Feld | Ein Zähler von 0 bis 9999, ein Text aus 12 Zeichen |
progress(value) | { kind: "steps", steps } oder { kind: "percent", value, label? }, gezeichnet während der Bereich arbeitet oder wartet. null leert die Anzeige | 12 Schritte, jede Beschriftung 60 Zeichen, ein Wert von 0 bis 100 |
actions(list) | Schaltflächen im Bereich des persistenten Agenten auf dem Band: { id, label, icon?, busy?, disabled? }. null leert sie | 4 Schaltflächen, eine Beschriftung von 16 Zeichen |
onAction(fn) | Führt ein Antippen einer dieser Schaltflächen aus. Geben Sie false zurück, um es abzulehnen | Das Telefon sendet kein Antippen für eine Schaltfläche mit busy oder disabled |
onSend(fn) | Akzeptiert den Text des Telefons als fn(text, { steer, requestId }) | 32 KiB Text |
onAbort(fn) | Akzeptiert Stop als fn({ requestId }) | Keine |
ask(input, { signal? }) | Eine Fragekarte (Fragen) | 50 offene Anfragen pro Bereich |
updateAsk, decideAsk, outcomeOf | Eine Anfrage ändern, entscheiden oder zurücklesen (Fragen) | Keine |
close() | Entfernt den Bereich aus dem Layout. Seine offenen Anfragen schließen als gestoppt | Keine |
Ein Bereich hat außerdem vier schreibgeschützte Felder: id, sessionId, turnId (der laufende Durchlauf oder der letzte) und openAsks. Das icon einer Aktion ist eines von play, pause, check, x, refresh, archive, flag, star, send, note, search und more. Ein anderer Name zeichnet kein Symbol.
Ein item-Ereignis überträgt ein Element mit einer id und einem optionalen ts. Ein Element mit einer bekannten ID ersetzt das frühere Element an Ort und Stelle.
| Art | was er enthält | Limit |
|---|---|---|
user | Eine Zeile, die die Person gesendet hat. requestId benennt den Sendevorgang, aus dem sie stammt, sodass das Telefon seine eigene Zeile dagegen austauscht | 64 KiB Text |
reply, thinking, notice | Die Worte des Agenten | 64 KiB Text |
markdown | Text, den das Telefon als Markdown darstellt: Überschriften, Listen, Hervorhebungen, Code-Abschnitte und Links | 32 KiB Text |
code | Ein Codeblock mit lang wie ts | 32 KiB Text. lang besteht aus 1 bis 24 Buchstaben, Ziffern oder _ + # . - |
link | Ein href und ein optionales label | href ist nur https://, maximal 2048 Zeichen. label ist 120 Zeichen lang |
tool | Ein Werkzeugaufruf: tool: { kind: "other", name, summary, output? } und ein status von running, done, failed oder denied | name 128 Bytes, summary 1 KiB, output 16 KiB |
Ein reply-, thinking-, notice- oder markdown-Element darf partial: true tragen, während sein Text wächst. Schreiben Sie dieselbe ID erneut, während er wächst, höchstens alle 250 ms, danach noch einmal mit dem finalen Text und ohne partial, bevor der Bereich working verlässt.
Text oberhalb des Limits wird abgeschnitten, und Steuerzeichen sowie unsichtbare Zeichen werden entfernt. Ein ungültiges lang, ein ungültiges href, ein ungültiges Badge oder ein ungültiger Fortschritt wird stattdessen zu einem TypeError oder einem RangeError, da Collie es sonst verwerfen würde. Ein persistenter Agent darf ask-, ask-closed- oder state-Ereignisse nicht selbst anhängen: ask() und state() schreiben diese.
Fragen
pane.ask zeigt eine Karte an und löst mit der Antwort auf, und requireApproval fragt nach einem Werkzeugaufruf in einer einzelnen Zeile.
import { requireApproval } from "@colliepwa/durable-sdk";
const args = { order: "5521", amount: 40 };
const approval = await requireApproval("refund", args, {
pane,
toolCallId: "call-1",
timeoutMs: 10 * 60_000,
});
if (!approval.approved) throw new Error(`refund not approved: ${approval.decidedBy}`);requireApproval(toolName, args, options) erstellt die Karte anhand des Aufrufinhalts, niemals anhand der Worte des Modells darüber. Der Titel lautet "refund wants to run", die Werkzeugzeile ist refund(order: "5521", amount: 40), die Push-Nachricht lautet "refund needs a yes", und die Schaltflächen sind Allow und Deny. Es gibt { approved, decidedBy, decidedAt, askId } zurück. Ablehnung, Zeitüberschreitung, Stopp und Abbruch geben alle approved: false zurück.
Option von requireApproval | Funktion | Standard |
|---|---|---|
pane | Der Bereich, der anfragt. Erforderlich | Keine |
toolCallId | Die eigene ID des Tool-Aufrufs, über einen Neustart hinweg dieselbe. Eine beliebige Zeichenkette: Eine, die die ID-Regel verletzt, wird sicher gemacht | Erforderlich |
itemId | Das Element, unter dem sich die Karte befindet | Die ID des Tool-Aufrufs |
timeoutMs | Wie viel Zeit das Telefon hat. Nach Ablauf wird der Aufruf verweigert, entschieden von timeout | Keine Begrenzung |
signal | Ein AbortSignal. Ein Abbruch verweigert den Aufruf, entschieden von program | Keine |
labels | Der Text der beiden Schaltflächen, { allow?, deny? } | Erlauben und Verweigern |
callSummary(name, args) und argumentsView(args) sind die beiden Teile, die es verwendet: der Aufruf in einer Zeile und die Argumente als key: value-Paare mit jedem Wert als JSON.
pane.ask(input) akzeptiert eine von vier Arten. Das Promise wird mit der Antwort in der Form der Art aufgelöst.
kind | Was die Karte anzeigt | die Antwort | Limit |
|---|---|---|---|
permission | Eine Schaltfläche pro Option, jeweils mit einer effect: allow, allow-always, deny oder cancel | { optionId, note? } | 1 bis 6 Optionen |
choice | Eine Schaltfläche pro Option. Mit multiple: true wählt die Person mehrere aus | { optionIds } | 1 bis 8 Optionen |
text | Ein Textfeld mit einem optionalen placeholder | { text } | maxLength von 1 bis 2000, Standardwert 500. Der Platzhalter umfasst 60 Zeichen |
form | 1 bis 6 Felder, jeweils von der Art text, choice oder toggle, manche required | { values }, indiziert nach Feld-ID | Ein Auswahlfeld hat 1 bis 8 Optionen |
Jede Art akzeptiert toolCallId, itemId und title (256 Bytes). Sie kann reason (2 KiB), tool, push: { title?, line? } (60 und 120 Zeichen, der Text der Benachrichtigung) und expiresAt (ein Date oder eine ISO-8601-Zeichenkette mit Zeitzone) akzeptieren.
Lassen Sie id weg. Das SDK leitet es mit askIdFor(paneId, toolCallId) ab: SHA-256 über die beiden IDs, die ersten 32 Hex-Zeichen. Derselbe nach einem Neustart erneut ausgelöste Tool-Aufruf erhält daher dieselbe ID, und eine Antwort, die das Telefon über den Neustart hinweg gesendet hat, kommt an. Das Auslösen einer bereits offenen ID ist ein TypeError.
| im Bereich | Funktion |
|---|---|
updateAsk(askId, patch) | Ändert eine offene Anfrage direkt vor Ort: title, reason, tool, options, placeholder, maxLength oder fields. Ihre Revision erhöht sich um eins, sodass eine Antwort auf das alte Formular 409 stale erhält und das Telefon ein erneutes Antippen verlangt. False, wenn die Anfrage nicht offen ist |
decideAsk(askId, answer?) | Der Durable Agent hat die Anfrage selbst entschieden, an anderer Stelle als auf dem Telefon. Mit answer löst sich das wartende ask() damit auf. Ohne wird es mit AskClosed abgelehnt. Ein späteres Antippen auf dem Telefon erhält 409 decided, und die Karte meldet „Im Durable Agent entschieden“. False, wenn die Anfrage nicht offen ist |
outcomeOf(askId) | Die erste Entscheidung: { decidedBy, decidedAt, optionId?, effect? }. Der Bereich merkt sich seine letzten 500. Undefined für eine Anfrage, die er nie ausgelöst oder die er vergessen hat |
decidedBy ist phone, program oder timeout. Eine Anfrage überschreitet ihr expiresAt und schließt als entschieden von timeout: ask() schlägt fehl mit AskClosed, dessen decidedBy timeout ist. Die Karte zeigt die verbleibende Zeit bis dahin an. Eine Frage, die abgelaufen ist oder im Durable Agent entschieden wurde, hinterlässt eine Zeile im Chat, wie etwa „Vor einer Antwort abgelaufen: refund möchte ausgeführt werden“.
Ein abgebrochenes signal, pane.close() und ein Schließen vom Telefon schließen die Anfrage als entschieden von program, und ask() schlägt fehl mit AskClosed.
Achtung. Eineallow-always-Option lässt nach einer einzigen Antwort jeden späteren Aufruf durch. Über https ist das Token das einzige Zugangstor, daher bietet ein Durable Agent dort nur Erlauben und Verweigern an.createCoremitallowAlways: falsemacht eineallow-always-Option zu einemTypeError. Das Telefon bietet keinallow-alwaysbei einer Anfrage an, deren Text gekürzt oder bereinigt wurde oder die kein Tool benennt.
Jede Aktion des Telefons enthält eine Anfrage-ID, und der Core behält deren Beleg: Eine Wiederholung führt nichts aus und erhält die erste Antwort erneut mit replayed: true. Der Standard-MemoryReceiptStore behält die neuesten RECEIPTS_PER_GROUP (1000) pro Bereich sowie pro Gruppe für Starter, Umbenennungen, Schließungen und Wiederöffnungen. Eine Wiederholung einer ID, die er verworfen hat, erhält 500 receipt-dropped und führt nichts aus. Der Speicher verschwindet mit dem Prozess.
Um Belege über einen Neustart hinweg zu behalten, schreiben Sie einen ReceiptStore mit get(requestId) und put(requestId, record, group) und übergeben Sie ihn an createCore als receipts. openCollie behält sie immer im Arbeitsspeicher.
Hooks und Verlauf
Ein Hook ist der einzige benannte Ort für eine Aktion, die das Telefon sendet, und ein Verlaufsprovider liefert Ihren eigenen Datensatz aus.
| Hook | wann er ausgeführt wird | wie er ablehnt |
|---|---|---|
onSend(pane, { text, steer, turnId, requestId }) | Text für einen Bereich ohne pane.onSend | Ausnahme: 500 internal, ein unbekanntes Ergebnis für das Telefon |
onAbort(pane, { turnId, requestId }) | Stopp für einen Bereich ohne pane.onAbort | Ausnahme, wie oben |
onAction(pane, { actionId, turnId?, requestId }) | Ein Klick auf die Gürtelleiste in einem Bereich ohne pane.onAction | Rückgabe false: 422 action-refused |
onRename({ kind, id, title }, requestId) | Ein neuer Titel für einen Arbeitsbereich oder einen Tab | Rückgabe false: 422 rename-refused |
onClose({ kind, id, paneIds }, requestId) | Das Telefon schließt einen Bereich, einen Tab oder einen Arbeitsbereich | Rückgabe false: 422 close-refused |
onReopen({ id, paneId? }, requestId) | Das Telefon öffnet eine geschlossene Konversation wieder | Rückgabe false: 422 reopen-refused |
Ein Hook wird nur ausgeführt, wenn seine Cap aktiviert und seine Anfrage-ID neu ist. Eine Ablehnung speichert nichts, daher kann dieselbe Anfrage-ID einen erneuten Versuch starten. Die Handler pro Bereich haben Vorrang vor einem Hook. Ein Bereich mit keinem von beiden antwortet mit 409 not-supported auf ein Senden, einen Stopp oder einen Klick.
Das SDK wendet eine akzeptierte Aktion selbst an. Eine Umbenennung setzt den Titel. Ein Schließen entfernt das Ziel samt Inhalt und schließt dessen offene Anfragen als gestoppt. Ein Wiederöffnen ohne Hook stellt einen Bereich wieder her, den dieser Prozess geschlossen hat; eine vor einem Neustart geschlossene Konversation benötigt onReopen. Das Layout wird bei jedem Start neu erstellt. Ein langlebiger Agent, dessen Titel oder Schließung den Prozess überdauern soll, speichert dies daher in seinem Hook.
collie.history(provider) liefert jede Konversation, offen wie geschlossen, aus dem eigenen Speicher des langlebigen Agenten aus. Es aktiviert die history-Cap, wenn caps weggelassen wird oder history: true benennt.
HistoryProvider | gibt zurück |
|---|---|
list(after, limit) | { items, next? }: Konversationszeilen, neueste zuerst, maximal limit (100) |
items(id, after, limit) | { items, next? }: die Einträge der Konversation, älteste zuerst, jeweils in der neuesten Version, maximal limit (1000). undefined bei einer unbekannten ID |
Eine Zeile ist { id, title, subtitle?, workspaceId?, tabId?, startedAt, endedAt?, state, items }, mit state open oder closed und items als Anzahl. Ein Cursor (after, next) ist Ihre eigene Zeichenkette, 1 bis 512 Byte druckbares ASCII ohne Leerzeichen. Ein fehlendes next beendet die Liste.
Sobald ein Provider gesetzt ist, entspricht sessionId jedes Bereichs dessen Bereichs-ID, und der Verlauf liefert die Konversation des Bereichs darunter aus. Übergeben Sie sessionId an tab.pane(), um eine andere ID anzugeben, oder null, wenn sie über einen Neustart hinweg nicht gleich bleiben kann.
tailLimit ist kein Verlauf. Es ist das reine Protokollende, das jeder Bereich für Collies Ereignisabfragen behält, standardmäßig 500 Ereignisse. Ein Leser, der dahinter zurückgefallen ist, erhält stattdessen die gesamte aktuelle Ansicht des Bereichs, maximal die neuesten 2000 Einträge.
Fähigkeiten
Eine Cap besagt, dass der langlebige Agent eine bestimmte Sache ausführen kann, und das Telefon stellt ein Steuerelement nur für eine Cap dar, die der langlebige Agent deklariert hat.
| Obergrenze | was der langlebige Agent entgegennimmt |
|---|---|
asks | Stellt Fragen und nimmt Antworten entgegen |
starters | Listet Starter auf und führt einen über die Seite „Neu“ aus |
send | Nimmt Text vom Telefon entgegen |
steer | Nimmt Text in einen laufenden Zug auf. Benötigt send |
abort | Stoppt einen laufenden Durchlauf |
rename | Akzeptiert einen neuen Titel für einen Arbeitsbereich oder einen Tab |
close | Schließt einen Bereich, einen Tab oder einen Arbeitsbereich |
actions | Listet Gürtelschaltflächen in einem Bereich auf und führt eine davon aus |
history | Stellt seine Unterhaltungen bereit, offene und geschlossene |
reopen | Zeigt eine geschlossene Unterhaltung wieder an |
Wird er weggelassen, schaltet caps alles ein, was das SDK unterstützt, und history, sobald history() einen Provider hat. Wird er angegeben, gilt die vollständige Liste: Eine Funktionseinschränkung (Cap), die er nicht nennt, ist deaktiviert; { asks: true } deklariert somit allein Anfragen. Um eine zu deaktivieren und den Rest zu behalten, wenden Sie Spread auf ALL_CAPS an: { ...ALL_CAPS, steer: false }. Eine Route mit deaktivierter Funktionseinschränkung antwortet mit 409 not-supported. terminal ist immer false.
Hilfsfunktionen und Konstanten
Der Root-Import exportiert auch die Bausteine, aus denen openCollie besteht, und die Regeln, die es anwendet.
| Exportieren | Beschreibung |
|---|---|
createCore(options) | Der Kern ohne Server. Er übernimmt die openCollie-Optionen mit Ausnahme von socket und callerCheck, zuzüglich receipts und allowAlways. Er gibt epoch, workspace, starters, history, ready, isReady und handle(request) zurück. |
handle | Die Übertragung als einzelne Funktion: ein Web-Request hinein und ein Response heraus. core.handle(request) ist der reguläre Einstiegspunkt. |
wireListener(core) | core.handle als ein node:http-Anfrage-Listener, mit drained() für ein sauberes Schließen |
hello, versionLine | Die Hello-Antwort und die einzelne Zeile, die ein persistenter Agent bei einer Versionsablehnung schreibt |
mintId() | Eine neue zufällige ID, 128 Bit als 32 Hex-Zeichen |
askIdFor(paneId, toolCallId) | Die abgeleitete Anfrage-ID |
AskClosed | Der Fehler, mit dem ask() abweist, wenn keine Antwort eingegangen ist. Er enthält by und decidedBy. |
idOk(id), assertId(id, what), safeId(raw) | Die ID-Regel: eine Prüfung, eine Prüfung mit Fehlerauslösung und eine sichere ID, die deterministisch aus einer beliebigen Zeichenkette erzeugt wird |
cursorOk(cursor) | Die Verlaufszeiger-Regel |
cut(text, max, multiline?) | Eine Zeichenkette bereinigen und auf max Bytes kürzen, mit … am Ende |
hrefOf, langOf, badgeOf, progressOf | Ein Linkziel, eine Codesprache, ein Badge und ein Fortschritt, geprüft gemäß den Kriterien des Bereichs |
subtitleOf, pushTextOf, renameTitleOf | Ein Untertitel, die Push-Begriffe einer Anfrage und ein Umbenennungstitel, bereinigt und gekürzt |
CAPS, LIMITS | Jedes Limit pro Feld in Bytes und jedes Limit pro Liste |
ACTION_LABEL_MAX, BADGE_TEXT_MAX, BADGE_COUNT_MAX | 16, 12 und 9999 |
SUBTITLE_MAX, LINK_LABEL_MAX, RENAME_TITLE_MAX | Jeweils 120 Zeichen |
PROGRESS_STEPS_MAX, PROGRESS_LABEL_MAX | 12 Schritte, 60 Zeichen |
PUSH_TITLE_MAX, PUSH_LINE_MAX, PLACEHOLDER_MAX | 60, 120 und 60 Zeichen |
ANSWER_TEXT_MAX, ANSWER_TEXT_DEFAULT, ANSWER_TEXT_BYTES | 2000 und 500 Zeichen sowie 8000 Bytes |
ALL_CAPS, PROTOCOL_RANGE, SOCKET_ENV | Jede Funktionseinschränkung aktiv, die Übertragungsversionen, die das SDK beherrscht, und der Name COLLIE_DURABLE_SOCKET |
MemoryReceiptStore, RECEIPTS_PER_GROUP | Der Standard-Empfangsbestätigungsspeicher und seine 1000 pro Gruppe |
Jeder Typ auf der Leitung und jede Hook-Nutzlast wird ebenfalls exportiert, aus src/core/types.ts.
Die Pi-Hilfsfunktionen
./pi wandelt eine Pi-Durable-Unterhaltung in einen Bereich um, einen riskanten Werkzeugaufruf in eine Karte und den Pi-Speicher in den Verlauf.
| Exportieren | Funktion |
|---|---|
showConversation(loc, harness, conversation, o) | Zeigt eine Unterhaltung als Bereich an, zuerst den Verlauf, dann Live-Ereignisse. Senden geht mit der Anfrage-ID an submit von Pi und Stopp an dessen Abbruch. Kann gefahrlos zweimal aufgerufen werden |
PaneRegistry | Welcher Bereich welche Unterhaltung anzeigt. Nach einem Neustart wartet reRaised(risky), bis jeder riskante Aufruf ohne Ergebnis erneut nachgefragt hat, sodass ready() nach den Nachfragen kommt |
riskGuard({ panes, risky, words?, timeoutMs?, onTimeout? }) | Eine Pi-Erweiterung, deren Hook beforeTool einen Aufruf an ein Werkzeug in risky in eine Erlauben- und Ablehnen-Karte umwandelt. Ein abgelehnter Aufruf wird blockiert. Mit timeoutMs läuft die Karte ab, ein von niemandem beantworteter Aufruf wird blockiert und onTimeout(tool, title) lässt den Durable-Agenten dies protokollieren |
askTools({ panes, words, timeoutMs?, onTimeout? }) | Die zwei Nachfrage-Werkzeuge des Support-Desks: ask_queue, eine Auswahl, und ask_customer, eine Textnachfrage. Mit timeoutMs läuft eine unbeantwortete Nachfrage ab und das Werkzeug gibt "timed out" zurück |
spawnHelperTool(o) | Das Werkzeug spawn_helper: eine untergeordnete Unterhaltung, die als neuer Bereich angezeigt wird und die Antwort des Helfers zurückgibt |
piHistory({ harness, panes, describe }) | Ein HistoryProvider, der jeden Eintrag jeder Pi-Unterhaltung liest |
firstMessageOf(conversation) | Der Text der ersten Nachricht einer Unterhaltung, um ihren Bereich zu benennen |
paneIdOf(id), conversationOfPaneId(paneId) | Die Bereichs-ID einer Pi-Unterhaltung, conv-<id>, und zurück |
summaryOf(args, name?) | Die Argumente eines Werkzeugaufrufs in Worten, maximal 200 Zeichen |
Mapper | Pi-Einträge und Agenten-Ereignisse als Elemente. Eine wachsende Antwort behält eine Element-ID |
PARTIAL_MS, RE_RAISE_MS | 250 ms zwischen zwei Schreibvorgängen einer wachsenden Antwort und die 5000 ms, die reRaised maximal wartet |
ESCALATED | Beispiel-Vokabular: der Hinweis des Support-Desks für die Eskalieren-Schaltfläche, die showConversation mit escalate: true hinzufügt |
ASKING_TOOLS | Beispiel-Vokabular: die Namen der beiden Nachfrage-Werkzeuge des Support-Desks |
Submit, ReplyExtras | Die Typen eines benutzerdefinierten submit und der Elemente, die ein Durable-Agent unter einer fertigen Antwort hinzufügt |
Die Wörter, die eine Karte anzeigt, werden als Optionen übergeben, daher enthält ./pi keinen Text des Beispiels außer diesen beiden Konstanten. Es wurde für Pi Durable 1.1.0 geschrieben. Der Support-Desk in examples/durable-member/ setzt alle Teile zusammen.
Versionen
Das Paket hat eine eigene Version, unabhängig von der von Collie, und nennt die Leitungsversion, die es spricht.
| heute | Bedeutung | |
|---|---|---|
SDK_VERSION | 0.1.0 | Die Paketversion. Bis das Paket das dist-tag experimental verlässt, kann ein Minor-Release die API ändern |
WIRE_VERSION | 1 | Die Durable-Leitungsversion, die das Paket spricht |
Collie spricht eine Leitungsversion und akzeptiert die vorherige für ein Minor-Release nach der Veröffentlichung einer neuen. Wenn ein Collie keine Ihrer Versionen spricht, schreibt der Kern eine Zeile über warn, einmal pro Version, zum Beispiel collie: Collie speaks wire v2, this durable agent speaks v1. Update the agent's SDK, or Collie. Das Telefon meldet die Abweichung auf der Startseite des Durable-Agenten mit Collies eigenen Worten. Aktualisieren Sie die ältere Seite.
Das Paket wird unter dem npm-dist-tag experimental veröffentlicht, niemals unter latest. Wenn die Durable-Leitung bei das Beenden eingestellt wird, wird das Paket als veraltet markiert (ADR 0105).
Diese Seite auf GitHub bearbeiten