Mainstream messaging
Slack
آمادهٔ تولید برای پیامهای مستقیم و کانالها از طریق یکپارچهسازیهای برنامهٔ Slack. حالت پیشفرض Socket Mode است؛ URLهای درخواست HTTP نیز پشتیبانی میشوند.
پیامهای مستقیم Slack بهصورت پیشفرض روی حالت جفتسازی هستند.
رفتار فرمان بومی و فهرست فرمانها.
تشخیصهای میانکانالی و راهنماهای ترمیم.
انتخاب Socket Mode یا URLهای درخواست HTTP
هر دو روش انتقال آمادهٔ تولید هستند و برای پیامرسانی، فرمانهای اسلش، App Home و تعاملپذیری از نظر قابلیتها همترازند. انتخاب را بر اساس شکل استقرار انجام دهید، نه قابلیتها.
| دغدغه | Socket Mode (پیشفرض) | URLهای درخواست HTTP |
|---|---|---|
| URL عمومی Gateway | لازم نیست | لازم است (DNS، TLS، پروکسی معکوس یا تونل) |
| شبکهٔ خروجی | WSS خروجی به wss-primary.slack.com باید در دسترس باشد |
بدون WS خروجی؛ فقط HTTPS ورودی |
| توکنهای موردنیاز | توکن بات (xoxb-...) + توکن سطح برنامه (xapp-...) با connections:write |
توکن بات (xoxb-...) + راز امضا |
| لپتاپ توسعه / پشت فایروال | بدون تغییر کار میکند | به تونل عمومی (ngrok، Cloudflare Tunnel، Tailscale Funnel) یا Gateway مرحلهبندی نیاز دارد |
| مقیاسپذیری افقی | یک نشست Socket Mode برای هر برنامه روی هر میزبان؛ چند Gateway به برنامههای Slack جداگانه نیاز دارند | هندلر POST بدون وضعیت؛ چند replica از Gateway میتوانند پشت یک load balancer یک برنامه را به اشتراک بگذارند |
| چند حساب روی یک Gateway | پشتیبانی میشود؛ هر حساب WS خودش را باز میکند | پشتیبانی میشود؛ هر حساب به webhookPath یکتای خودش نیاز دارد (پیشفرض /slack/events) تا ثبتها با هم برخورد نکنند |
| انتقال فرمان اسلش | از طریق اتصال WS تحویل میشود؛ slash_commands[].url نادیده گرفته میشود |
Slack به slash_commands[].url درخواست POST میفرستد؛ این فیلد برای dispatch شدن فرمان لازم است |
| امضای درخواست | استفاده نمیشود (احراز هویت همان توکن سطح برنامه است) | Slack هر درخواست را امضا میکند؛ OpenClaw آن را با signingSecret تأیید میکند |
| بازیابی هنگام قطع اتصال | Slack SDK بهصورت خودکار دوباره وصل میشود؛ تنظیمات انتقال pong-timeout در Gateway اعمال میشود | اتصال پایداری برای قطع شدن وجود ندارد؛ تلاشهای مجدد از سمت Slack برای هر درخواست انجام میشوند |
راهاندازی سریع
Socket Mode (default)
Create a new Slack app
api.slack.com/apps را باز کنید → Create New App → From a manifest → workspace خود را انتخاب کنید → یکی از manifestهای زیر را paste کنید → Next → Create.
{
"display_information": {
"name": "OpenClaw",
"description": "Slack connector for OpenClaw"
},
"features": {
"bot_user": { "display_name": "OpenClaw", "always_online": true },
"app_home": {
"home_tab_enabled": true,
"messages_tab_enabled": true,
"messages_tab_read_only_enabled": false
},
"slash_commands": [
{
"command": "/openclaw",
"description": "Send a message to OpenClaw",
"should_escape": false
}
]
},
"oauth_config": {
"scopes": {
"bot": [
"app_mentions:read",
"assistant:write",
"channels:history",
"channels:read",
"chat:write",
"commands",
"emoji:read",
"files:read",
"files:write",
"groups:history",
"groups:read",
"im:history",
"im:read",
"im:write",
"mpim:history",
"mpim:read",
"mpim:write",
"pins:read",
"pins:write",
"reactions:read",
"reactions:write",
"usergroups:read",
"users:read"
]
}
},
"settings": {
"socket_mode_enabled": true,
"event_subscriptions": {
"bot_events": [
"app_home_opened",
"app_mention",
"channel_rename",
"member_joined_channel",
"member_left_channel",
"message.channels",
"message.groups",
"message.im",
"message.mpim",
"pin_added",
"pin_removed",
"reaction_added",
"reaction_removed"
]
}
}
}
{
"display_information": {
"name": "OpenClaw",
"description": "Slack connector for OpenClaw"
},
"features": {
"bot_user": { "display_name": "OpenClaw", "always_online": true },
"app_home": {
"home_tab_enabled": true,
"messages_tab_enabled": true,
"messages_tab_read_only_enabled": false
},
"slash_commands": [
{
"command": "/openclaw",
"description": "Send a message to OpenClaw",
"should_escape": false
}
]
},
"oauth_config": {
"scopes": {
"bot": [
"app_mentions:read",
"assistant:write",
"channels:history",
"channels:read",
"chat:write",
"commands",
"groups:history",
"groups:read",
"im:history",
"im:read",
"im:write",
"users:read"
]
}
},
"settings": {
"socket_mode_enabled": true,
"event_subscriptions": {
"bot_events": [
"app_home_opened",
"app_mention",
"message.channels",
"message.groups",
"message.im"
]
}
}
}
پس از اینکه Slack برنامه را ایجاد کرد:
- Basic Information → App-Level Tokens → Generate Token and Scopes:
connections:writeرا اضافه کنید، ذخیره کنید، مقدارxapp-...را کپی کنید. - Install App → Install to Workspace: توکن OAuth کاربر بات
xoxb-...را کپی کنید.
Configure OpenClaw
راهاندازی پیشنهادی SecretRef:
export SLACK_APP_TOKEN=xapp-...
export SLACK_BOT_TOKEN=xoxb-...
cat > slack.socket.patch.json5 <<'JSON5'
{
channels: {
slack: {
enabled: true,
mode: "socket",
appToken: { source: "env", provider: "default", id: "SLACK_APP_TOKEN" },
botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" },
},
},
}
JSON5
openclaw config patch --file ./slack.socket.patch.json5 --dry-run
openclaw config patch --file ./slack.socket.patch.json5
fallback محیطی (فقط حساب پیشفرض):
SLACK_APP_TOKEN=xapp-...
SLACK_BOT_TOKEN=xoxb-...
Start gateway
openclaw gateway
HTTP Request URLs
Create a new Slack app
api.slack.com/apps را باز کنید → Create New App → From a manifest → workspace خود را انتخاب کنید → یکی از manifestهای زیر را paste کنید → https://gateway-host.example.com/slack/events را با URL عمومی Gateway خود جایگزین کنید → Next → Create.
{
"display_information": {
"name": "OpenClaw",
"description": "Slack connector for OpenClaw"
},
"features": {
"bot_user": { "display_name": "OpenClaw", "always_online": true },
"app_home": {
"home_tab_enabled": true,
"messages_tab_enabled": true,
"messages_tab_read_only_enabled": false
},
"slash_commands": [
{
"command": "/openclaw",
"description": "Send a message to OpenClaw",
"should_escape": false,
"url": "https://gateway-host.example.com/slack/events"
}
]
},
"oauth_config": {
"scopes": {
"bot": [
"app_mentions:read",
"assistant:write",
"channels:history",
"channels:read",
"chat:write",
"commands",
"emoji:read",
"files:read",
"files:write",
"groups:history",
"groups:read",
"im:history",
"im:read",
"im:write",
"mpim:history",
"mpim:read",
"mpim:write",
"pins:read",
"pins:write",
"reactions:read",
"reactions:write",
"usergroups:read",
"users:read"
]
}
},
"settings": {
"event_subscriptions": {
"request_url": "https://gateway-host.example.com/slack/events",
"bot_events": [
"app_home_opened",
"app_mention",
"channel_rename",
"member_joined_channel",
"member_left_channel",
"message.channels",
"message.groups",
"message.im",
"message.mpim",
"pin_added",
"pin_removed",
"reaction_added",
"reaction_removed"
]
},
"interactivity": {
"is_enabled": true,
"request_url": "https://gateway-host.example.com/slack/events",
"message_menu_options_url": "https://gateway-host.example.com/slack/events"
}
}
}
{
"display_information": {
"name": "OpenClaw",
"description": "Slack connector for OpenClaw"
},
"features": {
"bot_user": { "display_name": "OpenClaw", "always_online": true },
"app_home": {
"home_tab_enabled": true,
"messages_tab_enabled": true,
"messages_tab_read_only_enabled": false
},
"slash_commands": [
{
"command": "/openclaw",
"description": "Send a message to OpenClaw",
"should_escape": false,
"url": "https://gateway-host.example.com/slack/events"
}
]
},
"oauth_config": {
"scopes": {
"bot": [
"app_mentions:read",
"assistant:write",
"channels:history",
"channels:read",
"chat:write",
"commands",
"groups:history",
"groups:read",
"im:history",
"im:read",
"im:write",
"users:read"
]
}
},
"settings": {
"event_subscriptions": {
"request_url": "https://gateway-host.example.com/slack/events",
"bot_events": [
"app_home_opened",
"app_mention",
"message.channels",
"message.groups",
"message.im"
]
},
"interactivity": {
"is_enabled": true,
"request_url": "https://gateway-host.example.com/slack/events",
"message_menu_options_url": "https://gateway-host.example.com/slack/events"
}
}
}
پس از اینکه Slack برنامه را ایجاد کرد:
- Basic Information → App Credentials: برای اعتبارسنجی درخواست، Signing Secret را کپی کنید.
- Install App → Install to Workspace: توکن OAuth کاربر Bot با قالب
xoxb-...را کپی کنید.
Configure OpenClaw
راهاندازی پیشنهادی SecretRef:
export SLACK_BOT_TOKEN=xoxb-...
export SLACK_SIGNING_SECRET=...
cat > slack.http.patch.json5 <<'JSON5'
{
channels: {
slack: {
enabled: true,
mode: "http",
botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" },
signingSecret: { source: "env", provider: "default", id: "SLACK_SIGNING_SECRET" },
webhookPath: "/slack/events",
},
},
}
JSON5
openclaw config patch --file ./slack.http.patch.json5 --dry-run
openclaw config patch --file ./slack.http.patch.json5
Start gateway
openclaw gateway
تنظیم transport در Socket Mode
OpenClaw بهصورت پیشفرض، timeout مربوط به pong در کلاینت Slack SDK را برای Socket Mode روی ۱۵ ثانیه تنظیم میکند. فقط زمانی تنظیمات transport را override کنید که به تنظیمات مخصوص فضای کاری یا میزبان نیاز دارید:
{
channels: {
slack: {
mode: "socket",
socketMode: {
clientPingTimeout: 20000,
serverPingTimeout: 30000,
pingPongLoggingEnabled: false,
},
},
},
}
این مورد را فقط برای فضاهای کاری Socket Mode استفاده کنید که timeoutهای مربوط به Slack websocket pong/server-ping را ثبت میکنند یا روی میزبانهایی اجرا میشوند که دچار گرسنگی شناختهشده event-loop هستند. clientPingTimeout مدت انتظار برای pong پس از ارسال client ping توسط SDK است؛ serverPingTimeout مدت انتظار برای pingهای سرور Slack است. پیامها و رویدادهای برنامه همچنان state برنامه هستند، نه سیگنالهای زندهبودن transport.
چکلیست manifest و scope
manifest پایه برنامه Slack برای Socket Mode و HTTP Request URLs یکسان است. فقط بلوک settings (و url فرمان slash) تفاوت دارد.
manifest پایه (پیشفرض Socket Mode):
{
"display_information": {
"name": "OpenClaw",
"description": "Slack connector for OpenClaw"
},
"features": {
"bot_user": { "display_name": "OpenClaw", "always_online": true },
"app_home": {
"home_tab_enabled": true,
"messages_tab_enabled": true,
"messages_tab_read_only_enabled": false
},
"slash_commands": [
{
"command": "/openclaw",
"description": "Send a message to OpenClaw",
"should_escape": false
}
]
},
"oauth_config": {
"scopes": {
"bot": [
"app_mentions:read",
"assistant:write",
"channels:history",
"channels:read",
"chat:write",
"commands",
"emoji:read",
"files:read",
"files:write",
"groups:history",
"groups:read",
"im:history",
"im:read",
"im:write",
"mpim:history",
"mpim:read",
"mpim:write",
"pins:read",
"pins:write",
"reactions:read",
"reactions:write",
"usergroups:read",
"users:read"
]
}
},
"settings": {
"socket_mode_enabled": true,
"event_subscriptions": {
"bot_events": [
"app_home_opened",
"app_mention",
"channel_rename",
"member_joined_channel",
"member_left_channel",
"message.channels",
"message.groups",
"message.im",
"message.mpim",
"pin_added",
"pin_removed",
"reaction_added",
"reaction_removed"
]
}
}
}
برای حالت HTTP Request URLs، settings را با گونه HTTP جایگزین کنید و به هر فرمان slash مقدار url اضافه کنید. URL عمومی لازم است:
{
"features": {
"slash_commands": [
{
"command": "/openclaw",
"description": "Send a message to OpenClaw",
"should_escape": false,
"url": "https://gateway-host.example.com/slack/events"
}
]
},
"settings": {
"event_subscriptions": {
"request_url": "https://gateway-host.example.com/slack/events",
"bot_events": [
"app_home_opened",
"app_mention",
"channel_rename",
"member_joined_channel",
"member_left_channel",
"message.channels",
"message.groups",
"message.im",
"message.mpim",
"pin_added",
"pin_removed",
"reaction_added",
"reaction_removed"
]
},
"interactivity": {
"is_enabled": true,
"request_url": "https://gateway-host.example.com/slack/events",
"message_menu_options_url": "https://gateway-host.example.com/slack/events"
}
}
}
تنظیمات اضافی manifest
قابلیتهای متفاوتی را که پیشفرضهای بالا را گسترش میدهند، ارائه کنید.
manifest پیشفرض، تب Home در Slack App Home را فعال میکند و در app_home_opened مشترک میشود. وقتی عضوی از فضای کاری تب Home را باز میکند، OpenClaw با views.publish یک نمای Home پیشفرض امن منتشر میکند؛ هیچ payload مکالمه یا پیکربندی خصوصی در آن گنجانده نمیشود. تب Messages برای پیامهای مستقیم Slack فعال باقی میماند.
Optional native slash commands
میتوان بهجای یک فرمان پیکربندیشده واحد، از چند فرمان slash بومی با جزئیات بیشتر استفاده کرد:
- بهجای
/statusاز/agentstatusاستفاده کنید، چون فرمان/statusرزرو شده است. - همزمان نمیتوان بیش از ۲۵ فرمان slash را در دسترس قرار داد.
بخش موجود features.slash_commands خود را با زیرمجموعهای از فرمانهای موجود جایگزین کنید:
Socket Mode (default)
{
"slash_commands": [
{
"command": "/new",
"description": "Start a new session",
"usage_hint": "[model]"
},
{
"command": "/reset",
"description": "Reset the current session"
},
{
"command": "/compact",
"description": "Compact the session context",
"usage_hint": "[instructions]"
},
{
"command": "/stop",
"description": "Stop the current run"
},
{
"command": "/session",
"description": "Manage thread-binding expiry",
"usage_hint": "idle <duration|off> or max-age <duration|off>"
},
{
"command": "/think",
"description": "Set the thinking level",
"usage_hint": "<level>"
},
{
"command": "/verbose",
"description": "Toggle verbose output",
"usage_hint": "on|off|full"
},
{
"command": "/fast",
"description": "Show or set fast mode",
"usage_hint": "[status|on|off]"
},
{
"command": "/reasoning",
"description": "Toggle reasoning visibility",
"usage_hint": "[on|off|stream]"
},
{
"command": "/elevated",
"description": "Toggle elevated mode",
"usage_hint": "[on|off|ask|full]"
},
{
"command": "/exec",
"description": "Show or set exec defaults",
"usage_hint": "host=<auto|sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>"
},
{
"command": "/model",
"description": "Show or set the model",
"usage_hint": "[name|#|status]"
},
{
"command": "/models",
"description": "List providers/models",
"usage_hint": "[provider] [page] [limit=<n>|size=<n>|all]"
},
{
"command": "/help",
"description": "Show the short help summary"
},
{
"command": "/commands",
"description": "Show the generated command catalog"
},
{
"command": "/tools",
"description": "Show what the current agent can use right now",
"usage_hint": "[compact|verbose]"
},
{
"command": "/agentstatus",
"description": "Show runtime status, including provider usage/quota when available"
},
{
"command": "/tasks",
"description": "List active/recent background tasks for the current session"
},
{
"command": "/context",
"description": "Explain how context is assembled",
"usage_hint": "[list|detail|json]"
},
{
"command": "/whoami",
"description": "Show your sender identity"
},
{
"command": "/skill",
"description": "Run a skill by name",
"usage_hint": "<name> [input]"
},
{
"command": "/btw",
"description": "Ask a side question without changing session context",
"usage_hint": "<question>"
},
{
"command": "/side",
"description": "Ask a side question without changing session context",
"usage_hint": "<question>"
},
{
"command": "/usage",
"description": "Control the usage footer or show cost summary",
"usage_hint": "off|tokens|full|cost"
}
]
}
HTTP Request URLs
از همان فهرست slash_commands در Socket Mode بالا استفاده کنید و به هر ورودی "url": "https://gateway-host.example.com/slack/events" اضافه کنید. نمونه:
{
"slash_commands": [
{
"command": "/new",
"description": "Start a new session",
"usage_hint": "[model]",
"url": "https://gateway-host.example.com/slack/events"
},
{
"command": "/help",
"description": "Show the short help summary",
"url": "https://gateway-host.example.com/slack/events"
}
]
}
آن مقدار url را برای همه فرمانهای فهرست تکرار کنید.
دامنههای اختیاری انتساب نویسنده (عملیات نوشتن)
اگر میخواهید پیامهای خروجی بهجای هویت پیشفرض برنامه Slack از هویت عامل فعال (نام کاربری و نماد سفارشی) استفاده کنند، دامنه ربات chat:write.customize را اضافه کنید.
اگر از نماد ایموجی استفاده میکنید، Slack انتظار قالب :emoji_name: را دارد.
دامنههای اختیاری توکن کاربر (عملیات خواندن)
اگر channels.slack.userToken را پیکربندی میکنید، دامنههای خواندن معمول عبارتاند از:
channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read(اگر به خواندنهای جستوجوی Slack وابسته هستید)
مدل توکن
botToken+appTokenبرای Socket Mode الزامی هستند.- حالت HTTP به
botToken+signingSecretنیاز دارد. botToken،appToken،signingSecretوuserTokenرشتههای متن ساده یا اشیای SecretRef را میپذیرند.- توکنهای پیکربندی، fallback محیط را بازنویسی میکنند.
- fallback محیطی
SLACK_BOT_TOKEN/SLACK_APP_TOKENفقط برای حساب پیشفرض اعمال میشود. userToken(xoxp-...) فقط از پیکربندی میآید (fallback محیطی ندارد) و پیشفرض آن رفتار فقطخواندنی است (userTokenReadOnly: true).
رفتار نماگرفت وضعیت:
- بازرسی حساب Slack برای هر اعتبارنامه، فیلدهای
*Sourceو*Statusرا ردیابی میکند (botToken،appToken،signingSecret،userToken). - وضعیت
available،configured_unavailableیاmissingاست. configured_unavailableیعنی حساب از طریق SecretRef یا منبع راز غیر درونخطی دیگری پیکربندی شده است، اما مسیر فرمان/زمان اجرای فعلی نتوانست مقدار واقعی را resolve کند.- در حالت HTTP،
signingSecretStatusگنجانده میشود؛ در Socket Mode، جفت الزامیbotTokenStatus+appTokenStatusاست.
کنشها و گیتها
کنشهای Slack با channels.slack.actions.* کنترل میشوند.
گروههای کنش در ابزارهای فعلی Slack:
| گروه | پیشفرض |
|---|---|
| پیامها | فعال |
| واکنشها | فعال |
| سنجاقها | فعال |
| اطلاعات عضو | فعال |
| فهرست ایموجی | فعال |
کنشهای پیام فعلی Slack شامل send، upload-file، download-file، read، edit، delete، pin، unpin، list-pins، member-info و emoji-list هستند. download-file شناسههای فایل Slack را که در نگهدارندههای جای فایل ورودی نمایش داده میشوند میپذیرد و برای تصاویر، پیشنمایش تصویر یا برای انواع فایل دیگر، فراداده فایل محلی برمیگرداند.
کنترل دسترسی و مسیریابی
سیاست DM
channels.slack.dmPolicy دسترسی DM را کنترل میکند. channels.slack.allowFrom allowlist رسمی DM است.
pairing(پیشفرض)allowlistopen(نیاز داردchannels.slack.allowFromشامل"*"باشد)disabled
پرچمهای DM:
dm.enabled(پیشفرض true)channels.slack.allowFromdm.allowFrom(قدیمی)dm.groupEnabled(DMهای گروهی بهطور پیشفرض false)dm.groupChannels(allowlist اختیاری MPIM)
اولویت چندحسابی:
channels.slack.accounts.default.allowFromفقط برای حسابdefaultاعمال میشود.- حسابهای نامدار وقتی
allowFromخودشان تنظیم نشده باشد،channels.slack.allowFromرا به ارث میبرند. - حسابهای نامدار
channels.slack.accounts.default.allowFromرا به ارث نمیبرند.
channels.slack.dm.policy و channels.slack.dm.allowFrom قدیمی همچنان برای سازگاری خوانده میشوند. openclaw doctor --fix وقتی بتواند بدون تغییر دسترسی این کار را انجام دهد، آنها را به dmPolicy و allowFrom مهاجرت میدهد.
جفتسازی در DMها از openclaw pairing approve slack <code> استفاده میکند.
سیاست کانال
channels.slack.groupPolicy مدیریت کانال را کنترل میکند:
openallowlistdisabled
allowlist کانال زیر channels.slack.channels قرار دارد و باید از شناسههای پایدار کانال Slack (برای مثال C12345678) بهعنوان کلیدهای پیکربندی استفاده کند.
نکته زمان اجرا: اگر channels.slack کاملا وجود نداشته باشد (راهاندازی فقط با محیط)، زمان اجرا به groupPolicy="allowlist" fallback میکند و یک هشدار ثبت میکند (حتی اگر channels.defaults.groupPolicy تنظیم شده باشد).
resolve نام/شناسه:
- ورودیهای allowlist کانال و allowlist DM هنگام راهاندازی، وقتی دسترسی توکن اجازه دهد، resolve میشوند
- ورودیهای resolveنشده نام کانال همانطور که پیکربندی شدهاند نگه داشته میشوند، اما بهطور پیشفرض برای مسیریابی نادیده گرفته میشوند
- مجوزدهی ورودی و مسیریابی کانال بهطور پیشفرض ID-first هستند؛ تطبیق مستقیم نام کاربری/slug به
channels.slack.dangerouslyAllowNameMatching: trueنیاز دارد
منشنها و کاربران کانال
پیامهای کانال بهطور پیشفرض با منشن gate میشوند.
منابع منشن:
- منشن صریح برنامه (
<@botId>) - منشن گروه کاربری Slack (
<!subteam^S...>) وقتی کاربر ربات عضو آن گروه کاربری باشد؛ بهusergroups:readنیاز دارد - الگوهای regex منشن (
agents.list[].groupChat.mentionPatterns، fallbackmessages.groupChat.mentionPatterns) - رفتار ضمنی پاسخ به رشته ربات (وقتی
thread.requireExplicitMentionبرابرtrueباشد غیرفعال است)
کنترلهای هر کانال (channels.slack.channels.<id>؛ نامها فقط از طریق resolve راهاندازی یا dangerouslyAllowNameMatching):
requireMentionusers(allowlist)allowBotsskillssystemPrompttools,toolsBySender- قالب کلید
toolsBySender:id:،e164:،username:،name:، یا wildcard"*"(کلیدهای قدیمی بدون پیشوند همچنان فقط بهid:نگاشت میشوند)
allowBots برای کانالها و کانالهای خصوصی محافظهکارانه است: پیامهای اتاق که توسط ربات نوشته شدهاند فقط وقتی پذیرفته میشوند که ربات فرستنده صریحا در allowlist users همان اتاق فهرست شده باشد، یا وقتی دستکم یک شناسه صریح مالک Slack از channels.slack.allowFrom در حال حاضر عضو اتاق باشد. wildcardها و ورودیهای مالک با نام نمایشی حضور مالک را برآورده نمیکنند. حضور مالک از conversations.members Slack استفاده میکند؛ مطمئن شوید برنامه دامنه خواندن منطبق برای نوع اتاق را دارد (channels:read برای کانالهای عمومی، groups:read برای کانالهای خصوصی). اگر جستوجوی عضو شکست بخورد، OpenClaw پیام اتاق نوشتهشده توسط ربات را drop میکند.
رشتهها، نشستها، و برچسبهای پاسخ
- DMها بهصورت
directمسیریابی میشوند؛ کانالها بهصورتchannel؛ MPIMها بهصورتgroup. - اتصالهای مسیر Slack شناسههای خام peer و همچنین فرمهای هدف Slack مانند
channel:C12345678،user:U12345678و<@U12345678>را میپذیرند. - با
session.dmScope=mainپیشفرض، DMهای Slack به نشست اصلی عامل collapse میشوند. - نشستهای کانال:
agent:<agentId>:slack:channel:<channelId>. - پاسخهای رشته میتوانند در صورت کاربرد، پسوندهای نشست رشته (
:thread:<threadTs>) بسازند. - پیشفرض
channels.slack.thread.historyScopeبرابرthreadاست؛ پیشفرضthread.inheritParentبرابرfalseاست. channels.slack.thread.initialHistoryLimitکنترل میکند هنگام شروع یک نشست رشته جدید، چند پیام موجود رشته دریافت شود (پیشفرض20؛ برای غیرفعالسازی0تنظیم کنید).channels.slack.thread.requireExplicitMention(پیشفرضfalse): وقتیtrueباشد، منشنهای ضمنی رشته را سرکوب میکند تا ربات فقط به منشنهای صریح@botدرون رشتهها پاسخ دهد، حتی وقتی ربات قبلا در رشته مشارکت داشته است. بدون این، پاسخها در رشتهای که ربات در آن مشارکت داشته است، gatingrequireMentionرا دور میزنند.
کنترلهای رشتهبندی پاسخ:
channels.slack.replyToMode:off|first|all|batched(پیشفرضoff)channels.slack.replyToModeByChatType: برای هرdirect|group|channel- fallback قدیمی برای چتهای مستقیم:
channels.slack.dm.replyToMode
برچسبهای پاسخ دستی پشتیبانی میشوند:
[[reply_to_current]][[reply_to:<id>]]
واکنشهای تایید
ackReaction در حالی که OpenClaw در حال پردازش پیام ورودی است، یک ایموجی تایید میفرستد.
ترتیب resolve:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- fallback ایموجی هویت عامل (
agents.list[].identity.emoji، در غیر این صورت "👀")
نکتهها:
- Slack انتظار shortcode دارد (برای مثال
"eyes"). - برای غیرفعال کردن واکنش برای حساب Slack یا بهصورت سراسری، از
""استفاده کنید.
استریم متن
channels.slack.streaming رفتار پیشنمایش زنده را کنترل میکند:
off: استریم پیشنمایش زنده را غیرفعال کنید.partial(پیشفرض): متن پیشنمایش را با آخرین خروجی جزئی جایگزین کنید.block: بهروزرسانیهای پیشنمایش تکهتکه را append کنید.progress: هنگام تولید، متن وضعیت پیشرفت را نشان دهید، سپس متن نهایی را ارسال کنید.streaming.preview.toolProgress: وقتی پیشنمایش draft فعال است، بهروزرسانیهای ابزار/پیشرفت را به همان پیام پیشنمایش ویرایششده مسیریابی کنید (پیشفرض:true). برای نگه داشتن پیامهای جداگانه ابزار/پیشرفت،falseتنظیم کنید.streaming.preview.commandText/streaming.progress.commandText: برای نگه داشتن خطهای فشرده پیشرفت ابزار در حالی که متن خام فرمان/exec پنهان میشود، رویstatusتنظیم کنید (پیشفرض:raw).
پنهان کردن متن خام فرمان/exec در حالی که خطهای فشرده پیشرفت حفظ میشوند:
{
"channels": {
"slack": {
"streaming": {
"mode": "progress",
"progress": {
"toolProgress": true,
"commandText": "status"
}
}
}
}
}
channels.slack.streaming.nativeTransport استریم متن بومی Slack را وقتی channels.slack.streaming.mode برابر partial باشد کنترل میکند (پیشفرض: true).
- برای ظاهر شدن استریم متن بومی و وضعیت رشته دستیار Slack، یک رشته پاسخ باید در دسترس باشد. انتخاب رشته همچنان از
replyToModeپیروی میکند. - ریشههای کانال، چت گروهی، و DM سطح بالا همچنان میتوانند وقتی استریم بومی در دسترس نیست یا هیچ رشته پاسخی وجود ندارد، از پیشنمایش draft معمول استفاده کنند.
- DMهای سطح بالای Slack بهطور پیشفرض خارج از رشته میمانند، بنابراین پیشنمایش استریم/وضعیت بومی به سبک رشته Slack را نشان نمیدهند؛ OpenClaw بهجای آن یک پیشنمایش draft را در DM پست و ویرایش میکند.
- رسانه و payloadهای غیرمتنی به تحویل معمول fallback میکنند.
- پایانهای رسانه/خطا، ویرایشهای معلق پیشنمایش را لغو میکنند؛ پایانهای متن/block واجد شرایط فقط وقتی flush میشوند که بتوانند پیشنمایش را در همانجا ویرایش کنند.
- اگر استریم در میانه پاسخ شکست بخورد، OpenClaw برای payloadهای باقیمانده به تحویل معمول fallback میکند.
استفاده از پیشنمایش draft بهجای استریم متن بومی Slack:
{
channels: {
slack: {
streaming: {
mode: "partial",
nativeTransport: false,
},
},
},
}
کلیدهای قدیمی:
channels.slack.streamMode(replace | status_final | append) یک نام مستعار قدیمی زمان اجرا برایchannels.slack.streaming.modeاست.- بولی
channels.slack.streamingیک نام مستعار قدیمی زمان اجرا برایchannels.slack.streaming.modeوchannels.slack.streaming.nativeTransportاست. channels.slack.nativeStreamingقدیمی یک نام مستعار زمان اجرا برایchannels.slack.streaming.nativeTransportاست.- برای بازنویسی پیکربندی پایدارشده جریاندهی Slack به کلیدهای استاندارد،
openclaw doctor --fixرا اجرا کنید.
واکنش تایپ بهعنوان جایگزین
typingReaction هنگام پردازش پاسخ توسط OpenClaw، یک واکنش موقت به پیام ورودی Slack اضافه میکند و پس از پایان اجرا آن را حذف میکند. این گزینه بیرون از پاسخهای رشتهای بیشترین کاربرد را دارد؛ پاسخهای رشتهای از نشانگر وضعیت پیشفرض «در حال تایپ...» استفاده میکنند.
ترتیب وضوح:
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
نکتهها:
- Slack انتظار shortcode دارد، برای مثال
"hourglass_flowing_sand". - واکنش بهصورت best-effort انجام میشود و پس از تکمیل مسیر پاسخ یا شکست، پاکسازی بهطور خودکار تلاش میشود.
رسانه، قطعهبندی و تحویل
پیوستهای ورودی
پیوستهای فایل Slack از URLهای خصوصی میزبانیشده توسط Slack دانلود میشوند (جریان درخواست احرازهویتشده با توکن) و وقتی دریافت موفق باشد و محدودیتهای اندازه اجازه دهند، در ذخیرهگاه رسانه نوشته میشوند. جاینگهدارهای فایل شامل fileId مربوط به Slack هستند تا عاملها بتوانند فایل اصلی را با download-file دریافت کنند.
دانلودها از مهلتهای زمانی محدود برای بیکاری و کل زمان استفاده میکنند. اگر بازیابی فایل Slack متوقف شود یا شکست بخورد، OpenClaw پردازش پیام را ادامه میدهد و به جاینگهدار فایل برمیگردد.
سقف اندازه ورودی زمان اجرا بهطور پیشفرض 20MB است، مگر اینکه با channels.slack.mediaMaxMb بازنویسی شود.
متن و فایلهای خروجی
- قطعههای متن از
channels.slack.textChunkLimitاستفاده میکنند (پیشفرض 4000) channels.slack.chunkMode="newline"تقسیمبندی با اولویت پاراگراف را فعال میکند- ارسال فایلها از APIهای بارگذاری Slack استفاده میکند و میتواند شامل پاسخهای رشتهای (
thread_ts) باشد - سقف رسانه خروجی، وقتی پیکربندی شده باشد، از
channels.slack.mediaMaxMbپیروی میکند؛ در غیر این صورت، ارسالهای کانال از پیشفرضهای نوع MIME در مسیر رسانه استفاده میکنند
مقصدهای تحویل
مقصدهای صریح ترجیحی:
user:<id>برای پیامهای مستقیمchannel:<id>برای کانالها
پیامهای مستقیم Slack که فقط متن/بلوک دارند میتوانند مستقیما به شناسههای کاربر ارسال شوند؛ بارگذاری فایل و ارسالهای رشتهای ابتدا پیام مستقیم را از طریق APIهای گفتوگوی Slack باز میکنند، چون این مسیرها به یک شناسه گفتوگوی مشخص نیاز دارند.
دستورها و رفتار slash
دستورهای slash در Slack بهصورت یک دستور پیکربندیشده واحد یا چند دستور بومی ظاهر میشوند. برای تغییر پیشفرضهای دستور، channels.slack.slashCommand را پیکربندی کنید:
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
/openclaw /help
دستورهای بومی به تنظیمات manifest اضافی در برنامه Slack شما نیاز دارند و در عوض با channels.slack.commands.native: true یا commands.native: true در پیکربندیهای سراسری فعال میشوند.
- حالت خودکار دستور بومی برای Slack خاموش است، بنابراین
commands.native: "auto"دستورهای بومی Slack را فعال نمیکند.
/help
منوهای آرگومان بومی از یک راهبرد رندر تطبیقی استفاده میکنند که پیش از ارسال مقدار گزینه انتخابشده، یک modal تأیید نشان میدهد:
- تا 5 گزینه: بلوکهای دکمه
- 6 تا 100 گزینه: منوی انتخاب ایستا
- بیش از 100 گزینه: انتخاب خارجی با فیلتر ناهمگام گزینهها، وقتی handlerهای گزینههای تعاملی در دسترس باشند
- محدودیتهای Slack رد شده: مقدارهای گزینه کدگذاریشده به دکمهها برمیگردند
/think
نشستهای slash از کلیدهای ایزوله مانند agent:<agentId>:slack:slash:<userId> استفاده میکنند و همچنان اجرای دستورها را با استفاده از CommandTargetSessionKey به نشست گفتوگوی هدف مسیریابی میکنند.
پاسخهای تعاملی
Slack میتواند کنترلهای پاسخ تعاملی نوشتهشده توسط عامل را رندر کند، اما این قابلیت بهطور پیشفرض غیرفعال است.
فعالسازی سراسری:
{
channels: {
slack: {
capabilities: {
interactiveReplies: true,
},
},
},
}
یا آن را فقط برای یک حساب Slack فعال کنید:
{
channels: {
slack: {
accounts: {
ops: {
capabilities: {
interactiveReplies: true,
},
},
},
},
},
}
وقتی فعال باشد، عاملها میتوانند دستورالعملهای پاسخ فقط مخصوص Slack منتشر کنند:
[[slack_buttons: Approve:approve, Reject:reject]][[slack_select: Choose a target | Canary:canary, Production:production]]
این دستورالعملها به Slack Block Kit کامپایل میشوند و کلیکها یا انتخابها را از مسیر رویداد تعامل موجود Slack بازمیگردانند.
نکتهها:
- این UI مخصوص Slack است. کانالهای دیگر دستورالعملهای Slack Block Kit را به سیستمهای دکمه خود تبدیل نمیکنند.
- مقدارهای callback تعاملی، توکنهای opaque تولیدشده توسط OpenClaw هستند، نه مقدارهای خام نوشتهشده توسط عامل.
- اگر بلوکهای تعاملی تولیدشده از محدودیتهای Slack Block Kit فراتر بروند، OpenClaw بهجای ارسال payload نامعتبر blocks، به پاسخ متنی اصلی برمیگردد.
تأییدهای Exec در Slack
Slack میتواند بهجای برگشت به UI وب یا ترمینال، با دکمهها و تعاملهای تعاملی بهعنوان کلاینت تأیید بومی عمل کند.
- تأییدهای Exec از
channels.slack.execApprovals.*برای مسیریابی بومی پیام مستقیم/کانال استفاده میکنند. - تأییدهای Plugin همچنان میتوانند از طریق همان سطح دکمه بومی Slack حل شوند، وقتی درخواست از قبل در Slack وارد شده باشد و نوع شناسه تأیید
plugin:باشد. - مجوز تأییدکننده همچنان اعمال میشود: فقط کاربرانی که بهعنوان تأییدکننده شناسایی شدهاند میتوانند از طریق Slack درخواستها را تأیید یا رد کنند.
این از همان سطح دکمه تأیید مشترک کانالهای دیگر استفاده میکند. وقتی interactivity در تنظیمات برنامه Slack شما فعال باشد، اعلانهای تأیید بهصورت دکمههای Block Kit مستقیما در گفتوگو رندر میشوند.
وقتی این دکمهها حاضر باشند، تجربه کاربری اصلی تأیید همانها هستند؛ OpenClaw
فقط زمانی باید یک دستور دستی /approve را شامل کند که نتیجه ابزار بگوید تأییدهای چت
در دسترس نیستند یا تأیید دستی تنها مسیر است.
مسیر پیکربندی:
channels.slack.execApprovals.enabledchannels.slack.execApprovals.approvers(اختیاری؛ در صورت امکان بهcommands.ownerAllowFromبرمیگردد)channels.slack.execApprovals.target(dm|channel|both، پیشفرض:dm)agentFilter,sessionFilter
Slack وقتی enabled تنظیم نشده باشد یا "auto" باشد و دستکم یک
تأییدکننده resolve شود، تأییدهای Exec بومی را خودکار فعال میکند. برای غیرفعالسازی صریح Slack بهعنوان کلاینت تأیید بومی، enabled: false را تنظیم کنید.
برای اجبار فعالسازی تأییدهای بومی وقتی تأییدکنندهها resolve میشوند، enabled: true را تنظیم کنید.
رفتار پیشفرض بدون پیکربندی صریح تأیید Exec در Slack:
{
commands: {
ownerAllowFrom: ["slack:U12345678"],
},
}
پیکربندی صریح بومی Slack فقط وقتی لازم است که بخواهید تأییدکنندهها را بازنویسی کنید، فیلتر اضافه کنید، یا تحویل به چت مبدأ را فعال کنید:
{
channels: {
slack: {
execApprovals: {
enabled: true,
approvers: ["U12345678"],
target: "both",
},
},
},
}
ارسال مجدد مشترک approvals.exec جداست. فقط زمانی از آن استفاده کنید که اعلانهای تأیید Exec باید همچنین
به چتهای دیگر یا مقصدهای صریح خارج از باند مسیریابی شوند. ارسال مجدد مشترک approvals.plugin نیز
جداست؛ دکمههای بومی Slack همچنان میتوانند تأییدهای Plugin را وقتی آن درخواستها از قبل
در Slack وارد شدهاند resolve کنند.
/approve در همان چت نیز در کانالها و پیامهای مستقیم Slack که از قبل از دستورها پشتیبانی میکنند کار میکند. برای مدل کامل ارسال مجدد تأیید، تأییدهای Exec را ببینید.
رویدادها و رفتار عملیاتی
- ویرایش/حذف پیامها به رویدادهای سیستمی نگاشت میشوند.
- پخشهای رشتهای (پاسخهای رشتهای «همچنین به کانال ارسال کن») بهعنوان پیامهای عادی کاربر پردازش میشوند.
- رویدادهای افزودن/حذف واکنش به رویدادهای سیستمی نگاشت میشوند.
- رویدادهای پیوستن/ترک عضو، ایجاد/تغییرنام کانال، و افزودن/حذف pin به رویدادهای سیستمی نگاشت میشوند.
- وقتی
configWritesفعال باشد،channel_id_changedمیتواند کلیدهای پیکربندی کانال را مهاجرت دهد. - فراداده موضوع/هدف کانال بهعنوان زمینه غیرقابل اعتماد در نظر گرفته میشود و میتواند به زمینه مسیریابی تزریق شود.
- آغازگر رشته و seed کردن زمینه تاریخچه اولیه رشته، در صورت کاربرد، با allowlistهای فرستنده پیکربندیشده فیلتر میشوند.
- اکشنهای بلوک و تعاملهای modal رویدادهای سیستمی ساختاریافته
Slack interaction: ...را با فیلدهای payload غنی منتشر میکنند:- اکشنهای بلوک: مقدارهای انتخابشده، labelها، مقدارهای picker، و فراداده
workflow_* - رویدادهای modal
view_submissionوview_closedبا فراداده کانال مسیریابیشده و ورودیهای فرم
- اکشنهای بلوک: مقدارهای انتخابشده، labelها، مقدارهای picker، و فراداده
مرجع پیکربندی
مرجع اصلی: مرجع پیکربندی - Slack.
فیلدهای مهم Slack
- mode/auth:
mode,botToken,appToken,signingSecret,webhookPath,accounts.* - دسترسی پیام مستقیم:
dm.enabled,dmPolicy,allowFrom(قدیمی:dm.policy,dm.allowFrom),dm.groupEnabled,dm.groupChannels - toggle سازگاری:
dangerouslyAllowNameMatching(break-glass؛ مگر در صورت نیاز خاموش نگه دارید) - دسترسی کانال:
groupPolicy,channels.*,channels.*.users,channels.*.requireMention - رشتهبندی/تاریخچه:
replyToMode,replyToModeByChatType,thread.*,historyLimit,dmHistoryLimit,dms.*.historyLimit - تحویل:
textChunkLimit,chunkMode,mediaMaxMb,streaming,streaming.nativeTransport,streaming.preview.toolProgress - ops/features:
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
عیبیابی
هیچ پاسخی در کانالها دریافت نمیشود
بهترتیب بررسی کنید:
groupPolicy- allowlist کانال (
channels.slack.channels) — کلیدها باید شناسه کانال باشند (C12345678)، نه نامها (#channel-name). کلیدهای مبتنی بر نام تحتgroupPolicy: "allowlist"بیصدا شکست میخورند، چون مسیریابی کانال بهطور پیشفرض ابتدا بر پایه شناسه است. برای پیدا کردن شناسه: در Slack روی کانال راستکلیک کنید → Copy link — مقدارC...در انتهای URL شناسه کانال است. requireMention- allowlist کاربران در هر کانال
دستورهای مفید:
openclaw channels status --probe
openclaw logs --follow
openclaw doctor
پیامهای مستقیم نادیده گرفته میشوند
بررسی کنید:
channels.slack.dm.enabledchannels.slack.dmPolicy(یاchannels.slack.dm.policyقدیمی)- تأییدهای pairing / ورودیهای allowlist
- رویدادهای پیام مستقیم Slack Assistant: logهای verbose که به
drop message_changedاشاره میکنند معمولا یعنی Slack یک رویداد رشته Assistant ویرایششده را بدون فرستنده انسانی قابل بازیابی در فراداده پیام ارسال کرده است
openclaw pairing list slack
Socket mode وصل نمیشود
توکنهای bot + app و فعال بودن Socket Mode را در تنظیمات برنامه Slack اعتبارسنجی کنید.
اگر openclaw channels status --probe --json مقدار botTokenStatus یا
appTokenStatus: "configured_unavailable" را نشان دهد، حساب Slack
پیکربندی شده است اما زمان اجرای فعلی نتوانسته مقدار پشتیبانیشده با SecretRef را
resolve کند.
HTTP mode رویدادها را دریافت نمیکند
اعتبارسنجی کنید:
- signing secret
- مسیر Webhook
- URLهای درخواست Slack (Events + Interactivity + Slash Commands)
webhookPathیکتا برای هر حساب HTTP
اگر signingSecretStatus: "configured_unavailable" در snapshotهای حساب
ظاهر شود، حساب HTTP پیکربندی شده است اما زمان اجرای فعلی نتوانسته
signing secret پشتیبانیشده با SecretRef را resolve کند.
دستورهای Native/slash اجرا نمیشوند
بررسی کنید کدامیک را در نظر داشتهاید:
- حالت دستور بومی (
channels.slack.commands.native: true) با دستورهای slash مطابق که در Slack ثبت شدهاند - یا حالت دستور slash واحد (
channels.slack.slashCommand.enabled: true)
همچنین commands.useAccessGroups و allowlistهای کانال/کاربر را بررسی کنید.
مرجع vision پیوست
Slack میتواند رسانههای دانلودشده را وقتی دانلود فایلهای Slack موفق باشد و محدودیتهای اندازه اجازه دهد، به نوبت عامل پیوست کند. فایلهای تصویری میتوانند از مسیر درک رسانه عبور داده شوند یا مستقیماً به یک مدل پاسخ دارای قابلیت بینایی داده شوند؛ فایلهای دیگر بهعنوان زمینهٔ فایل قابل دانلود نگه داشته میشوند، نه اینکه بهعنوان ورودی تصویر تلقی شوند.
انواع رسانهٔ پشتیبانیشده
| نوع رسانه | منبع | رفتار فعلی | نکات |
|---|---|---|---|
| تصاویر JPEG / PNG / GIF / WebP | نشانی فایل Slack | دانلود میشوند و برای پردازش دارای قابلیت بینایی به نوبت پیوست میشوند | سقف هر فایل: channels.slack.mediaMaxMb (پیشفرض 20 مگابایت) |
| فایلهای PDF | نشانی فایل Slack | دانلود میشوند و بهعنوان زمینهٔ فایل برای ابزارهایی مانند download-file یا pdf در دسترس قرار میگیرند |
ورودی Slack بهطور خودکار PDFها را به ورودی بینایی تصویر تبدیل نمیکند |
| فایلهای دیگر | نشانی فایل Slack | در صورت امکان دانلود میشوند و بهعنوان زمینهٔ فایل در دسترس قرار میگیرند | فایلهای دودویی بهعنوان ورودی تصویر تلقی نمیشوند |
| پاسخهای رشته گفتگو | فایلهای شروعکنندهٔ رشته گفتگو | فایلهای پیام ریشه میتوانند وقتی پاسخ رسانهٔ مستقیم ندارد، بهعنوان زمینه بازیابی شوند | شروعکنندههای فقطفایل از یک جاینگهدار پیوست استفاده میکنند |
| پیامهای چندتصویری | چندین فایل Slack | هر فایل بهصورت مستقل ارزیابی میشود | پردازش Slack به هشت فایل در هر پیام محدود است |
خط لولهٔ ورودی
وقتی یک پیام Slack همراه با پیوستهای فایل میرسد:
- OpenClaw فایل را با استفاده از توکن ربات (
xoxb-...) از نشانی خصوصی Slack دانلود میکند. - در صورت موفقیت، فایل در ذخیرهگاه رسانه نوشته میشود.
- مسیرهای رسانهٔ دانلودشده و انواع محتوا به زمینهٔ ورودی افزوده میشوند.
- مسیرهای مدل/ابزار دارای قابلیت تصویر میتوانند از پیوستهای تصویر موجود در آن زمینه استفاده کنند.
- فایلهای غیرتصویری بهعنوان فرادادهٔ فایل یا ارجاعهای رسانه برای ابزارهایی که میتوانند آنها را مدیریت کنند، در دسترس میمانند.
ارثبری پیوست از ریشهٔ رشته گفتگو
وقتی پیامی در یک رشته گفتگو میرسد (یک والد thread_ts دارد):
- اگر خود پاسخ رسانهٔ مستقیم نداشته باشد و پیام ریشهٔ شاملشده فایل داشته باشد، Slack میتواند فایلهای ریشه را بهعنوان زمینهٔ شروعکنندهٔ رشته گفتگو بازیابی کند.
- پیوستهای مستقیم پاسخ بر پیوستهای پیام ریشه اولویت دارند.
- پیام ریشهای که فقط فایل دارد و متن ندارد، با یک جاینگهدار پیوست نمایش داده میشود تا مسیر جایگزین همچنان بتواند فایلهای آن را شامل کند.
مدیریت چندپیوستی
وقتی یک پیام Slack واحد چندین پیوست فایل دارد:
- هر پیوست بهصورت مستقل از طریق خط لولهٔ رسانه پردازش میشود.
- ارجاعهای رسانهٔ دانلودشده در زمینهٔ پیام تجمیع میشوند.
- ترتیب پردازش از ترتیب فایلهای Slack در بار دادهٔ رویداد پیروی میکند.
- شکست در دانلود یک پیوست، پیوستهای دیگر را مسدود نمیکند.
محدودیتهای اندازه، دانلود و مدل
- سقف اندازه: پیشفرض 20 مگابایت برای هر فایل. از طریق
channels.slack.mediaMaxMbقابل پیکربندی است. - شکستهای دانلود: فایلهایی که Slack نمیتواند ارائه کند، نشانیهای منقضیشده، فایلهای غیرقابل دسترسی، فایلهای بیشازحد بزرگ، و پاسخهای HTML احراز هویت/ورود Slack بهجای گزارششدن بهعنوان قالبهای پشتیبانینشده، نادیده گرفته میشوند.
- مدل بینایی: تحلیل تصویر وقتی مدل پاسخ فعال از بینایی پشتیبانی کند از همان مدل استفاده میکند، یا از مدل تصویر پیکربندیشده در
agents.defaults.imageModel.
محدودیتهای شناختهشده
| سناریو | رفتار فعلی | راهکار جایگزین |
|---|---|---|
| نشانی فایل Slack منقضیشده | فایل نادیده گرفته میشود؛ خطایی نمایش داده نمیشود | فایل را دوباره در Slack بارگذاری کنید |
| مدل بینایی پیکربندی نشده است | پیوستهای تصویر بهعنوان ارجاعهای رسانه ذخیره میشوند، اما بهعنوان تصویر تحلیل نمیشوند | agents.defaults.imageModel را پیکربندی کنید یا از یک مدل پاسخ دارای قابلیت بینایی استفاده کنید |
| تصاویر بسیار بزرگ (> 20 مگابایت بهطور پیشفرض) | براساس سقف اندازه نادیده گرفته میشوند | اگر Slack اجازه میدهد، channels.slack.mediaMaxMb را افزایش دهید |
| پیوستهای ارسالشده/اشتراکگذاریشده | متن و رسانهٔ تصویر/فایل میزبانیشده در Slack بهصورت best-effort پردازش میشوند | مستقیماً در رشته گفتگوی OpenClaw دوباره به اشتراک بگذارید |
| پیوستهای PDF | بهعنوان زمینهٔ فایل/رسانه ذخیره میشوند، نه اینکه بهطور خودکار از مسیر بینایی تصویر عبور داده شوند | برای فرادادهٔ فایل از download-file یا برای تحلیل PDF از ابزار pdf استفاده کنید |
مستندات مرتبط
- خط لولهٔ درک رسانه
- ابزار PDF
- اپیک: #51349 — فعالسازی بینایی پیوستهای Slack
- آزمونهای رگرسیون: #51353
- راستیآزمایی زنده: #51354