Plugin maintainer reference

API voor uitgaande kanaalberichten

Channelplugins maken het gedrag voor uitgaande berichten beschikbaar vanuit openclaw/plugin-sdk/channel-outbound. Gebruik openclaw/plugin-sdk/channel-inbound voor de orkestratie van ontvangst/context/dispatch.

Core beheert wachtrijvorming, duurzaamheid, de duurzame ingangsmonitor en verwerking (createChannelIngressMonitor, createChannelIngressDrain en openChannelIngressDrain), generiek beleid voor nieuwe pogingen, de levenscyclus voor overname van beurten (turnAdoptionLifecycle / bindIngressLifecycleToReplyOptions), hooks, ontvangstbewijzen en de gedeelde tool message. De plugin beheert native aanroepen voor verzenden/bewerken/verwijderen, normalisatie van doelen, platformspecifieke threads, geselecteerde citaten, meldingsvlaggen, accountstatus, inspectie van binnenkomende gegevens en codering van payloads, baansleutels, predicaten voor niet-opnieuw-uitvoerbare fouten, optionele autorisatie voor vervanging en platformspecifieke neveneffecten.

Duurzame ingangsmonitors

Gebruik createChannelIngressMonitor(...) wanneer een kanaal geaccepteerde transportgebeurtenissen vóór dispatch duurzaam moet opslaan. Dit combineert een wachtrij en verwerking voor kanaalingang met de gedeelde levenscyclus voor toelating, polling, opschoning, levering en afsluiting. Gebruik het onderliggende createChannelIngressDrain(...) alleen wanneer het transport een wezenlijk ander contract voor toelating of verwerking beheert.

De vereiste opties zijn:

Optie Contract
queue Een ChannelIngressQueue, of een luie factory die de accountgebonden wachtrij opent.
inspect(raw, context) Retourneert de stabiele eventId en geserialiseerde laneKey, of null voor een genegeerde gebeurtenis. Feiten op het moment van claimen moeten overeenkomen met de opgeslagen id en baan.
payload Levert de payloadversie plus serialisatie/deserialisatie van de inhoud. Gebruik storage: "raw-event" voor de standaard tekenreeksenvelop { version, rawEvent }, of geef aangepaste callbacks voor coderen/decoderen op voor een bestaande kanaalspecifieke vorm. createClaimError classificeert ongeldige versies of een gewijzigde identiteit.
deliver(raw, lifecycle, claim) Verstuurt één gedecodeerde gebeurtenis en ontvangt de volledige overnamelevenscyclus. Kan completed, deferred, failed-retryable of niets retourneren.
pollIntervalMs Plant herstel-/verwerkingspolls zolang de monitor actief is.
retention Levert het opschoningsinterval en de TTL's en limieten voor voltooide/mislukte vermeldingen.

De monitor serialiseert toelatingen, zodat back-off bij toevoegen de volgorde binnen een baan niet kan omkeren. De standaard begrensde vertragingen voor toevoegen zijn 0, 100 en 300 ms; bij uitputting wordt de transportcallback geweigerd in plaats van een gebeurtenis te dispatchen die niet duurzaam is opgeslagen. Op het moment van claimen decodeert de monitor de payload met versie, voert inspect opnieuw uit en weigert deze een niet-overeenkomende id of baan vóór levering.

deliver ontvangt onAdopted, onDeferred, onAdoptionFinalizing, onAbandoned en abortSignal. Terugkeren zonder expliciete overdracht markeert een terminale gebeurtenis zonder dispatch als overgenomen. admission is altijd exclusive. Een uitgestelde overdracht houdt de claim vast, terwijl afsluiting of afbreking niet-overgenomen werk opnieuw uitvoerbaar laat. De monitor volgt levering onafhankelijk van de afhandeling van claims, omdat overname een rij als verwijderd kan markeren voordat de leveringsbelofte van het kanaal terugkeert.

