09/Documentation
El SDK durable (experimental)
El paquete de npm @colliepwa/durable-sdk, parte por parte: entradas y entornos de ejecución, openCollie, métodos del panel, los cuatro tipos de pregunta y requireApproval, hooks, historial, caps, funciones auxiliares, integración con Pi y versiones
Experimental. El paquete, su API y el protocolo que utiliza pueden cambiar, o la función puede eliminarse, en una versión menor posterior. Versiones indica lo que esto significa para su agente duradero.
@colliepwa/durable-sdk es el paquete npm que utiliza un agente duradero para mostrarse en el teléfono a través de Collie. Esta página enumera cada parte del mismo. Durable agents contiene el inicio rápido y la configuración del lado de Collie, y El protocolo durable explica lo que se transfiere entre ambos.
Instalación y puntos de entrada
Una instalación proporciona cinco puntos de entrada: la importación raíz para la mayoría de los agentes duraderos, y cuatro para necesidades más específicas.
npm install @colliepwa/durable-sdk@experimental
# or
bun add @colliepwa/durable-sdk@experimental| importación | contenido |
|---|---|
@colliepwa/durable-sdk | openCollie y la API completa. En Bun sirve el socket con el servidor Bun; en otros entornos, con el servidor node:http |
@colliepwa/durable-sdk/bun | La misma API, siempre con el servidor Bun |
@colliepwa/durable-sdk/node | La misma API, siempre con el servidor node:http, más NO_DESCENDANT_CHECK, la línea que escribe al iniciar |
@colliepwa/durable-sdk/core | El diseño y el cable en una sola función, handle(request), para un durable agent que aporta su propio transporte. Sin importación de runtime, por lo que se ejecuta dondequiera que lo haga un Request web |
@colliepwa/durable-sdk/pi | El pegamento para un durable agent construido sobre Pi Durable (Los helpers de Pi) |
El paquete requiere Node 22.19 o posterior, o Bun 1.4 o posterior, y no tiene dependencias de runtime. ./pi requiere @earendil-works/pi-durable, @earendil-works/pi-ai y @earendil-works/chord, 1.1 o posterior y menor que 2. La entrada está probada con Pi Durable 1.1.0 y 1.2.0. Los tres son dependencias de pares opcionales: un durable agent que nunca importe ./pi no instala ninguno.
El runtime decide si el durable agent puede determinar quién responde. La comprobación de descendientes rechaza una acción del propio durable agent o de un proceso iniciado por él, con 403 caller-refused. Cubre answer, send, stop, action, rename, close, reopen y starter. Las lecturas permanecen abiertas.
| runtime | la comprobación de descendientes | lo que se configure |
|---|---|---|
| Bun en Linux | Activado por defecto. Bun lee el id de proceso del emisor desde el socket | Nada. callerCheck: "off" lo desactiva |
| Bun en macOS, o cualquier otro sistema salvo Linux | No se puede ejecutar. El inicio falla con un error que nombra callerCheck | callerCheck: "off" |
| Node, cualquier sistema | No se puede ejecutar: Node no puede leer el emisor de un socket. El durable agent escribe una línea al inicio que lo indica | Nada. callerCheck no se lee |
Sin la comprobación, cualquier proceso de su usuario puede responder a una tarjeta, incluida una herramienta que ejecute el agente. Ejecute las herramientas del agente en un sandbox que no pueda acceder al socket. El socket requiere un sistema con propietarios de archivos, por lo que en Windows openCollie se detiene al inicio. En su lugar, un durable agent allí sirve ./core detrás de TLS con un token (Dos formas de acceder a un agente duradero).
Abrir una conexión
openCollie crea el socket privado, y el identificador que devuelve define lo que muestra el teléfono.
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();Sin la opción socket, la ruta proviene de COLLIE_DURABLE_SOCKET, la variable que Collie también lee.
| opción | qué hace | predeterminado |
|---|---|---|
socket | La ruta del socket: absoluta, como máximo 103 bytes. Su carpeta se crea con modo 0700, o ya debe pertenecerle con modo 0700 | La variable COLLIE_DURABLE_SOCKET. Si ninguna está definida: el inicio falla |
hostName | El nombre propio del durable agent en su saludo, truncado a 64 bytes. Obligatorio | Ninguno |
tailLimit | Cuántos eventos sin procesar conserva cada panel para las lecturas de Collie | 500, como máximo 1000 |
caps | Lo que el durable agent declara que puede hacer (Caps) | Todo lo que el SDK puede hacer |
callerCheck | descendant o off. Se lee solo en Bun | descendant |
hooks | Un lugar con nombre para cada acto que envía el teléfono (Hooks e historial) | Ninguno |
warn | Donde el SDK escribe sus notas de una línea, por ejemplo sobre un Collie que habla otra versión de protocolo | console.warn |
onRename | Obsoleto. El nombre anterior de hooks.onRename, conservado durante una versión, sin el id de solicitud | Ninguno |
Existen dos opciones más solo en createCore, no en openCollie: receipts y allowAlways (Preguntas).
| en el identificador | qué es |
|---|---|
address | La ruta de socket en la que escucha |
epoch | Nuevo y aleatorio en cada inicio, 128 bits |
core | El núcleo detrás del socket. Una prueba, o un segundo transporte, llama a core.handle directamente |
workspace(id, { title, cwd? }) | Un espacio de trabajo, creado una vez por id. Su tab(id, { title }) proporciona una pestaña, y el pane(id, options) de la pestaña un panel |
starters(list) | Lo que el teléfono puede iniciar desde la página Nuevo, como máximo 50. Cada uno es { id, label, run }, y run resuelve a { paneId } del panel que mostró |
history(provider) | Servir el propio registro de conversaciones del agente persistente (Hooks e historial) |
ready() | Llamar una vez que se muestre cada panel, y tras reiniciar una vez que cada solicitud abierta se plantee de nuevo. Hasta entonces cada ruta excepto hello responde 503 starting |
close() | Detener el servidor. Las respuestas que ya están en camino todavía salen, durante 2 s como máximo, luego el archivo de socket se elimina |
close() deja abiertas las solicitudes abiertas a propósito: un apagado no es una respuesta, y el agente persistente decide qué ocurre con el trabajo que espera una.
tab.pane(id, { title, harness, cwd?, sessionId? }) devuelve el panel que tiene ese id cuando existe, para que un agente persistente pueda mostrar una conversación dos veces sin un segundo panel. Los títulos se cortan a 256 bytes y harness a 64. cwd es una ruta absoluta; de lo contrario se omite.
Cada id sigue la regla de id: de 1 a 128 bytes, sin caracteres de control, sin espacios en blanco y ninguno de /, ? o #. Un id no válido es un TypeError. El id de un espacio de trabajo o pestaña no puede contener :, porque el protocolo nombra una pestaña como <workspace>:<tab>.
Paneles
Un panel es una conversación, y sus métodos definen lo que el teléfono muestra para ella.
| método | lo que muestra el teléfono | límite |
|---|---|---|
state(s) | working, waiting o idle. Un cambio a working inicia un nuevo turno | Mientras haya alguna solicitud abierta, el panel muestra waiting |
event(e) | Elementos del chat: eventos de item, remove, settled, reset y synced | Consulte la tabla de elementos a continuación |
subtitle(text) | Una línea debajo del título. null la borra | 120 caracteres |
badge(value) | { count } o { text } junto al título. null lo borra | Un conteo de 0 a 9999, un texto de 12 caracteres |
progress(value) | { kind: "steps", steps } o { kind: "percent", value, label? }, dibujado mientras el panel trabaja o espera. null lo borra | 12 pasos, cada etiqueta de 60 caracteres, un valor de 0 a 100 |
actions(list) | Botones en la sección del agente duradero en el cinturón: { id, label, icon?, busy?, disabled? }. null los borra | 4 botones, una etiqueta de 16 caracteres |
onAction(fn) | Ejecuta una pulsación en uno de esos botones. Devuelva false para rechazarla | El teléfono no envía ninguna pulsación para un botón busy o disabled |
onSend(fn) | Toma el texto del teléfono, como fn(text, { steer, requestId }) | 32 KiB de texto |
onAbort(fn) | Toma Stop, como fn({ requestId }) | Ninguno |
ask(input, { signal? }) | Una tarjeta de pregunta (Preguntas) | 50 solicitudes abiertas por panel |
updateAsk, decideAsk, outcomeOf | Cambiar, decidir o volver a leer una solicitud (Preguntas) | Ninguno |
close() | Elimina el panel de la distribución. Sus solicitudes abiertas se cierran como detenidas | Ninguno |
Un panel también tiene cuatro campos de solo lectura: id, sessionId, turnId (el turno en ejecución, o el último) y openAsks. El icon de una acción es uno de play, pause, check, x, refresh, archive, flag, star, send, note, search y more. Otro nombre no dibuja ningún icono.
Un evento item transporta un elemento con un id y un ts opcional. Un elemento con un id conocido reemplaza al anterior en su lugar.
| tipo | contenido | límite |
|---|---|---|
user | Una línea enviada por el usuario. requestId nombra el envío del que procede, de modo que el teléfono intercambia su propia línea por esta | 64 KiB de texto |
reply, thinking, notice | Las palabras del agente | 64 KiB de texto |
markdown | Texto que el teléfono renderiza como markdown: encabezados, listas, énfasis, fragmentos de código y enlaces | 32 KiB de texto |
code | Un bloque de código, con lang como ts | 32 KiB de texto. lang contiene de 1 a 24 letras, dígitos o _ + # . - |
link | Un href y un label opcional | href es solo https://, con un máximo de 2048 caracteres. label tiene 120 caracteres |
tool | Una llamada a herramienta: tool: { kind: "other", name, summary, output? } y un status de running, done, failed o denied | name 128 bytes, summary 1 KiB, output 16 KiB |
Un elemento reply, thinking, notice o markdown puede transportar partial: true mientras crece su texto. Escriba el mismo id de nuevo a medida que crezca, como máximo cada 250 ms, y luego una vez más con el texto final y sin partial, antes de que el panel salga de working.
El texto que excede su límite se recorta, y los controles y caracteres invisibles se eliminan. Un lang incorrecto, un href incorrecto, una insignia incorrecta o un progreso incorrecto se convierten en un TypeError o un RangeError, ya que Collie lo descartaría. Un agente duradero no puede anexar eventos ask, ask-closed o state por sí mismo: ask() y state() escriben estos.
Preguntas
pane.ask muestra una tarjeta y se resuelve con la respuesta, y requireApproval consulta sobre una llamada a herramienta en una sola línea.
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) construye la tarjeta a partir de lo que es la llamada, nunca a partir de las palabras del modelo sobre ella. El título es "refund wants to run", la línea de la herramienta es refund(order: "5521", amount: 40), la notificación dice "refund needs a yes", y los botones son Allow y Deny. Devuelve { approved, decidedBy, decidedAt, askId }. Una denegación, un tiempo de espera agotado, una detención y una anulación devuelven approved: false.
opción de requireApproval | qué hace | predeterminado |
|---|---|---|
pane | El panel que realiza la solicitud. Requerido | Ninguno |
toolCallId | El id propio de la llamada a la herramienta, el mismo tras un reinicio. Cualquier cadena: si no cumple la regla de id, se adapta de forma segura. | Obligatorio |
itemId | El elemento debajo del cual se ubica la tarjeta | El id de la llamada a la herramienta |
timeoutMs | El tiempo de que dispone el teléfono. Tras este plazo se deniega la llamada, decidido por timeout | Sin límite |
signal | Un AbortSignal. Abortar deniega la llamada, decidido por program | Ninguno |
labels | El texto de los dos botones, { allow?, deny? } | Permitir y Denegar |
callSummary(name, args) y argumentsView(args) son las dos piezas que utiliza: la llamada en una sola línea y los argumentos como pares key: value con cada valor en formato JSON.
pane.ask(input) acepta una de cuatro clases. La promesa se resuelve con la respuesta en el formato de esa clase.
kind | lo que muestra la tarjeta | la respuesta | límite |
|---|---|---|---|
permission | Un botón por opción, cada uno con un effect: allow, allow-always, deny o cancel | { optionId, note? } | De 1 a 6 opciones |
choice | Un botón por opción. Con multiple: true se seleccionan varias | { optionIds } | De 1 a 8 opciones |
text | Un campo de texto, con un placeholder opcional | { text } | maxLength de 1 a 2000, 500 por defecto. El marcador de posición tiene 60 caracteres |
form | De 1 a 6 campos, cada uno de clase text, choice o toggle, algunos required | { values }, indexado por el id del campo | Un campo de selección tiene de 1 a 8 opciones |
Cada clase admite toolCallId, itemId y title (256 bytes). Puede admitir reason (2 KiB), tool, push: { title?, line? } (60 y 120 caracteres, el texto de la notificación) y expiresAt (un Date o una cadena ISO 8601 con zona).
Omita id. El SDK lo deriva con askIdFor(paneId, toolCallId): SHA-256 sobre los dos identificadores, los primeros 32 caracteres hexadecimales. Por tanto, la misma llamada a la herramienta generada de nuevo tras un reinicio recibe el mismo id, y se procesa una respuesta enviada por el teléfono durante el reinicio. Generar un id ya abierto constituye un TypeError.
| en el panel | qué hace |
|---|---|
updateAsk(askId, patch) | Modifica in situ una solicitud abierta: title, reason, tool, options, placeholder, maxLength o fields. Su revisión aumenta en uno, de modo que una respuesta al formulario anterior recibe 409 stale y el teléfono solicita una nueva pulsación. Devuelve false si la solicitud no está abierta. |
decideAsk(askId, answer?) | El agente persistente resolvió la solicitud por sí mismo, fuera del teléfono. Con answer, el ask() en espera se resuelve con ella. Sin este parámetro, se rechaza con AskClosed. Una pulsación posterior en el teléfono recibe 409 decided, y la tarjeta muestra "Decided in the durable agent." Devuelve false si la solicitud no está abierta. |
outcomeOf(askId) | La primera decisión: { decidedBy, decidedAt, optionId?, effect? }. El panel recuerda las últimas 500. Sin definir para una solicitud no generada u olvidada. |
decidedBy es phone, program o timeout. Una solicitud supera su expiresAt y se cierra como decidida por timeout: ask() rechaza con AskClosed, cuyo decidedBy es timeout. La tarjeta muestra el tiempo restante hasta entonces. Una pregunta que agotó el tiempo de espera o se decidió en el agente persistente deja una línea en Chat, como por ejemplo "Timed out before an answer: refund wants to run".
Un signal abortado, pane.close() y un cierre desde el teléfono cierran la solicitud como decidida por program, y ask() rechaza con AskClosed.
Precaución. Una opciónallow-alwayspermite el paso de todas las llamadas posteriores tras una única respuesta. Mediante https el token es el único control de acceso, por lo que un agente persistente en ese entorno solo ofrece Permitir y Denegar.createCoreconallowAlways: falseconvierte una opciónallow-alwaysen unTypeError. El teléfono no ofrece ningúnallow-alwaysen una solicitud cuyo texto fue recortado o limpiado, o que no especifica ninguna herramienta.
Cada acto desde el teléfono lleva un id de solicitud, y el núcleo guarda su recibo: una repetición no ejecuta nada y obtiene la primera respuesta nuevamente con replayed: true. El MemoryReceiptStore predeterminado conserva los RECEIPTS_PER_GROUP más recientes (1000) por panel, y por grupo para iniciadores, cambios de nombre, cierres y reaperturas. Una repetición de un id descartado obtiene 500 receipt-dropped y no ejecuta nada. El almacén desaparece con el proceso.
Para conservar los recibos tras un reinicio, escriba un ReceiptStore con get(requestId) y put(requestId, record, group), y páselo a createCore como receipts. openCollie siempre los conserva en memoria.
Hooks e historial
Un hook es el único lugar con nombre para un acto que envía el teléfono, y un proveedor de historial sirve su propio registro.
| hook | cuándo se ejecuta | cómo rechaza |
|---|---|---|
onSend(pane, { text, steer, turnId, requestId }) | Texto para un panel que no tiene pane.onSend | Lanzar excepción: 500 internal, un resultado desconocido para el teléfono |
onAbort(pane, { turnId, requestId }) | Detención para un panel que no tiene pane.onAbort | Lanzar excepción, como arriba |
onAction(pane, { actionId, turnId?, requestId }) | Un toque en la barra de herramientas en un panel que no tiene pane.onAction | Devolver false: 422 action-refused |
onRename({ kind, id, title }, requestId) | Un nuevo título para un espacio de trabajo o una pestaña | Devolver false: 422 rename-refused |
onClose({ kind, id, paneIds }, requestId) | El teléfono cierra un panel, una pestaña o un espacio de trabajo | Devolver false: 422 close-refused |
onReopen({ id, paneId? }, requestId) | El teléfono reabre una conversación cerrada | Devolver false: 422 reopen-refused |
Un hook solo se ejecuta cuando su cap está activo y su id de solicitud es nuevo. Un rechazo no almacena nada, por lo que el mismo id de solicitud puede intentar de nuevo. Los controladores por panel tienen prioridad sobre un hook. Un panel sin ninguno de los dos responde 409 not-supported a un envío, una detención o un toque.
El SDK aplica un acto aceptado por sí mismo. Un cambio de nombre establece el título. Un cierre elimina el destino y todo lo que contiene, y cierra sus solicitudes abiertas como detenidas. Una reapertura sin hook restablece un panel que este proceso cerró; una conversación cerrada antes de un reinicio necesita onReopen. El diseño se vuelve a crear en cada inicio, por lo que un agente persistente que requiera que un título o un cierre sobreviva al proceso lo almacena en su hook.
collie.history(provider) sirve cada conversación, abierta y cerrada, desde el propio almacén del agente persistente. Activa el cap history cuando se omite caps o nombra a history: true.
HistoryProvider | devuelve |
|---|---|
list(after, limit) | { items, next? }: filas de conversaciones, las más recientes primero, como máximo limit (100) |
items(id, after, limit) | { items, next? }: los elementos de la conversación, los más antiguos primero, cada uno en su versión más reciente, como máximo limit (1000). undefined para un id que no conoce |
Una fila es { id, title, subtitle?, workspaceId?, tabId?, startedAt, endedAt?, state, items }, con state open o closed y items el recuento. Un cursor (after, next) es su propia cadena, de 1 a 512 bytes de ASCII imprimible sin espacios. next ausente finaliza la lista.
Una vez configurado un proveedor, el sessionId de cada panel es su id de panel, y el historial sirve la conversación del panel bajo este. Pase sessionId a tab.pane() para nombrar otro id, o null cuando no pueda mantenerse igual tras un reinicio.
tailLimit no es historial. Es el registro final sin procesar que conserva cada panel para las lecturas de eventos de Collie, 500 eventos por defecto. Un lector que se haya quedado atrás obtiene en su lugar la vista actual completa del panel, como máximo los 2000 elementos más recientes.
Caps
Un cap indica que el agente persistente puede hacer una cosa, y el teléfono dibuja un control solo para un cap que el agente persistente declaró.
| límite | lo que admite el agente persistente |
|---|---|
asks | Formula preguntas y admite respuestas |
starters | Enumera iniciadores y ejecuta uno desde la página Nuevo |
send | Admite texto desde el teléfono |
steer | Admite texto en un turno en ejecución. Requiere send |
abort | Detiene un turno en ejecución |
rename | Acepta un nuevo título para un espacio de trabajo o una pestaña |
close | Cierra un panel, una pestaña o un espacio de trabajo |
actions | Lista los botones de la barra en un panel y ejecuta uno |
history | Sirve sus conversaciones, abiertas y cerradas |
reopen | Muestra de nuevo una conversación cerrada |
Si se omite, caps activa todo lo que el SDK puede hacer, y history una vez que history() tenga un proveedor. Si se proporciona, es la lista completa: una capacidad que no mencione está desactivada, por lo que { asks: true } declara únicamente solicitudes. Para desactivar una y mantener el resto, propague ALL_CAPS: { ...ALL_CAPS, steer: false }. Una ruta cuya capacidad esté desactivada responde 409 not-supported. terminal siempre es false.
Funciones auxiliares y constantes
La importación raíz también exporta las partes que componen openCollie y las reglas que aplica.
| export | qué es |
|---|---|
createCore(options) | El núcleo sin servidor. Acepta las opciones de openCollie excepto socket y callerCheck, además de receipts y allowAlways. Devuelve epoch, workspace, starters, history, ready, isReady y handle(request) |
handle | El protocolo en una sola función: una Request web de entrada y una Response de salida. core.handle(request) es la vía de entrada habitual |
wireListener(core) | core.handle como agente de escucha de peticiones node:http, con drained() para un cierre limpio |
hello, versionLine | La respuesta de bienvenida y la única línea que un agente duradero escribe para un rechazo de versión |
mintId() | Un nuevo identificador aleatorio, 128 bits como 32 caracteres hexadecimales |
askIdFor(paneId, toolCallId) | El identificador de solicitud derivado |
AskClosed | El error con el que ask() rechaza cuando no hubo respuesta. Contiene by y decidedBy |
idOk(id), assertId(id, what), safeId(raw) | La regla de identificadores: una comprobación, una comprobación que lanza una excepción y un identificador seguro generado a partir de cualquier cadena, siempre el mismo |
cursorOk(cursor) | La regla del cursor de historial |
cut(text, max, multiline?) | Limpia una cadena y la recorta a max bytes, con … al final |
hrefOf, langOf, badgeOf, progressOf | Un destino de enlace, un lenguaje de código, una insignia y un progreso, validados como los valida el panel |
subtitleOf, pushTextOf, renameTitleOf | Un subtítulo, las palabras clave de una solicitud y el título de un cambio de nombre, limpios y recortados |
CAPS, LIMITS | Cada límite por campo en bytes y cada límite por lista |
ACTION_LABEL_MAX, BADGE_TEXT_MAX, BADGE_COUNT_MAX | 16, 12 y 9999 |
SUBTITLE_MAX, LINK_LABEL_MAX, RENAME_TITLE_MAX | 120 caracteres cada uno |
PROGRESS_STEPS_MAX, PROGRESS_LABEL_MAX | 12 pasos, 60 caracteres |
PUSH_TITLE_MAX, PUSH_LINE_MAX, PLACEHOLDER_MAX | 60, 120 y 60 caracteres |
ANSWER_TEXT_MAX, ANSWER_TEXT_DEFAULT, ANSWER_TEXT_BYTES | 2000 y 500 caracteres, y 8000 bytes |
ALL_CAPS, PROTOCOL_RANGE, SOCKET_ENV | Todas las capacidades activadas, las versiones del protocolo que admite el SDK y el nombre COLLIE_DURABLE_SOCKET |
MemoryReceiptStore, RECEIPTS_PER_GROUP | El almacén de recibos predeterminado, y su límite de 1000 por grupo |
Cada tipo en el cable y cada carga útil de hook también se exportan, desde src/core/types.ts.
Los helpers de Pi
./pi convierte una conversación de Pi Durable en un panel, una llamada a herramienta riesgosa en una tarjeta y el almacén de Pi en historial.
| export | qué hace |
|---|---|
showConversation(loc, harness, conversation, o) | Muestra una conversación como un panel, primero el historial y luego los eventos en vivo. Send va a submit de Pi con el id de solicitud, y Stop a su cancelación. Es seguro llamarlo dos veces |
PaneRegistry | Qué panel muestra qué conversación. Después de reiniciar, reRaised(risky) espera hasta que cada llamada riesgosa sin resultado haya preguntado de nuevo, por lo que ready() viene después de las preguntas |
riskGuard({ panes, risky, words?, timeoutMs?, onTimeout? }) | Una extensión de Pi cuyo hook beforeTool convierte una llamada a una herramienta en risky en una tarjeta de Permitir y Denegar. Una llamada denegada se bloquea. Con timeoutMs, la tarjeta caduca, una llamada que nadie respondió se bloquea y onTimeout(tool, title) permite que el agente duradero lo registre |
askTools({ panes, words, timeoutMs?, onTimeout? }) | Las dos herramientas de consulta del centro de soporte: ask_queue, una opción, y ask_customer, una consulta de texto. Con timeoutMs, una consulta sin respuesta caduca y la herramienta devuelve "timed out" |
spawnHelperTool(o) | La herramienta spawn_helper: una conversación secundaria que se muestra como un panel nuevo y devuelve la respuesta del asistente |
piHistory({ harness, panes, describe }) | Un HistoryProvider que lee cada entrada de cada conversación de Pi |
firstMessageOf(conversation) | El texto del primer mensaje de una conversación, para nombrar su panel |
paneIdOf(id), conversationOfPaneId(paneId) | El id de panel de una conversación de Pi, conv-<id>, y viceversa |
summaryOf(args, name?) | Los argumentos de una llamada a herramienta en palabras, como máximo 200 caracteres |
Mapper | Entradas de Pi y eventos del agente como elementos. Una respuesta que sigue creciendo conserva un id de elemento |
PARTIAL_MS, RE_RAISE_MS | 250 ms entre dos escrituras de una respuesta en crecimiento, y los 5000 ms que reRaised espera como máximo |
ESCALATED | Vocabulario de ejemplo: el aviso del centro de soporte para el botón Escalate que showConversation añade con escalate: true |
ASKING_TOOLS | Vocabulario de ejemplo: los nombres de las dos herramientas de consulta del centro de soporte |
Submit, ReplyExtras | Los tipos de un submit personalizado, y de los elementos que un agente duradero añade bajo una respuesta finalizada |
Las palabras que muestra una tarjeta llegan como opciones, por lo que ./pi no contiene texto del ejemplo salvo esas dos constantes. Está escrito para Pi Durable 1.1.0. El centro de soporte en examples/durable-member/ reúne todas las partes.
Versiones
El paquete tiene su propia versión, aparte de la de Collie, e indica la versión de cable con la que se comunica.
| hoy | significado | |
|---|---|---|
SDK_VERSION | 0.1.0 | La versión del paquete. Hasta que el paquete deje la etiqueta de distribución experimental, una versión menor puede cambiar la API |
WIRE_VERSION | 1 | La versión de cable duradero con la que se comunica el paquete |
Collie utiliza una versión de cable y acepta la anterior durante una versión menor tras publicar una nueva. Si un Collie no es compatible con ninguna de sus versiones, el núcleo escribe una línea mediante warn, una vez por versión, por ejemplo collie: Collie speaks wire v2, this durable agent speaks v1. Update the agent's SDK, or Collie. El teléfono muestra la discrepancia en el inicio del agente duradero, con las palabras de Collie. Actualice el extremo desactualizado.
El paquete se publica bajo la etiqueta de distribución de npm experimental, nunca latest. Si el cable duradero pasa a la salida, el paquete queda obsoleto (ADR 0105).