Salta al contenuto
ColliePWA

09/Documentation

L'SDK durevole (sperimentale)

Il pacchetto npm @colliepwa/durable-sdk, parte per parte: entry point e runtime, openCollie, i metodi dei riquadri, i quattro tipi di domanda e requireApproval, hook, cronologia, capacità, helper, il collante per Pi e le versioni

Sperimentale. Il pacchetto, la relativa API e il protocollo di rete utilizzato potrebbero cambiare, oppure la funzionalità potrebbe essere rimossa, in una versione minor successiva. Versioni illustra cosa comporta per il proprio durable agent.

@colliepwa/durable-sdk è il pacchetto npm utilizzato da un durable agent per mostrarsi sul telefono tramite Collie. Questa pagina ne elenca ogni parte. Agenti durevoli contiene la guida rapida e la configurazione lato Collie, mentre Il wire durevole spiega cosa transita tra i due.

Installazione ed entry point

Una sola installazione fornisce cinque entry point: l'import radice per la maggior parte dei durable agent e quattro per esigenze più specifiche.

npm install @colliepwa/durable-sdk@experimental
# or
bun add @colliepwa/durable-sdk@experimental
importcontenuto
@colliepwa/durable-sdkopenCollie e l'intera API. Su Bun serve il socket con il server Bun, altrove con il server node:http
@colliepwa/durable-sdk/bunLa stessa API, sempre con il server Bun
@colliepwa/durable-sdk/nodeLa stessa API, sempre con il server node:http, oltre a NO_DESCENDANT_CHECK, la riga scritta all'avvio
@colliepwa/durable-sdk/coreIl layout e la connessione in un'unica funzione, handle(request), per un agente durevole dotato di trasporto autonomo. Nessuna importazione di runtime, quindi viene eseguito ovunque sia supportato un Request web
@colliepwa/durable-sdk/piLa logica di integrazione per un agente durevole basato su Pi Durable (Gli helper di Pi)

Il pacchetto richiede Node 22.19 o versioni successive, oppure Bun 1.4 o versioni successive, e non ha dipendenze di runtime. ./pi richiede @earendil-works/pi-durable, @earendil-works/pi-ai e @earendil-works/chord, versione 1.1 o successiva e inferiore a 2. L'entry point è testato con Pi Durable 1.1.0 e 1.2.0. I tre pacchetti sono peer dependency opzionali: un agente durevole che non importa mai ./pi non ne installa alcuno.

Il runtime determina se l'agente durevole può identificare chi risponde. Il controllo dei discendenti rifiuta un'azione proveniente dall'agente durevole stesso o da un processo da esso avviato, restituendo 403 caller-refused. Si applica a answer, send, stop, action, rename, close, reopen e starter. Le letture rimangono aperte.

runtimeil controllo dei discendentivalore impostato
Bun su LinuxAttivo per impostazione predefinita. Bun legge l'ID del processo chiamante dal socketNessuno. callerCheck: "off" lo disattiva
Bun su macOS, o qualsiasi altro sistema tranne LinuxImpossibile eseguire. L'avvio non riesce con un errore che indica callerCheckcallerCheck: "off"
Node, qualsiasi sistemaImpossibile eseguire: Node non può leggere il chiamante di un socket. L'agente durevole scrive una riga all'avvio che segnala il problemaNessuno. callerCheck non viene letto

Senza il controllo, qualsiasi processo del proprio utente può rispondere a una card, compreso uno strumento eseguito dall'agente. Eseguire gli strumenti dell'agente in una sandbox che non possa raggiungere il socket. Il socket richiede un sistema dotato di proprietari dei file, quindi su Windows openCollie si arresta all'avvio. In tale ambiente, un agente durevole espone ./core protetto da TLS con un token (Due modi per raggiungere un durable agent).

Aprire una connessione

openCollie crea il socket privato e l'handle restituito definisce la disposizione degli elementi mostrati dal telefono.

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();

