Telegram (Bot API)¶
สถานะ: พร้อมใช้งานระดับโปรดักชันสำหรับบอต DMs + กลุ่มผ่าน grammY ค่าเริ่มต้นเป็น long-polling; webhook เป็นตัวเลือก 27. ค่าเริ่มต้นเป็น long-polling; webhook เป็นตัวเลือก.
เริ่มต้นอย่างรวดเร็ว(ผู้เริ่มต้น)¶
-
- สร้างบอทด้วย @BotFather (ลิงก์โดยตรง). สร้างบอตด้วย @BotFather (ลิงก์ตรง) ยืนยันว่า handle เป็น
@BotFatherตรงตัว จากนั้นคัดลอกโทเคน
- สร้างบอทด้วย @BotFather (ลิงก์โดยตรง). สร้างบอตด้วย @BotFather (ลิงก์ตรง) ยืนยันว่า handle เป็น
- ตั้งค่าโทเคน:
- Env:
TELEGRAM_BOT_TOKEN=...- หรือคอนฟิก:channels.telegram.botToken: "..."- หากตั้งค่าทั้งสองอย่าง คอนฟิกจะมีลำดับความสำคัญสูงกว่า (env ใช้เป็นค่า fallback สำหรับบัญชีเริ่มต้นเท่านั้น) - เริ่มต้น Gateway
- การเข้าถึง DM ใช้การจับคู่เป็นค่าเริ่มต้น อนุมัติรหัสจับคู่เมื่อมีการติดต่อครั้งแรก
คอนฟิกขั้นต่ำ:
{
channels: {
telegram: {
enabled: true,
botToken: "123:abc",
dmPolicy: "pairing",
},
},
}
คืออะไร¶
- ช่องทาง Telegram Bot API ที่ Gateway เป็นเจ้าของ
- การกำหนดเส้นทางแบบกำหนดแน่นอน: การตอบกลับจะกลับไปที่ Telegram เสมอ โมเดลจะไม่เลือกช่องทางเอง
- DM ใช้เซสชันหลักของเอเจนต์ร่วมกัน; กลุ่มจะแยกจากกัน (
agent:<agentId>:telegram:group:<chatId>)
การตั้งค่า(ทางลัด)¶
1. สร้างโทเคนบอต (BotFather)¶
- เปิด Telegram และแชตกับ @BotFather (ลิงก์ตรง) ยืนยันว่า handle เป็น
@BotFatherตรงตัว 29. ยืนยันว่าแฮนเดิลเป็น@BotFatherตรงตัว. - รัน
/newbotแล้วทำตามคำแนะนำ (ชื่อ + ชื่อผู้ใช้ลงท้ายด้วยbot) - คัดลอกโทเคนและเก็บรักษาอย่างปลอดภัย
การตั้งค่า BotFather (ไม่บังคับ):
/setjoingroups— อนุญาต/ปฏิเสธการเพิ่มบอตเข้ากลุ่ม/setprivacy— ควบคุมว่าบอตจะเห็นข้อความทั้งหมดในกลุ่มหรือไม่
2. กำหนดค่าโทเคน (env หรือคอนฟิก)¶
ตัวอย่าง:
{
channels: {
telegram: {
enabled: true,
botToken: "123:abc",
dmPolicy: "pairing",
groups: { "*": { requireMention: true } },
},
},
}
ตัวเลือก Env: TELEGRAM_BOT_TOKEN=... (ใช้ได้กับบัญชีเริ่มต้น)
หากตั้งค่าทั้ง env และคอนฟิก คอนฟิกจะมีลำดับความสำคัญสูงกว่า
หากตั้งค่าทั้ง env และคอนฟิก คอนฟิกจะมีลำดับความสำคัญสูงกว่า
รองรับหลายบัญชี: ใช้ channels.telegram.accounts พร้อมโทเคนต่อบัญชีและ name (ไม่บังคับ) รองรับหลายบัญชี: ใช้ channels.telegram.accounts พร้อมโทเคนต่อบัญชี และ name (ไม่บังคับ) ดู gateway/configuration สำหรับรูปแบบที่ใช้ร่วมกัน
- เริ่มต้น Gateway เริ่มต้น Gateway Telegram จะเริ่มทำงานเมื่อมีการแก้ไขโทเคน (คอนฟิกก่อน แล้วจึง env fallback)
-
- การเข้าถึง DM ค่าเริ่มต้นเป็นการจับคู่. การเข้าถึง DM ค่าเริ่มต้นเป็นการจับคู่ อนุมัติรหัสเมื่อบอตถูกติดต่อครั้งแรก
- สำหรับกลุ่ม: เพิ่มบอต ตัดสินใจพฤติกรรมความเป็นส่วนตัว/แอดมิน (ด้านล่าง) จากนั้นตั้งค่า
channels.telegram.groupsเพื่อควบคุม mention gating + allowlists
โทเคน + ความเป็นส่วนตัว + สิทธิ์ (ฝั่ง Telegram)¶
การสร้างโทเคน (BotFather)¶
/newbotสร้างบอตและส่งคืนโทเคน (เก็บเป็นความลับ)- หากโทเคนรั่ว ให้เพิกถอน/สร้างใหม่ผ่าน @BotFather และอัปเดตคอนฟิก
การมองเห็นข้อความกลุ่ม (Privacy Mode)¶
บอต Telegram ค่าเริ่มต้นอยู่ใน Privacy Mode ซึ่งจำกัดข้อความกลุ่มที่บอตจะได้รับ หากบอตต้องเห็นข้อความกลุ่ม ทั้งหมด มีสองทางเลือก: 31. หากบอทของคุณต้องเห็นข้อความกลุ่ม ทั้งหมด คุณมีสองทางเลือก:
- ปิด privacy mode ด้วย
/setprivacyหรือ - เพิ่มบอตเป็น แอดมิน ของกลุ่ม (บอตแอดมินจะได้รับข้อความทั้งหมด)
หมายเหตุ: เมื่อสลับ privacy mode Telegram ต้องการให้ลบแล้วเพิ่มบอตใหม่ ในแต่ละกลุ่มเพื่อให้การเปลี่ยนแปลงมีผล
สิทธิ์กลุ่ม (สิทธิ์แอดมิน)¶
- สถานะผู้ดูแลตั้งค่าภายในกลุ่ม (ผ่าน UI ของ Telegram). 33. บอทที่เป็นผู้ดูแลจะได้รับข้อความกลุ่มทั้งหมดเสมอ ดังนั้นให้ใช้สถานะผู้ดูแลหากต้องการการมองเห็นแบบเต็ม.
ทำงานอย่างไร(พฤติกรรม)¶
- ข้อความขาเข้าได้รับการปรับให้อยู่ในซองช่องทางร่วม พร้อมบริบทการตอบกลับและตัวแทนสื่อ
- การตอบในกลุ่มต้องมีการกล่าวถึงเป็นค่าเริ่มต้น (native @mention หรือ
agents.list[].groupChat.mentionPatterns/messages.groupChat.mentionPatterns) - การ override หลายเอเจนต์: ตั้งค่าแพตเทิร์นต่อเอเจนต์ที่
agents.list[].groupChat.mentionPatterns - การตอบกลับจะถูกส่งกลับไปยังแชต Telegram เดิมเสมอ
- long-polling ใช้ grammY runner พร้อมการจัดลำดับต่อแชต; คอนเคอร์เรนซีรวมถูกจำกัดโดย
agents.defaults.maxConcurrent - Telegram Bot API ไม่รองรับ read receipts; ไม่มีตัวเลือก
sendReadReceipts
Draft streaming¶
OpenClaw สามารถสตรีมการตอบกลับบางส่วนใน Telegram DMs โดยใช้ sendMessageDraft
ข้อกำหนด:
- เปิด Threaded Mode สำหรับบอตใน @BotFather (forum topic mode)
- เฉพาะเธรดแชตส่วนตัว (Telegram จะใส่
message_thread_idในข้อความขาเข้า) channels.telegram.streamModeไม่ตั้งค่าเป็น"off"(ค่าเริ่มต้น:"partial","block"เปิดการอัปเดตแบบบล็อก)
Draft streaming ใช้ได้เฉพาะ DM; Telegram ไม่รองรับในกลุ่มหรือแชนเนล
การจัดรูปแบบ (Telegram HTML)¶
- ข้อความขาออกของ Telegram ใช้
parse_mode: "HTML"(ชุดแท็กที่ Telegram รองรับ) - อินพุตสไตล์ Markdown ถูกเรนเดอร์เป็น HTML ที่ปลอดภัยสำหรับ Telegram (ตัวหนา/เอียง/ขีดฆ่า/โค้ด/ลิงก์); องค์ประกอบบล็อกจะถูกรวมเป็นข้อความพร้อมบรรทัดใหม่/สัญลักษณ์หัวข้อ
- HTML ดิบจากโมเดลจะถูก escape เพื่อหลีกเลี่ยงข้อผิดพลาดการแยกวิเคราะห์ของ Telegram
- หาก Telegram ปฏิเสธ payload HTML OpenClaw จะลองส่งข้อความเดิมเป็น plain text
คำสั่ง (เนทีฟ + กำหนดเอง)¶
OpenClaw ลงทะเบียนคำสั่งเนทีฟ (เช่น /status, /reset, /model) กับเมนูบอตของ Telegram เมื่อเริ่มต้น
คุณสามารถเพิ่มคำสั่งกำหนดเองลงเมนูผ่านคอนฟิก:
34. คุณสามารถเพิ่มคำสั่งกำหนดเองลงในเมนูผ่านคอนฟิก:
{
channels: {
telegram: {
customCommands: [
{ command: "backup", description: "Git backup" },
{ command: "generate", description: "Create an image" },
],
},
},
}
การแก้ไขปัญหาการตั้งค่า (คำสั่ง)¶
setMyCommands failedในล็อกมักหมายถึง HTTPS/DNS ขาออกไปยังapi.telegram.orgถูกบล็อก- หากเห็นความล้มเหลว
sendMessageหรือsendChatActionให้ตรวจสอบเส้นทาง IPv6 และ DNS
ความช่วยเหลือเพิ่มเติม: การแก้ไขปัญหาช่องทาง
หมายเหตุ:
- คำสั่งกำหนดเองเป็น รายการเมนูเท่านั้น; OpenClaw จะไม่ทำงานให้ เว้นแต่คุณจัดการเองที่อื่น
- คำสั่งบางอย่างสามารถถูกจัดการโดยปลั๊กอิน/สกิลได้โดยไม่ต้องลงทะเบียนในเมนูคำสั่งของ Telegram คำสั่งเหล่านี้ยังคงใช้งานได้เมื่อพิมพ์ (เพียงแต่จะไม่แสดงใน
/commands/ เมนู) - ชื่อคำสั่งจะถูกทำให้เป็นมาตรฐาน (ตัด
/นำหน้า แปลงเป็นตัวพิมพ์เล็ก) และต้องตรงตามa-z,0-9,_(1–32 ตัวอักษร) - คำสั่งกำหนดเอง ไม่สามารถแทนที่คำสั่งเนทีฟได้ ความขัดแย้งจะถูกละเว้นและบันทึก 35. ความขัดแย้งจะถูกละเว้นและบันทึกไว้.
- หาก
commands.nativeถูกปิด จะลงทะเบียนเฉพาะคำสั่งกำหนดเอง (หรือถูกล้างหากไม่มี)
คำสั่งการจับคู่อุปกรณ์ (ปลั๊กอิน device-pair)¶
หากติดตั้งปลั๊กอิน device-pair แล้ว จะเพิ่มโฟลว์แบบ Telegram-first สำหรับการจับคู่โทรศัพท์เครื่องใหม่:
/pairจะสร้าง setup code (ส่งเป็นข้อความแยกต่างหากเพื่อให้ง่ายต่อการคัดลอก/วาง)- วาง setup code ในแอป iOS เพื่อเชื่อมต่อ
/pair approveใช้อนุมัติคำขออุปกรณ์ที่รอดำเนินการล่าสุด
รายละเอียดเพิ่มเติม: Pairing.
ข้อจำกัด¶
- ข้อความขาออกถูกแบ่งเป็นชิ้นขนาด
channels.telegram.textChunkLimit(ค่าเริ่มต้น 4000) - การแบ่งตามบรรทัดใหม่ (ไม่บังคับ): ตั้งค่า
channels.telegram.chunkMode="newline"เพื่อแบ่งตามบรรทัดว่าง (ขอบเขตย่อหน้า) ก่อนแบ่งตามความยาว - การดาวน์โหลด/อัปโหลดสื่อจำกัดที่
channels.telegram.mediaMaxMb(ค่าเริ่มต้น 5) - คำขอ Telegram Bot API หมดเวลาหลัง
channels.telegram.timeoutSeconds(ค่าเริ่มต้น 500 ผ่าน grammY) ตั้งค่าต่ำลงเพื่อหลีกเลี่ยงการค้างยาว 36. ตั้งค่าให้ต่ำลงเพื่อหลีกเลี่ยงการค้างนาน. - บริบทประวัติกลุ่มใช้
channels.telegram.historyLimit(หรือchannels.telegram.accounts.*.historyLimit) โดย fallback เป็นmessages.groupChat.historyLimitตั้งค่า0เพื่อปิด (ค่าเริ่มต้น 50) ตั้งค่า0เพื่อปิด (ค่าเริ่มต้น 50) - ประวัติ DM สามารถจำกัดด้วย
channels.telegram.dmHistoryLimit(จำนวนรอบผู้ใช้) การ override ต่อผู้ใช้:channels.telegram.dms["<user_id>"].historyLimitchannels.signal.dmHistoryLimit: ขีดจำกัดประวัติ DM ในรอบผู้ใช้ การเขียนทับต่อผู้ใช้:channels.telegram.dms["<user_id>"].historyLimit
โหมดการเปิดใช้งานกลุ่ม¶
ค่าเริ่มต้น บอตจะตอบเฉพาะเมื่อมีการกล่าวถึงในกลุ่ม (@botname หรือแพตเทิร์นใน agents.list[].groupChat.mentionPatterns) หากต้องการเปลี่ยนพฤติกรรม: 37. เพื่อเปลี่ยนพฤติกรรมนี้:
ผ่านคอนฟิก (แนะนำ)¶
{
channels: {
telegram: {
groups: {
"-1001234567890": { requireMention: false }, // always respond in this group
},
},
},
}
สำคัญ: การตั้งค่า channels.telegram.groups จะสร้าง allowlist — จะยอมรับเฉพาะกลุ่มที่ระบุ (หรือ "*")
Forum topics จะสืบทอดคอนฟิกของกลุ่มแม่ (allowFrom, requireMention, skills, prompts) เว้นแต่คุณเพิ่มการ override ต่อหัวข้อภายใต้ channels.telegram.groups.<groupId> 38. หัวข้อฟอรัมจะสืบทอดคอนฟิกของกลุ่มแม่ (allowFrom, requireMention, skills, prompts) เว้นแต่คุณจะเพิ่มการเขียนทับรายหัวข้อภายใต้channels.telegram.groups..topics.<topicId>
เพื่ออนุญาตทุกกลุ่มและตอบเสมอ:
{
channels: {
telegram: {
groups: {
"*": { requireMention: false }, // all groups, always respond
},
},
},
}
เพื่อคงโหมดกล่าวถึงเท่านั้นสำหรับทุกกลุ่ม (ค่าเริ่มต้น):
{
channels: {
telegram: {
groups: {
"*": { requireMention: true }, // or omit groups entirely
},
},
},
}
ผ่านคำสั่ง (ระดับเซสชัน)¶
ส่งในกลุ่ม:
/activation always- ตอบทุกข้อความ/activation mention- ต้องมีการกล่าวถึง (ค่าเริ่มต้น)
หมายเหตุ: คำสั่งจะอัปเดตเฉพาะสถานะเซสชัน สำหรับพฤติกรรมถาวรข้ามการรีสตาร์ต ให้ใช้คอนฟิก 39. สำหรับพฤติกรรมถาวรข้ามการรีสตาร์ต ให้ใช้คอนฟิก.
การดึง group chat ID¶
ส่งต่อข้อความใดๆ จากกลุ่มไปยัง @userinfobot หรือ @getidsbot บน Telegram เพื่อดู chat ID (ตัวเลขติดลบเช่น -1001234567890)
เคล็ดลับ: สำหรับ user ID ของคุณเอง DM บอต แล้วบอตจะตอบด้วย user ID (ข้อความจับคู่) หรือใช้ /whoami เมื่อเปิดใช้คำสั่งแล้ว
- หมายเหตุด้านความเป็นส่วนตัว:
@userinfobotเป็นบอทของบุคคลที่สาม. หมายเหตุความเป็นส่วนตัว:@userinfobotเป็นบอตของบุคคลที่สาม หากต้องการหลีกเลี่ยง ให้เพิ่มบอตของคุณเข้ากลุ่ม ส่งข้อความ แล้วใช้openclaw logs --followเพื่ออ่านchat.idหรือใช้ Bot APIgetUpdates
การเขียนคอนฟิก¶
ค่าเริ่มต้น Telegram อนุญาตให้เขียนอัปเดตคอนฟิกที่เกิดจากอีเวนต์ของช่องทางหรือ /config set|unset
สิ่งนี้จะเกิดขึ้นเมื่อ:
- กลุ่มถูกอัปเกรดเป็นซูเปอร์กรุ๊ปและ Telegram ส่ง
migrate_to_chat_id(chat ID เปลี่ยน) OpenClaw สามารถย้ายchannels.telegram.groupsอัตโนมัติ 41. OpenClaw สามารถย้ายchannels.telegram.groupsให้อัตโนมัติ. - คุณรัน
/config setหรือ/config unsetในแชต Telegram (ต้องมีcommands.config: true)
ปิดใช้งานด้วย:
{
channels: { telegram: { configWrites: false } },
}
หัวข้อ (forum supergroups)¶
หัวข้อฟอรัมของ Telegram จะมี message_thread_id ต่อข้อความ OpenClaw จะ: OpenClaw:
- ต่อท้าย
:topic:<threadId>กับคีย์เซสชันกลุ่ม Telegram เพื่อให้แต่ละหัวข้อแยกกัน - ส่งตัวบ่งชี้การพิมพ์และการตอบกลับด้วย
message_thread_idเพื่อให้การตอบอยู่ในหัวข้อ - หัวข้อทั่วไป (thread id
1) เป็นกรณีพิเศษ: การส่งข้อความจะไม่ใส่message_thread_id(Telegram ปฏิเสธ) แต่ตัวบ่งชี้การพิมพ์ยังคงใส่ - เปิดเผย
MessageThreadId+IsForumในบริบทเทมเพลตสำหรับการกำหนดเส้นทาง/เทมเพลต - มีการกำหนดค่าเฉพาะหัวข้อภายใต้
channels.telegram.groups.<chatId>.topics.<threadId>(skills, allowlists, auto-reply, system prompts, disable) - คอนฟิกหัวข้อจะสืบทอดการตั้งค่ากลุ่ม (requireMention, allowlists, skills, prompts, enabled) เว้นแต่ถูก override ต่อหัวข้อ
- แชตส่วนตัวอาจมี
message_thread_idในบางกรณีขอบ. แชตส่วนตัวอาจมีmessage_thread_idในบางกรณีขอบ OpenClaw จะคงคีย์เซสชัน DM เดิม แต่ยังใช้ thread id สำหรับการตอบกลับ/การสตรีมดราฟต์เมื่อมี
ปุ่มอินไลน์¶
Telegram รองรับคีย์บอร์ดอินไลน์พร้อมปุ่ม callback
{
channels: {
telegram: {
capabilities: {
inlineButtons: "allowlist",
},
},
},
}
สำหรับการกำหนดค่าต่อบัญชี:
{
channels: {
telegram: {
accounts: {
main: {
capabilities: {
inlineButtons: "allowlist",
},
},
},
},
},
}
ขอบเขต:
off— ปิดปุ่มอินไลน์dm— เฉพาะ DM (บล็อกเป้าหมายกลุ่ม)group— เฉพาะกลุ่ม (บล็อกเป้าหมาย DM)all— DM + กลุ่มallowlist— DM + กลุ่ม แต่เฉพาะผู้ส่งที่อนุญาตโดยallowFrom/groupAllowFrom(กติกาเดียวกับคำสั่งควบคุม)
- ค่าเริ่มต้น:
allowlist. ค่าเริ่มต้น:allowlistLegacy:capabilities: ["inlineButtons"]=inlineButtons: "all"
การส่งปุ่ม¶
ใช้ message tool พร้อมพารามิเตอร์ buttons:
{
action: "send",
channel: "telegram",
to: "123456789",
message: "Choose an option:",
buttons: [
[
{ text: "Yes", callback_data: "yes" },
{ text: "No", callback_data: "no" },
],
[{ text: "Cancel", callback_data: "cancel" }],
],
}
เมื่อผู้ใช้คลิกปุ่ม ข้อมูล callback จะถูกส่งกลับไปยังเอเจนต์เป็นข้อความรูปแบบ:
callback_data: value
ตัวเลือกการกำหนดค่า¶
ความสามารถของ Telegram สามารถกำหนดค่าได้สองระดับ (แสดงรูปแบบอ็อบเจ็กต์ด้านบน; ยังรองรับอาร์เรย์สตริงแบบ legacy):
channels.telegram.capabilities: ค่าดีฟอลต์ระดับโกลบอล ใช้กับบัญชี Telegram ทั้งหมด เว้นแต่ถูก overridechannels.telegram.accounts.<account>.capabilities: ความสามารถต่อบัญชีที่ override ค่าดีฟอลต์โกลบอลสำหรับบัญชีนั้น
- ใช้การตั้งค่าระดับโกลบอลเมื่อบอท/บัญชี Telegram ทั้งหมดควรมีพฤติกรรมเหมือนกัน. ใช้ค่าระดับโกลบอลเมื่อบอต/บัญชี Telegram ทั้งหมดควรมีพฤติกรรมเหมือนกัน ใช้การกำหนดค่าต่อบัญชีเมื่อบอตต่างกันต้องการพฤติกรรมต่างกัน (เช่น บัญชีหนึ่งรับเฉพาะ DM อีกบัญชีอนุญาตในกลุ่ม)
การควบคุมการเข้าถึง(DMs+กลุ่ม)¶
การเข้าถึง DM¶
- ค่าเริ่มต้น:
channels.telegram.dmPolicy = "pairing". ค่าเริ่มต้น:channels.telegram.dmPolicy = "pairing"ผู้ส่งที่ไม่รู้จักจะได้รับรหัสจับคู่ ข้อความจะถูกละเว้นจนกว่าจะอนุมัติ (รหัสหมดอายุภายใน 1 ชั่วโมง) - อนุมัติผ่าน:
openclaw pairing list telegramopenclaw pairing approve telegram <CODE>- การจับคู่เป็นการแลกเปลี่ยนโทเคนค่าเริ่มต้นที่ใช้สำหรับ Telegram DMs รายละเอียด: การจับคู่ การจับคู่เป็นการแลกเปลี่ยนโทเคนเริ่มต้น รายละเอียด: Pairing
channels.telegram.allowFromรับ user ID แบบตัวเลข (แนะนำ) หรือรายการ@usernameไม่ใช่ ชื่อผู้ใช้ของบอต ใช้ ID ของผู้ส่งที่เป็นมนุษย์ ตัวช่วยตั้งค่ารับ@usernameและจะแก้เป็น ID ตัวเลขเมื่อทำได้ 45. นี่ ไม่ใช่ ชื่อผู้ใช้ของบอท; ให้ใช้ ID ของผู้ส่งที่เป็นมนุษย์. 46. ตัวช่วยตั้งค่ารองรับ@usernameและจะแปลงเป็น ID ตัวเลขเมื่อเป็นไปได้.
การค้นหา Telegram user ID ของคุณ¶
ปลอดภัยกว่า (ไม่มีบอตบุคคลที่สาม):
- เริ่มต้น Gateway และ DM บอตของคุณ
- รัน
openclaw logs --followและมองหาfrom.id
ทางเลือก (Bot API ทางการ):
-
- ส่ง DM ไปยังบอทของคุณ.
- ดึงอัปเดตด้วยโทเคนบอตของคุณและอ่าน
message.from.id:
bash
curl "https://api.telegram.org/bot<bot_token>/getUpdates"
บุคคลที่สาม (ความเป็นส่วนตัวน้อยกว่า):
- DM
@userinfobotหรือ@getidsbotและใช้ user id ที่ได้
การเข้าถึงกลุ่ม¶
มีการควบคุมอิสระสองส่วน:
1. กลุ่มใดบ้างที่อนุญาต (allowlist กลุ่มผ่าน channels.telegram.groups):
- ไม่มีคอนฟิก
groups= อนุญาตทุกกลุ่ม - มีคอนฟิก
groups= อนุญาตเฉพาะกลุ่มที่ระบุหรือ"*" - ตัวอย่าง:
"groups": { "-1001234567890": {}, "*": {} }อนุญาตทุกกลุ่ม
2. ผู้ส่งใดบ้างที่อนุญาต (การกรองผู้ส่งผ่าน channels.telegram.groupPolicy):
"open"= ผู้ส่งทุกคนในกลุ่มที่อนุญาตสามารถส่งข้อความได้"allowlist"= เฉพาะผู้ส่งในchannels.telegram.groupAllowFromเท่านั้น"disabled"= ไม่รับข้อความกลุ่มเลย ค่าเริ่มต้นคือgroupPolicy: "allowlist"(บล็อกจนกว่าจะเพิ่มgroupAllowFrom)
ผู้ใช้ส่วนใหญ่ต้องการ: groupPolicy: "allowlist" + groupAllowFrom + ระบุกลุ่มเฉพาะใน channels.telegram.groups
เพื่ออนุญาตให้ สมาชิกกลุ่มใดๆ พูดคุยในกลุ่มเฉพาะ (ขณะยังคงจำกัดคำสั่งควบคุมให้ผู้ส่งที่ได้รับอนุญาต) ให้ตั้งค่า override ต่อกลุ่ม:
{
channels: {
telegram: {
groups: {
"-1001234567890": {
groupPolicy: "open",
requireMention: false,
},
},
},
},
}
Long-polling เทียบกับ webhook¶
- ค่าเริ่มต้น: long-polling (ไม่ต้องมี URL สาธารณะ)
- โหมด webhook: ตั้งค่า
channels.telegram.webhookUrlและchannels.telegram.webhookSecret(เลือกตั้งchannels.telegram.webhookPath) - ตัวรับฟังในเครื่อง bind ที่
0.0.0.0:8787และให้บริการPOST /telegram-webhookเป็นค่าเริ่มต้น - หาก URL สาธารณะต่างออกไป ให้ใช้ reverse proxy และชี้
channels.telegram.webhookUrlไปยังปลายทางสาธารณะ
เธรดการตอบกลับ¶
Telegram รองรับการตอบแบบเธรดผ่านแท็ก:
[[reply_to_current]]-- ตอบกลับข้อความที่กระตุ้น[[reply_to:<id>]]-- ตอบกลับ message id ที่ระบุ
ควบคุมด้วย channels.telegram.replyToMode:
first(ค่าเริ่มต้น),all,off
ข้อความเสียง (voice vs file)¶
Telegram แยก voice notes (ฟองกลม) ออกจาก ไฟล์เสียง (การ์ดเมทาดาทา) OpenClaw ค่าเริ่มต้นใช้ไฟล์เสียงเพื่อความเข้ากันได้ย้อนหลัง 48. OpenClaw ใช้ไฟล์เสียงเป็นค่าเริ่มต้นเพื่อความเข้ากันได้ย้อนหลัง.
เพื่อบังคับส่งเป็นฟอง voice note ในการตอบของเอเจนต์ ให้ใส่แท็กนี้ที่ใดก็ได้ในคำตอบ:
[[audio_as_voice]]— ส่งเสียงเป็น voice note แทนไฟล์
- แท็กจะถูกตัดออกจากข้อความที่ส่งมอบ. แท็กจะถูกลบออกจากข้อความที่ส่งจริง ช่องทางอื่นจะเพิกเฉยแท็กนี้
สำหรับการส่งด้วย message tool ให้ตั้งค่า asVoice: true พร้อมเสียงที่รองรับ voice ที่ URL media
(message เป็นตัวเลือกเมื่อมีสื่อ):
{
action: "send",
channel: "telegram",
to: "123456789",
media: "https://example.com/voice.ogg",
asVoice: true,
}
ข้อความวิดีโอ (วิดีโอ vs วิดีโอโน้ต)¶
Telegram แยกแยะ วิดีโอโน้ต (ฟองกลม) ออกจาก ไฟล์วิดีโอ (สี่เหลี่ยมผืนผ้า) OpenClaw ตั้งค่าเริ่มต้นเป็นไฟล์วิดีโอ
สำหรับการส่งด้วย message tool ให้ตั้งค่า asVideoNote: true พร้อม URL วิดีโอใน media:
{
action: "send",
channel: "telegram",
to: "123456789",
media: "https://example.com/video.mp4",
asVideoNote: true,
}
(หมายเหตุ: วิดีโอโน้ตไม่รองรับคำบรรยาย) หากคุณใส่ข้อความ ข้อความนั้นจะถูกส่งเป็นอีกข้อความหนึ่งแยกต่างหาก)
สติกเกอร์¶
OpenClaw รองรับการรับและส่งสติกเกอร์ Telegram พร้อมแคชอัจฉริยะ
การรับสติกเกอร์¶
เมื่อผู้ใช้ส่งสติกเกอร์ OpenClaw จะจัดการตามประเภท:
- สติกเกอร์แบบคงที่ (WEBP): ดาวน์โหลดและประมวลผลผ่าน vision สติกเกอร์จะแสดงเป็นตัวแทน
<media:sticker>ในเนื้อหาข้อความ 50. สติกเกอร์จะแสดงเป็นตัวแทน<media:sticker>ในเนื้อหาข้อความ. - สติกเกอร์แอนิเมชัน (TGS): ข้าม (รูปแบบ Lottie ไม่รองรับการประมวลผล)
- สติกเกอร์วิดีโอ (WEBM): ข้าม (รูปแบบวิดีโอไม่รองรับการประมวลผล)
ฟิลด์บริบทเทมเพลตที่ใช้ได้เมื่อรับสติกเกอร์:
Sticker— อ็อบเจ็กต์ที่มี:emoji— อีโมจิที่เกี่ยวข้องกับสติกเกอร์setName— ชื่อชุดสติกเกอร์fileId— Telegram file ID (ใช้ส่งสติกเกอร์เดิมกลับ)fileUniqueId— ID คงที่สำหรับค้นหาในแคชcachedDescription— คำอธิบายจาก vision ที่แคชไว้เมื่อมี
แคชสติกเกอร์¶
Stickers are processed through the AI's vision capabilities to generate descriptions. สติกเกอร์ถูกประมวลผลผ่านความสามารถ vision ของ AI เพื่อสร้างคำอธิบาย เนื่องจากสติกเกอร์เดียวกันมักถูกส่งซ้ำ OpenClaw จึงแคชคำอธิบายเพื่อหลีกเลี่ยงการเรียก API ซ้ำ
ทำงานอย่างไร:
- พบครั้งแรก: ส่งภาพสติกเกอร์ไปวิเคราะห์ vision AI สร้างคำอธิบาย (เช่น "แมวการ์ตูนโบกมืออย่างกระตือรือร้น") The AI generates a description (e.g., "A cartoon cat waving enthusiastically").
- บันทึกแคช: บันทึกคำอธิบายพร้อม file ID อีโมจิ และชื่อชุด
- Subsequent encounters: When the same sticker is seen again, the cached description is used directly. The image is not sent to the AI.
ตำแหน่งแคช: ~/.openclaw/telegram/sticker-cache.json
รูปแบบรายการแคช:
{
"fileId": "CAACAgIAAxkBAAI...",
"fileUniqueId": "AgADBAADb6cxG2Y",
"emoji": "👋",
"setName": "CoolCats",
"description": "A cartoon cat waving enthusiastically",
"cachedAt": "2026-01-15T10:30:00.000Z"
}
ประโยชน์:
- ลดค่าใช้จ่าย API โดยหลีกเลี่ยงการเรียก vision ซ้ำสำหรับสติกเกอร์เดิม
- ตอบสนองเร็วขึ้นสำหรับสติกเกอร์ที่แคชแล้ว (ไม่มีดีเลย์จากการประมวลผล vision)
- เปิดใช้ฟังก์ชันค้นหาสติกเกอร์ตามคำอธิบายที่แคช
แคชจะถูกเติมอัตโนมัติเมื่อรับสติกเกอร์ ไม่ต้องจัดการแคชด้วยตนเอง There is no manual cache management required.
การส่งสติกเกอร์¶
เอเจนต์สามารถส่งและค้นหาสติกเกอร์ด้วยแอ็กชัน sticker และ sticker-search ซึ่งถูกปิดเป็นค่าเริ่มต้นและต้องเปิดในคอนฟิก: These are disabled by default and must be enabled in config:
{
channels: {
telegram: {
actions: {
sticker: true,
},
},
},
}
ส่งสติกเกอร์:
{
action: "sticker",
channel: "telegram",
to: "123456789",
fileId: "CAACAgIAAxkBAAI...",
}
พารามิเตอร์:
fileId(required) — the Telegram file ID of the sticker.fileId(จำเป็น) — Telegram file ID ของสติกเกอร์ รับจากSticker.fileIdเมื่อรับสติกเกอร์ หรือจากผลลัพธ์sticker-searchreplyTo(ไม่บังคับ) — message ID ที่จะตอบกลับthreadId(ไม่บังคับ) — message thread ID สำหรับหัวข้อฟอรัม
ค้นหาสติกเกอร์:
เอเจนต์สามารถค้นหาสติกเกอร์ที่แคชไว้ตามคำอธิบาย อีโมจิ หรือชื่อชุด:
{
action: "sticker-search",
channel: "telegram",
query: "cat waving",
limit: 5,
}
ส่งคืนสติกเกอร์ที่ตรงจากแคช:
{
ok: true,
count: 2,
stickers: [
{
fileId: "CAACAgIAAxkBAAI...",
emoji: "👋",
description: "A cartoon cat waving enthusiastically",
setName: "CoolCats",
},
],
}
การค้นหาใช้การจับคู่แบบฟัซซีข้ามข้อความคำอธิบาย อักขระอีโมจิ และชื่อชุด
ตัวอย่างพร้อมเธรด:
{
action: "sticker",
channel: "telegram",
to: "-1001234567890",
fileId: "CAACAgIAAxkBAAI...",
replyTo: 42,
threadId: 123,
}
การสตรีม (ดราฟต์)¶
Telegram can stream draft bubbles while the agent is generating a response.
Telegram สามารถสตรีม ฟองดราฟต์ ระหว่างที่เอเจนต์กำลังสร้างคำตอบ
OpenClaw ใช้ Bot API sendMessageDraft (ไม่ใช่ข้อความจริง) จากนั้นส่งคำตอบสุดท้ายเป็นข้อความปกติ
ข้อกำหนด (Telegram Bot API 9.3+):
- แชตส่วนตัวที่เปิดใช้หัวข้อ (forum topic mode สำหรับบอต)
- ข้อความขาเข้าต้องมี
message_thread_id(เธรดหัวข้อส่วนตัว) - การสตรีมจะถูกละเว้นสำหรับกลุ่ม/ซูเปอร์กรุ๊ป/แชนเนล
คอนฟิก:
channels.telegram.streamMode: "off" | "partial" | "block"(ค่าเริ่มต้น:partial)partial: อัปเดตฟองดราฟต์ด้วยข้อความสตรีมล่าสุดblock: อัปเดตฟองดราฟต์เป็นบล็อกใหญ่ (แบ่งชิ้น)off: ปิดการสตรีมดราฟต์- ตัวเลือก (เฉพาะ
streamMode: "block"): channels.telegram.draftChunk: { minChars?, maxChars?, breakPreference? }- ค่าเริ่มต้น:
minChars: 200,maxChars: 800,breakPreference: "paragraph"(จำกัดที่channels.telegram.textChunkLimit)
- ค่าเริ่มต้น:
Note: draft streaming is separate from block streaming (channel messages).
หมายเหตุ: การสตรีมดราฟต์แยกจาก block streaming (ข้อความช่องทาง)
block streaming ปิดเป็นค่าเริ่มต้นและต้องใช้ channels.telegram.blockStreaming: true
หากต้องการข้อความ Telegram ก่อนกำหนดแทนการอัปเดตดราฟต์
สตรีมเหตุผล (เฉพาะ Telegram):
/reasoning streamจะสตรีมเหตุผลลงในฟองดราฟต์ขณะสร้างคำตอบ จากนั้นส่งคำตอบสุดท้ายโดยไม่มีเหตุผล- หาก
channels.telegram.streamModeเป็นoffจะปิดสตรีมเหตุผล บริบทเพิ่มเติม: การสตรีม + การแบ่งชิ้น More context: Streaming + chunking.
นโยบายการลองใหม่¶
การเรียก Telegram API ขาออกจะลองใหม่เมื่อเกิดข้อผิดพลาดเครือข่ายชั่วคราว/429 ด้วย exponential backoff และ jitter กำหนดค่าผ่าน channels.telegram.retry ดู นโยบายการลองใหม่ Configure via channels.telegram.retry. See Retry policy.
เครื่องมือเอเจนต์ (ข้อความ + ปฏิกิริยา)¶
- เครื่องมือ:
telegramพร้อมแอ็กชันsendMessage(to,content, ตัวเลือกmediaUrl,replyToMessageId,messageThreadId) - เครื่องมือ:
telegramพร้อมแอ็กชันreact(chatId,messageId,emoji) - เครื่องมือ:
telegramพร้อมแอ็กชันdeleteMessage(chatId,messageId) - ความหมายการลบปฏิกิริยา: ดู /tools/reactions
- การจำกัดเครื่องมือ:
channels.telegram.actions.reactions,channels.telegram.actions.sendMessage,channels.telegram.actions.deleteMessage(ค่าเริ่มต้น: เปิด), และchannels.telegram.actions.sticker(ค่าเริ่มต้น: ปิด)
การแจ้งเตือนปฏิกิริยา¶
การทำงานของปฏิกิริยา:
ปฏิกิริยาของ Telegram เข้ามาเป็น อีเวนต์ message_reaction แยกต่างหาก ไม่ได้เป็นพร็อพเพอร์ตีใน payload ข้อความ เมื่อผู้ใช้เพิ่มปฏิกิริยา OpenClaw จะ: When a user adds a reaction, OpenClaw:
- รับอัปเดต
message_reactionจาก Telegram API - แปลงเป็น system event รูปแบบ:
"Telegram reaction added: {emoji} by {user} on msg {id}" - ใส่คิว system event โดยใช้ คีย์เซสชันเดียวกัน กับข้อความปกติ
- เมื่อมีข้อความถัดไปในบทสนทนา system events จะถูกระบายและนำหน้าบริบทของเอเจนต์
เอเจนต์จะเห็นปฏิกิริยาเป็น การแจ้งเตือนระบบ ในประวัติการสนทนา ไม่ใช่เมทาดาทาของข้อความ
การกำหนดค่า:
channels.telegram.reactionNotifications: ควบคุมว่าปฏิกิริยาใดกระตุ้นการแจ้งเตือน"off"— เพิกเฉยทุกปฏิกิริยา"own"— แจ้งเตือนเมื่อผู้ใช้ตอบสนองต่อข้อความบอต (best-effort; ในหน่วยความจำ) (ค่าเริ่มต้น)-
"all"— แจ้งเตือนทุกปฏิกิริยา -
channels.telegram.reactionLevel: ควบคุมความสามารถปฏิกิริยาของเอเจนต์ "off"— เอเจนต์ไม่สามารถตอบสนอง"ack"— บอตส่งปฏิกิริยารับทราบ (👀 ระหว่างประมวลผล) (ค่าเริ่มต้น)"minimal"— เอเจนต์ตอบสนองอย่างประหยัด (แนวทาง: 1 ครั้งต่อ 5–10 รอบ)"extensive"— เอเจนต์ตอบสนองอย่างเสรีเมื่อเหมาะสม
กลุ่มฟอรัม: ปฏิกิริยาในกลุ่มฟอรัมจะมี message_thread_id และใช้คีย์เซสชันเช่น agent:main:telegram:group:{chatId}:topic:{threadId} เพื่อให้ปฏิกิริยาและข้อความในหัวข้อเดียวกันอยู่ด้วยกัน This ensures reactions and messages in the same topic stay together.
ตัวอย่างคอนฟิก:
{
channels: {
telegram: {
reactionNotifications: "all", // See all reactions
reactionLevel: "minimal", // Agent can react sparingly
},
},
}
ข้อกำหนด:
- บอต Telegram ต้องร้องขอ
message_reactionอย่างชัดเจนในallowed_updates(OpenClaw ตั้งค่าให้อัตโนมัติ) - สำหรับโหมด webhook ปฏิกิริยาจะรวมอยู่ใน webhook
allowed_updates - สำหรับโหมด polling ปฏิกิริยาจะรวมอยู่ใน
getUpdatesallowed_updates
เป้าหมายการส่งมอบ(CLI/cron)¶
- ใช้ chat id (
123456789) หรือชื่อผู้ใช้ (@name) เป็นเป้าหมาย - ตัวอย่าง:
openclaw message send --channel telegram --target 123456789 --message "hi"
การแก้ไขปัญหา¶
บอตไม่ตอบข้อความที่ไม่ถูกกล่าวถึงในกลุ่ม:
- หากตั้งค่า
channels.telegram.groups.*.requireMention=falseต้องปิด privacy mode ของ Bot API ของ Telegram - BotFather:
/setprivacy→ Disable (จากนั้นลบแล้วเพิ่มบอตใหม่เข้ากลุ่ม) openclaw channels statusจะแสดงคำเตือนเมื่อคอนฟิกคาดหวังข้อความกลุ่มที่ไม่ถูกกล่าวถึงopenclaw channels status --probeสามารถตรวจสอบสมาชิกเพิ่มเติมสำหรับ group ID ตัวเลขที่ระบุ (ไม่สามารถตรวจสอบกฎ wildcard"*")- ทดสอบด่วน:
/activation always(เฉพาะเซสชัน; ใช้คอนฟิกเพื่อความถาวร)
บอตไม่เห็นข้อความกลุ่มเลย:
- หากตั้งค่า
channels.telegram.groupsกลุ่มต้องถูกระบุหรือใช้"*" - ตรวจสอบ Privacy Settings ใน @BotFather → "Group Privacy" ควรเป็น OFF
- ยืนยันว่าบอตเป็นสมาชิกจริง (ไม่ใช่แค่แอดมินที่ไม่มีสิทธิ์อ่าน)
- ตรวจสอบล็อก Gateway:
openclaw logs --follow(มองหา "skipping group message")
บอตตอบเมื่อถูกกล่าวถึง แต่ไม่ตอบ /activation always:
- คำสั่ง
/activationอัปเดตสถานะเซสชันแต่ไม่บันทึกถาวรในคอนฟิก - เพื่อความถาวร เพิ่มกลุ่มไปที่
channels.telegram.groupsพร้อมrequireMention: false
คำสั่งอย่าง /status ใช้ไม่ได้:
- ตรวจสอบว่า Telegram user ID ของคุณได้รับอนุญาตแล้ว (ผ่านการจับคู่หรือ
channels.telegram.allowFrom) - คำสั่งต้องการการอนุญาต แม้อยู่ในกลุ่มที่ตั้งค่า
groupPolicy: "open"
long-polling ยุติทันทีบน Node 22+ (มักเกิดกับ proxy/fetch แบบกำหนดเอง):
- Node 22+ เข้มงวดกับอินสแตนซ์
AbortSignalมากขึ้น สัญญาณจากภายนอกอาจยุติการเรียกfetchทันที - อัปเกรดเป็นบิลด์ OpenClaw ที่ทำ normalization สัญญาณ abort หรือรัน Gateway บน Node 20 จนกว่าจะอัปเกรดได้
บอตเริ่มทำงานแล้วหยุดตอบเงียบๆ (หรือบันทึก HttpError: Network request ... failed):
- Some hosts resolve
api.telegram.orgto IPv6 first. บางโฮสต์แก้ชื่อapi.telegram.orgเป็น IPv6 ก่อน หากเซิร์ฟเวอร์ของคุณไม่มี IPv6 egress ที่ใช้งานได้ grammY อาจค้างกับคำขอ IPv6 เท่านั้น - แก้ไขโดยเปิด IPv6 egress หรือ บังคับให้แก้ชื่อเป็น IPv4 สำหรับ
api.telegram.org(เช่น เพิ่มรายการ/etc/hostsด้วย A record ของ IPv4 หรือกำหนดให้ระบบปฏิบัติการเลือก IPv4) แล้วรีสตาร์ต Gateway - ตรวจสอบด่วน:
dig +short api.telegram.org Aและdig +short api.telegram.org AAAAเพื่อยืนยันผล DNS
อ้างอิงการกำหนดค่า (Telegram)¶
การกำหนดค่าแบบเต็ม: การกำหนดค่า
ตัวเลือกผู้ให้บริการ:
channels.telegram.enabled: เปิด/ปิดการเริ่มต้นช่องทางchannels.telegram.botToken: โทเคนบอต (BotFather)channels.telegram.tokenFile: อ่านโทเคนจากพาธไฟล์channels.telegram.dmPolicy:pairing | allowlist | open | disabled(ค่าเริ่มต้น: การจับคู่)channels.telegram.allowFrom: allowlist DM (ids/ชื่อผู้ใช้)openต้องใช้"*"openต้องใช้"*".channels.telegram.groupPolicy:open | allowlist | disabled(ค่าเริ่มต้น: allowlist)channels.telegram.groupAllowFrom: allowlist ผู้ส่งในกลุ่ม (ids/ชื่อผู้ใช้)channels.telegram.groups: ค่าเริ่มต้นต่อกลุ่ม + allowlist (ใช้"*"สำหรับค่าเริ่มต้นโกลบอล)channels.telegram.groups.<id>.groupPolicy: override ต่อกลุ่มสำหรับ groupPolicy (open | allowlist | disabled)channels.telegram.groups.<id>.requireMention: ค่าเริ่มต้น mention gatingchannels.telegram.groups.<id>.skills: ตัวกรอง skill (ไม่ระบุ = ทุก Skills, ว่าง = ไม่มี)channels.telegram.groups.<id>.allowFrom: override allowlist ผู้ส่งต่อกลุ่มchannels.telegram.groups.<id>.systemPrompt: system prompt เพิ่มเติมสำหรับกลุ่มchannels.telegram.groups.<id>.enabled: ปิดการใช้งานกลุ่มเมื่อfalsechannels.telegram.groups.<id>.topics.<threadId>.*: override ต่อหัวข้อ (ฟิลด์เดียวกับกลุ่ม)channels.telegram.groups.<id>.topics.<threadId>.groupPolicy: override ต่อหัวข้อสำหรับ groupPolicy (open | allowlist | disabled)channels.telegram.groups.<id>.topics.<threadId>.requireMention: override mention gating ต่อหัวข้อchannels.telegram.capabilities.inlineButtons:off | dm | group | all | allowlist(ค่าเริ่มต้น: allowlist)channels.telegram.accounts.<account>.capabilities.inlineButtons: override ต่อบัญชีchannels.telegram.replyToMode:off | first | all(ค่าเริ่มต้น:first)channels.telegram.textChunkLimit: ขนาดชิ้นขาออก (ตัวอักษร)channels.telegram.chunkMode:length(ค่าเริ่มต้น) หรือnewlineเพื่อแบ่งตามบรรทัดว่าง (ขอบเขตย่อหน้า) ก่อนแบ่งตามความยาวchannels.telegram.linkPreview: สลับการแสดงตัวอย่างลิงก์สำหรับข้อความขาออก (ค่าเริ่มต้น: true)channels.telegram.streamMode:off | partial | block(draft streaming)channels.telegram.mediaMaxMb: ขีดจำกัดสื่อขาเข้า/ขาออก (MB)channels.telegram.retry: นโยบายลองใหม่สำหรับการเรียก Telegram API ขาออก (จำนวนครั้ง, minDelayMs, maxDelayMs, jitter)channels.telegram.network.autoSelectFamily: override Node autoSelectFamily (true=เปิด, false=ปิด) ค่าเริ่มต้นปิดบน Node 22 เพื่อหลีกเลี่ยงเวลาเกิน Happy Eyeballs Defaults to disabled on Node 22 to avoid Happy Eyeballs timeouts.channels.telegram.proxy: URL พร็อกซีสำหรับการเรียก Bot API (SOCKS/HTTP)channels.telegram.webhookUrl: เปิดโหมด webhook (ต้องใช้channels.telegram.webhookSecret)channels.telegram.webhookSecret: webhook secret (จำเป็นเมื่อกำหนด webhookUrl)channels.telegram.webhookPath: พาธ webhook ภายในเครื่อง (ค่าเริ่มต้น/telegram-webhook)channels.telegram.actions.reactions: ควบคุมปฏิกิริยาเครื่องมือ Telegramchannels.telegram.actions.sendMessage: ควบคุมการส่งข้อความเครื่องมือ Telegramchannels.telegram.actions.deleteMessage: ควบคุมการลบข้อความเครื่องมือ Telegramchannels.telegram.actions.sticker: ควบคุมแอ็กชันสติกเกอร์ Telegram — ส่งและค้นหา (ค่าเริ่มต้น: false)channels.telegram.reactionNotifications:off | own | all— ควบคุมว่าปฏิกิริยาใดกระตุ้น system events (ค่าเริ่มต้น:ownเมื่อไม่ตั้งค่า)channels.telegram.reactionLevel:off | ack | minimal | extensive— ควบคุมความสามารถปฏิกิริยาของเอเจนต์ (ค่าเริ่มต้น:minimalเมื่อไม่ตั้งค่า)
ตัวเลือกโกลบอลที่เกี่ยวข้อง:
agents.list[].groupChat.mentionPatterns(แพตเทิร์น mention gating)messages.groupChat.mentionPatterns(fallback โกลบอล)commands.native(ค่าเริ่มต้นเป็น"auto"→ เปิดสำหรับ Telegram/Discord ปิดสำหรับ Slack),commands.text,commands.useAccessGroups(พฤติกรรมคำสั่ง) override ด้วยchannels.telegram.commands.nativeOverride withchannels.telegram.commands.native.messages.responsePrefix,messages.ackReaction,messages.ackReactionScope,messages.removeAckAfterReply