Optionele instellingen omvatten aangepaste vertragingen voor toevoegen, een optieblok drain voor geavanceerde volgorde/concurrency/beleid voor nieuwe pogingen bij verwerking, een extern abortSignal, een klok, rapportage van verwerkingsfouten, een factory voor fouten bij gestopte toestand en toelatingsbeleid. De geretourneerde monitor maakt admit, start, pause, stop, waitForIdle, isRunning en isStopped beschikbaar. stop handelt eerst geaccepteerde toelatingen af, breekt daarna de verwerking af en verwijdert deze, wacht op de verwerking en actieve leveringen, en verwijdert deze opnieuw om de racecondition bij luie creatie af te sluiten.

Houd transportspecifieke redactie, validatie van onbewerkte enveloppen, classificatie als niet-opnieuw-uitvoerbaar en de opgeslagen payloadvorm in de plugin. Webhook-transporten mogen pas bevestigen nadat admit is voltooid; transporten zonder herhalingsmogelijkheid moeten uitputting bij duurzaam toevoegen melden in plaats van stilzwijgend te dispatchen.

Adapter

De meeste plugins definiëren één message-adapter:

ts
   defineChannelMessageAdapter,  createMessageReceiptFromOutboundResults,} from "openclaw/plugin-sdk/channel-outbound"; export const demoMessageAdapter = defineChannelMessageAdapter({  id: "demo",  durableFinal: {    capabilities: {      text: true,      replyTo: true,      thread: true,      messageSendingHooks: true,    },  },  send: {    text: async ({ cfg, to, text, accountId, replyToId, threadId, signal }) => {      const sent = await sendDemoMessage({        cfg,        to,        text,        accountId: accountId ?? undefined,        replyToId: replyToId ?? undefined,        threadId: threadId == null ? undefined : String(threadId),        signal,      });       return {        receipt: createMessageReceiptFromOutboundResults({          results: [{ channel: "demo", messageId: sent.id, conversationId: to }],          kind: "text",          threadId: threadId == null ? undefined : String(threadId),          replyToId: replyToId ?? undefined,        }),      };    },  },});

Declareer alleen mogelijkheden die het native transport daadwerkelijk behoudt. Dek elke gedeclareerde mogelijkheid voor verzenden, ontvangstbewijzen, livevoorbeelden en ontvangstbevestigingen af met de contracthelpers die vanuit dit subpad worden geëxporteerd.

Onderdrukking van uitgaande echo's

Wanneer een platform het eigen uitgaande bericht van de plugin opnieuw als inkomend bericht kan afleveren, roep je recordOutboundMessageIdentity(...) aan met het kanaal, account, gesprek en een stabiele platformbericht- of bronidentiteit. Het gedeelde pad voor inkomende beurten verwijdert overeenkomende identiteiten gedurende een begrensd venster van 30 seconden vóór sessieregistratie of dispatch naar de agent; een bronidentiteit kan vóór verzending worden gereserveerd of worden vernieuwd wanneer een kanaalroute wordt verwijderd om leveringsraceconditions af te sluiten. isRecentOutboundMessageIdentity(...) maakt dezelfde query beschikbaar voor kanaaldiagnostiek en tests. Onderhoud geen parallelle kanaallokale TTL-cache voor dezelfde stabiele identiteit.

Opschoning van platte tekst

Gebruik sanitizeForPlainText(...) wanneer een uitgaande adapter de ondersteunde HTML-opmaaktags moet omzetten in lichtgewicht tekstopmaak. Standaard blijven de bestaande chatmarkeringen voor vet en doorhalen behouden. Geef { style: "markdown" } alleen door wanneer het kanaal het resultaat opnieuw als Markdown verwerkt:

ts
 const chatText = sanitizeForPlainText(text);const markdownText = sanitizeForPlainText(text, { style: "markdown" });

De Markdown-stijl gebruikt **bold** en ~~strikethrough~~; cursief en inline code behouden in beide stijlen _italic_ en backtickmarkeringen. Selecteer de stijl bij de kanaalgrens in plaats van markeringstekst na opschoning te herschrijven.

Leveringsbewijs

Een MessageReceipt registreert het resultaat dat een kanaaladapter retourneert. Concrete platformbericht-id's tonen aan dat het verzendpad van het platform het bericht heeft geaccepteerd; ze bewijzen niet dat het apparaat van een ontvanger het heeft weergegeven of gelezen. Ontvangstbewijzen zonder platformbericht-id's zijn uitsluitend lokale metagegevens voor ontvangstbewijzen. Kanalen met leesbevestigingen of informatie over levering aan apparaten moeten deze feiten via een afzonderlijk kanaalspecifiek pad bijhouden.