Senza l'opzione socket, il percorso proviene da COLLIE_DURABLE_SOCKET, la variabile letta anche da Collie.

opzionefunzionepredefinito
socketIl percorso del socket: assoluto, massimo 103 byte. La relativa cartella viene creata con permessi 0700, oppure deve essere già di proprietà dell'utente con permessi 0700La variabile COLLIE_DURABLE_SOCKET. Se nessuna delle due è impostata, l'avvio non riesce
hostNameIl nome dell'agente durevole nel relativo hello, troncato a 64 byte. ObbligatorioNessuno
tailLimitNumero di eventi non elaborati conservati da ciascun riquadro per le letture di Collie500, massimo 1000
capsLe funzionalità dichiarate dall'agente durevole (Caps)Tutto ciò che l'SDK può fare
callerCheckdescendant o off. Letto solo su Bundescendant
hooksUna destinazione denominata per ogni azione inviata dal telefono (Hook e cronologia)Nessuno
warnDove l'SDK scrive le sue note su riga singola, ad esempio riguardo a un Collie che usa un'altra versione del protocollo wireconsole.warn
onRenameDeprecato. Il vecchio nome di hooks.onRename, mantenuto per una release, senza l'id di richiestaNessuno

Esistono altre due opzioni solo su createCore, non su openCollie: receipts e allowAlways (Domande).

sull'handledescrizione
addressIl percorso del socket su cui è in ascolto
epochNuovo e casuale a ogni avvio, 128 bit
coreIl core dietro il socket. Un test, o un secondo trasporto, chiama direttamente core.handle
workspace(id, { title, cwd? })Un'area di lavoro, creata una volta per id. Il suo tab(id, { title }) fornisce una scheda, e il pane(id, options) della scheda un riquadro
starters(list)Cosa può avviare il telefono dalla pagina Nuovo, al massimo 50. Ognuno è { id, label, run }, e run risolve in { paneId } del riquadro mostrato
history(provider)Fornire il record dell'agente durevole relativo alle sue conversazioni (Hook e cronologia)
ready()Chiamare una volta mostrato ogni riquadro, e dopo un riavvio una volta riproposta ogni richiesta aperta. Fino ad allora ogni route tranne hello risponde con 503 starting
close()Arrestare il server. Le risposte già in transito vengono comunque inviate, per un massimo di 2 s, poi il file socket viene rimosso

close() lascia intenzionalmente aperte le richieste aperte: un arresto non è una risposta, e l'agente durevole decide cosa succede al lavoro in attesa di una risposta.

tab.pane(id, { title, harness, cwd?, sessionId? }) restituisce il riquadro con quell'id quando esiste, permettendo a un agente durevole di mostrare una conversazione due volte senza un secondo riquadro. I titoli sono troncati a 256 byte e harness a 64. cwd è un percorso assoluto, altrimenti viene omesso.

Ogni id segue la regola degli id: da 1 a 128 byte, nessun carattere di controllo, nessuno spazio bianco e nessuno tra /, ? o #. Un id non valido è un TypeError. L'id di un'area di lavoro o di una scheda non può contenere :, perché a livello di protocollo una scheda è denominata <workspace>:<tab>.

Riquadri

Un riquadro corrisponde a una conversazione, e i suoi metodi impostano ciò che il telefono mostra per essa.

