Plugins
Mesaj sunumu
İleti sunumu, zengin giden sohbet kullanıcı arayüzü için OpenClaw'ın paylaşılan sözleşmesidir. Aracıların, CLI komutlarının, onay akışlarının ve plugins'in ileti amacını bir kez açıklamasını, her kanal plugin'inin ise sunabileceği en iyi yerel biçimde işlemesini sağlar.
Taşınabilir ileti kullanıcı arayüzü için sunumu kullanın:
- metin bölümleri
- küçük bağlam/alt bilgi metni
- ayırıcılar
- düğmeler
- seçim menüleri
- kart başlığı ve tonu
Paylaşılan ileti aracına Discord components, Slack
blocks, Telegram buttons, Teams card veya Feishu card gibi yeni
sağlayıcıya özgü yerel alanlar eklemeyin. Bunlar kanal plugin'inin sahip olduğu
işleyici çıktılarıdır.
Sözleşme
Plugin yazarları herkese açık sözleşmeyi şuradan içe aktarır:
MessagePresentation,
ReplyPayloadDelivery,
} from "openclaw/plugin-sdk/interactive-runtime";
Biçim:
type MessagePresentation = {
title?: string;
tone?: "neutral" | "info" | "success" | "warning" | "danger";
blocks: MessagePresentationBlock[];
};
type MessagePresentationBlock =
| { type: "text"; text: string }
| { type: "context"; text: string }
| { type: "divider" }
| { type: "buttons"; buttons: MessagePresentationButton[] }
| { type: "select"; placeholder?: string; options: MessagePresentationOption[] };
type MessagePresentationButton = {
label: string;
value?: string;
url?: string;
style?: "primary" | "secondary" | "success" | "danger";
};
type MessagePresentationOption = {
label: string;
value: string;
};
type ReplyPayloadDelivery = {
pin?:
| boolean
| {
enabled: boolean;
notify?: boolean;
required?: boolean;
};
};
Düğme semantiği:
value, kanal tıklanabilir kontrolleri desteklediğinde kanalın mevcut etkileşim yolu üzerinden geri yönlendirilen bir uygulama eylem değeridir.urlbir bağlantı düğmesidir.valueolmadan var olabilir.labelzorunludur ve metin geri dönüşünde de kullanılır.styletavsiye niteliğindedir. İşleyiciler desteklenmeyen stilleri güvenli bir varsayılana eşlemeli, gönderimi başarısız kılmamalıdır.
Seçim semantiği:
options[].valueseçilen uygulama değeridir.placeholdertavsiye niteliğindedir ve yerel seçim desteği olmayan kanallar tarafından yok sayılabilir.- Bir kanal seçimleri desteklemiyorsa, geri dönüş metni etiketleri listeler.
Üretici örnekleri
Basit kart:
{
"title": "Deploy approval",
"tone": "warning",
"blocks": [
{ "type": "text", "text": "Canary is ready to promote." },
{ "type": "context", "text": "Build 1234, staging passed." },
{
"type": "buttons",
"buttons": [
{ "label": "Approve", "value": "deploy:approve", "style": "success" },
{ "label": "Decline", "value": "deploy:decline", "style": "danger" }
]
}
]
}
Yalnızca URL içeren bağlantı düğmesi:
{
"blocks": [
{ "type": "text", "text": "Release notes are ready." },
{
"type": "buttons",
"buttons": [{ "label": "Open notes", "url": "https://example.com/release" }]
}
]
}
Seçim menüsü:
{
"title": "Choose environment",
"blocks": [
{
"type": "select",
"placeholder": "Environment",
"options": [
{ "label": "Canary", "value": "env:canary" },
{ "label": "Production", "value": "env:prod" }
]
}
]
}
CLI gönderimi:
openclaw message send --channel slack \
--target channel:C123 \
--message "Deploy approval" \
--presentation '{"title":"Deploy approval","tone":"warning","blocks":[{"type":"text","text":"Canary is ready."},{"type":"buttons","buttons":[{"label":"Approve","value":"deploy:approve","style":"success"},{"label":"Decline","value":"deploy:decline","style":"danger"}]}]}'
Sabitlenmiş teslimat:
openclaw message send --channel telegram \
--target -1001234567890 \
--message "Topic opened" \
--pin
Açık JSON ile sabitlenmiş teslimat:
{
"pin": {
"enabled": true,
"notify": true,
"required": false
}
}
İşleyici sözleşmesi
Kanal plugins'i, giden bağdaştırıcılarında işleme desteğini bildirir:
const adapter: ChannelOutboundAdapter = {
deliveryMode: "direct",
presentationCapabilities: {
supported: true,
buttons: true,
selects: true,
context: true,
divider: true,
},
deliveryCapabilities: {
pin: true,
},
renderPresentation({ payload, presentation, ctx }) {
return renderNativePayload(payload, presentation, ctx);
},
async pinDeliveredMessage({ target, messageId, pin }) {
await pinNativeMessage(target, messageId, { notify: pin.notify === true });
},
};
Yetenek alanları özellikle basit boolean değerlerdir. Bunlar, işleyicinin etkileşimli hale getirebildiklerini açıklar; her yerel platform sınırını değil. İşleyiciler maksimum düğme sayısı, blok sayısı ve kart boyutu gibi platforma özgü sınırların sahipliğini yine üstlenir.
Çekirdek işleme akışı
Bir ReplyPayload veya ileti eylemi presentation içerdiğinde çekirdek:
- Sunum yükünü normalleştirir.
- Hedef kanalın giden bağdaştırıcısını çözümler.
presentationCapabilitiesöğesini okur.- Bağdaştırıcı yükü işleyebildiğinde
renderPresentationçağırır. - Bağdaştırıcı yoksa veya işleyemiyorsa korumacı metne geri döner.
- Ortaya çıkan yükü normal kanal teslimat yolu üzerinden gönderir.
- İlk başarılı gönderilmiş iletiden sonra
delivery.pingibi teslimat meta verilerini uygular.
Çekirdek, üreticilerin kanaldan bağımsız kalabilmesi için geri dönüş davranışının sahibidir. Kanal plugins'i yerel işleme ve etkileşim yönetiminin sahibidir.
Bozulma kuralları
Sunum, sınırlı kanallarda gönderilmeye güvenli olmalıdır.
Geri dönüş metni şunları içerir:
- ilk satır olarak
title - normal paragraflar olarak
textblokları - kompakt bağlam satırları olarak
contextblokları - görsel ayırıcı olarak
dividerblokları - bağlantı düğmeleri için URL'ler dahil düğme etiketleri
- seçim seçeneği etiketleri
Desteklenmeyen yerel kontroller, tüm gönderimi başarısız kılmak yerine bozulmalıdır. Örnekler:
- Satır içi düğmeleri devre dışı olan Telegram, metin geri dönüşü gönderir.
- Seçim desteği olmayan bir kanal, seçim seçeneklerini metin olarak listeler.
- Yalnızca URL içeren bir düğme, yerel bağlantı düğmesine veya geri dönüş URL satırına dönüşür.
- İsteğe bağlı sabitleme hataları teslim edilen iletiyi başarısız kılmaz.
Ana istisna delivery.pin.required: true durumudur; sabitleme zorunlu olarak
istenirse ve kanal gönderilen iletiyi sabitleyemezse, teslimat hata bildirir.
Sağlayıcı eşlemesi
Mevcut paketli işleyiciler:
| Kanal | Yerel işleme hedefi | Notlar |
|---|---|---|
| Discord | Bileşenler ve bileşen kapsayıcıları | Mevcut sağlayıcıya özgü yerel yük üreticileri için eski channelData.discord.components öğesini korur, ancak yeni paylaşılan gönderimler presentation kullanmalıdır. |
| Slack | Block Kit | Mevcut sağlayıcıya özgü yerel yük üreticileri için eski channelData.slack.blocks öğesini korur, ancak yeni paylaşılan gönderimler presentation kullanmalıdır. |
| Telegram | Metin ve satır içi klavyeler | Düğmeler/seçimler hedef yüzey için satır içi düğme yeteneği gerektirir; aksi halde metin geri dönüşü kullanılır. |
| Mattermost | Metin ve etkileşimli props | Diğer bloklar metne bozulur. |
| Microsoft Teams | Adaptive Cards | Her ikisi de sağlandığında düz message metni kartla birlikte dahil edilir. |
| Feishu | Etkileşimli kartlar | Kart başlığı title kullanabilir; gövde bu başlığı yinelemekten kaçınır. |
| Düz kanallar | Metin geri dönüşü | İşleyicisi olmayan kanallar yine de okunabilir çıktı alır. |
Sağlayıcıya özgü yerel yük uyumluluğu, mevcut yanıt üreticileri için bir geçiş kolaylığıdır. Yeni paylaşılan yerel alanlar eklemek için bir gerekçe değildir.
Sunum ve InteractiveReply
InteractiveReply, onay ve etkileşim yardımcıları tarafından kullanılan eski
dahili alt kümedir. Şunları destekler:
- metin
- düğmeler
- seçimler
MessagePresentation, kurallı paylaşılan gönderim sözleşmesidir. Şunları ekler:
- başlık
- ton
- bağlam
- ayırıcı
- yalnızca URL içeren düğmeler
ReplyPayload.deliveryüzerinden genel teslimat meta verileri
Eski kodu bağlarken openclaw/plugin-sdk/interactive-runtime içindeki yardımcıları kullanın:
interactiveReplyToPresentation,
normalizeMessagePresentation,
presentationToInteractiveReply,
renderMessagePresentationFallbackText,
} from "openclaw/plugin-sdk/interactive-runtime";
Yeni kod doğrudan MessagePresentation kabul etmeli veya üretmelidir.
Teslimat sabitleme
Sabitleme, sunum değil teslimat davranışıdır. channelData.telegram.pin gibi
sağlayıcıya özgü yerel alanlar yerine delivery.pin kullanın.
Semantik:
pin: trueilk başarıyla teslim edilen iletiyi sabitler.pin.notifyvarsayılan olarakfalseolur.pin.requiredvarsayılan olarakfalseolur.- İsteğe bağlı sabitleme hataları bozulur ve gönderilen iletiyi olduğu gibi bırakır.
- Zorunlu sabitleme hataları teslimatı başarısız kılar.
- Parçalanmış iletiler kuyruk parçasını değil, ilk teslim edilen parçayı sabitler.
Sağlayıcının bu işlemleri desteklediği mevcut iletiler için manuel pin,
unpin ve pins ileti eylemleri hâlâ vardır.
Plugin yazarı kontrol listesi
- Kanal semantik sunumu işleyebildiğinde veya güvenli şekilde bozabildiğinde
describeMessageTool(...)içindenpresentationbildirin. - Çalışma zamanı giden bağdaştırıcısına
presentationCapabilitiesekleyin. renderPresentationöğesini kontrol düzlemi plugin kurulum kodunda değil, çalışma zamanı kodunda uygulayın.- Yerel kullanıcı arayüzü kitaplıklarını sıcak kurulum/katalog yollarının dışında tutun.
- Platform sınırlarını işleyicide ve testlerde koruyun.
- Desteklenmeyen düğmeler, seçimler, URL düğmeleri, başlık/metin yinelemesi ve
karışık
messageartıpresentationgönderimleri için geri dönüş testleri ekleyin. - Teslimat sabitleme desteğini yalnızca sağlayıcı gönderilen ileti kimliğini
sabitleyebildiğinde
deliveryCapabilities.pinvepinDeliveredMessageüzerinden ekleyin. - Yeni sağlayıcıya özgü yerel kart/blok/bileşen/düğme alanlarını paylaşılan ileti eylemi şeması üzerinden göstermeyin.