Plugin maintainer reference

Kanal giden API'si

Kanal pluginleri, giden ileti davranışını openclaw/plugin-sdk/channel-outbound üzerinden kullanıma sunar. Alma/bağlam/sevk orkestrasyonu için openclaw/plugin-sdk/channel-inbound kullanın.

Çekirdek; kuyruğa alma, dayanıklılık, dayanıklı giriş izleyicisi ve boşaltma (createChannelIngressMonitor, createChannelIngressDrain ve openChannelIngressDrain), genel yeniden deneme ilkesi, tur devralma yaşam döngüsü (turnAdoptionLifecycle / bindIngressLifecycleToReplyOptions), kancalar, alındılar ve paylaşılan message aracının sahibidir. Plugin ise yerel gönderme/düzenleme/silme çağrıları, hedef normalleştirme, platform ileti dizileri, seçili alıntılar, bildirim bayrakları, hesap durumu, giriş incelemesi ve yük kodlama, şerit anahtarları, yeniden denenemez koşullar, isteğe bağlı geçersiz kılma yetkilendirmesi ve platforma özgü yan etkilerin sahibidir.

Dayanıklı giriş izleyicileri

Bir kanalın kabul edilen taşıma olaylarını sevkten önce kalıcı hâle getirmesi gerektiğinde createChannelIngressMonitor(...) kullanın. Bu, bir kanal giriş kuyruğunu ve boşaltmayı paylaşılan kabul, yoklama, budama, teslim ve kapatma yaşam döngüsüyle birleştirir. Daha düşük düzeyli createChannelIngressDrain(...) yalnızca taşıma önemli ölçüde farklı bir kabul veya pompalama sözleşmesine sahipse kullanılmalıdır.

Gerekli seçenekler şunlardır:

Seçenek Sözleşme
queue Bir ChannelIngressQueue veya hesap kapsamlı kuyruğu açan tembel bir fabrika.
inspect(raw, context) Kararlı eventId ve serileştirilmiş laneKey değerlerini ya da yok sayılan bir olay için null döndürür. Talep anındaki olgular, kalıcı kimlik ve şeritle eşleşmelidir.
payload Yük sürümünü ve gövde serileştirme/seri durumdan çıkarma işlemlerini sağlar. Standart { version, rawEvent } dize zarfı için storage: "raw-event" kullanın veya kanala özgü mevcut bir şekil için özel kodlama/kod çözme geri çağrıları sağlayın. createClaimError, geçersiz sürümleri veya değişen kimliği sınıflandırır.
deliver(raw, lifecycle, claim) Kodu çözülmüş tek bir olayı sevk eder ve devralma yaşam döngüsünün tamamını alır. completed, deferred, failed-retryable veya hiçbir şey döndürebilir.
pollIntervalMs İzleyici çalışırken kurtarma/boşaltma yoklamalarını zamanlar.
retention Budama sıklığını ve tamamlanan/başarısız TTL ile girdi sınırlarını sağlar.

İzleyici, ekleme geri çekilmesinin bir şeridin sırasını tersine çevirememesi için kabulleri seri hâle getirir. Varsayılan sınırlı ekleme gecikmeleri 0, 100 ve 300 ms'dir; bunların tükenmesi, dayanıklı hâle getirilmemiş bir olayı sevk etmek yerine taşıma geri çağrısını reddeder. Talep anında sürümlü yükün kodunu çözer, inspect işlemini yeniden çalıştırır ve teslimden önce kimlik veya şerit uyuşmazlığını reddeder.

deliver; onAdopted, onDeferred, onAdoptionFinalizing, onAbandoned ve abortSignal değerlerini alır. Açık bir devir olmadan dönmek, sevk edilmeyen sonlandırıcı bir olayı devralınmış olarak işaretler. admission her zaman exclusive değerindedir. Ertelenmiş bir devir talebi elde tutarken kapatma veya iptal, devralınmamış işin yeniden denenebilir kalmasını sağlar. İzleyici teslimi talep uzlaşmasından bağımsız olarak izler; çünkü devralma, kanalın teslim sözü dönmeden önce bir satırı mezar taşıyla işaretleyebilir.