metodocosa mostra il telefonolimite
state(s)working, waiting o idle. Una modifica a working avvia un nuovo turnoFinché è aperta una richiesta, il riquadro mostra waiting
event(e)Elementi della chat: eventi item, remove, settled, reset e syncedConsultare la tabella degli elementi sotto
subtitle(text)Una riga sotto il titolo. null la cancella120 caratteri
badge(value){ count } o { text } accanto al titolo. null lo cancellaUn conteggio da 0 a 9999, un testo di 12 caratteri
progress(value){ kind: "steps", steps } o { kind: "percent", value, label? }, disegnato mentre il riquadro lavora o è in attesa. null lo cancella12 passaggi, ciascuna etichetta di 60 caratteri, un valore da 0 a 100
actions(list)Pulsanti nella sezione dell'agente durevole della cintura: { id, label, icon?, busy?, disabled? }. null li cancella4 pulsanti, un'etichetta di 16 caratteri
onAction(fn)Esegue un tocco su uno di questi pulsanti. Restituire false per rifiutarloIl telefono non invia alcun tocco per un pulsante busy o disabled
onSend(fn)Accetta il testo del telefono, come fn(text, { steer, requestId })32 KiB di testo
onAbort(fn)Accetta Stop, come fn({ requestId })Nessuno
ask(input, { signal? })Una scheda con domanda (Domande)50 richieste aperte per riquadro
updateAsk, decideAsk, outcomeOfModificare, decidere o rileggere una richiesta (Domande)Nessuno
close()Rimuove il riquadro dal layout. Le sue richieste aperte si chiudono come interrotteNessuno

Un riquadro ha anche quattro campi di sola lettura: id, sessionId, turnId (il turno in esecuzione, o l'ultimo) e openAsks. Il icon di un'azione è uno tra play, pause, check, x, refresh, archive, flag, star, send, note, search e more. Un altro nome non disegna alcuna icona.

Un evento item contiene un elemento con un id e un ts facoltativo. Un elemento con un ID noto sostituisce sul posto quello precedente.

tipocontenutolimite
userUna riga inviata dalla persona. requestId indica l'invio da cui proviene, in modo che il telefono sostituisca la propria riga con essa64 KiB di testo
reply, thinking, noticeLe parole dell'agente64 KiB di testo
markdownTesto che il telefono visualizza come markdown: intestazioni, elenchi, enfasi, frammenti di codice e collegamenti32 KiB di testo
codeUn blocco di codice, con lang come ts32 KiB di testo. lang contiene da 1 a 24 lettere, cifre o _ + # . -
linkUn href e un label facoltativohref è solo https://, al massimo 2048 caratteri. label è di 120 caratteri
toolUna chiamata a uno strumento: tool: { kind: "other", name, summary, output? } e uno status tra running, done, failed o deniedname 128 byte, summary 1 KiB, output 16 KiB

Un elemento reply, thinking, notice o markdown può contenere partial: true mentre il suo testo cresce. Scrivere nuovamente lo stesso ID man mano che cresce, al massimo ogni 250 ms, poi un'ultima volta con il testo finale e senza partial, prima che il riquadro esca da working.

Il testo che supera il limite viene troncato, e i caratteri di controllo e invisibili vengono rimossi. Un valore non valido per lang, href, badge o progress diventa invece un TypeError o un RangeError, poiché Collie lo scarterebbe. Un agente durevole non può aggiungere autonomamente eventi ask, ask-closed o state: questi vengono scritti da ask() e state().

Domande

pane.ask mostra una scheda e si risolve con la risposta, mentre requireApproval chiede informazioni su una singola chiamata di strumento in una riga.

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) costruisce la scheda a partire dall'effettiva chiamata, mai dalle parole usate dal modello per descriverla. Il titolo è "refund wants to run", la riga dello strumento è refund(order: "5521", amount: 40), la notifica push indica "refund needs a yes", e i pulsanti sono Allow e Deny. Restituisce { approved, decidedBy, decidedAt, askId }. Un rifiuto, un timeout, un'interruzione e un annullamento restituiscono tutti approved: false.

opzione di requireApprovalfunzionepredefinito
paneIl riquadro che formula la richiesta. ObbligatorioNessuno
toolCallIdL'id specifico della chiamata dello strumento, identico dopo un riavvio. Qualsiasi stringa: se non rispetta le regole per gli id viene resa sicuraObbligatorio
itemIdL'elemento a cui appartiene la schedaL'id della chiamata dello strumento
timeoutMsTempo a disposizione per il telefono. Oltre questo limite la chiamata viene rifiutata, con decisione presa da timeoutNessun limite
signalUn AbortSignal. L'interruzione rifiuta la chiamata, con decisione presa da programNessuno
labelsIl testo dei due pulsanti, { allow?, deny? }Consenti e Rifiuta

