- Temel ilkeller reply değil, receive ve send olmalıdır.
- Yanıt, yalnızca giden ileti üzerindeki bir ilişkidir.
- Turn, gelen ileti işleme kolaylığıdır; teslimatın sahibi değildir.
- Gönderme bağlam tabanlı olmalıdır:
begin, render, önizleme veya akış, son gönderim, commit, fail. - Alma da bağlam tabanlı olmalıdır: normalleştir, tekilleştir, yönlendir, kaydet, gönder, platform onayı, fail.
- Herkese açık Plugin SDK, tek ve küçük bir kanal-giden yüzeyine indirgenmelidir.
Sorunlar
Mevcut kanal yığını, birkaç geçerli yerel ihtiyaçtan büyüdü:- Basit gelen bağdaştırıcıları
runtime.channel.inbound.runkullanır. - Zengin bağdaştırıcılar
runtime.channel.inbound.runPreparedReplykullanır. - Eski yardımcılar
dispatchInboundReplyWithBase,recordInboundSessionAndDispatchReply, yanıt yükü yardımcıları, yanıt parçalama, yanıt referansları ve giden runtime yardımcıları kullanır. - Önizleme akışı kanala özgü göndericilerde yaşar.
- Son teslimat dayanıklılığı, mevcut yanıt yükü yollarının etrafına ekleniyor.
Hedefler
- Tüm kanal iletisi alma ve gönderme yolları için tek bir core yaşam döngüsü.
- Bir bağdaştırıcı yeniden oynatma açısından güvenli davranış bildirdikten sonra yeni ileti yaşam döngüsünde varsayılan olarak dayanıklı son gönderimler.
- Paylaşılan önizleme, düzenleme, akış, sonlandırma, yeniden deneme, kurtarma ve alındı semantikleri.
- Üçüncü taraf Plugin’lerin öğrenip sürdürebileceği küçük bir Plugin SDK yüzeyi.
- Geçiş sırasında mevcut gelen yanıt uyumluluğu çağırıcıları için uyumluluk.
- Yeni kanal yetenekleri için net genişletme noktaları.
- Core içinde platforma özgü dallar yok.
- Token-delta kanal iletileri yok. Kanal akışı ileti önizlemesi, düzenleme, ekleme veya tamamlanmış blok teslimatı olarak kalır.
- Operasyonel/sistem çıktısı için yapılandırılmış OpenClaw-kökenli metadata; böylece görünür Gateway hataları paylaşılan bot etkin odalara yeni prompt’lar olarak yeniden girmez.
Hedef olmayanlar
- İlk aşamada her mevcut kanalı dayanıklı ileti teslimatına zorlamayın.
- Her kanalı aynı yerel taşıma davranışına zorlamayın.
- Core’a Telegram konuları, Slack yerel akışları, Matrix redaction’ları, Feishu kartları, QQ ses veya Teams etkinliklerini öğretmeyin.
- Tüm iç geçiş yardımcılarını kararlı SDK API olarak yayımlamayın.
- Yeniden denemelerin tamamlanmış idempotent olmayan platform işlemlerini yeniden oynatmasını sağlamayın.
Referans model
Vercel Chat iyi bir herkese açık zihinsel modele sahiptir:ChatThreadChannelMessagepostMessage,editMessage,deleteMessage,stream,startTypingve geçmiş getirmeleri gibi bağdaştırıcı yöntemleri- tekilleştirme, kilitler, kuyruklar ve kalıcılık için bir durum bağdaştırıcısı
- Doğrudan taşıma çağrılarından önce dayanıklı giden gönderim niyetleri.
- Begin, commit ve fail içeren açık gönderim bağlamları.
- Platform onay politikasını bilen alma bağlamları.
- Yeniden başlatmadan sağ çıkan ve düzenleme, silme, kurtarma ve yinelenen bastırmayı yönlendirebilen alındılar.
- Daha küçük bir herkese açık SDK. Birlikte gelen Plugin’ler iç runtime yardımcılarını kullanabilir, ancak üçüncü taraf Plugin’ler tek ve tutarlı bir ileti API’si görmelidir.
- Ajana özgü davranış: oturumlar, transkriptler, blok akışı, araç ilerlemesi, onaylar, medya direktifleri, sessiz yanıtlar ve grup mention geçmişi.
thread.post() tarzı promise’ler OpenClaw için yeterli değildir. Bir gönderimin kurtarılabilir olup olmadığına karar veren işlem sınırını gizlerler.
Core model
Yeni domain,src/channels/message/* gibi bir iç core namespace altında yaşamalıdır.
Dört kavramı vardır:
receive gelen yaşam döngüsünün sahibidir.
send giden yaşam döngüsünün sahibidir.
live önizleme, düzenleme, ilerleme ve akış durumunun sahibidir.
state dayanıklı niyet depolama, alındılar, idempotency, kurtarma, kilitler ve tekilleştirmenin sahibidir.
İleti terimleri
İleti
Normalleştirilmiş ileti platformdan bağımsızdır:Hedef
Hedef, iletinin nerede yaşadığını açıklar:İlişki
Yanıt bir ilişkidir, API kökü değildir:Köken
Köken, bir iletiyi kimin ürettiğini ve OpenClaw’un o iletinin yankılarını nasıl ele alması gerektiğini açıklar. İlişkiden ayrıdır: Bir ileti bir kullanıcıya yanıt olabilir ve yine de OpenClaw-kökenli operasyonel çıktı olabilir.allowBots etkin olduğunda paylaşılan odalarda bot tarafından yazılmış girdi olarak kabul edilmemelidir.
Alındı
Alındılar birinci sınıftır:Alma bağlamı
Alma çıplak bir yardımcı çağrısı olmamalıdır. Core’un tekilleştirme, yönlendirme, oturum kaydı ve platform onay politikasını bilen bir bağlama ihtiyacı vardır.- Taşıma onayı: Platform webhook’una veya soketine OpenClaw’un olay zarfını kabul ettiğini söyler. Bazı platformlar bunu gönderimden önce gerektirir.
- Polling offset onayı: Aynı olayın yeniden getirilmemesi için bir imleci ilerletir. Bu, kurtarılamayacak işin ötesine geçmemelidir.
- Gelen kayıt onayı: OpenClaw’un bir yeniden teslimatı tekilleştirmek ve yönlendirmek için yeterli gelen metadata’yı kalıcılaştırdığını doğrular.
- Kullanıcıya görünür alındı: İsteğe bağlı okundu/durum/yazıyor davranışı; asla dayanıklılık sınırı değildir.
ReceiveAckPolicy yalnızca taşıma veya polling onayını kontrol eder. Okundu alındıları veya durum tepkileri için yeniden kullanılmamalıdır.
Bot yetkilendirmesinden önce, kanal ileti kökeni metadata’sını çözebildiğinde alma, paylaşılan OpenClaw yankı politikasını uygulamalıdır:
allowBots yetkilendirmesinden geçmeye devam eder.
Onay politikası açıktır:
getUpdates getirme offset’i hâlâ polling kütüphanesi tarafından kontrol edilir, bu yüzden kalan daha derin kesim, OpenClaw’un yeniden başlatma watermark’ının ötesinde platform düzeyinde yeniden teslimata ihtiyacımız olursa tam dayanıklı bir polling kaynağıdır. Webhook platformları anında HTTP onayı gerektirebilir, ancak webhook’lar yeniden teslim edebildiği için yine de gelen tekilleştirmeye ve dayanıklı giden gönderim niyetlerine ihtiyaç duyarlar.
Gönderme bağlamı
Gönderme de bağlama dayalıdır:unknown_after_send içinde sürdürülmelidir. Uzlaştırması
olmayan kanallar, yalnızca yinelenen görünür mesajlar o kanal ve ilişki için kabul edilebilir,
belgelenmiş bir ödünleşimse en az bir kez yeniden oynatmayı seçebilir.
Geçerli SDK uzlaştırma köprüsü, bağdaştırıcının
reconcileUnknownSend bildirmesini gerektirir, ardından durableFinal.reconcileUnknownSend ile
bilinmeyen bir girdiyi sent, not_sent veya unresolved olarak
sınıflandırmasını ister; yalnızca not_sent yeniden oynatmaya izin verir
ve çözülemeyen girdiler terminal durumda kalır ya da yalnızca
uzlaştırma denetimini yeniden dener.
Dayanıklılık ilkesi açık olmalıdır:
required, dayanıklı amacı yazamadığında çekirdeğin kapalı hatayla sonlanması gerektiği anlamına gelir.
best_effort, kalıcılık kullanılamadığında devam edebilir. disabled, eski doğrudan gönderme
davranışını korur. Geçiş sırasında, eski sarmalayıcılar ve genel
uyumluluk yardımcıları varsayılan olarak disabled kullanır; bir kanalın genel bir giden bağdaştırıcısı
olduğu gerçeğinden required çıkarımı yapmamalıdırlar.
Gönderme bağlamları ayrıca kanal yerelindeki gönderim sonrası etkilerin sahibidir. Dayanıklı teslimat,
önceden kanalın doğrudan gönderme yoluna bağlı olan yerel davranışı atlıyorsa geçiş güvenli değildir.
Örnekler arasında öz-yankı bastırma önbellekleri, ileti dizisine katılım işaretçileri, yerel düzenleme
çapaları, model imzası işleme ve platforma özgü yinelenen korumaları bulunur. Bu etkiler, o kanal
dayanıklı genel nihai teslimatı etkinleştirmeden önce gönderme bağdaştırıcısına, işleme bağdaştırıcısına
veya adlandırılmış bir gönderme bağlamı hook’una taşınmalıdır.
Gönderme yardımcıları alındı kayıtlarını çağıranlarına kadar geri döndürmelidir. Dayanıklı
sarmalayıcılar mesaj kimliklerini yutamaz veya bir kanal teslimat sonucunu
undefined ile değiştiremez; arabelleğe alınmış dağıtıcılar bu kimlikleri ileti dizisi çapaları,
sonraki düzenlemeler, önizleme sonlandırması ve yinelenen bastırma için kullanır.
Fallback göndermeleri tek tek payload’lar üzerinde değil, batch’ler üzerinde çalışır. Sessiz yanıt yeniden yazımları,
medya fallback’i, kart fallback’i ve parça projeksiyonu birden fazla teslim edilebilir mesaj üretebilir;
bu nedenle bir gönderme bağlamı ya tüm projekte edilen batch’i teslim etmeli ya da neden yalnızca bir
payload’ın geçerli olduğunu açıkça belgelemelidir.
unknown_after_send olarak işaretlemelidir.
Canlı bağlam
Önizleme, düzenleme, ilerleme ve akış davranışı tek bir isteğe bağlı yaşam döngüsü olmalıdır.- Telegram gönderimi ve önizlemeyi düzenleme; bayat önizleme yaşından sonra yeni nihai mesaj.
- Discord gönderimi ve önizlemeyi düzenleme; medya/hata/açık yanıt durumunda iptal.
- İleti dizisi şekline bağlı olarak Slack yerel akışı veya taslak önizlemesi.
- Mattermost taslak gönderi sonlandırması.
- Matrix taslak olay sonlandırması veya uyuşmazlıkta redaksiyon.
- Teams yerel ilerleme akışı.
- QQ Bot akışı veya birikimli fallback.
Bağdaştırıcı yüzeyi
Genel SDK hedefi tek bir alt yol olmalıdır:origin.decode OpenClaw kökenli metadata döndürdüğünde
çekirdek paylaşılan OpenClaw yankı yüklemini çalıştırmalıdır. Alma bağdaştırıcısı bot yazarı ve oda şekli
gibi platform olgularını sağlar; bırakma kararı ve sıralama çekirdeğe aittir, böylece kanallar metin
filtrelerini yeniden uygulamaz.
Köken bağdaştırıcısı:
MessageOrigin ayarlar. Kanallar onu yalnızca yerel aktarım metadata’sına ve metadata’sından
çevirir. Slack bunu chat.postMessage({ metadata }) ve gelen message.metadata ile eşler;
Matrix bunu ek olay içeriğine eşleyebilir; yerel metadata’sı olmayan kanallar, en iyi mevcut yaklaşım
bu olduğunda bir alındı kaydı/giden kayıt defteri kullanabilir.
Yetenekler:
Genel SDK azaltımı
Yeni genel yüzey şu kavramsal alanları içine almalı veya kullanımdan kaldırmalıdır:reply-runtimereply-dispatch-runtimereply-referencereply-chunkingreply-payloadinbound-reply-dispatchchannel-reply-pipelineoutbound-runtimegenel kullanımlarının çoğu- ad hoc taslak akış yaşam döngüsü yardımcıları
plugin-sdk/channel-outbound konumuna yönlendirmelidir.
Kanal gelen ile ilişki
runtime.channel.inbound.*, geçiş sırasında çalışma zamanı köprüsüdür.
Bir uyumluluk bağdaştırıcısına dönüşmelidir:
channel.inbound.runPreparedReply da başlangıçta kalmalıdır:
channel.turn çalışma zamanı yüzeyi kaldırıldı. Çalışma zamanı çağıranları
channel.inbound.* kullanır; kanal dokümanları ve SDK alt yolları gelen/mesaj adlarını kullanır.
Uyumluluk koruma sınırları
Geçiş sırasında, mevcut teslimat callback’i “bu payload’ı gönder”in ötesinde yan etkilere sahip olan her kanal için genel dayanıklı teslimat isteğe bağlıdır. Eski giriş noktaları varsayılan olarak dayanıklı değildir:channel.inbound.runvedispatchChannelInboundReply, o kanal açıkça denetlenmiş bir dayanıklı ilke/seçenek nesnesi sağlamadıkça kanalın teslimat callback’ini kullanır.channel.inbound.runPreparedReply, hazırlanmış dağıtıcı gönderme bağlamını açıkça çağırana kadar kanalın sahipliğinde kalır.recordInboundSessionAndDispatchReply,dispatchInboundReplyWithBaseve doğrudan DM yardımcıları gibi genel uyumluluk yardımcıları, çağıranın sağladığıdeliverveyareplycallback’inden önce asla genel dayanıklı teslimat enjekte etmez.
durable: undefined, “dayanıklı değil” anlamına gelir. Dayanıklı yol
yalnızca açık bir ilke/seçenek değeriyle etkinleştirilir. durable: false uyumluluk yazımı olarak kalabilir, ancak uygulama her geçiş yapmamış kanalın bunu eklemesini
gerektirmemelidir.
Geçerli köprü kodu dayanıklılık kararını açık tutmalıdır:
- Dayanıklı nihai teslim, ayrıştırılmış bir durum döndürür.
handled_visiblevehandled_no_sendterminaldir;unsupportedvenot_applicablekanalın sahip olduğu teslime geri dönebilir;failedgönderim hatasını iletir. - Genel dayanıklı nihai teslim, sessiz teslim, yanıt hedefini koruma, yerel alıntıyı koruma ve ileti gönderme kancaları gibi bağdaştırıcı yetenekleriyle sınırlandırılır. Eşdeğerlik eksikse, kullanıcıya görünür davranışı değiştiren genel bir gönderim değil, kanalın sahip olduğu teslim seçilmelidir.
- Kuyruk destekli dayanıklı gönderimler bir teslim amacı başvurusu sunar. Mevcut
pendingFinalDelivery*oturum alanları geçiş sırasında amaç kimliğini taşıyabilir; son durum, dondurulmuş yanıt metni ve geçici bağlam alanları yerine birMessageSendIntentdeposudur.
- Genel gönderim bağdaştırıcısı, eski doğrudan yolla aynı işleme ve taşıma davranışını yürütür.
- Yerel gönderim sonrası yan etkiler gönderim bağlamı üzerinden korunur.
- Bağdaştırıcı, tüm platform ileti kimlikleriyle birlikte alındı bilgileri veya teslim sonuçları döndürür.
- Hazırlanmış dağıtıcı yolları ya yeni gönderim bağlamını çağırır ya da dayanıklılık garantisinin dışında olarak belgelenmiş kalır.
- Geri dönüş teslimi, yalnızca ilkini değil yansıtılan her yükü işler.
- Dayanıklı geri dönüş teslimi, yansıtılan yük dizisinin tamamını tek bir yeniden oynatılabilir amaç veya toplu plan olarak kaydeder.
- iMessage izleyici teslimi, başarılı bir gönderimden sonra gönderilen iletileri bir yankı önbelleğine kaydeder. Dayanıklı nihai gönderimler bu önbelleği yine de doldurmalıdır; aksi halde OpenClaw kendi nihai yanıtlarını gelen kullanıcı iletileri olarak yeniden içe alabilir.
- Tlon, isteğe bağlı bir model imzası ekler ve grup yanıtlarından sonra katılım sağlanan ileti dizilerini kaydeder. Genel dayanıklı teslim bu etkileri atlamamalıdır; bunları Tlon işleme/gönderim/sonlandırma bağdaştırıcılarına taşıyın ya da Tlon’u kanalın sahip olduğu yolda tutun.
- Discord ve diğer hazırlanmış dağıtıcılar zaten doğrudan teslim ve önizleme davranışına sahiptir. Hazırlanmış dağıtıcıları nihai iletileri açıkça gönderim bağlamı üzerinden yönlendirmedikçe, birleştirilmiş tur dayanıklılık garantisi kapsamında değildirler.
- Telegram sessiz geri dönüş teslimi, yansıtılan yük dizisinin tamamını teslim etmelidir. Tek yük kısayolu, yansıtmadan sonra ek geri dönüş yüklerini düşürebilir.
- LINE, Zalo, Nostr ve diğer mevcut birleştirilmiş/yardımcı yolların yanıt belirteci işleme, medya vekilleme, gönderilen ileti önbellekleri, yükleme/durum temizliği veya yalnızca geri çağrı hedefleri olabilir. Bu anlamlar gönderim bağdaştırıcısı tarafından temsil edilip testlerle doğrulanana kadar kanalın sahip olduğu teslimde kalırlar.
- Doğrudan DM yardımcılarında, tek doğru taşıma hedefi olan bir yanıt geri
çağrısı bulunabilir. Genel giden yol,
OriginatingToveyaToüzerinden tahminde bulunup bu geri çağrıyı atlamamalıdır. - OpenClaw Gateway hata çıktısı insanlar tarafından görünür kalmalıdır, ancak
etiketlenmiş bot tarafından yazılmış oda yankıları
allowBotsyetkilendirmesinden önce düşürülmelidir. Kanallar bunu kısa bir acil durdurma önlemi dışında görünür metin önek filtreleriyle uygulamamalıdır; dayanıklılık sözleşmesi yapılandırılmış kaynak meta verisidir.
Dahili depolama
Dayanıklı kuyruk, yanıt yüklerini değil ileti gönderim amaçlarını depolamalıdır.Hata sınıfları
Kanal bağdaştırıcıları taşıma hatalarını kapalı kategoriler halinde sınıflandırır:transientverate_limitiçin yeniden deneyin.- Bir işleme geri dönüşü yoksa
invalid_payloadiçin yeniden denemeyin. - Yapılandırma değişene kadar
authveyapermissioniçin yeniden denemeyin. not_foundiçin kanal bunun güvenli olduğunu beyan ettiğinde canlı sonlandırmanın düzenlemeden yeni gönderime geri dönmesine izin verin.conflictiçin iletinin zaten var olup olmadığına karar vermek üzere alındı bilgisi/idempotency kurallarını kullanın.- Bağdaştırıcının platform G/Ç’sini tamamlamış olabileceği ancak alındı bilgisi
kaydından önce oluşan herhangi bir hata, bağdaştırıcı platform işleminin
gerçekleşmediğini kanıtlayamadığı sürece
unknown_after_sendolur.
Kanal eşlemesi
| Kanal | Hedef geçiş |
|---|---|
| Telegram | Alındı ilkesi ve dayanıklı nihai gönderimler. Canlı bağdaştırıcı gönderimi ve önizleme düzenlemeyi, eski önizlemenin nihai gönderimini, konuları, alıntılı yanıt önizlemesini atlamayı, medya yedeğini ve retry-after işlemeyi üstlenir. |
| Discord | Gönderim bağdaştırıcısı mevcut dayanıklı yük teslimini sarmalar. Canlı bağdaştırıcı taslak düzenlemeyi, ilerleme taslağını, medya/hata önizleme iptalini, yanıt hedefini korumayı ve mesaj kimliği makbuzlarını üstlenir. Paylaşılan odalarda bot tarafından yazılan Gateway hatası yankılarını denetleyin; Discord normal mesajlarda kaynak meta verisi taşıyamıyorsa giden kayıt defteri veya başka bir yerel eşdeğer kullanın. |
| Slack | Gönderim bağdaştırıcısı normal sohbet gönderilerini işler. Canlı bağdaştırıcı, iş parçacığı şekli desteklediğinde yerel akışı, aksi halde taslak önizlemeyi seçer. Makbuzlar iş parçacığı zaman damgalarını korur. Kaynak bağdaştırıcısı OpenClaw Gateway hatalarını Slack chat.postMessage.metadata alanına eşler ve etiketli bot odası yankılarını allowBots yetkilendirmesinden önce bırakır. |
| Gönderim bağdaştırıcısı dayanıklı nihai niyetlerle metin/medya gönderimini üstlenir. Alım bağdaştırıcısı grup bahsini ve gönderen kimliğini işler. WhatsApp düzenlenebilir bir taşıma elde edene kadar canlı bağdaştırıcı olmayabilir. | |
| Matrix | Canlı bağdaştırıcı taslak olay düzenlemelerini, sonlandırmayı, redaksiyonu, şifreli medya kısıtlarını ve yanıt hedefi uyuşmazlığı yedeğini üstlenir. Alım bağdaştırıcısı şifreli olay hidrasyonunu ve tekilleştirmeyi üstlenir. Kaynak bağdaştırıcısı OpenClaw Gateway hatası kaynağını Matrix olay içeriğine kodlamalı ve yapılandırılmış bot odası yankılarını allowBots işlemeden önce bırakmalıdır. |
| Mattermost | Canlı bağdaştırıcı tek bir taslak gönderiyi, ilerleme/araç katlamayı, yerinde sonlandırmayı ve yeni gönderim yedeğini üstlenir. |
| Microsoft Teams | Canlı bağdaştırıcı yerel ilerleme ve blok akışı davranışını üstlenir. Gönderim bağdaştırıcısı etkinlikleri ve ek/kart makbuzlarını üstlenir. |
| Feishu | İşleme bağdaştırıcısı metin/kart/ham işlemeyi üstlenir. Canlı bağdaştırıcı akış kartlarını ve yinelenen nihai bastırmayı üstlenir. Gönderim bağdaştırıcısı yorumları, konu oturumlarını, medyayı ve ses bastırmayı üstlenir. |
| QQ Bot | Canlı bağdaştırıcı C2C akışını, biriktirici zaman aşımını ve yedek nihai gönderimi üstlenir. İşleme bağdaştırıcısı medya etiketlerini ve metin-olarak-ses davranışını üstlenir. |
| Signal | Basit alım ve gönderim bağdaştırıcısı. signal-cli güvenilir düzenleme desteği eklemedikçe canlı bağdaştırıcı yoktur. |
| iMessage | Basit alım ve gönderim bağdaştırıcısı. Dayanıklı nihai gönderimler monitör teslimini atlayabilmeden önce iMessage gönderimi monitör yankı önbelleği doldurmasını korumalıdır. |
| Google Chat | İş parçacığı ilişkisi alanlara ve iş parçacığı kimliklerine eşlenmiş basit alım ve gönderim bağdaştırıcısı. Etiketli OpenClaw Gateway hatası yankıları için allowBots=true oda davranışını denetleyin. |
| LINE | Yanıt belirteci kısıtları hedef/ilişki kabiliyeti olarak modellenmiş basit alım ve gönderim bağdaştırıcısı. |
| Nextcloud Talk | SDK alım köprüsü ve gönderim bağdaştırıcısı. |
| IRC | Basit alım ve gönderim bağdaştırıcısı, dayanıklı düzenleme makbuzu yok. |
| Nostr | Şifreli DM’ler için alım ve gönderim bağdaştırıcısı; makbuzlar olay kimlikleridir. |
| QA Kanalı | Alım, gönderim, canlı, yeniden deneme ve kurtarma davranışı için sözleşme testi bağdaştırıcısı. |
| Synology Chat | Basit alım ve gönderim bağdaştırıcısı. |
| Tlon | Genel dayanıklı nihai teslim etkinleştirilmeden önce gönderim bağdaştırıcısı model imzası işlemeyi ve katılınan iş parçacığı takibini korumalıdır. |
| Twitch | Hız sınırı sınıflandırmalı basit alım ve gönderim bağdaştırıcısı. |
| Zalo | Basit alım ve gönderim bağdaştırıcısı. |
| Zalo Personal | Basit alım ve gönderim bağdaştırıcısı. |
Geçiş planı
Aşama 1: Dahili Mesaj Alanı
- Mesajlar, hedefler, ilişkiler,
kaynaklar, makbuzlar, kabiliyetler, dayanıklı niyetler, alım bağlamı, gönderim
bağlamı, canlı bağlam ve hata sınıfları için
src/channels/message/*türleri ekleyin. - Geçerli yanıt teslimi tarafından kullanılan geçiş köprüsü yük türüne
origin?: MessageOriginekleyin, ardından refaktör yanıt yüklerini değiştirdikçe bu alanıChannelMessageve işlenmiş mesaj türlerine taşıyın. - Bağdaştırıcılar ve testler şekli kanıtlayana kadar bunu dahili tutun.
- Durum geçişleri ve serileştirme için saf birim testleri ekleyin.
Aşama 2: Dayanıklı Gönderim Çekirdeği
- Mevcut giden kuyruğunu yanıt yükü dayanıklılığından dayanıklı mesaj gönderme niyetlerine taşıyın.
- Dayanıklı gönderim niyetinin yalnızca tek bir yanıt yükü değil, projeksiyonu yapılmış bir yük dizisi veya toplu plan taşımasına izin verin.
- Uyumluluk dönüştürmesiyle geçerli kuyruk kurtarma davranışını koruyun.
deliverOutboundPayloadsişlevininmessages.sendçağırmasını sağlayın.- Bağdaştırıcı yeniden oynatma güvenliğini bildirdikten sonra, yeni mesaj yaşam döngüsünde dayanıklı niyet yazılamadığında nihai gönderim dayanıklılığını varsayılan yapın ve kapalı şekilde hata verin. Mevcut gelen çalıştırıcı ve SDK uyumluluk yolları bu aşamada varsayılan olarak doğrudan gönderimde kalır.
- Makbuzları tutarlı şekilde kaydedin.
- Dayanıklı gönderimi terminal bir yan etki gibi ele almak yerine makbuzları ve teslim sonuçlarını özgün dağıtıcı çağıranına döndürün.
- Kurtarma, yeniden oynatma ve parçalı gönderimler OpenClaw operasyonel kökenini korusun diye mesaj kaynağını dayanıklı gönderim niyetleri üzerinden kalıcı hale getirin.
Aşama 3: Kanal Gelen Köprüsü
channel.inbound.runvedispatchChannelInboundReplyişlevlerinimessages.receivevemessages.sendüzerine yeniden uygulayın.- Geçerli olgu türlerini kararlı tutun.
- Varsayılan olarak eski davranışı koruyun. Birleştirilmiş dönüş kanalı yalnızca bağdaştırıcısı yeniden oynatma açısından güvenli bir dayanıklılık ilkesiyle açıkça katıldığında dayanıklı hale gelir.
- Yerel düzenlemeleri sonlandıran ve henüz güvenli şekilde yeniden oynatamayan yollar için
uyumluluk kaçış yolu olarak
durable: falsedeğerini koruyun, ancak geçirilmemiş kanalları korumak içinfalseişaretlerine güvenmeyin. - Birleştirilmiş dönüş dayanıklılığını yalnızca yeni mesaj yaşam döngüsünde, kanal eşlemesi genel gönderim yolunun eski kanal teslim semantiğini koruduğunu kanıtladıktan sonra varsayılan yapın.
Aşama 4: Hazırlanmış Dağıtıcı Köprüsü
deliverDurableInboundReplyPayloadyerine bir gönderme bağlamı köprüsü kullanın.- Eski yardımcıyı bir sarmalayıcı olarak tutun.
- Önce Telegram, WhatsApp, Slack, Signal, iMessage ve Discord’u taşıyın çünkü bunlarda zaten durable-final çalışması veya daha basit gönderme yolları var.
- Her hazırlanmış dispatcher’ı, gönderme bağlamına açıkça dahil olana kadar kapsam dışı kabul edin. Dokümantasyon ve changelog girdileri, tüm otomatik final yanıtlarını iddia etmek yerine “birleştirilmiş kanal turları” demeli veya taşınan kanal yollarını adlandırmalıdır.
recordInboundSessionAndDispatchReply, doğrudan DM yardımcıları ve benzer herkese açık uyumluluk yardımcılarını davranışı koruyacak şekilde tutun. Bunlar daha sonra açık bir gönderme bağlamı katılımı sunabilir, ancak çağıranın sahip olduğu teslim callback’inden önce otomatik olarak genel durable teslimat denememelidir.
Aşama 5: Birleşik Canlı Yaşam Döngüsü
messages.liveöğesini iki kanıt adapter’ı ile oluşturun:- Gönderme, düzenleme ve eski final gönderimi için Telegram.
- Taslak finalizasyonu ve redaction fallback için Matrix.
- Sonra Discord, Slack, Mattermost, Teams, QQ Bot ve Feishu’yu taşıyın.
- Yinelenen önizleme finalizasyon kodunu yalnızca her kanalın eşdeğerlik testleri olduktan sonra silin.
Aşama 6: Herkese Açık SDK
openclaw/plugin-sdk/channel-outboundekleyin.- Bunu tercih edilen kanal Plugin API’si olarak belgeleyin.
- Paket export’larını, entrypoint envanterini, üretilen API baseline’larını ve Plugin SDK dokümanlarını güncelleyin.
- Kanal-outbound SDK yüzeyine
MessageOrigin, origin encode/decode hook’ları ve paylaşılanshouldDropOpenClawEchopredicate’ini dahil edin. - Eski alt yollar için uyumluluk sarmalayıcılarını tutun.
- Paketlenmiş Plugin’ler taşındıktan sonra yanıta göre adlandırılmış SDK yardımcılarını dokümanlarda kullanımdan kaldırılmış olarak işaretleyin.
Aşama 7: Tüm Göndericiler
Yanıt olmayan tüm outbound üreticilerimessages.send üzerine taşıyın:
- Cron ve Heartbeat bildirimleri
- görev tamamlamaları
- hook sonuçları
- onay istemleri ve onay sonuçları
- mesaj aracı gönderimleri
- alt ajan tamamlama duyuruları
- açık CLI veya Control UI gönderimleri
- otomasyon/broadcast yolları
Aşama 8: Tur Adlı Uyumluluğu Kaldırma
- Uyumluluk penceresi olarak inbound/message adlı sarmalayıcıları tutun.
- Migration notlarını yayımlayın.
- Eski import’lara karşı Plugin SDK uyumluluk testlerini çalıştırın.
- Eski dahili yardımcıları yalnızca hiçbir paketlenmiş Plugin onlara ihtiyaç duymadığında ve üçüncü taraf sözleşmelerinin kararlı bir alternatifi olduğunda kaldırın veya gizleyin.
Test planı
Birim testleri:- Durable gönderme intent serileştirmesi ve kurtarma.
- Idempotency key yeniden kullanımı ve yinelenenlerin bastırılması.
- Receipt commit ve replay atlama.
- Bir adapter uzlaştırmayı desteklediğinde replay öncesi uzlaştıran
unknown_after_sendkurtarması. - Hata sınıflandırma politikası.
- Alma ack politikası sıralaması.
- Yanıt, followup, sistem ve broadcast gönderimleri için ilişki eşlemesi.
- Gateway hatası origin factory’si ve
shouldDropOpenClawEchopredicate’i. - Payload normalizasyonu, chunking, durable kuyruk serileştirmesi ve kurtarma boyunca origin korunması.
channel.inbound.runbasit adapter’ı hâlâ kaydeder ve gönderir.- Eski birleştirilmiş olay teslimatı, kanal açıkça dahil olmadıkça durable hale gelmez.
channel.inbound.runPreparedReplyköprüsü hâlâ kaydeder ve finalleştirir.- Herkese açık uyumluluk yardımcıları varsayılan olarak çağırana ait teslim callback’lerini çağırır ve bu callback’lerden önce genel gönderim yapmaz.
- Durable fallback teslimatı, yeniden başlatmadan sonra tüm projekte edilmiş payload dizisini replay eder ve erken bir crash sonrasında sonraki payload’ları kaydedilmemiş bırakamaz.
- Durable birleştirilmiş olay teslimatı, platform mesaj kimliklerini buffered dispatcher’a döndürür.
- Özel teslim hook’ları, durable teslimat devre dışı veya kullanılamaz olduğunda hâlâ platform mesaj kimliklerini döndürür.
- Final yanıt, assistant tamamlaması ile platform gönderimi arasındaki yeniden başlatmadan sağ çıkar.
- Önizleme taslağı, izin verildiğinde yerinde finalleştirilir.
- Medya/hata/yanıt hedefi uyumsuzluğu normal teslimat gerektirdiğinde önizleme taslağı iptal edilir veya redaction uygulanır.
- Blok streaming ve önizleme streaming aynı metni ikisi birden teslim etmez.
- Erken stream edilen medya final teslimatta yinelenmez.
- Telegram konu yanıtında polling ack, alma bağlamının güvenli tamamlanmış watermark’ına kadar geciktirilir.
- Kabul edilmiş ancak teslim edilmemiş güncellemeler için Telegram polling kurtarması, kalıcı güvenli-tamamlanmış offset modeliyle kapsanır.
- Telegram eski önizleme taze final gönderir ve önizlemeyi temizler.
- Telegram sessiz fallback her projekte edilmiş fallback payload’unu gönderir.
- Telegram sessiz fallback dayanıklılığı, döngü iterasyonu başına tek payload’lu durable intent değil, tüm projekte edilmiş fallback dizisini atomik olarak kaydeder.
- Medya/hata/açık yanıt durumunda Discord önizleme iptali.
- Discord final-yanıt dayanıklılığı dokümanlarda veya changelog’da iddia edilmeden önce Discord hazırlanmış dispatcher final’ları gönderme bağlamı üzerinden yönlendirilir.
- iMessage durable final gönderimleri monitor sent-message echo cache’ini doldurur.
- LINE, Zalo ve Nostr eski teslimat yolları, adapter eşdeğerlik testleri var olana kadar genel durable gönderim tarafından bypass edilmez.
- Doğrudan DM/Nostr callback teslimatı, eksiksiz bir mesaj hedefine ve replay güvenli gönderme adapter’ına açıkça taşınmadıkça yetkili kalır.
- Slack etiketli OpenClaw gateway hata mesajları outbound olarak görünür
kalır, etiketli bot-room echo’ları
allowBotsöncesinde düşer ve aynı görünür metne sahip etiketsiz bot mesajları yine normal bot yetkilendirmesini izler. - Üst düzey DM’lerde Slack native stream fallback’i taslak önizlemeye geçer.
- Matrix önizleme finalizasyonu ve redaction fallback.
- Yapılandırılmış bot hesaplarından gelen Matrix etiketli OpenClaw
gateway-failure oda echo’ları
allowBotsişlemeden önce düşer. - Discord ve Google Chat paylaşımlı oda gateway-failure cascade denetimleri,
orada genel koruma iddia edilmeden önce
allowBotsmodlarını kapsar. - Mattermost taslak finalizasyonu ve taze gönderim fallback’i.
- Teams native ilerleme finalizasyonu.
- Feishu yinelenen final bastırma.
- QQ Bot accumulator timeout fallback.
- Tlon durable final gönderimleri model-signature rendering’i ve katılım sağlanan thread takibini korur.
- WhatsApp, Signal, iMessage, Google Chat, LINE, IRC, Nostr, Nextcloud Talk, Synology Chat, Tlon, Twitch, Zalo ve Zalo Personal basit durable final gönderimleri.
- Geliştirme sırasında hedefli Vitest dosyaları.
- Tüm değişen yüzey için Testbox içinde
pnpm check:changed. - Tam refactor’ı land etmeden önce veya herkese açık SDK/export
değişikliklerinden sonra Testbox içinde daha geniş
pnpm check. - Uyumluluk sarmalayıcılarını kaldırmadan önce en az bir düzenleme yetenekli kanal ve bir basit yalnızca gönderim kanalı için canlı veya qa-channel smoke.
Açık sorular
- Telegram’ın sonunda grammY runner kaynağını, yalnızca OpenClaw’ın kalıcı yeniden başlatma watermark’ını değil, platform düzeyi yeniden teslimatı kontrol edebilen tamamen durable bir polling kaynağıyla değiştirip değiştirmemesi.
- Durable canlı önizleme durumunun final gönderme intent’iyle aynı kuyruk kaydında mı yoksa kardeş bir live-state store’da mı saklanması gerektiği.
plugin-sdk/channel-outboundyayımlandıktan sonra uyumluluk sarmalayıcılarının dokümanlarda ne kadar süre kalacağı.- Üçüncü taraf Plugin’lerin receive adapter’larını doğrudan mı uygulaması
gerektiği yoksa yalnızca
defineChannelMessageAdapterüzerinden normalize/send/live hook’ları mı sağlaması gerektiği. - Hangi receipt alanlarının herkese açık SDK’da gösterilmesinin güvenli olduğu ve hangilerinin dahili runtime durumu olarak kalacağı.
- Self-echo cache’leri ve participated-thread marker’ları gibi yan etkilerin gönderme bağlamı hook’ları, adapter’a ait finalize adımları veya receipt subscriber’ları olarak mı modellenmesi gerektiği.
- Hangi kanalların native origin metadata’sına sahip olduğu, hangilerinin kalıcı outbound registry’lerine ihtiyaç duyduğu ve hangilerinin güvenilir cross-bot echo bastırma sunamayacağı.
Kabul kriterleri
- Her paketlenmiş mesaj kanalı final görünür çıktıyı
messages.sendüzerinden gönderir. - Her inbound mesaj kanalı
messages.receiveveya belgelenmiş bir uyumluluk sarmalayıcısı üzerinden girer. - Her önizleme/düzenleme/stream kanalı taslak durumu ve finalizasyon için
messages.livekullanır. channel.inboundyalnızca bir sarmalayıcıdır.- Yanıta göre adlandırılmış SDK yardımcıları önerilen yol değil, uyumluluk export’larıdır.
- Durable kurtarma, yeniden başlatmadan sonra bekleyen final gönderimleri final yanıtı kaybetmeden veya zaten commit edilmiş gönderimleri çoğaltmadan replay edebilir; platform sonucu bilinmeyen gönderimler replay öncesi uzlaştırılır veya ilgili adapter için en az bir kez olarak belgelenir.
- Durable final gönderimleri, çağıran açıkça belgelenmiş non-durable modu seçmediği sürece durable intent yazılamadığında kapalı hata verir.
- Eski SDK uyumluluk yardımcıları varsayılan olarak doğrudan kanalın sahip olduğu teslimatı kullanır; genel durable gönderim yalnızca açık katılımdır.
- Receipt’ler, çok parçalı teslimatlar için tüm platform mesaj kimliklerini ve threading/düzenleme kolaylığı için birincil kimliği korur.
- Durable sarmalayıcılar, doğrudan teslim callback’lerini değiştirmeden önce kanal yerel yan etkilerini korur.
- Hazırlanmış dispatcher’lar, final teslimat yolları açıkça gönderme bağlamını kullanana kadar durable sayılmaz.
- Fallback teslimatı her projekte edilmiş payload’u işler.
- Durable fallback teslimatı her projekte edilmiş payload’u tek bir replay edilebilir intent veya batch plan içinde kaydeder.
- OpenClaw kaynaklı gateway hata çıktısı insanlar tarafından görünürdür, ancak etiketli bot-authored oda echo’ları origin sözleşmesi desteği beyan eden kanallarda bot yetkilendirmesinden önce düşürülür.
- Dokümanlar send, receive, live, state, receipt’ler, ilişkiler, hata politikası, migration ve test kapsamını açıklar.