İsteğe bağlı ayarlar arasında özel ekleme gecikmeleri, gelişmiş boşaltma sıralaması/eşzamanlılığı/yeniden deneme ilkesi için bir drain seçenek bloğu, harici bir abortSignal, saat, pompa hata raporlaması, durduruldu-hatası fabrikası ve kabul ilkesi bulunur. Döndürülen izleyici; admit, start, pause, stop, waitForIdle, isRunning ve isStopped değerlerini kullanıma sunar. stop önce kabul edilmiş kabulleri uzlaştırır, ardından boşaltmayı iptal edip bertaraf eder, pompayı ve etkin teslimleri bekler ve tembel oluşturma yarışını kapatmak için yeniden bertaraf eder.

Taşımaya özgü gizlemeyi, ham zarf doğrulamasını, yeniden denenemez sınıflandırmayı ve kalıcı yük şeklini Plugin içinde tutun. Webhook taşımaları yalnızca admit çözümlendikten sonra onay vermelidir; yeniden oynatılamayan taşımalar ise sessizce sevk etmek yerine dayanıklı ekleme tükenmesini bildirmelidir.

Bağdaştırıcı

Çoğu Plugin tek bir message bağdaştırıcısı tanımlar:

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,        }),      };    },  },});

Yalnızca yerel taşımanın gerçekten koruduğu yetenekleri bildirin. Bildirilen her gönderme, alındı, canlı önizleme ve alma-onayı yeteneğini bu alt yoldan dışa aktarılan sözleşme yardımcılarıyla kapsayın.

Giden yankının engellenmesi

Bir platform, Plugin'in kendi giden iletisini gelen ileti olarak yeniden teslim edebiliyorsa kanal, hesap, konuşma ve kararlı bir platform iletisi veya kaynak kimliğiyle recordOutboundMessageIdentity(...) çağrısını yapın. Paylaşılan gelen tur yolu, oturum kaydından veya aracı sevkinden önce eşleşen kimlikleri 30 saniyelik sınırlı bir süre boyunca düşürür; teslim yarışlarını kapatmak için bir kaynak kimliği göndermeden önce ayrılabilir veya bir kanal rotası kaldırıldığında yenilenebilir. isRecentOutboundMessageIdentity(...), kanal tanılamaları ve testleri için aynı sorguyu kullanıma sunar. Aynı kararlı kimlik için paralel bir kanala yerel TTL önbelleği tutmayın.

Düz metin temizleme

Bir giden bağdaştırıcının desteklenen HTML biçimlendirme etiketlerini hafif metin işaretlemesine dönüştürmesi gerektiğinde sanitizeForPlainText(...) kullanın. Varsayılan ayar mevcut sohbet tarzı kalın ve üstü çizili işaretleyicileri korur. Yalnızca kanal sonucu Markdown olarak yeniden ayrıştırıyorsa { style: "markdown" } geçirin:

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

Markdown stili **bold** ve ~~strikethrough~~ kullanır; italik ve satır içi kod, her iki stilde de _italic_ ve ters tırnak işaretleyicilerini korur. Temizlemeden sonra işaretleyici metnini yeniden yazmak yerine stili kanal sınırında seçin.

Teslim Kanıtı

Bir MessageReceipt, kanal bağdaştırıcısının döndürdüğü sonucu kaydeder. Somut platform ileti tanımlayıcıları, platform gönderme yolunun iletiyi kabul ettiğini gösterir; alıcının cihazında görüntülendiğini veya okunduğunu kanıtlamaz. Platform ileti tanımlayıcısı olmayan alındılar yalnızca yerel alındı meta verileridir. Okundu bilgisi veya cihaz teslim durumu bulunan kanallar bu olguları kanala özgü ayrı bir yol üzerinden izlemelidir.