callSummary(name, args) e argumentsView(args) sono i due elementi utilizzati: la chiamata su una sola riga e gli argomenti come coppie key: value con ogni valore in formato JSON.

pane.ask(input) accetta uno di quattro tipi. La promise si risolve con la risposta nel formato del tipo indicato.

kindcosa mostra la schedala rispostalimite
permissionUn pulsante per opzione, ciascuno con un effect: allow, allow-always, deny o cancel{ optionId, note? }Da 1 a 6 opzioni
choiceUn pulsante per opzione. Con multiple: true l'utente può selezionarne più di una{ optionIds }Da 1 a 8 opzioni
textUn campo di testo, con un placeholder facoltativo{ text }maxLength da 1 a 2000, predefinito 500. Il segnaposto è di 60 caratteri
formDa 1 a 6 campi, ciascuno di tipo text, choice o toggle, alcuni required{ values }, indicizzati per id del campoUn campo di scelta contiene da 1 a 8 opzioni

Ciascun tipo accetta toolCallId, itemId e title (256 byte). Può accettare reason (2 KiB), tool, push: { title?, line? } (60 e 120 caratteri, il testo della notifica) e expiresAt (un Date o una stringa ISO 8601 con fuso orario).

Omettere id. L'SDK lo ricava con askIdFor(paneId, toolCallId): SHA-256 sui due id, prendendo i primi 32 caratteri esadecimali. La stessa chiamata dello strumento riproposta dopo un riavvio riceve quindi lo stesso id, e la risposta inviata dal telefono durante il riavvio va a buon fine. Proporre un id già aperto genera un TypeError.

sul riquadrofunzione
updateAsk(askId, patch)Modifica una richiesta aperta sul posto: title, reason, tool, options, placeholder, maxLength o fields. La sua revisione aumenta di uno, quindi una risposta al vecchio modulo riceve 409 stale e il telefono richiede un nuovo tocco. False quando la richiesta non è aperta
decideAsk(askId, answer?)L'agente durevole ha deciso la richiesta autonomamente, altrove rispetto al telefono. Con answer, l'attesa di ask() si risolve con questo valore. Senza, viene rifiutata con AskClosed. Un tocco successivo sul telefono riceve 409 decided e la scheda mostra "Decided in the durable agent." False quando la richiesta non è aperta
outcomeOf(askId)La prima decisione: { decidedBy, decidedAt, optionId?, effect? }. Il riquadro memorizza le ultime 500. Non definito per una richiesta mai formulata o dimenticata

decidedBy è phone, program o timeout. Una richiesta supera il suo expiresAt e si chiude con decisione presa da timeout: ask() rifiuta con AskClosed, la cui proprietà decidedBy è timeout. La scheda mostra il tempo rimanente fino a quel momento. Una domanda scaduta o decisa nell'agente durevole lascia una riga in Chat, come "Timed out before an answer: refund wants to run".

Un signal interrotto, pane.close() e una chiusura dal telefono chiudono la richiesta con decisione presa da program, e ask() rifiuta con AskClosed.

Attenzione. L'opzione allow-always lascia passare ogni chiamata successiva dopo una risposta. Su https il token è l'unico punto di controllo, quindi un durable agent in tale contesto offre solo Allow e Deny. createCore con allowAlways: false trasforma l'opzione allow-always in TypeError. Il telefono non offre allow-always per una richiesta le cui parole sono state tagliate o ripulite, o che non nomina alcuno strumento.

