09/Documentation
Le SDK durable (expérimental)
Le paquet npm @colliepwa/durable-sdk, partie par partie : ses points d'entrée et ses environnements d'exécution, openCollie, les méthodes de panneau, les quatre types de questions et requireApproval, les hooks, l'historique, les capacités, les utilitaires, le connecteur Pi et les versions
Expérimental. Le paquet, son API et le protocole réseau utilisé peuvent changer, ou la fonctionnalité peut être supprimée, dans une version mineure ultérieure. Versions explique ce que cela implique pour votre agent durable.
@colliepwa/durable-sdk est le paquet npm qu'un agent durable utilise pour s'afficher sur votre téléphone via Collie. Cette page détaille chacun de ses composants. Agents durables contient le guide de démarrage rapide ainsi que la configuration côté Collie, et Le câble durable explique ce qui circule entre les deux.
Installation et points d'entrée
Une seule installation fournit cinq points d'entrée : l'import racine pour la plupart des agents durables, et quatre autres pour des besoins plus spécifiques.
npm install @colliepwa/durable-sdk@experimental
# or
bun add @colliepwa/durable-sdk@experimental| import | ce qu'elle contient |
|---|---|
@colliepwa/durable-sdk | openCollie et l'ensemble de l'API. Sur Bun, il gère la socket avec le serveur Bun, ailleurs avec le serveur node:http |
@colliepwa/durable-sdk/bun | La même API, toujours avec le serveur Bun |
@colliepwa/durable-sdk/node | La même API, toujours avec le serveur node:http, plus NO_DESCENDANT_CHECK, la ligne écrite au démarrage |
@colliepwa/durable-sdk/core | La disposition et la connexion en une seule fonction, handle(request), pour un agent durable qui fournit son propre transport. Aucun import d'exécution, il s'exécute donc partout où tourne un Request web |
@colliepwa/durable-sdk/pi | Le liant pour un agent durable construit sur Pi Durable (Les assistants Pi) |
Le paquet requiert Node 22.19 ou supérieur, ou Bun 1.4 ou supérieur, et ne possède aucune dépendance d'exécution. ./pi requiert @earendil-works/pi-durable, @earendil-works/pi-ai et @earendil-works/chord, version 1.1 ou supérieure et inférieure à 2. Le point d'entrée est testé avec Pi Durable 1.1.0 et 1.2.0. Les trois sont des peer dependencies optionnelles : un agent durable qui n'importe jamais ./pi n'en installe aucune.
L'environnement d'exécution détermine si l'agent durable peut identifier qui répond. La vérification de descendance refuse une action provenant de l'agent durable lui-même ou d'un processus qu'il a lancé, avec un code 403 caller-refused. Elle couvre answer, send, stop, action, rename, close, reopen et starter. Les lectures restent ouvertes.
| environnement d'exécution | la vérification de descendance | ce que vous définissez |
|---|---|---|
| Bun sur Linux | Activé par défaut. Bun lit l'identifiant de processus de l'appelant sur le socket | Rien. callerCheck: "off" le désactive |
| Bun sur macOS, ou tout autre système sauf Linux | Impossible à exécuter. Le démarrage échoue avec une erreur qui nomme callerCheck | callerCheck: "off" |
| Node, tout système | Impossible à exécuter : Node ne peut pas lire l'appelant d'un socket. L'agent durable écrit au démarrage une ligne qui l'indique | Rien. callerCheck n'est pas lu |
Sans cette vérification, n'importe quel processus de votre utilisateur peut répondre à une carte, y compris un outil exécuté par l'agent. Exécutez les outils de l'agent dans un bac à sable qui ne peut pas atteindre le socket. Le socket nécessite un système gérant les propriétaires de fichiers, donc sur Windows, openCollie s'arrête au démarrage. Un agent durable y sert plutôt ./core derrière TLS avec un jeton (Deux façons de joindre un agent durable).
Ouvrir une connexion
openCollie crée le socket privé, et le handle retourné définit la disposition affichée par le téléphone.
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();Sans l'option socket, le chemin provient de COLLIE_DURABLE_SOCKET, la variable que Collie lit également.
| option | description | valeur par défaut |
|---|---|---|
socket | Le chemin du socket : absolu, 103 octets au maximum. Son dossier est créé avec le mode 0700, ou doit déjà vous appartenir avec le mode 0700 | La variable COLLIE_DURABLE_SOCKET. Si aucune des deux n'est définie : le démarrage échoue |
hostName | Le nom propre de l'agent durable dans son hello, tronqué à 64 octets. Requis | Aucun |
tailLimit | Nombre d'événements bruts conservés par chaque panneau pour les lectures de Collie | 500, au maximum 1000 |
caps | Ce que l'agent durable déclare pouvoir faire (Capacités) | Tout ce que le SDK peut faire |
callerCheck | descendant ou off. Lu sur Bun uniquement | descendant |
hooks | Un emplacement nommé pour chaque acte envoyé par le téléphone (Hooks et historique) | Aucun |
warn | Où le SDK écrit ses notes d'une ligne, par exemple à propos d'un Collie utilisant une autre version de protocole | console.warn |
onRename | Obsolète. L'ancien nom de hooks.onRename, conservé pendant une version, sans l'ID de requête | Aucun |
Deux options supplémentaires existent uniquement sur createCore, pas sur openCollie : receipts et allowAlways (Questions).
| sur le handle | ce que c'est |
|---|---|
address | Le chemin de socket sur lequel il écoute |
epoch | Nouveau et aléatoire à chaque démarrage, 128 bits |
core | Le cœur derrière le socket. Un test, ou un second transport, appelle directement core.handle |
workspace(id, { title, cwd? }) | Un workspace, créé une seule fois par ID. Son tab(id, { title }) donne un onglet, et le pane(id, options) de l'onglet donne un volet |
starters(list) | Ce que le téléphone peut lancer depuis la page New, 50 au maximum. Chacun correspond à { id, label, run }, et run résout en { paneId } du volet affiché |
history(provider) | Sert l'enregistrement propre à l'agent durable de ses conversations (Hooks et historique) |
ready() | À appeler une fois que chaque volet est affiché, et après un redémarrage, une fois que chaque ask ouverte est relancée. D'ici là, chaque route sauf hello répond 503 starting |
close() | Arrête le serveur. Les réponses déjà en cours d'envoi partent encore, pendant 2 s au maximum, puis le fichier de socket disparaît |
close() laisse volontairement ouvertes les asks ouvertes : un arrêt n'est pas une réponse, et l'agent durable décide du sort du travail en attente.
tab.pane(id, { title, harness, cwd?, sessionId? }) renvoie le volet possédant cet ID s'il existe, afin qu'un agent durable puisse afficher deux fois une conversation sans second volet. Les titres sont coupés à 256 octets et harness à 64. cwd est un chemin absolu, sinon il est omis.
Chaque ID suit la règle des ID : 1 à 128 octets, aucun caractère de contrôle, aucun espace, et aucun parmi /, ? ou #. Un ID invalide donne un TypeError. Un ID de workspace ou d'onglet ne peut pas contenir :, car le protocole nomme un onglet <workspace>:<tab>.
Volets
Un volet représente une conversation, et ses méthodes définissent ce que le téléphone affiche pour celle-ci.
| méthode | ce que le téléphone affiche | limite |
|---|---|---|
state(s) | working, waiting ou idle. Une modification de working démarre un nouveau tour | Tant qu'une ask reste ouverte, le volet indique waiting |
event(e) | Éléments du chat : événements item, remove, settled, reset et synced | Voir le tableau des éléments ci-dessous |
subtitle(text) | Une ligne sous le titre. null l'efface | 120 caractères |
badge(value) | { count } ou { text } à côté du titre. null l'efface | Un décompte de 0 à 9999, un texte de 12 caractères |
progress(value) | { kind: "steps", steps } ou { kind: "percent", value, label? }, affiché pendant que le volet travaille ou attend. null l'efface | 12 étapes, chaque libellé de 60 caractères, une valeur de 0 à 100 |
actions(list) | Boutons dans la section de l'agent durable du bandeau : { id, label, icon?, busy?, disabled? }. null les efface | 4 boutons, un libellé de 16 caractères |
onAction(fn) | Exécute un appui sur l'un de ces boutons. Renvoyez false pour le refuser | Le téléphone n'envoie aucun appui pour un bouton busy ou disabled |
onSend(fn) | Prend le texte du téléphone, sous la forme fn(text, { steer, requestId }) | 32 Kio de texte |
onAbort(fn) | Prend Stop, sous la forme fn({ requestId }) | Aucun |
ask(input, { signal? }) | Une carte de question (Questions) | 50 demandes ouvertes par panneau |
updateAsk, decideAsk, outcomeOf | Modifier, trancher ou relire une demande (Questions) | Aucun |
close() | Retire le panneau de la disposition. Ses demandes ouvertes se ferment avec l'état arrêté | Aucun |
Un panneau possède également quatre champs en lecture seule : id, sessionId, turnId (le tour en cours, ou le dernier) et openAsks. Le champ icon d'une action est l'un des suivants : play, pause, check, x, refresh, archive, flag, star, send, note, search et more. Tout autre nom n'affiche aucune icône.
Un événement item transporte un élément avec un id et un ts facultatif. Un élément avec un identifiant connu remplace le précédent sur place.
| type | ce qu'elle contient | limite |
|---|---|---|
user | Une ligne envoyée par la personne. requestId nomme l'envoi d'origine, afin que le téléphone remplace sa propre ligne par celle-ci | 64 Kio de texte |
reply, thinking, notice | Les mots de l'agent | 64 Kio de texte |
markdown | Texte que le téléphone affiche en markdown : titres, listes, mise en valeur, fragments de code et liens | 32 Kio de texte |
code | Un bloc de code, avec lang tel que ts | 32 Kio de texte. lang contient de 1 à 24 lettres, chiffres ou _ + # . - |
link | Un href et un label facultatif | href correspond à https:// uniquement, 2048 caractères au maximum. label fait 120 caractères |
tool | Un appel d'outil : tool: { kind: "other", name, summary, output? } et un status parmi running, done, failed ou denied | name 128 octets, summary 1 Kio, output 16 Kio |
Un élément reply, thinking, notice ou markdown peut porter partial: true pendant que son texte s'étoffe. Réécrivez le même identifiant au fur et à mesure qu'il grandit, au maximum toutes les 250 ms, puis une dernière fois avec le texte final et sans partial, avant que le panneau ne quitte working.
Le texte dépassant sa limite est tronqué, et les caractères de contrôle et invisibles sont supprimés. Un mauvais lang, un mauvais href, un mauvais badge ou une mauvaise progression devient un TypeError ou un RangeError à la place, car Collie l'abandonnerait. Un agent durable ne peut pas ajouter lui-même d'événements ask, ask-closed ou state : ask() et state() les écrivent.
Questions
pane.ask affiche une carte et se résout avec la réponse, et requireApproval pose une question sur un appel d'outil en une ligne.
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) construit la carte à partir de la nature de l'appel, jamais à partir des propos du modèle à son sujet. Le titre est "refund wants to run", la ligne d'outil est refund(order: "5521", amount: 40), la notification push indique "refund needs a yes", et les boutons sont Allow et Deny. Il renvoie { approved, decidedBy, decidedAt, askId }. Un refus, un délai d'attente dépassé, un arrêt et une interruption renvoient tous approved: false.
option de requireApproval | description | valeur par défaut |
|---|---|---|
pane | Le panneau demandeur. Requis | Aucun |
toolCallId | L'identifiant propre de l'appel d'outil, conservé après un redémarrage. N'importe quelle chaîne : une valeur qui enfreint la règle d'identifiant est sécurisée | Requis |
itemId | L'élément sous lequel se trouve la carte | L'identifiant de l'appel d'outil |
timeoutMs | Le délai accordé au téléphone. Au-delà, l'appel est refusé, décision prise par timeout | Aucune limite |
signal | Un AbortSignal. L'interruption refuse l'appel, décision prise par program | Aucun |
labels | Le texte des deux boutons, { allow?, deny? } | Autoriser et Refuser |
callSummary(name, args) et argumentsView(args) sont les deux éléments utilisés : l'appel sur une seule ligne, et les arguments sous forme de paires key: value avec chaque valeur en JSON.
pane.ask(input) accepte l'un des quatre types. La promesse est résolue avec la réponse sous la forme de ce type.
kind | ce que la carte affiche | la réponse | limite |
|---|---|---|---|
permission | Un bouton par option, chacun avec un effect : allow, allow-always, deny ou cancel | { optionId, note? } | 1 à 6 options |
choice | Un bouton par option. Avec multiple: true, la personne en sélectionne plusieurs | { optionIds } | 1 à 8 options |
text | Un champ texte, avec un placeholder facultatif | { text } | maxLength de 1 à 2000, 500 par défaut. Le texte indicatif fait 60 caractères |
form | 1 à 6 champs, chacun de type text, choice ou toggle, certains required | { values }, indexé par l'identifiant du champ | Un champ de sélection comporte 1 à 8 options |
Chaque type accepte toolCallId, itemId et title (256 octets). Il peut accepter reason (2 Kio), tool, push: { title?, line? } (60 et 120 caractères, le texte de la notification) et expiresAt (un Date ou une chaîne ISO 8601 avec fuseau horaire).
Omettez id. Le SDK le dérive avec askIdFor(paneId, toolCallId) : SHA-256 sur les deux identifiants, les 32 premiers caractères hexadécimaux. Le même appel d'outil déclenché à nouveau après un redémarrage reçoit ainsi le même identifiant, et une réponse envoyée par le téléphone pendant le redémarrage aboutit. Déclencher un identifiant déjà ouvert constitue un TypeError.
| sur le panneau | description |
|---|---|
updateAsk(askId, patch) | Modifie une demande ouverte sur place : title, reason, tool, options, placeholder, maxLength ou fields. Sa révision augmente de un, donc une réponse à l'ancien formulaire reçoit 409 stale et le téléphone réclame une nouvelle saisie. Vaut false quand la demande n'est pas ouverte |
decideAsk(askId, answer?) | L'agent durable a tranché la demande lui-même, ailleurs que sur le téléphone. Avec answer, l'attente de ask() est résolue avec cette valeur. Sans, elle est rejetée avec AskClosed. Une saisie ultérieure sur le téléphone reçoit 409 decided, et la carte affiche "Decided in the durable agent." Vaut false quand la demande n'est pas ouverte |
outcomeOf(askId) | La première décision : { decidedBy, decidedAt, optionId?, effect? }. Le panneau conserve ses 500 dernières décisions. Non défini pour une demande qu'il n'a jamais déclenchée ou qu'il a oubliée |
decidedBy vaut phone, program ou timeout. Une demande dépasse son expiresAt et se ferme avec une décision prise par timeout : ask() est rejeté avec AskClosed, dont decidedBy est timeout. La carte affiche le temps restant jusque-là. Une question ayant expiré ou ayant été tranchée dans l'agent durable laisse une seule ligne dans Chat, par exemple "Timed out before an answer: refund wants to run".
Un signal interrompu, pane.close() et une fermeture depuis le téléphone ferment la demande avec une décision prise par program, et ask() est rejeté avec AskClosed.
Attention. Une optionallow-alwayslaisse passer tous les appels ultérieurs après une seule réponse. En https, le jeton constitue l'unique barrière, donc un agent durable n'y propose que Autoriser et Refuser.createCoreavecallowAlways: falsetransforme une optionallow-alwaysenTypeError. Le téléphone ne propose aucune optionallow-alwayssur une demande dont le texte a été tronqué ou nettoyé, ou qui ne nomme aucun outil.
Chaque action provenant du téléphone comporte un identifiant de requête, et le cœur en conserve l'accusé de réception : une répétition n'exécute rien et reçoit à nouveau la première réponse avec replayed: true. Le MemoryReceiptStore par défaut conserve les RECEIPTS_PER_GROUP plus récents (1000) par volet, ainsi que par groupe pour les démarrages, renommages, fermetures et réouvertures. Une répétition d'un identifiant abandonné reçoit 500 receipt-dropped et n'exécute rien. Le stockage disparaît avec le processus.
Pour conserver les accusés de réception après un redémarrage, écrivez un ReceiptStore avec get(requestId) et put(requestId, record, group), et transmettez-le à createCore sous le nom de receipts. openCollie les conserve toujours en mémoire.
Hooks et historique
Un hook est l'unique emplacement nommé pour une action envoyée par le téléphone, et un fournisseur d'historique sert votre propre registre.
| hook | quand il s'exécute | comment il refuse |
|---|---|---|
onSend(pane, { text, steer, turnId, requestId }) | Texte pour un volet qui n'a pas de pane.onSend | Throw : 500 internal, un résultat inconnu pour le téléphone |
onAbort(pane, { turnId, requestId }) | Arrêt pour un volet qui n'a pas de pane.onAbort | Throw, comme ci-dessus |
onAction(pane, { actionId, turnId?, requestId }) | Un appui sur la ceinture pour un volet qui n'a pas de pane.onAction | Renvoie false : 422 action-refused |
onRename({ kind, id, title }, requestId) | Un nouveau titre pour un espace de travail ou un onglet | Renvoie false : 422 rename-refused |
onClose({ kind, id, paneIds }, requestId) | Le téléphone ferme un volet, un onglet ou un espace de travail | Renvoie false : 422 close-refused |
onReopen({ id, paneId? }, requestId) | Le téléphone rouvre une conversation fermée | Renvoie false : 422 reopen-refused |
Un hook ne s'exécute que lorsque sa capacité est activée et que son identifiant de requête est nouveau. Un refus ne stocke rien, de sorte que le même identifiant de requête peut faire une nouvelle tentative. Les gestionnaires par volet prévalent sur un hook. Un volet ne possédant ni l'un ni l'autre répond 409 not-supported à un envoi, un arrêt ou un appui.
Le SDK applique lui-même une action acceptée. Un renommage définit le titre. Une fermeture supprime la cible et tout son contenu, et ferme leurs demandes en cours comme interrompues. Une réouverture sans hook rétablit un volet fermé par ce processus ; une conversation fermée avant un redémarrage nécessite onReopen. La disposition est recréée à chaque démarrage, donc un agent durable souhaitant qu'un titre ou une fermeture survive au processus le stocke dans son hook.
collie.history(provider) sert chaque conversation, ouverte et fermée, depuis le stockage propre de l'agent durable. Il active la capacité history lorsque caps est omis ou nomme history: true.
HistoryProvider | renvoie |
|---|---|
list(after, limit) | { items, next? } : lignes de conversation, les plus récentes en premier, au maximum limit (100) |
items(id, after, limit) | { items, next? } : les éléments de la conversation, les plus anciens en premier, chacun dans sa dernière version, au maximum limit (1000). undefined pour un identifiant qu'il ne connaît pas |
Une ligne est { id, title, subtitle?, workspaceId?, tabId?, startedAt, endedAt?, state, items }, avec state open ou closed et items le décompte. Un curseur (after, next) est votre propre chaîne, de 1 à 512 octets d'ASCII imprimable sans espace. next absent termine la liste.
Dès qu'un fournisseur est défini, le sessionId de chaque volet correspond à son identifiant de volet, et l'historique sert la conversation du volet sous cet identifiant. Transmettez sessionId à tab.pane() pour désigner un autre identifiant, ou null lorsqu'il ne peut pas rester le même après un redémarrage.
tailLimit n'est pas un historique. C'est le flux brut de fin que chaque volet conserve pour les lectures d'événements de Collie, 500 événements par défaut. Un lecteur ayant pris du retard reçoit à la place l'intégralité de la vue actuelle du volet, au maximum les 2000 éléments les plus récents.
Capacités
Une capacité indique que l'agent durable peut effectuer une action, et le téléphone n'affiche un contrôle que pour une capacité déclarée par l'agent durable.
| plafond | ce que l'agent durable accepte |
|---|---|
asks | Pose des questions et prend des réponses |
starters | Liste les démarreurs et en exécute un depuis la page Nouveau |
send | Prend le texte envoyé par le téléphone |
steer | Prend du texte dans un tour en cours. Nécessite send |
abort | Arrête un tour en cours |
rename | Prend un nouveau titre pour un espace de travail ou un onglet |
close | Ferme un volet, un onglet ou un espace de travail |
actions | Liste les boutons du bandeau sur un volet et en exécute un |
history | Sert ses conversations, ouvertes comme fermées |
reopen | Affiche à nouveau une conversation fermée |
Omis, caps active tout ce que le SDK sait faire, ainsi que history dès que history() a un fournisseur. Défini, il s'agit de la liste complète : une capacité non mentionnée est désactivée, ainsi { asks: true } déclare uniquement les asks. Pour en désactiver une et conserver le reste, décomposez ALL_CAPS : { ...ALL_CAPS, steer: false }. Une route dont la capacité est désactivée renvoie 409 not-supported. terminal est toujours faux.
Utilitaires et constantes
L'import racine exporte aussi les éléments constituant openCollie, ainsi que les règles qu'il applique.
| export | ce que c'est |
|---|---|
createCore(options) | Le cœur sans serveur. Il prend les options de openCollie sauf socket et callerCheck, plus receipts et allowAlways. Il renvoie epoch, workspace, starters, history, ready, isReady et handle(request) |
handle | Le protocole sous forme de fonction unique, un Request web en entrée et un Response en sortie. core.handle(request) est le point d'entrée habituel |
wireListener(core) | core.handle en tant qu'écouteur de requêtes node:http, avec drained() pour une fermeture propre |
hello, versionLine | La réponse hello, et l'unique ligne qu'un agent persistant écrit en cas de refus de version |
mintId() | Un nouvel identifiant aléatoire, 128 bits sous forme de 32 caractères hexadécimaux |
askIdFor(paneId, toolCallId) | L'identifiant d'ask dérivé |
AskClosed | L'erreur renvoyée par le rejet de ask() en l'absence de réponse. Elle contient by et decidedBy |
idOk(id), assertId(id, what), safeId(raw) | La règle d'identifiant : une vérification, une vérification avec levée d'erreur, et un identifiant sûr généré à partir de toute chaîne, identique à chaque fois |
cursorOk(cursor) | La règle du curseur d'historique |
cut(text, max, multiline?) | Nettoyer une chaîne et la tronquer à max octets, avec … à la fin |
hrefOf, langOf, badgeOf, progressOf | Une cible de lien, un langage de code, un badge et une progression, vérifiés selon les règles du volet |
subtitleOf, pushTextOf, renameTitleOf | Un sous-titre, les mots d'action d'un ask et un titre renommé, nettoyés et tronqués |
CAPS, LIMITS | Chaque limite par champ en octets, et chaque limite par liste |
ACTION_LABEL_MAX, BADGE_TEXT_MAX, BADGE_COUNT_MAX | 16, 12 et 9999 |
SUBTITLE_MAX, LINK_LABEL_MAX, RENAME_TITLE_MAX | 120 caractères chacun |
PROGRESS_STEPS_MAX, PROGRESS_LABEL_MAX | 12 étapes, 60 caractères |
PUSH_TITLE_MAX, PUSH_LINE_MAX, PLACEHOLDER_MAX | 60, 120 et 60 caractères |
ANSWER_TEXT_MAX, ANSWER_TEXT_DEFAULT, ANSWER_TEXT_BYTES | 2000 et 500 caractères, et 8000 octets |
ALL_CAPS, PROTOCOL_RANGE, SOCKET_ENV | Toutes les capacités activées, les versions de protocole prises en charge par le SDK, et le nom COLLIE_DURABLE_SOCKET |
MemoryReceiptStore, RECEIPTS_PER_GROUP | Le magasin de reçus par défaut, et ses 1000 par groupe |
Chaque type sur le réseau et chaque payload de hook est également exporté, depuis src/core/types.ts.
Les assistants Pi
./pi transforme une conversation Pi Durable en panneau, un appel d'outil risqué en carte, et le magasin de Pi en historique.
| export | description |
|---|---|
showConversation(loc, harness, conversation, o) | Affiche une conversation sous forme de panneau, d'abord l'historique, puis les événements en direct. Send va vers le submit de Pi avec l'identifiant de requête, et Stop vers son abort. Peut être appelé deux fois sans risque |
PaneRegistry | Quel panneau affiche quelle conversation. Après un redémarrage, reRaised(risky) attend que chaque appel risqué sans résultat ait redemandé, de sorte que ready() arrive après les demandes |
riskGuard({ panes, risky, words?, timeoutMs?, onTimeout? }) | Une extension Pi dont le hook beforeTool transforme un appel à un outil dans risky en carte Allow et Deny. Un appel refusé est bloqué. Avec timeoutMs, la carte expire, un appel auquel personne n'a répondu est bloqué, et onTimeout(tool, title) permet à l'agent durable de le consigner |
askTools({ panes, words, timeoutMs?, onTimeout? }) | Les deux outils d'interrogation du support desk: ask_queue, un choix, et ask_customer, une demande de texte. Avec timeoutMs, une demande sans réponse expire et l'outil renvoie "timed out" |
spawnHelperTool(o) | L'outil spawn_helper: une conversation enfant affichée sous forme de nouveau panneau, qui renvoie la réponse de l'assistant |
piHistory({ harness, panes, describe }) | Un HistoryProvider qui lit chaque entrée de chaque conversation Pi |
firstMessageOf(conversation) | Le texte du premier message d'une conversation, pour nommer son panneau |
paneIdOf(id), conversationOfPaneId(paneId) | L'identifiant de panneau d'une conversation Pi, conv-<id>, et inversement |
summaryOf(args, name?) | Les arguments d'un appel d'outil en texte clair, 200 caractères au maximum |
Mapper | Les entrées Pi et les événements d'agent sous forme d'éléments. Une réponse en cours garde un identifiant d'élément unique |
PARTIAL_MS, RE_RAISE_MS | 250 ms entre deux écritures d'une réponse en cours, et les 5000 ms que reRaised attend au maximum |
ESCALATED | Vocabulaire d'exemple: la notification du support desk pour le bouton Escalate que showConversation ajoute avec escalate: true |
ASKING_TOOLS | Vocabulaire d'exemple: les noms des deux outils d'interrogation du support desk |
Submit, ReplyExtras | Les types d'un submit personnalisé, et des éléments qu'un agent durable ajoute sous une réponse terminée |
Le texte affiché par une carte provient des options, ainsi ./pi ne contient aucun texte de l'exemple en dehors de ces deux constantes. Il est écrit pour Pi Durable 1.1.0. Le support desk dans examples/durable-member/ assemble chaque composant.
Versions
Le package possède sa propre version, distincte de celle de Collie, et indique la version du protocole réseau qu'il gère.
| aujourd'hui | ce que cela signifie | |
|---|---|---|
SDK_VERSION | 0.1.0 | La version du package. Tant que le package reste sous le dist-tag experimental, une version mineure peut modifier l'API |
WIRE_VERSION | 1 | La version du protocole réseau durable gérée par le package |
Collie gère une version du protocole réseau et accepte la précédente pendant une version mineure après la sortie d'une nouvelle version. Quand un Collie ne gère aucune de vos versions, le cœur écrit une ligne via warn, une fois par version, par exemple collie: Collie speaks wire v2, this durable agent speaks v1. Update the agent's SDK, or Collie. Le téléphone signale l'incompatibilité sur l'écran d'accueil de l'agent durable, avec les propres termes de Collie. Mettez à jour le composant le plus ancien.
Le package est publié sous le dist-tag npm experimental, jamais latest. Si le protocole réseau durable passe à la sortie, le package devient obsolète (ADR 0105).
Modifier cette page sur GitHub