Als een kanaaladapter kan bewijzen dat het opnieuw proberen van een fout geen voor de ontvanger zichtbare verzending kan dupliceren en er geen aanroep met finalisatiemogelijkheid is begonnen, genereer dan new PlatformMessageNotDispatchedError("...", { cause: error }) vanuit openclaw/plugin-sdk/error-runtime. Core kan dan verouderd bewijs van verzendpogingen wissen en de intentie in de wachtrij veilig opnieuw uitvoeren. Alleen de adapter die de uiteindelijke dispatchgrens beheert, mag dit beweren. Gebruik de markering nooit nadat een finalisatie-/verzendaanroep begint of een dubbelzinnig resultaat retourneert; een onjuiste markering kan berichten dupliceren.

Bestaande uitgaande adapters

Als het kanaal al een compatibele outbound-adapter heeft, leid je de berichtadapter daarvan af in plaats van verzendcode te dupliceren:

ts
 export const messageAdapter = createChannelMessageAdapterFromOutbound({  id: "demo",  outbound,  durableFinal: {    capabilities: {      text: true,      media: true,    },  },});

Duurzame verzendingen

Runtime-helpers voor verzending zijn ook beschikbaar op channel-outbound:

  • sendDurableMessageBatch(...)
  • withDurableMessageSendContext(...)
  • deliverInboundReplyWithMessageSendContext(...)
  • helpers voor conceptstreaming/voortgang, zoals resolveChannelDraftStreamingChunking(...)

sendDurableMessageBatch(...) retourneert één expliciete uitkomst:

Uitkomst Betekenis
sent ten minste één zichtbaar platformbericht is door het verzendpad van het platform geaccepteerd
suppressed geen enkel platformbericht mag als ontbrekend worden beschouwd
partial_failed ten minste één platformbericht is geaccepteerd voordat een latere payload of een later neveneffect mislukte
failed er is geen platformontvangstbewijs geproduceerd

Gebruik payloadOutcomes wanneer een batch verzonden, onderdrukte en mislukte payloads combineert. Leid annulering door hooks niet af uit een leeg verouderd resultaat voor directe levering.

Toelating voor uitgestelde levering

Gebruik message.durableFinal.admitDeferredDelivery(...) wanneer een herleid account door Core beheerde uitgaande of uitgestelde levering niet veilig kan accepteren. Core roept deze hook synchroon aan vóór actief uitgaand werk, inclusief paden die duurzame opslag in de wachtrij overslaan, en opnieuw voordat een herstelde intentie wordt afgespeeld. De context omvat cfg, channel, to, accountId en een phase van live of recovery.

Retourneer { status: "allowed" } om door te gaan. Retourneer { status: "permanent_rejection", reason } wanneer de levering niet duurzaam mag worden opgeslagen, rechtstreeks mag worden verzonden of opnieuw mag worden afgespeeld. Een actieve weigering mislukt vóór het aanmaken van de wachtrij, berichthooks of platformwerk. Een weigering tijdens herstel markeert de wachtrijregistratie als mislukt en slaat reconciliatie en opnieuw afspelen over. Als de hook ontbreekt, is dit toegestaan.

De hook is een synchrone toelatingsbeslissing, geen verzendpad. Lees alleen reeds geladen configuratie of runtimestatus; voer geen netwerk-, bestandssysteem- of andere asynchrone I/O uit. Contracttests moeten beide fasen en beide resultaatvarianten doorlopen via ChannelMessageDurableFinalAdapter vanuit openclaw/plugin-sdk/channel-outbound.

Compatibiliteitsdispatch

Stel de dispatch voor inkomende antwoorden samen via dispatchChannelInboundReply(...) vanuit channel-inbound. Houd platformlevering in de leveringsadapter; gebruik channel-outbound voor berichtadapters, duurzame verzendingen, ontvangstbevestigingen, live voorvertoning en opties voor de antwoordpijplijn.

Was this useful?
On this page

On this page