Ogni azione inviata dal telefono include un id di richiesta e il core ne conserva la ricevuta: una ripetizione non esegue nulla e riceve nuovamente la prima risposta con replayed: true. Il valore predefinito di MemoryReceiptStore conserva i RECEIPTS_PER_GROUP più recenti (1000) per pannello, e per gruppo nel caso di starter, ridenominazioni, chiusure e riaperture. La ripetizione di un id eliminato riceve 500 receipt-dropped e non esegue nulla. Lo store scompare con il processo.

Per conservare le ricevute dopo un riavvio, scrivere un ReceiptStore con get(requestId) e put(requestId, record, group), e passarlo a createCore come receipts. openCollie le conserva sempre in memoria.

Hook e cronologia

Un hook è l'unico punto con nome per un'azione inviata dal telefono, mentre un provider di cronologia gestisce le registrazioni proprie.

hookquando viene eseguitocome rifiuta
onSend(pane, { text, steer, turnId, requestId })Testo per un pannello che non ha pane.onSendGenera eccezione: 500 internal, un esito sconosciuto per il telefono
onAbort(pane, { turnId, requestId })Interruzione per un pannello che non ha pane.onAbortGenera eccezione, come sopra
onAction(pane, { actionId, turnId?, requestId })Tocco sulla cintura in un pannello che non ha pane.onActionRestituisce false: 422 action-refused
onRename({ kind, id, title }, requestId)Un nuovo titolo per un'area di lavoro o una schedaRestituisce false: 422 rename-refused
onClose({ kind, id, paneIds }, requestId)Il telefono chiude un pannello, una scheda o un'area di lavoroRestituisce false: 422 close-refused
onReopen({ id, paneId? }, requestId)Il telefono riapre una conversazione chiusaRestituisce false: 422 reopen-refused

Un hook viene eseguito solo quando la sua cap è abilitata e il suo id di richiesta è nuovo. Un rifiuto non memorizza nulla, quindi lo stesso id di richiesta può riprovare. I gestori per singolo pannello hanno la precedenza su un hook. Un pannello privo di entrambi risponde con 409 not-supported a un invio, un'interruzione o un tocco.

L'SDK applica direttamente un'azione accettata. Una ridenominazione imposta il titolo. Una chiusura rimuove la destinazione e tutto ciò che contiene, e chiude le relative richieste aperte come interrotte. Una riapertura senza hook ripristina un pannello chiuso da questo processo; una conversazione chiusa prima di un riavvio richiede onReopen. Il layout viene ricreato a ogni avvio, quindi un durable agent che vuole preservare un titolo o una chiusura oltre il processo li memorizza nel proprio hook.

collie.history(provider) fornisce ogni conversazione, aperta e chiusa, dallo store proprio del durable agent. Abilita la cap history quando caps viene omesso o indica history: true.

HistoryProviderrestituisce
list(after, limit){ items, next? }: righe di conversazione, dalle più recenti, al massimo limit (100)
items(id, after, limit){ items, next? }: gli elementi della conversazione, dai più vecchi, ciascuno nella sua versione più recente, al massimo limit (1000). undefined per un id sconosciuto

Una riga è { id, title, subtitle?, workspaceId?, tabId?, startedAt, endedAt?, state, items }, con state open o closed e items come conteggio. Un cursore (after, next) è una stringa personalizzata, da 1 a 512 byte in ASCII stampabile senza spazi. L'assenza di next indica la fine dell'elenco.

Una volta impostato un provider, il valore sessionId di ogni pannello è il suo id pannello, e la cronologia fornisce la conversazione del pannello sotto tale id. Passare sessionId a tab.pane() per indicare un altro id, oppure null quando questo non può rimanere invariato dopo un riavvio.

tailLimit non è la cronologia. È la coda grezza conservata da ogni pannello per le letture degli eventi di Collie, 500 eventi per impostazione predefinita. Un lettore rimasto indietro riceve invece l'intera vista corrente del pannello, al massimo i 2000 elementi più recenti.

Caps

Una cap indica che il durable agent può compiere una determinata azione, e il telefono mostra un controllo solo per una cap dichiarata dal durable agent.

