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| import | contenuto |
|---|---|
@colliepwa/durable-sdk | openCollie e l'intera API. Su Bun serve il socket con il server Bun, altrove con il server node:http |
@colliepwa/durable-sdk/bun | La stessa API, sempre con il server Bun |
@colliepwa/durable-sdk/node | La stessa API, sempre con il server node:http, oltre a NO_DESCENDANT_CHECK, la riga scritta all'avvio |
@colliepwa/durable-sdk/core | Il 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/pi | La 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.
| runtime | il controllo dei discendenti | valore impostato |
|---|---|---|
| Bun su Linux | Attivo per impostazione predefinita. Bun legge l'ID del processo chiamante dal socket | Nessuno. callerCheck: "off" lo disattiva |
| Bun su macOS, o qualsiasi altro sistema tranne Linux | Impossibile eseguire. L'avvio non riesce con un errore che indica callerCheck | callerCheck: "off" |
| Node, qualsiasi sistema | Impossibile eseguire: Node non può leggere il chiamante di un socket. L'agente durevole scrive una riga all'avvio che segnala il problema | Nessuno. 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.
| opzione | funzione | predefinito |
|---|---|---|
socket | Il 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 0700 | La variabile COLLIE_DURABLE_SOCKET. Se nessuna delle due è impostata, l'avvio non riesce |
hostName | Il nome dell'agente durevole nel relativo hello, troncato a 64 byte. Obbligatorio | Nessuno |
tailLimit | Numero di eventi non elaborati conservati da ciascun riquadro per le letture di Collie | 500, massimo 1000 |
caps | Le funzionalità dichiarate dall'agente durevole (Caps) | Tutto ciò che l'SDK può fare |
callerCheck | descendant o off. Letto solo su Bun | descendant |
hooks | Una destinazione denominata per ogni azione inviata dal telefono (Hook e cronologia) | Nessuno |
warn | Dove l'SDK scrive le sue note su riga singola, ad esempio riguardo a un Collie che usa un'altra versione del protocollo wire | console.warn |
onRename | Deprecato. Il vecchio nome di hooks.onRename, mantenuto per una release, senza l'id di richiesta | Nessuno |
Esistono altre due opzioni solo su createCore, non su openCollie: receipts e allowAlways (Domande).
| sull'handle | descrizione |
|---|---|
address | Il percorso del socket su cui è in ascolto |
epoch | Nuovo e casuale a ogni avvio, 128 bit |
core | Il 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.
| metodo | cosa mostra il telefono | limite |
|---|---|---|
state(s) | working, waiting o idle. Una modifica a working avvia un nuovo turno | Finché è aperta una richiesta, il riquadro mostra waiting |
event(e) | Elementi della chat: eventi item, remove, settled, reset e synced | Consultare la tabella degli elementi sotto |
subtitle(text) | Una riga sotto il titolo. null la cancella | 120 caratteri |
badge(value) | { count } o { text } accanto al titolo. null lo cancella | Un 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 cancella | 12 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 cancella | 4 pulsanti, un'etichetta di 16 caratteri |
onAction(fn) | Esegue un tocco su uno di questi pulsanti. Restituire false per rifiutarlo | Il 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, outcomeOf | Modificare, decidere o rileggere una richiesta (Domande) | Nessuno |
close() | Rimuove il riquadro dal layout. Le sue richieste aperte si chiudono come interrotte | Nessuno |
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.
| tipo | contenuto | limite |
|---|---|---|
user | Una riga inviata dalla persona. requestId indica l'invio da cui proviene, in modo che il telefono sostituisca la propria riga con essa | 64 KiB di testo |
reply, thinking, notice | Le parole dell'agente | 64 KiB di testo |
markdown | Testo che il telefono visualizza come markdown: intestazioni, elenchi, enfasi, frammenti di codice e collegamenti | 32 KiB di testo |
code | Un blocco di codice, con lang come ts | 32 KiB di testo. lang contiene da 1 a 24 lettere, cifre o _ + # . - |
link | Un href e un label facoltativo | href è solo https://, al massimo 2048 caratteri. label è di 120 caratteri |
tool | Una chiamata a uno strumento: tool: { kind: "other", name, summary, output? } e uno status tra running, done, failed o denied | name 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 requireApproval | funzione | predefinito |
|---|---|---|
pane | Il riquadro che formula la richiesta. Obbligatorio | Nessuno |
toolCallId | L'id specifico della chiamata dello strumento, identico dopo un riavvio. Qualsiasi stringa: se non rispetta le regole per gli id viene resa sicura | Obbligatorio |
itemId | L'elemento a cui appartiene la scheda | L'id della chiamata dello strumento |
timeoutMs | Tempo a disposizione per il telefono. Oltre questo limite la chiamata viene rifiutata, con decisione presa da timeout | Nessun limite |
signal | Un AbortSignal. L'interruzione rifiuta la chiamata, con decisione presa da program | Nessuno |
labels | Il 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.
kind | cosa mostra la scheda | la risposta | limite |
|---|---|---|---|
permission | Un pulsante per opzione, ciascuno con un effect: allow, allow-always, deny o cancel | { optionId, note? } | Da 1 a 6 opzioni |
choice | Un pulsante per opzione. Con multiple: true l'utente può selezionarne più di una | { optionIds } | Da 1 a 8 opzioni |
text | Un campo di testo, con un placeholder facoltativo | { text } | maxLength da 1 a 2000, predefinito 500. Il segnaposto è di 60 caratteri |
form | Da 1 a 6 campi, ciascuno di tipo text, choice o toggle, alcuni required | { values }, indicizzati per id del campo | Un 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 riquadro | funzione |
|---|---|
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'opzioneallow-alwayslascia 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.createCoreconallowAlways: falsetrasforma l'opzioneallow-alwaysinTypeError. Il telefono non offreallow-alwaysper 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.
| hook | quando viene eseguito | come rifiuta |
|---|---|---|
onSend(pane, { text, steer, turnId, requestId }) | Testo per un pannello che non ha pane.onSend | Genera eccezione: 500 internal, un esito sconosciuto per il telefono |
onAbort(pane, { turnId, requestId }) | Interruzione per un pannello che non ha pane.onAbort | Genera eccezione, come sopra |
onAction(pane, { actionId, turnId?, requestId }) | Tocco sulla cintura in un pannello che non ha pane.onAction | Restituisce false: 422 action-refused |
onRename({ kind, id, title }, requestId) | Un nuovo titolo per un'area di lavoro o una scheda | Restituisce false: 422 rename-refused |
onClose({ kind, id, paneIds }, requestId) | Il telefono chiude un pannello, una scheda o un'area di lavoro | Restituisce false: 422 close-refused |
onReopen({ id, paneId? }, requestId) | Il telefono riapre una conversazione chiusa | Restituisce 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.
HistoryProvider | restituisce |
|---|---|
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.
| soglia | cosa riceve il durable agent |
|---|---|
asks | Pone domande e riceve risposte |
starters | Elenca gli starter e ne esegue uno dalla pagina New |
send | Riceve testo dal telefono |
steer | Invia testo a un turno in esecuzione. Richiede send |
abort | Interrompe un turno in esecuzione |
rename | Accetta un nuovo titolo per un workspace o una scheda |
close | Chiude un riquadro, una scheda o un workspace |
actions | Elenca i pulsanti della barra su un riquadro e ne esegue uno |
history | Distribuisce le relative conversazioni, aperte e chiuse |
reopen | Mostra 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.
| export | descrizione |
|---|---|
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) |
handle | Il 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, versionLine | La 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 |
AskClosed | L'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, progressOf | Una destinazione di collegamento, un linguaggio di codice, un badge e un indicatore di avanzamento, con la medesima convalida del riquadro |
subtitleOf, pushTextOf, renameTitleOf | Un sottotitolo, i termini di push di un ask e un titolo rinominato, puliti e troncati |
CAPS, LIMITS | Ogni cap per campo in byte e ogni cap per elenco |
ACTION_LABEL_MAX, BADGE_TEXT_MAX, BADGE_COUNT_MAX | 16, 12 e 9999 |
SUBTITLE_MAX, LINK_LABEL_MAX, RENAME_TITLE_MAX | 120 caratteri ciascuno |
PROGRESS_STEPS_MAX, PROGRESS_LABEL_MAX | 12 passaggi, 60 caratteri |
PUSH_TITLE_MAX, PUSH_LINE_MAX, PLACEHOLDER_MAX | 60, 120 e 60 caratteri |
ANSWER_TEXT_MAX, ANSWER_TEXT_DEFAULT, ANSWER_TEXT_BYTES | 2000 e 500 caratteri, e 8000 byte |
ALL_CAPS, PROTOCOL_RANGE, SOCKET_ENV | Tutte le funzionalità attive, le versioni wire supportate dall'SDK e il nome COLLIE_DURABLE_SOCKET |
MemoryReceiptStore, RECEIPTS_PER_GROUP | Lo 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.
| export | funzione |
|---|---|
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 |
PaneRegistry | Quale 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 |
Mapper | Voci Pi ed eventi dell'agente sotto forma di elementi. Una risposta progressiva mantiene un unico ID elemento |
PARTIAL_MS, RE_RAISE_MS | 250 ms tra due scritture di una risposta progressiva e i 5000 ms massimi di attesa di reRaised |
ESCALATED | Vocabolario di esempio: l'avviso dell'assistenza per il pulsante Inoltra che showConversation aggiunge con escalate: true |
ASKING_TOOLS | Vocabolario di esempio: i nomi dei due strumenti di richiesta dell'assistenza |
Submit, ReplyExtras | I 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.
| oggi | significato | |
|---|---|---|
SDK_VERSION | 0.1.0 | La versione del pacchetto. Finché il pacchetto mantiene il dist-tag experimental, una release minor può modificare l'API |
WIRE_VERSION | 1 | La 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