Bir kanal bağdaştırıcısı, bir hatayı yeniden denemenin alıcıya görünür bir gönderimi çoğaltamayacağını ve sonlandırma yapabilen hiçbir çağrının başlamadığını kanıtlayabiliyorsa openclaw/plugin-sdk/error-runtime içinden new PlatformMessageNotDispatchedError("...", { cause: error }) fırlatın. Böylece çekirdek, eski gönderme girişimi kanıtlarını temizleyebilir ve kuyruğa alınmış amacı güvenle yeniden deneyebilir. Bu iddiayı yalnızca nihai sevk sınırının sahibi olan bağdaştırıcı ileri sürebilir. İşaretleyiciyi asla bir sonlandırma/gönderme çağrısı başladıktan veya belirsiz bir sonuç döndürdükten sonra kullanmayın; yanlış işaretleme iletileri çoğaltabilir.

Mevcut giden bağdaştırıcılar

Kanalda zaten uyumlu bir outbound bağdaştırıcısı varsa gönderme kodunu çoğaltmak yerine ileti bağdaştırıcısını bundan türetin:

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

Dayanıklı göndermeler

Çalışma zamanı gönderme yardımcıları da channel-outbound üzerinde bulunur:

  • sendDurableMessageBatch(...)
  • withDurableMessageSendContext(...)
  • deliverInboundReplyWithMessageSendContext(...)
  • resolveChannelDraftStreamingChunking(...) gibi taslak akışı/ilerleme yardımcıları

sendDurableMessageBatch(...) tek bir açık sonuç döndürür:

Sonuç Anlamı
sent platform gönderme yolu tarafından en az bir görünür platform iletisi kabul edildi
suppressed hiçbir platform iletisi eksik olarak değerlendirilmemelidir
partial_failed sonraki bir yük veya yan etki başarısız olmadan önce en az bir platform iletisi kabul edildi
failed hiçbir platform alındısı üretilmedi

Bir toplu işlem gönderilmiş, engellenmiş ve başarısız yükleri karıştırdığında payloadOutcomes kullanın. Boş bir eski doğrudan teslim sonucundan kanca iptalini çıkarsamayın.

Ertelenmiş teslim kabulü

Çözümlenmiş bir hesap, çekirdek tarafından yönetilen giden veya ertelenmiş teslimi güvenle kabul edemediğinde message.durableFinal.admitDeferredDelivery(...) kullanın. Çekirdek bu kancayı, kuyruk kalıcılığını atlayan yollar dâhil olmak üzere canlı giden işten önce ve kurtarılan bir amacı yeniden oynatmadan önce eşzamanlı olarak çağırır. Bağlam; cfg, channel, to, accountId ve live ya da recovery değerinde bir phase içerir.

Devam etmek için { status: "allowed" } döndürün. Teslimin kalıcı hâle getirilmemesi, doğrudan gönderilmemesi veya yeniden oynatılmaması gerektiğinde { status: "permanent_rejection", reason } döndürün. Canlı bir ret, kuyruk oluşturulmadan, ileti kancaları çalıştırılmadan veya platform işi yapılmadan önce başarısız olur. Kurtarma reddi, kuyruğa alınmış kaydı başarısız olarak işaretler ve uzlaştırma ile yeniden oynatmayı atlar. Kancanın belirtilmemesi izin verildiği anlamına gelir.

Kanca, bir gönderim yolu değil, eşzamanlı bir kabul kararıdır. Yalnızca önceden yüklenmiş yapılandırmayı veya çalışma zamanı durumunu okuyun; ağ, dosya sistemi ya da başka eşzamansız G/Ç işlemleri gerçekleştirmeyin. Sözleşme testleri, hem aşamaları hem de sonuç değişkenlerini openclaw/plugin-sdk/channel-outbound içindeki ChannelMessageDurableFinalAdapter üzerinden sınamalıdır.

Uyumluluk dağıtımı

Gelen yanıt dağıtımını channel-inbound içindeki dispatchChannelInboundReply(...) üzerinden oluşturun. Platform teslimatını teslimat bağdaştırıcısında tutun; mesaj bağdaştırıcıları, kalıcı gönderimler, alındı bildirimleri, canlı önizleme ve yanıt işlem hattı seçenekleri için channel-outbound kullanın.

Was this useful?
On this page

On this page