sogliacosa riceve il durable agent
asksPone domande e riceve risposte
startersElenca gli starter e ne esegue uno dalla pagina New
sendRiceve testo dal telefono
steerInvia testo a un turno in esecuzione. Richiede send
abortInterrompe un turno in esecuzione
renameAccetta un nuovo titolo per un workspace o una scheda
closeChiude un riquadro, una scheda o un workspace
actionsElenca i pulsanti della barra su un riquadro e ne esegue uno
historyDistribuisce le relative conversazioni, aperte e chiuse
reopenMostra di nuovo una conversazione chiusa

Se omesso, caps abilita tutto ciò che l'SDK può fare, e history non appena history() dispone di un provider. Se specificato, costituisce l'elenco completo: una cap non indicata è disabilitata, quindi { asks: true } dichiara unicamente gli ask. Per disabilitarne una e mantenere le altre, usare lo spread di ALL_CAPS: { ...ALL_CAPS, steer: false }. Una route con cap disabilitata risponde con 409 not-supported. terminal è sempre false.

Funzioni di supporto e costanti

L'import radice esporta anche i componenti di cui openCollie è composto e le regole applicate.

exportdescrizione
createCore(options)Il core senza server. Accetta le opzioni di openCollie ad eccezione di socket e callerCheck, oltre a receipts e allowAlways. Restituisce epoch, workspace, starters, history, ready, isReady e handle(request)
handleIl protocollo di rete in un'unica funzione, con Request web in ingresso e Response in uscita. core.handle(request) è il punto di ingresso consueto
wireListener(core)core.handle come listener di richieste node:http, con drained() per una chiusura corretta
hello, versionLineLa risposta hello e la riga scritta da un agent permanente in caso di rifiuto della versione
mintId()Un nuovo id casuale, a 128 bit sotto forma di 32 caratteri esadecimali
askIdFor(paneId, toolCallId)L'id ask derivato
AskClosedL'errore con cui ask() rifiuta la richiesta in assenza di risposta. Include by e decidedBy
idOk(id), assertId(id, what), safeId(raw)La regola per gli id: una verifica, una verifica che solleva un'eccezione e un id sicuro generato a partire da qualsiasi stringa, identico a ogni esecuzione
cursorOk(cursor)La regola per il cursore della cronologia
cut(text, max, multiline?)Pulisce una stringa e la tronca a max byte, con … alla fine
hrefOf, langOf, badgeOf, progressOfUna destinazione di collegamento, un linguaggio di codice, un badge e un indicatore di avanzamento, con la medesima convalida del riquadro
subtitleOf, pushTextOf, renameTitleOfUn sottotitolo, i termini di push di un ask e un titolo rinominato, puliti e troncati
CAPS, LIMITSOgni cap per campo in byte e ogni cap per elenco
ACTION_LABEL_MAX, BADGE_TEXT_MAX, BADGE_COUNT_MAX16, 12 e 9999
SUBTITLE_MAX, LINK_LABEL_MAX, RENAME_TITLE_MAX120 caratteri ciascuno
PROGRESS_STEPS_MAX, PROGRESS_LABEL_MAX12 passaggi, 60 caratteri
PUSH_TITLE_MAX, PUSH_LINE_MAX, PLACEHOLDER_MAX60, 120 e 60 caratteri
ANSWER_TEXT_MAX, ANSWER_TEXT_DEFAULT, ANSWER_TEXT_BYTES2000 e 500 caratteri, e 8000 byte
ALL_CAPS, PROTOCOL_RANGE, SOCKET_ENVTutte le funzionalità attive, le versioni wire supportate dall'SDK e il nome COLLIE_DURABLE_SOCKET
MemoryReceiptStore, RECEIPTS_PER_GROUPLo store predefinito delle ricevute e il relativo limite di 1000 per gruppo

Anche ogni tipo sul wire e ogni payload degli hook viene esportato, da src/core/types.ts.

Gli helper di Pi

./pi trasforma una conversazione Pi Durable in un riquadro, una chiamata a uno strumento rischioso in una scheda e lo store di Pi nella cronologia.

exportfunzione
showConversation(loc, harness, conversation, o)Mostra una conversazione come riquadro: prima la cronologia, poi gli eventi in tempo reale. L'invio va a submit di Pi con l'ID richiesta, e Stop al relativo abort. È sicuro chiamarlo due volte
PaneRegistryQuale riquadro mostra quale conversazione. Dopo un riavvio, reRaised(risky) attende finché ogni chiamata rischiosa priva di risultato non viene richiesta di nuovo, quindi ready() arriva dopo le richieste
riskGuard({ panes, risky, words?, timeoutMs?, onTimeout? })Un'estensione Pi il cui hook beforeTool trasforma una chiamata a uno strumento in risky in una scheda con Consenti e Nega. Una chiamata negata viene bloccata. Con timeoutMs, la scheda scade, una chiamata senza risposta viene bloccata e onTimeout(tool, title) consente all'agente durable di registrarla
askTools({ panes, words, timeoutMs?, onTimeout? })I due strumenti di richiesta del supporto: ask_queue, una scelta, e ask_customer, una richiesta di testo. Con timeoutMs, una richiesta senza risposta scade e lo strumento restituisce "timed out"
spawnHelperTool(o)Lo strumento spawn_helper: una conversazione figlia mostrata come nuovo riquadro, che restituisce la risposta dell'helper
piHistory({ harness, panes, describe })Un HistoryProvider che legge ogni voce di ogni conversazione Pi
firstMessageOf(conversation)Il testo del primo messaggio di una conversazione, per dare un nome al relativo riquadro
paneIdOf(id), conversationOfPaneId(paneId)L'ID del riquadro di una conversazione Pi, conv-<id>, e viceversa
summaryOf(args, name?)Gli argomenti di una chiamata a uno strumento in forma testuale, al massimo 200 caratteri
MapperVoci Pi ed eventi dell'agente sotto forma di elementi. Una risposta progressiva mantiene un unico ID elemento
PARTIAL_MS, RE_RAISE_MS250 ms tra due scritture di una risposta progressiva e i 5000 ms massimi di attesa di reRaised
ESCALATEDVocabolario di esempio: l'avviso dell'assistenza per il pulsante Inoltra che showConversation aggiunge con escalate: true
ASKING_TOOLSVocabolario di esempio: i nomi dei due strumenti di richiesta dell'assistenza
Submit, ReplyExtrasI tipi di un submit personalizzato e degli elementi che un agente durable aggiunge sotto una risposta completata

Le parole mostrate da una scheda arrivano come opzioni, quindi ./pi non contiene testo dell'esempio ad eccezione di quelle due costanti. È scritto per Pi Durable 1.1.0. L'assistenza in examples/durable-member/ unisce tutte le parti.

Versioni

Il pacchetto ha una propria versione, separata da quella di Collie, e specifica la versione wire supportata.

oggisignificato
SDK_VERSION0.1.0La versione del pacchetto. Finché il pacchetto mantiene il dist-tag experimental, una release minor può modificare l'API
WIRE_VERSION1La versione wire durable supportata dal pacchetto

Collie supporta una versione wire e accetta quella precedente per una release minor successiva al rilascio di una nuova versione. Quando un'istanza di Collie non supporta alcuna delle versioni usate, il core scrive una riga tramite warn, una volta per versione, ad esempio collie: Collie speaks wire v2, this durable agent speaks v1. Update the agent's SDK, or Collie. Il telefono segnala la mancata corrispondenza nella home dell'agente durable, con i messaggi di Collie. Aggiornare il componente meno recente.

Il pacchetto è pubblicato con il dist-tag npm experimental, mai latest. Se il wire durable passa a l'uscita, il pacchetto viene deprecato (ADR 0105).

Modifica questa pagina su GitHub

The rest of the documentation