hermes - 💡(How to fix) Fix [i18n] Thai Translation: Messaging Part d - signal, slack, sms, telegram [1 participants]
ON THIS PAGE
Recommended Tools
×6Utilities matched from this issue’s tags and category — try them while you read without losing context.
GitHub issue graph ai analysis
Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.
The report is written in English Markdown for sharing and archival.
Helpful · Quick feedback
Error Message
| "missing_scope" error | เพิ่ม scope ที่จำเป็นใน OAuth & Permissions แล้ว ติดตั้งแอปใหม่ |
4. ค่า thread_id หรือ chat_id ที่ไม่ได้แมปจะถูกละเว้นอย่างเงียบๆ - ไม่มี error, ไม่มี skill
Code Example
# macOS
brew install signal-cli
# Linux (ดาวน์โหลด latest release)
VERSION=$(curl -Ls -o /dev/null -w %{url_effective} \
https://github.com/AsamK/signal-cli/releases/latest | sed 's/^.*\/v//')
curl -L -O "https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz"
sudo tar xf "signal-cli-${VERSION}.tar.gz" -C /opt
sudo ln -sf "/opt/signal-cli-${VERSION}/bin/signal-cli" /usr/local/bin/
---
# สร้าง linking URI (แสดง QR code หรือลิงก์)
signal-cli link -n "HermesAgent"
---
# แทนที่ +1234567890 ด้วยหมายเลขโทรศัพท์ Signal ของคุณ (รูปแบบ E.164)
signal-cli --account +1234567890 daemon --http 127.0.0.1:8080
---
curl http://127.0.0.1:8080/api/v1/check
# ควรคืนค่า: {"versions":{"signal-cli":...}}
---
hermes gateway setup
---
# จำเป็นต้องมี
SIGNAL_HTTP_URL=http://127.0.0.1:8080
SIGNAL_ACCOUNT=+1234567890
# ความปลอดภัย (แนะนำ)
SIGNAL_ALLOWED_USERS=+1234567890,+0987654321 # หมายเลข E.164 หรือ UUID คั่นด้วยเครื่องหมายจุลภาค
# ทางเลือก
SIGNAL_GROUP_ALLOWED_USERS=groupId1,groupId2 # เปิดใช้งานกลุ่ม (เว้นว่างเพื่อปิดใช้งาน, * สำหรับทั้งหมด)
SIGNAL_HOME_CHANNEL=+1234567890 # เป้าหมายการส่งค่าเริ่มต้นสำหรับ cron jobs
---
hermes gateway # Foreground
hermes gateway install # ติดตั้งเป็น user service
sudo hermes gateway install --system # สำหรับ Linux เท่านั้น: system service ที่ทำงานเมื่อบูต
---
# Required
SLACK_BOT_TOKEN=xoxb-your-bot-token-here
SLACK_APP_TOKEN=xapp-your-app-token-here
SLACK_ALLOWED_USERS=U01ABC2DEF3 # Member IDs ที่คั่นด้วยเครื่องหมายจุลภาค
# Optional
SLACK_HOME_CHANNEL=C01234567890 # ช่องเริ่มต้นสำหรับข้อความ cron/scheduled messages
SLACK_HOME_CHANNEL_NAME=general # ชื่อที่อ่านได้สำหรับช่องเริ่มต้น (optional)
---
hermes gateway setup # เลือก Slack เมื่อถูกแจ้ง
---
hermes gateway # สำหรับ foreground
hermes gateway install # ติดตั้งเป็น user service
sudo hermes gateway install --system # สำหรับ Linux เท่านั้น: system service ที่ boot-time
---
/invite @Hermes Agent
---
platforms:
slack:
# ควบคุมว่าการตอบกลับหลายส่วน (multi-part responses) จะถูก thread อย่างไร
# "off" - ไม่เคย thread การตอบกลับไปยังข้อความต้นฉบับ
# "first" - ส่วนแรกจะ thread ไปยังข้อความของผู้ใช้ (ค่าเริ่มต้น)
# "all" - ทุกส่วนจะ thread ไปยังข้อความของผู้ใช้
reply_to_mode: "first"
extra:
# ว่าจะตอบกลับใน thread หรือไม่ (ค่าเริ่มต้น: true).
# เมื่อเป็น false ข้อความในช่องจะได้รับ direct channel replies แทน
# การใช้ thread ข้อความที่อยู่ใน thread ที่มีอยู่ยังคงตอบกลับใน thread
reply_in_thread: true
# ส่ง thread replies ไปยัง main channel ด้วยหรือไม่
# (ฟีเจอร์ "Also send to channel" ของ Slack).
# มีเพียงส่วนแรกของ reply แรกเท่านั้นที่จะถูก broadcast.
reply_broadcast: false
---
# Global setting - ใช้ได้กับ Slack และแพลตฟอร์มอื่นทั้งหมด
group_sessions_per_user: true
---
slack:
# กำหนดให้ต้อง @mention ในช่อง (นี่คือพฤติกรรมเริ่มต้น;
# ตัว adapter ของ Slack บังคับใช้ @mention gating ในช่องโดยไม่คำนึงถึง,
# แต่คุณสามารถตั้งค่าสิ่งนี้อย่างชัดเจนเพื่อให้สอดคล้องกับแพลตฟอร์มอื่น)
require_mention: true
# รูปแบบ mention ที่กำหนดเองที่กระตุ้น bot
# (นอกเหนือจากการตรวจจับ @mention โดยค่าเริ่มต้น)
mention_patterns:
- "hey hermes"
- "hermes,"
# ข้อความที่เติมไว้ด้านหน้าทุกข้อความที่ส่งออก
reply_prefix: ""
---
slack:
# จะเกิดอะไรขึ้นเมื่อผู้ใช้ที่ไม่ได้รับอนุญาต (ไม่ได้อยู่ใน SLACK_ALLOWED_USERS) DM bot
# "pair" - แจ้งให้พวกเขาขอ pairing code (ค่าเริ่มต้น)
# "ignore" - ละทิ้งข้อความอย่างเงียบๆ
unauthorized_dm_behavior: "pair"
---
unauthorized_dm_behavior: "pair"
---
# Global setting - เปิด/ปิดการถอดเสียงอัตโนมัติของข้อความเสียงที่เข้ามา
stt_enabled: true
---
# Global gateway settings
group_sessions_per_user: true
unauthorized_dm_behavior: "pair"
stt_enabled: true
# Slack-specific settings
slack:
require_mention: true
unauthorized_dm_behavior: "pair"
# Platform config
platforms:
slack:
reply_to_mode: "first"
extra:
reply_in_thread: true
reply_broadcast: false
---
SLACK_HOME_CHANNEL=C01234567890
---
# Multiple bot tokens - ตัวละ workspace
SLACK_BOT_TOKEN=xoxb-workspace1-token,xoxb-workspace2-token,xoxb-workspace3-token
# ยังคงใช้ app-level token เดียวสำหรับ Socket Mode
SLACK_APP_TOKEN=xapp-your-app-token
---
platforms:
slack:
token: "xoxb-workspace1-token,xoxb-workspace2-token"
---
~/.hermes/slack_tokens.json
---
{
"T01ABC2DEF3": {
"token": "xoxb-workspace-token-here",
"team_name": "My Workspace"
}
}
---
slack:
channel_prompts:
"C01RESEARCH": |
คุณเป็นผู้ช่วยวิจัย มุ่งเน้นที่แหล่งข้อมูลทางวิชาการ,
การอ้างอิง, และการสังเคราะห์ที่กระชับ
"C02ENGINEERING": |
โหมด Code review ต้องแม่นยำเกี่ยวกับ edge cases และ
ผลกระทบด้านประสิทธิภาพ
---
hermes gateway setup
---
TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWILIO_AUTH_TOKEN=your_auth_token_here
TWILIO_PHONE_NUMBER=+15551234567
# Security: restrict to specific phone numbers (recommended)
SMS_ALLOWED_USERS=+15559876543,+15551112222
# Optional: set a home channel for cron job delivery
SMS_HOME_CHANNEL=+15559876543
---
# Using cloudflared
cloudflared tunnel --url http://localhost:8080
# Using ngrok
ngrok http 8080
---
# Must match the webhook URL in your Twilio Console
SMS_WEBHOOK_URL=https://your-server:8080/webhooks/twilio
---
SMS_WEBHOOK_PORT=3000
---
hermes gateway
---
[sms] Twilio webhook server listening on 0.0.0.0:8080, from: +1555***4567
---
# Local dev only — NOT for production
SMS_INSECURE_NO_SIGNATURE=true
---
# Recommended: restrict to specific phone numbers
SMS_ALLOWED_USERS=+15559876543,+15551112222
# Or allow all (NOT recommended for bots with terminal access)
SMS_ALLOW_ALL_USERS=true
---
SMS_WEBHOOK_PORT=3001
---
123456789:ABCdefGHIjklMNOpqrSTUvwxYZ
---
help - แสดงข้อมูลช่วยเหลือ
new - เริ่มการสนทนาใหม่
sethome - กำหนดแชทนี้เป็น home channel
---
hermes gateway setup
---
TELEGRAM_BOT_TOKEN=123456789:ABCdefGHIjklMNOpqrSTUvwxYZ
TELEGRAM_ALLOWED_USERS=123456789 # คั่นด้วยเครื่องหมายจุลภาคสำหรับผู้ใช้หลายคน
---
hermes gateway
---
terminal:
backend: docker
docker_volumes:
- "/home/user/.hermes/cache/documents:/output"
---
TELEGRAM_WEBHOOK_URL=https://my-app.fly.dev/telegram
# TELEGRAM_WEBHOOK_PORT=8443 # optional, default 8443
# TELEGRAM_WEBHOOK_SECRET=mysecret # optional, recommended
---
fly secrets set TELEGRAM_WEBHOOK_URL=https://my-app.fly.dev/telegram
fly secrets set TELEGRAM_WEBHOOK_SECRET=$(openssl rand -hex 32)
---
[[services]]
internal_port = 8443
protocol = "tcp"
[[services.ports]]
handlers = ["tls", "http"]
port = 443
---
fly deploy
---
telegram:
proxy_url: "socks5://127.0.0.1:1080"
---
TELEGRAM_PROXY=socks5://127.0.0.1:1080
---
TELEGRAM_HOME_CHANNEL=-1001234567890
TELEGRAM_HOME_CHANNEL_NAME="My Notes"
---
# Ubuntu/Debian
sudo apt install ffmpeg
# macOS
brew install ffmpeg
---
telegram:
require_mention: true
mention_patterns:
- "^\\s*chompy\\b"
ignored_threads:
- 31
- "42"
---
platforms:
telegram:
extra:
dm_topics:
- chat_id: 123456789 # User ID ของ Telegram ของคุณ
topics:
- name: General
icon_color: 7322096
- name: Website
icon_color: 9367192
- name: Research
icon_color: 16766590
skill: arxiv # โหลด skill อัตโนมัติในหัวข้อนี้
---
platforms:
telegram:
extra:
group_topics:
- chat_id: -1001234567890 # Supergroup ID
topics:
- name: Engineering
thread_id: 5
skill: software-development
- name: Research
thread_id: 12
skill: arxiv
- name: General
thread_id: 1
# ไม่มี skill — วัตถุประสงค์ทั่วไป
---
# Explicit fallback IPs (comma-separated)
TELEGRAM_FALLBACK_IPS=149.154.167.220,149.154.167.221
---
platforms:
telegram:
extra:
fallback_ips:
- "149.154.167.220"
---
export HTTPS_PROXY=http://proxy.example.com:8080
hermes gateway
---
HTTPS_PROXY=http://proxy.example.com:8080
---
telegram:
reactions: true
---
TELEGRAM_REACTIONS=true
---
telegram:
channel_prompts:
"-1001234567890": |
You are a research assistant. Focus on academic sources,
citations, and concise synthesis.
"42": |
This topic is for creative writing feedback. Be warm and
constructive.RAW_BUFFERClick to expand / collapse
📄 user-guide/messaging/signal.md
sidebar_position: 6 title: "Signal" description: "Set up Hermes Agent as a Signal messenger bot via signal-cli daemon"
การตั้งค่า Signal
Hermes เชื่อมต่อกับ Signal ผ่าน daemon signal-cli ที่ทำงานในโหมด HTTP ตัว adapter จะสตรีมข้อความแบบ real-time ผ่าน SSE (Server-Sent Events) และส่งการตอบกลับผ่าน JSON-RPC
Signal เป็นแอปพลิเคชันส่งข้อความกระแสหลักที่เน้นความเป็นส่วนตัวมากที่สุด - มีการเข้ารหัสแบบ end-to-end เป็นค่าเริ่มต้น, ใช้โปรโตคอลแบบ open-source, และมีการเก็บ metadata น้อยที่สุด ด้วยคุณสมบัตินี้จึงเหมาะสำหรับ workflow ของ agent ที่ต้องการความปลอดภัยสูง
:::info No New Python Dependencies
Signal adapter ใช้ httpx (ซึ่งเป็น dependency หลักของ Hermes อยู่แล้ว) สำหรับการสื่อสารทั้งหมด ไม่จำเป็นต้องติดตั้ง Python packages เพิ่มเติม คุณเพียงแค่ต้องติดตั้ง signal-cli ภายนอกเท่านั้น
:::
ข้อกำหนดเบื้องต้น (Prerequisites)
- signal-cli - Signal client ที่ใช้ Java-based (GitHub)
- Java 17+ runtime - จำเป็นสำหรับ signal-cli
- หมายเลขโทรศัพท์ ที่ติดตั้ง Signal (สำหรับการเชื่อมโยงเป็นอุปกรณ์รอง)
การติดตั้ง signal-cli
# macOS
brew install signal-cli
# Linux (ดาวน์โหลด latest release)
VERSION=$(curl -Ls -o /dev/null -w %{url_effective} \
https://github.com/AsamK/signal-cli/releases/latest | sed 's/^.*\/v//')
curl -L -O "https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz"
sudo tar xf "signal-cli-${VERSION}.tar.gz" -C /opt
sudo ln -sf "/opt/signal-cli-${VERSION}/bin/signal-cli" /usr/local/bin/:::caution signal-cli ไม่ได้ อยู่ใน apt หรือ snap repositories การติดตั้งบน Linux ข้างต้นจะดาวน์โหลดโดยตรงจาก GitHub releases :::
ขั้นตอนที่ 1: เชื่อมโยงบัญชี Signal ของคุณ
Signal-cli ทำงานในลักษณะของ อุปกรณ์ที่เชื่อมโยง (linked device) - คล้ายกับ WhatsApp Web แต่สำหรับ Signal โทรศัพท์ของคุณยังคงเป็นอุปกรณ์หลัก
# สร้าง linking URI (แสดง QR code หรือลิงก์)
signal-cli link -n "HermesAgent"- เปิด Signal บนโทรศัพท์ของคุณ
- ไปที่ Settings → Linked Devices
- แตะ Link New Device
- สแกน QR code หรือป้อน URI
ขั้นตอนที่ 2: เริ่มต้น Daemon ของ signal-cli
# แทนที่ +1234567890 ด้วยหมายเลขโทรศัพท์ Signal ของคุณ (รูปแบบ E.164)
signal-cli --account +1234567890 daemon --http 127.0.0.1:8080:::tip
ให้รันส่วนนี้ไว้ใน background คุณสามารถใช้ systemd, tmux, screen, หรือรันเป็น service ได้
:::
ตรวจสอบว่ากำลังทำงานอยู่หรือไม่:
curl http://127.0.0.1:8080/api/v1/check
# ควรคืนค่า: {"versions":{"signal-cli":...}}ขั้นตอนที่ 3: กำหนดค่า Hermes
วิธีที่ง่ายที่สุด:
hermes gateway setupเลือก Signal จากเมนูแพลตฟอร์ม Wizard จะดำเนินการ:
- ตรวจสอบว่าติดตั้ง signal-cli แล้ว
- แจ้ง URL สำหรับ HTTP (ค่าเริ่มต้น:
http://127.0.0.1:8080) - ทดสอบการเชื่อมต่อกับ daemon
- สอบถามหมายเลขโทรศัพท์บัญชีของคุณ
- กำหนดค่าผู้ใช้ที่อนุญาตและนโยบายการเข้าถึง
การกำหนดค่าด้วยตนเอง (Manual Configuration)
เพิ่มใน ~/.hermes/.env:
# จำเป็นต้องมี
SIGNAL_HTTP_URL=http://127.0.0.1:8080
SIGNAL_ACCOUNT=+1234567890
# ความปลอดภัย (แนะนำ)
SIGNAL_ALLOWED_USERS=+1234567890,+0987654321 # หมายเลข E.164 หรือ UUID คั่นด้วยเครื่องหมายจุลภาค
# ทางเลือก
SIGNAL_GROUP_ALLOWED_USERS=groupId1,groupId2 # เปิดใช้งานกลุ่ม (เว้นว่างเพื่อปิดใช้งาน, * สำหรับทั้งหมด)
SIGNAL_HOME_CHANNEL=+1234567890 # เป้าหมายการส่งค่าเริ่มต้นสำหรับ cron jobsจากนั้นเริ่ม gateway:
hermes gateway # Foreground
hermes gateway install # ติดตั้งเป็น user service
sudo hermes gateway install --system # สำหรับ Linux เท่านั้น: system service ที่ทำงานเมื่อบูตการควบคุมการเข้าถึง (Access Control)
การเข้าถึง DM
การเข้าถึง DM เป็นไปตามรูปแบบเดียวกับแพลตฟอร์ม Hermes อื่นๆ ทั้งหมด:
SIGNAL_ALLOWED_USERSถูกตั้งค่า → เฉพาะผู้ใช้เหล่านั้นเท่านั้นที่สามารถส่งข้อความได้- ไม่ได้ตั้งค่า allowlist → ผู้ใช้ที่ไม่ทราบจะได้รับรหัสจับคู่ DM (อนุมัติผ่าน
hermes pairing approve signal CODE) SIGNAL_ALLOW_ALL_USERS=true→ ใครๆ ก็สามารถส่งข้อความได้ (ควรใช้ด้วยความระมัดระวัง)
การเข้าถึงกลุ่ม (Group Access)
การเข้าถึงกลุ่มถูกควบคุมโดยตัวแปรสภาพแวดล้อม SIGNAL_GROUP_ALLOWED_USERS:
| การกำหนดค่า | พฤติกรรม |
|---|---|
| ไม่ได้ตั้งค่า (ค่าเริ่มต้น) | ข้อความกลุ่มทั้งหมดจะถูกเพิกเฉย บอทจะตอบกลับเฉพาะ DM เท่านั้น |
| ตั้งค่าด้วย group IDs | จะตรวจสอบเฉพาะกลุ่มที่ระบุเท่านั้น (เช่น groupId1,groupId2) |
ตั้งค่าเป็น * | บอทจะตอบกลับในทุกกลุ่มที่ตนเป็นสมาชิก |
คุณสมบัติ (Features)
ไฟล์แนบ (Attachments)
adapter รองรับการส่งและรับสื่อในทั้งสองทิศทาง
ขาเข้า (Incoming) (ผู้ใช้ → agent):
- รูปภาพ - PNG, JPEG, GIF, WebP (ตรวจจับอัตโนมัติผ่าน magic bytes)
- เสียง - MP3, OGG, WAV, M4A (ข้อความเสียงจะถูกถอดเสียงหากมีการตั้งค่า Whisper)
- เอกสาร - PDF, ZIP, และประเภทไฟล์อื่นๆ
ขาออก (Outgoing) (agent → ผู้ใช้):
agent สามารถส่งไฟล์สื่อผ่านแท็ก MEDIA: ในการตอบกลับได้ รองรับวิธีการส่งมอบดังต่อไปนี้:
- รูปภาพ -
send_image_fileส่ง PNG, JPEG, GIF, WebP เป็น Signal attachments แบบ native - เสียง -
send_voiceส่งไฟล์เสียง (OGG, MP3, WAV, M4A, AAC) เป็น attachments - วิดีโอ -
send_videoส่งไฟล์วิดีโอ MP4 - เอกสาร -
send_documentส่งไฟล์ประเภทใดก็ได้ (PDF, ZIP, ฯลฯ)
สื่อขาออกทั้งหมดจะผ่าน Signal's standard attachment API ต่างจากแพลตฟอร์มบางแห่ง Signal ไม่ได้แยกความแตกต่างระหว่างข้อความเสียงกับไฟล์แนบในระดับโปรโตคอล
ขีดจำกัดขนาดไฟล์แนบ: 100 MB (ทั้งสองทิศทาง)
ตัวบ่งชี้การพิมพ์ (Typing Indicators)
บอทจะส่งตัวบ่งชี้การพิมพ์ขณะประมวลผลข้อความ โดยจะรีเฟรชทุก 8 วินาที
การปกปิดหมายเลขโทรศัพท์ (Phone Number Redaction)
หมายเลขโทรศัพท์ทั้งหมดจะถูกปกปิดโดยอัตโนมัติใน log:
+15551234567→+155****4567- สิ่งนี้ใช้ได้ทั้งใน log ของ Hermes gateway และระบบการปกปิดทั่วโลก
หมายเหตุถึงตัวเอง (Note to Self - Single-Number Setup)
หากคุณรัน signal-cli เป็น อุปกรณ์รองที่เชื่อมโยง (linked secondary device) ด้วยหมายเลขโทรศัพท์ของคุณเอง (แทนที่จะเป็นหมายเลขบอทแยก) คุณสามารถโต้ตอบกับ Hermes ผ่านฟีเจอร์ "Note to Self" ของ Signal ได้
เพียงแค่ส่งข้อความถึงตัวคุณเองจากโทรศัพท์ของคุณ - signal-cli จะรับข้อความนั้นและ Hermes จะตอบกลับในบทสนทนาเดียวกัน
วิธีการทำงาน:
- ข้อความ "Note to Self" จะมาถึงในรูปแบบ
syncMessage.sentMessageenvelopes - adapter จะตรวจจับเมื่อข้อความเหล่านี้ถูกส่งถึงบัญชีของบอทเอง และประมวลผลเป็นข้อความขาเข้าปกติ
- การป้องกันการสะท้อนกลับ (echo-back protection) (การติดตาม sent-timestamp) ป้องกันลูปไม่รู้จบ - การตอบกลับของบอทเองจะถูกกรองออกโดยอัตโนมัติ
ไม่ต้องตั้งค่าเพิ่มเติม สิ่งนี้จะทำงานโดยอัตโนมัติตราบใดที่ SIGNAL_ACCOUNT ตรงกับหมายเลขโทรศัพท์ของคุณ
การตรวจสอบสถานะ (Health Monitoring)
adapter จะตรวจสอบการเชื่อมต่อ SSE และจะเชื่อมต่อใหม่โดยอัตโนมัติหาก:
- การเชื่อมต่อหลุด (พร้อม exponential backoff: 2s → 60s)
- ไม่มีการใช้งานเป็นเวลา 120 วินาที (ping signal-cli เพื่อตรวจสอบ)
การแก้ไขปัญหา (Troubleshooting)
| ปัญหา | วิธีแก้ไข |
|---|---|
| "Cannot reach signal-cli" ระหว่างการตั้งค่า | ตรวจสอบให้แน่ใจว่า daemon ของ signal-cli กำลังทำงานอยู่: signal-cli --account +YOUR_NUMBER daemon --http 127.0.0.1:8080 |
| ไม่ได้รับข้อความ | ตรวจสอบว่า SIGNAL_ALLOWED_USERS รวมถึงหมายเลขของผู้ส่งในรูปแบบ E.164 (พร้อม prefix +) |
| "signal-cli not found on PATH" | ติดตั้ง signal-cli และตรวจสอบให้แน่ใจว่าอยู่ใน PATH ของคุณ หรือใช้ Docker |
| การเชื่อมต่อหลุดตลอดเวลา | ตรวจสอบ log ของ signal-cli เพื่อหาข้อผิดพลาด ตรวจสอบให้แน่ใจว่าติดตั้ง Java 17+ แล้ว |
| เพิกเฉยต่อข้อความกลุ่ม | กำหนดค่า SIGNAL_GROUP_ALLOWED_USERS ด้วย group IDs เฉพาะ หรือ * เพื่ออนุญาตทุกกลุ่ม |
| บอทไม่ตอบใครเลย | กำหนดค่า SIGNAL_ALLOWED_USERS, ใช้ DM pairing, หรืออนุญาตผู้ใช้ทั้งหมดอย่างชัดเจนผ่าน gateway policy หากคุณต้องการการเข้าถึงที่กว้างขึ้น |
| ข้อความซ้ำซ้อน | ตรวจสอบให้แน่ใจว่ามี signal-cli instance เพียงตัวเดียวที่กำลังฟังหมายเลขโทรศัพท์ของคุณ |
ความปลอดภัย (Security)
:::warning
ต้องกำหนดค่าการควบคุมการเข้าถึงเสมอ โดยค่าเริ่มต้น บอทมีสิทธิ์เข้าถึง terminal เสมอ หากไม่มี SIGNAL_ALLOWED_USERS หรือ DM pairing gateway จะปฏิเสธข้อความขาเข้าทั้งหมดเพื่อความปลอดภัย
:::
- หมายเลขโทรศัพท์จะถูกปกปิดใน log output ทั้งหมด
- ใช้ DM pairing หรือ allowlist อย่างชัดเจนสำหรับการเริ่มต้นใช้งานผู้ใช้ใหม่ที่ปลอดภัย
- ปิดใช้งานกลุ่ม เว้นแต่คุณต้องการการรองรับกลุ่มโดยเฉพาะ หรือจำกัดเฉพาะกลุ่มที่คุณเชื่อถือเท่านั้น
- การเข้ารหัส end-to-end ของ Signal ปกป้องเนื้อหาข้อความระหว่างการส่ง
- ข้อมูลเซสชัน signal-cli ใน
~/.local/share/signal-cli/มี credentials ของบัญชี - โปรดปกป้องมันเหมือนรหัสผ่าน
อ้างอิงตัวแปรสภาพแวดล้อม (Environment Variables Reference)
| Variable | Required | Default | Description |
|---|---|---|---|
SIGNAL_HTTP_URL | Yes | — | signal-cli HTTP endpoint |
SIGNAL_ACCOUNT | Yes | — | หมายเลขโทรศัพท์ของบอท (E.164) |
SIGNAL_ALLOWED_USERS | No | — | หมายเลขโทรศัพท์/UUID คั่นด้วยเครื่องหมายจุลภาค |
SIGNAL_GROUP_ALLOWED_USERS | No | — | Group IDs ที่จะตรวจสอบ หรือ * สำหรับทั้งหมด (เว้นว่างเพื่อปิดใช้งานกลุ่ม) |
SIGNAL_ALLOW_ALL_USERS | No | false | อนุญาตให้ผู้ใช้ทุกคนโต้ตอบได้ (ข้าม allowlist) |
SIGNAL_HOME_CHANNEL | No | — | เป้าหมายการส่งค่าเริ่มต้นสำหรับ cron jobs |
📄 user-guide/messaging/slack.md
sidebar_position: 4 title: "Slack" description: "Set up Hermes Agent as a Slack bot using Socket Mode"
การตั้งค่า Slack
เชื่อมต่อ Hermes Agent เข้ากับ Slack ในรูปแบบ bot โดยใช้ Socket Mode Socket Mode ใช้ WebSockets แทนการใช้ public HTTP endpoints ดังนั้น instance ของ Hermes ของคุณจึงไม่จำเป็นต้องเข้าถึงได้จากภายนอก (publicly accessible) - มันสามารถทำงานได้เบื้องหลัง firewall, บนแล็ปท็อปของคุณ, หรือบน private server
:::warning Classic Slack Apps Deprecated แอป Slack แบบ Classic (ที่ใช้ RTM API) ถูก ยกเลิกการใช้งานโดยสมบูรณ์แล้วในเดือนมีนาคม 2025 Hermes ใช้ Bolt SDK ที่ทันสมัยพร้อม Socket Mode หากคุณมีแอปแบบ classic เก่า คุณต้องสร้างแอปใหม่โดยทำตามขั้นตอนด้านล่างนี้ :::
ภาพรวม (Overview)
| Component | Value |
|---|---|
| Library | slack-bolt / slack_sdk for Python (Socket Mode) |
| Connection | WebSocket - ไม่จำเป็นต้องใช้ public URL |
| Auth tokens needed | Bot Token (xoxb-) + App-Level Token (xapp-) |
| User identification | Slack Member IDs (เช่น U01ABC2DEF3) |
ขั้นตอนที่ 1: สร้าง Slack App
- ไปที่ https://api.slack.com/apps
- คลิก Create New App
- เลือก From scratch
- ป้อนชื่อแอป (เช่น "Hermes Agent") และเลือก workspace ของคุณ
- คลิก Create App
คุณจะถูกนำไปยังหน้า Basic Information ของแอป
ขั้นตอนที่ 2: กำหนดขอบเขต Bot Token (Configure Bot Token Scopes)
ไปที่ Features → OAuth & Permissions ในแถบด้านข้าง เลื่อนลงไปที่ Scopes → Bot Token Scopes และเพิ่มรายการต่อไปนี้:
| Scope | Purpose |
|---|---|
chat:write | ส่งข้อความในฐานะ bot |
app_mentions:read | ตรวจจับเมื่อถูก @mention ในช่อง (channels) |
channels:history | อ่านข้อความในช่องสาธารณะที่ bot อยู่ |
channels:read | รายชื่อและรับข้อมูลเกี่ยวกับช่องสาธารณะ |
groups:history | อ่านข้อความในช่องส่วนตัวที่ bot ได้รับเชิญให้เข้าร่วม |
im:history | อ่านประวัติข้อความส่วนตัว (direct message) |
im:read | ดูข้อมูล DM พื้นฐาน |
im:write | เปิดและจัดการ DM |
users:read | ค้นหาข้อมูลผู้ใช้ |
files:read | อ่านและดาวน์โหลดไฟล์แนบ รวมถึง voice notes/audio |
files:write | อัปโหลดไฟล์ (รูปภาพ, เสียง, เอกสาร) |
:::caution Missing scopes = missing features
หากไม่มี channels:history และ groups:history bot จะไม่รับข้อความในช่อง (channels) - มันจะทำงานได้เฉพาะใน DM เท่านั้น นี่คือขอบเขตที่มักถูกมองข้ามมากที่สุด
:::
Optional scopes:
| Scope | Purpose |
|---|---|
groups:read | รายชื่อและรับข้อมูลเกี่ยวกับช่องส่วนตัว |
ขั้นตอนที่ 3: เปิดใช้งาน Socket Mode
Socket Mode ช่วยให้ bot สามารถเชื่อมต่อผ่าน WebSocket แทนการต้องใช้ public URL
- ในแถบด้านข้าง ไปที่ Settings → Socket Mode
- เปิด Enable Socket Mode เป็น ON
- คุณจะถูกแจ้งให้สร้าง App-Level Token:
- ตั้งชื่อเป็นอะไรก็ได้ เช่น
hermes-socket(ชื่อไม่สำคัญ) - เพิ่ม scope
connections:write - คลิก Generate
- ตั้งชื่อเป็นอะไรก็ได้ เช่น
- คัดลอก token - มันจะขึ้นต้นด้วย
xapp-นี่คือSLACK_APP_TOKENของคุณ
:::tip คุณสามารถค้นหาหรือสร้าง app-level tokens ใหม่ได้เสมอภายใต้ Settings → Basic Information → App-Level Tokens. :::
ขั้นตอนที่ 4: สมัครรับ Event (Subscribe to Events)
ขั้นตอนนี้สำคัญมาก - เพราะมันควบคุมว่า bot จะเห็นข้อความอะไรได้บ้าง
- ในแถบด้านข้าง ไปที่ Features → Event Subscriptions
- เปิด Enable Events เป็น ON
- ขยาย Subscribe to bot events และเพิ่ม:
| Event | Required? | Purpose |
|---|---|---|
message.im | Yes | Bot รับข้อความส่วนตัว (direct messages) |
message.channels | Yes | Bot รับข้อความในช่อง สาธารณะ ที่ถูกเพิ่มเข้าไป |
message.groups | Recommended | Bot รับข้อความในช่อง ส่วนตัว ที่ได้รับเชิญให้เข้าร่วม |
app_mention | Yes | ป้องกันข้อผิดพลาดของ Bolt SDK เมื่อ bot ถูก @mention |
- คลิก Save Changes ที่ด้านล่างของหน้า
:::danger Missing event subscriptions is the #1 setup issue
หาก bot ทำงานได้ใน DM แต่ ไม่ทำงานในช่อง (channels) คุณเกือบจะแน่ใจว่าลืมเพิ่ม message.channels (สำหรับช่องสาธารณะ) และ/หรือ message.groups (สำหรับช่องส่วนตัว) โดยไม่มี event เหล่านี้ Slack จะไม่ส่งข้อความในช่องมาให้ bot เลย
:::
ขั้นตอนที่ 5: เปิดใช้งานแท็บ Messages (Enable the Messages Tab)
ขั้นตอนนี้เปิดใช้งานการส่งข้อความส่วนตัว (direct messages) ไปยัง bot หากไม่มีขั้นตอนนี้ ผู้ใช้จะเห็นข้อความว่า "Sending messages to this app has been turned off" เมื่อพยายาม DM bot
- ในแถบด้านข้าง ไปที่ Features → App Home
- เลื่อนลงไปที่ Show Tabs
- เปิด Messages Tab เป็น ON
- ติ๊ก "Allow users to send Slash commands and messages from the messages tab"
:::danger Without this step, DMs are completely blocked แม้จะมี scope และ event subscriptions ที่ถูกต้องทั้งหมด แต่ Slack จะไม่อนุญาตให้ผู้ใช้ส่ง direct messages ไปยัง bot เว้นแต่จะเปิดใช้งาน Messages Tab นี่คือข้อกำหนดของแพลตฟอร์ม Slack ไม่ใช่ปัญหาการตั้งค่าของ Hermes :::
ขั้นตอนที่ 6: ติดตั้ง App เข้ากับ Workspace (Install App to Workspace)
- ในแถบด้านข้าง ไปที่ Settings → Install App
- คลิก Install to Workspace
- ตรวจสอบสิทธิ์และคลิก Allow
- หลังจากอนุญาตแล้ว คุณจะเห็น Bot User OAuth Token ที่ขึ้นต้นด้วย
xoxb- - คัดลอก token นี้ - นี่คือ
SLACK_BOT_TOKENของคุณ
:::tip หากคุณเปลี่ยน scopes หรือ event subscriptions ในภายหลัง คุณ ต้องติดตั้งแอปใหม่ เพื่อให้การเปลี่ยนแปลงมีผล หน้า Install App จะแสดงแบนเนอร์แจ้งให้คุณทำเช่นนั้น :::
ขั้นตอนที่ 7: ค้นหา User IDs สำหรับ Allowlist
Hermes ใช้ Member IDs ของ Slack (ไม่ใช่ชื่อผู้ใช้หรือชื่อที่แสดง) สำหรับ allowlist
วิธีค้นหา Member ID:
- ใน Slack คลิกที่ชื่อหรือ avatar ของผู้ใช้
- คลิก View full profile
- คลิกปุ่ม ⋮ (more)
- เลือก Copy member ID
Member IDs มีลักษณะคล้าย U01ABC2DEF3 อย่างน้อยคุณต้องมี Member ID ของตัวเอง
ขั้นตอนที่ 8: กำหนดค่า Hermes
เพิ่มรายการต่อไปนี้ในไฟล์ ~/.hermes/.env ของคุณ:
# Required
SLACK_BOT_TOKEN=xoxb-your-bot-token-here
SLACK_APP_TOKEN=xapp-your-app-token-here
SLACK_ALLOWED_USERS=U01ABC2DEF3 # Member IDs ที่คั่นด้วยเครื่องหมายจุลภาค
# Optional
SLACK_HOME_CHANNEL=C01234567890 # ช่องเริ่มต้นสำหรับข้อความ cron/scheduled messages
SLACK_HOME_CHANNEL_NAME=general # ชื่อที่อ่านได้สำหรับช่องเริ่มต้น (optional)หรือรันการตั้งค่าแบบโต้ตอบ (interactive setup):
hermes gateway setup # เลือก Slack เมื่อถูกแจ้งจากนั้นเริ่ม gateway:
hermes gateway # สำหรับ foreground
hermes gateway install # ติดตั้งเป็น user service
sudo hermes gateway install --system # สำหรับ Linux เท่านั้น: system service ที่ boot-timeขั้นตอนที่ 9: เชิญ Bot เข้าสู่ Channels
หลังจากเริ่ม gateway แล้ว คุณต้อง เชิญ bot เข้าไปยังช่องใดๆ ที่คุณต้องการให้มันตอบ:
/invite @Hermes Agentbot จะ ไม่ เข้าสู่ช่องโดยอัตโนมัติ คุณต้องเชิญมันเข้าสู่แต่ละช่องด้วยตนเอง
วิธีที่ Bot ตอบสนอง (How the Bot Responds)
การทำความเข้าใจว่า Hermes มีพฤติกรรมอย่างไรในบริบทที่แตกต่างกัน:
| Context | Behavior |
|---|---|
| DMs | Bot ตอบสนองต่อทุกข้อความ - ไม่จำเป็นต้อง @mention |
| Channels | Bot จะตอบสนองเมื่อถูก @mention เท่านั้น (เช่น @Hermes Agent what time is it?) ในช่อง (channels) Hermes จะตอบกลับใน thread ที่แนบกับข้อความนั้น |
| Threads | หากคุณ @mention Hermes ภายใน thread ที่มีอยู่ มันจะตอบกลับใน thread นั้น เมื่อ bot มี session ที่ใช้งานอยู่ใน thread แล้ว การตอบกลับครั้งต่อไปใน thread นั้นไม่จำเป็นต้อง @mention - bot จะติดตามบทสนทนาตามธรรมชาติ |
:::tip ในช่อง (channels) ให้ @mention bot เสมอเพื่อเริ่มบทสนทนา เมื่อ bot ทำงานอยู่ใน thread แล้ว คุณสามารถตอบกลับใน thread นั้นได้โดยไม่ต้อง mention นอกเหนือจาก thread ข้อความที่ไม่มี @mention จะถูกละเลยเพื่อป้องกันความวุ่นวายในช่องที่ยุ่งมาก :::
ตัวเลือกการกำหนดค่า (Configuration Options)
นอกเหนือจาก environment variables ที่จำเป็นในขั้นตอนที่ 8 คุณสามารถปรับแต่งพฤติกรรมของ Slack bot ผ่าน ~/.hermes/config.yaml
Thread & Reply Behavior
platforms:
slack:
# ควบคุมว่าการตอบกลับหลายส่วน (multi-part responses) จะถูก thread อย่างไร
# "off" - ไม่เคย thread การตอบกลับไปยังข้อความต้นฉบับ
# "first" - ส่วนแรกจะ thread ไปยังข้อความของผู้ใช้ (ค่าเริ่มต้น)
# "all" - ทุกส่วนจะ thread ไปยังข้อความของผู้ใช้
reply_to_mode: "first"
extra:
# ว่าจะตอบกลับใน thread หรือไม่ (ค่าเริ่มต้น: true).
# เมื่อเป็น false ข้อความในช่องจะได้รับ direct channel replies แทน
# การใช้ thread ข้อความที่อยู่ใน thread ที่มีอยู่ยังคงตอบกลับใน thread
reply_in_thread: true
# ส่ง thread replies ไปยัง main channel ด้วยหรือไม่
# (ฟีเจอร์ "Also send to channel" ของ Slack).
# มีเพียงส่วนแรกของ reply แรกเท่านั้นที่จะถูก broadcast.
reply_broadcast: false| Key | Default | Description |
|---|---|---|
platforms.slack.reply_to_mode | "first" | โหมดการ thread สำหรับข้อความหลายส่วน: "off", "first", หรือ "all" |
platforms.slack.extra.reply_in_thread | true | เมื่อเป็น false ข้อความในช่องจะได้รับ direct replies แทน threads ข้อความที่อยู่ใน thread ที่มีอยู่ยังคงตอบกลับใน-thread |
platforms.slack.extra.reply_broadcast | false | เมื่อเป็น true thread replies จะถูกโพสต์ไปยัง main channel ด้วย มีเพียงส่วนแรกเท่านั้นที่ถูก broadcast |
Session Isolation
# Global setting - ใช้ได้กับ Slack และแพลตฟอร์มอื่นทั้งหมด
group_sessions_per_user: trueเมื่อเป็น true (ค่าเริ่มต้น) ผู้ใช้แต่ละคนในช่องที่แชร์จะได้รับ session การสนทนาที่แยกจากกัน สองคนที่คุยกับ Hermes ใน #general จะมีประวัติและบริบทที่แยกจากกัน
ตั้งค่าเป็น false หากคุณต้องการโหมดทำงานร่วมกันที่ทั้งช่องแชร์ session การสนทนาเดียว โปรดทราบว่านี่หมายความว่าผู้ใช้แชร์การเติบโตของบริบทและค่าใช้จ่าย token และการใช้ /reset ของผู้ใช้คนหนึ่งจะล้าง session สำหรับทุกคน
Mention & Trigger Behavior
slack:
# กำหนดให้ต้อง @mention ในช่อง (นี่คือพฤติกรรมเริ่มต้น;
# ตัว adapter ของ Slack บังคับใช้ @mention gating ในช่องโดยไม่คำนึงถึง,
# แต่คุณสามารถตั้งค่าสิ่งนี้อย่างชัดเจนเพื่อให้สอดคล้องกับแพลตฟอร์มอื่น)
require_mention: true
# รูปแบบ mention ที่กำหนดเองที่กระตุ้น bot
# (นอกเหนือจากการตรวจจับ @mention โดยค่าเริ่มต้น)
mention_patterns:
- "hey hermes"
- "hermes,"
# ข้อความที่เติมไว้ด้านหน้าทุกข้อความที่ส่งออก
reply_prefix: "":::info
Slack รองรับทั้ง patterns: โดยค่าเริ่มต้นต้อง @mention เพื่อเริ่มบทสนทนา แต่คุณสามารถยกเว้นช่องเฉพาะได้ผ่าน SLACK_FREE_RESPONSE_CHANNELS (channel IDs ที่คั่นด้วยเครื่องหมายจุลภาค) หรือ slack.free_response_channels ใน config.yaml เมื่อ bot มี session ที่ใช้งานอยู่ใน thread แล้ว การตอบกลับใน thread ครั้งต่อไปไม่จำเป็นต้อง mention ใน DM bot จะตอบสนองเสมอโดยไม่จำเป็นต้อง mention
:::
Unauthorized User Handling
slack:
# จะเกิดอะไรขึ้นเมื่อผู้ใช้ที่ไม่ได้รับอนุญาต (ไม่ได้อยู่ใน SLACK_ALLOWED_USERS) DM bot
# "pair" - แจ้งให้พวกเขาขอ pairing code (ค่าเริ่มต้น)
# "ignore" - ละทิ้งข้อความอย่างเงียบๆ
unauthorized_dm_behavior: "pair"คุณยังสามารถตั้งค่าสิ่งนี้ได้ทั่วโลกสำหรับทุกแพลตฟอร์ม:
unauthorized_dm_behavior: "pair"การตั้งค่าเฉพาะแพลตฟอร์มภายใต้ slack: จะมีลำดับความสำคัญเหนือการตั้งค่าทั่วโลก
Voice Transcription
# Global setting - เปิด/ปิดการถอดเสียงอัตโนมัติของข้อความเสียงที่เข้ามา
stt_enabled: trueเมื่อเป็น true (ค่าเริ่มต้น) ข้อความเสียงที่เข้ามาจะถูกถอดเสียงโดยอัตโนมัติโดยใช้ STT provider ที่กำหนดค่าไว้ก่อนที่จะถูกประมวลผลโดย agent
Full Example
# Global gateway settings
group_sessions_per_user: true
unauthorized_dm_behavior: "pair"
stt_enabled: true
# Slack-specific settings
slack:
require_mention: true
unauthorized_dm_behavior: "pair"
# Platform config
platforms:
slack:
reply_to_mode: "first"
extra:
reply_in_thread: true
reply_broadcast: falseHome Channel
ตั้งค่า SLACK_HOME_CHANNEL เป็น Channel ID ที่ Hermes จะส่งข้อความที่กำหนดเวลา (scheduled messages), ผลลัพธ์ cron job, และการแจ้งเตือนเชิงรุกอื่นๆ วิธีค้นหา Channel ID:
- คลิกขวาที่ชื่อช่องใน Slack
- คลิก View channel details
- เลื่อนลงไปด้านล่าง - Channel ID จะแสดงอยู่ที่นั่น
SLACK_HOME_CHANNEL=C01234567890ตรวจสอบให้แน่ใจว่า bot ได้รับ เชิญเข้าช่อง (/invite @Hermes Agent) แล้ว
Multi-Workspace Support
Hermes สามารถเชื่อมต่อกับ multiple Slack workspaces ได้พร้อมกันโดยใช้ gateway instance เดียว Workspace แต่ละแห่งจะได้รับการยืนยันตัวตนอย่างอิสระด้วย bot user ID ของตัวเอง
Configuration
ระบุ bot tokens หลายตัวเป็น รายการที่คั่นด้วยเครื่องหมายจุลภาค ใน SLACK_BOT_TOKEN:
# Multiple bot tokens - ตัวละ workspace
SLACK_BOT_TOKEN=xoxb-workspace1-token,xoxb-workspace2-token,xoxb-workspace3-token
# ยังคงใช้ app-level token เดียวสำหรับ Socket Mode
SLACK_APP_TOKEN=xapp-your-app-tokenหรือใน ~/.hermes/config.yaml:
platforms:
slack:
token: "xoxb-workspace1-token,xoxb-workspace2-token"OAuth Token File
นอกเหนือจาก tokens ใน environment หรือ config แล้ว Hermes ยังโหลด tokens จาก OAuth token file ที่:
~/.hermes/slack_tokens.jsonไฟล์นี้เป็น JSON object ที่แมป team IDs กับรายการ token:
{
"T01ABC2DEF3": {
"token": "xoxb-workspace-token-here",
"team_name": "My Workspace"
}
}Tokens จากไฟล์นี้จะถูกรวมกับ tokens ใดๆ ที่ระบุผ่าน SLACK_BOT_TOKEN Tokens ที่ซ้ำกันจะถูกลบออกโดยอัตโนมัติ
How it works
- token แรก ในรายการคือ primary token ซึ่งใช้สำหรับการเชื่อมต่อ Socket Mode (AsyncApp)
- แต่ละ token จะได้รับการยืนยันตัวตนผ่าน
auth.testเมื่อเริ่มต้น gateway จะแมปแต่ละteam_idไปยังWebClientและbot_user_idของตัวเอง - เมื่อมีข้อความเข้ามา Hermes จะใช้ client เฉพาะ workspace ที่ถูกต้องเพื่อตอบกลับ
bot_user_idหลัก (จาก token แรก) ถูกใช้เพื่อความเข้ากันได้กับคุณสมบัติที่คาดหวัง bot identity เดียว
Voice Messages
Hermes รองรับ voice บน Slack:
- Incoming: ข้อความเสียง/audio จะถูกถอดเสียงโดยอัตโนมัติโดยใช้ STT provider ที่กำหนดค่าไว้: local
faster-whisper, Groq Whisper (GROQ_API_KEY), หรือ OpenAI Whisper (VOICE_TOOLS_OPENAI_KEY) - Outgoing: การตอบกลับ TTS จะถูกส่งเป็นไฟล์แนบ audio
Per-Channel Prompts
กำหนด ephemeral system prompts ให้กับ Slack channels เฉพาะ Prompt จะถูกแทรกใน runtime ในทุกรอบ - ไม่เคยถูกบันทึกใน transcript history - ดังนั้นการเปลี่ยนแปลงจึงมีผลทันที
slack:
channel_prompts:
"C01RESEARCH": |
คุณเป็นผู้ช่วยวิจัย มุ่งเน้นที่แหล่งข้อมูลทางวิชาการ,
การอ้างอิง, และการสังเคราะห์ที่กระชับ
"C02ENGINEERING": |
โหมด Code review ต้องแม่นยำเกี่ยวกับ edge cases และ
ผลกระทบด้านประสิทธิภาพKeys คือ Slack channel IDs (ค้นหาได้จาก channel details → "About" → เลื่อนลงไปด้านล่าง) ข้อความทั้งหมดในช่องที่ตรงกันจะได้รับ prompt ที่ถูกแทรกเป็น ephemeral system instruction
Troubleshooting
| Problem | Solution |
|---|---|
| Bot doesn't respond to DMs | ตรวจสอบว่า message.im อยู่ใน event subscriptions ของคุณ และแอปได้รับการติดตั้งใหม่ |
| Bot works in DMs but not in channels | ปัญหาที่พบบ่อยที่สุด เพิ่ม message.channels และ message.groups ใน event subscriptions, ติดตั้งแอปใหม่, และเชิญ bot เข้าช่องด้วย /invite @Hermes Agent |
| Bot doesn't respond to @mentions in channels | 1) ตรวจสอบว่ามีการ subscribe event message.channels 2) Bot ต้องถูกเชิญเข้าช่อง 3) ตรวจสอบให้แน่ใจว่าเพิ่ม scope channels:history แล้ว 4) ติดตั้งแอปใหม่หลังจากเปลี่ยน scope/event |
| Bot ignores messages in private channels | เพิ่ม event subscription message.groups และ scope groups:history จากนั้นติดตั้งแอปใหม่และ /invite bot |
| "Sending messages to this app has been turned off" in DMs | เปิด Messages Tab ใน App Home settings (ดูขั้นตอนที่ 5) |
| "not_authed" หรือ "invalid_auth" errors | สร้าง Bot Token และ App Token ใหม่, อัปเดต .env |
| Bot responds but can't post in a channel | เชิญ bot เข้าช่องด้วย /invite @Hermes Agent |
| "missing_scope" error | เพิ่ม scope ที่จำเป็นใน OAuth & Permissions แล้ว ติดตั้งแอปใหม่ |
| Socket disconnects frequently | ตรวจสอบเครือข่ายของคุณ; Bolt จะ auto-reconnect แต่การเชื่อมต่อที่ไม่เสถียรทำให้เกิดความล่าช้า |
| Changed scopes/events but nothing changed | คุณ ต้องติดตั้งแอปใหม่ เข้ากับ workspace ของคุณหลังจากเปลี่ยน scope หรือ event subscription ใดๆ |
Quick Checklist
หาก bot ไม่ทำงานในช่อง (channels) ให้ตรวจสอบ ทั้งหมด เหล่านี้:
- ✅ event
message.channelsถูก subscribe แล้ว (สำหรับช่องสาธารณะ) - ✅ event
message.groupsถูก subscribe แล้ว (สำหรับช่องส่วนตัว) - ✅ event
app_mentionถูก subscribe แล้ว - ✅ scope
channels:historyถูกเพิ่มแล้ว (สำหรับช่องสาธารณะ) - ✅ scope
groups:historyถูกเพิ่มแล้ว (สำหรับช่องส่วนตัว) - ✅ แอปได้รับการ ติดตั้งใหม่ หลังจากเพิ่ม scopes/events
- ✅ Bot ได้รับ เชิญ เข้าช่องแล้ว (
/invite @Hermes Agent) - ✅ คุณกำลัง @mention bot ในข้อความของคุณ
Security
:::warning
ต้องตั้งค่า SLACK_ALLOWED_USERS เสมอ ด้วย Member IDs ของผู้ใช้ที่ได้รับอนุญาต หากไม่มีการตั้งค่านี้ gateway จะ ปฏิเสธข้อความทั้งหมด โดยค่าเริ่มต้นเพื่อความปลอดภัย ห้ามแชร์ bot tokens ของคุณ - ให้ถือว่ามันเป็นรหัสผ่าน
:::
- Tokens ควรถูกเก็บไว้ใน
~/.hermes/.env(สิทธิ์ไฟล์600) - หมุนเวียน tokens เป็นระยะผ่านการตั้งค่าแอป Slack
- ตรวจสอบว่าใครมีสิทธิ์เข้าถึง directory config ของ Hermes ของคุณ
- Socket Mode หมายความว่าไม่มี public endpoint ถูกเปิดเผย - ลดพื้นที่ผิวการโจมตีลงได้อีกจุด
📄 user-guide/messaging/sms.md
sidebar_position: 8 sidebar_label: "SMS (Twilio)" title: "SMS (Twilio)" description: "Set up Hermes Agent as an SMS chatbot via Twilio"
การตั้งค่า SMS (Twilio)
Hermes เชื่อมต่อกับ SMS ผ่าน Twilio API ผู้คนสามารถส่งข้อความ (text) ไปยังหมายเลขโทรศัพท์ Twilio ของคุณ และรับการตอบกลับจาก AI ได้ ประสบการณ์การสนทนาเหมือนกับ Telegram หรือ Discord แต่ใช้ข้อความธรรมดาแทน
:::info ข้อมูลรับรองที่ใช้ร่วมกัน (Shared Credentials)
เกตเวย์ SMS ใช้ข้อมูลรับรองร่วมกับ telephony skill ที่เป็นทางเลือก หากคุณได้ตั้งค่า Twilio สำหรับการโทรด้วยเสียงหรือ SMS แบบครั้งเดียวแล้ว เกตเวย์จะใช้ TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, และ TWILIO_PHONE_NUMBER ชุดเดียวกัน
:::
ข้อกำหนดเบื้องต้น
- บัญชี Twilio - ลงทะเบียนที่ twilio.com (มี free trial ให้ใช้)
- หมายเลขโทรศัพท์ Twilio ที่รองรับ SMS
- เซิร์ฟเวอร์ที่เข้าถึงได้แบบสาธารณะ - Twilio จะส่ง webhooks ไปยังเซิร์ฟเวอร์ของคุณเมื่อมี SMS เข้ามา
- aiohttp -
pip install 'hermes-agent[sms]'
ขั้นตอนที่ 1: รับข้อมูลรับรอง Twilio ของคุณ
- ไปที่ Twilio Console
- คัดลอก Account SID และ Auth Token ของคุณจากหน้าแดชบอร์ด
- ไปที่ Phone Numbers → Manage → Active Numbers - จดหมายเลขโทรศัพท์ของคุณในรูปแบบ E.164 (เช่น
+15551234567)
ขั้นตอนที่ 2: กำหนดค่า Hermes
การตั้งค่าแบบโต้ตอบ (แนะนำ)
hermes gateway setupเลือก SMS (Twilio) จากรายการแพลตฟอร์ม ตัวช่วย (wizard) จะแจ้งให้คุณป้อนข้อมูลรับรอง
การตั้งค่าแบบแมนนวล
เพิ่มใน ~/.hermes/.env:
TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWILIO_AUTH_TOKEN=your_auth_token_here
TWILIO_PHONE_NUMBER=+15551234567
# Security: restrict to specific phone numbers (recommended)
SMS_ALLOWED_USERS=+15559876543,+15551112222
# Optional: set a home channel for cron job delivery
SMS_HOME_CHANNEL=+15559876543ขั้นตอนที่ 3: กำหนดค่า Twilio Webhook
Twilio จำเป็นต้องรู้ว่าจะส่งข้อความขาเข้าที่ใด ใน Twilio Console:
- ไปที่ Phone Numbers → Manage → Active Numbers
- คลิกที่หมายเลขโทรศัพท์ของคุณ
- ใต้ Messaging → A MESSAGE COMES IN, ให้ตั้งค่า:
- Webhook:
https://your-server:8080/webhooks/twilio - HTTP Method:
POST
- Webhook:
:::tip การเปิดเผย Webhook ของคุณ หากคุณกำลังรัน Hermes ในเครื่อง (locally) ให้ใช้ tunnel เพื่อเปิดเผย webhook:
# Using cloudflared
cloudflared tunnel --url http://localhost:8080
# Using ngrok
ngrok http 8080ตั้งค่า URL สาธารณะที่ได้เป็น Twilio webhook ของคุณ :::
ตั้งค่า SMS_WEBHOOK_URL ให้เป็น URL เดียวกับที่คุณกำหนดค่าใน Twilio สิ่งนี้จำเป็นสำหรับการตรวจสอบลายเซ็น (signature validation) ของ Twilio - adapter จะปฏิเสธที่จะเริ่มทำงานหากไม่มีค่านี้:
# Must match the webhook URL in your Twilio Console
SMS_WEBHOOK_URL=https://your-server:8080/webhooks/twilioพอร์ต webhook จะตั้งค่าเริ่มต้นที่ 8080 หากต้องการเปลี่ยน ให้ใช้:
SMS_WEBHOOK_PORT=3000ขั้นตอนที่ 4: เริ่มต้นใช้งาน Gateway
hermes gatewayคุณควรเห็นข้อความ:
[sms] Twilio webhook server listening on 0.0.0.0:8080, from: +1555***4567หากคุณเห็นข้อความ Refusing to start: SMS_WEBHOOK_URL is required ให้ตั้งค่า SMS_WEBHOOK_URL เป็น URL สาธารณะที่กำหนดค่าใน Twilio Console ของคุณ (ดูขั้นตอนที่ 3)
ส่งข้อความไปยังหมายเลข Twilio ของคุณ - Hermes จะตอบกลับทาง SMS
Environment Variables
| Variable | Required | Description |
|---|---|---|
TWILIO_ACCOUNT_SID | Yes | Twilio Account SID (ขึ้นต้นด้วย AC) |
TWILIO_AUTH_TOKEN | Yes | Twilio Auth Token (ใช้สำหรับการตรวจสอบลายเซ็น webhook ด้วย) |
TWILIO_PHONE_NUMBER | Yes | หมายเลขโทรศัพท์ Twilio ของคุณ (รูปแบบ E.164) |
SMS_WEBHOOK_URL | Yes | Public URL สำหรับการตรวจสอบลายเซ็น Twilio - ต้องตรงกับ webhook URL ใน Twilio Console ของคุณ |
SMS_WEBHOOK_PORT | No | Webhook listener port (ค่าเริ่มต้น: 8080) |
SMS_WEBHOOK_HOST | No | Webhook bind address (ค่าเริ่มต้น: 0.0.0.0) |
SMS_INSECURE_NO_SIGNATURE | No | ตั้งค่าเป็น true เพื่อปิดการตรวจสอบลายเซ็น (สำหรับ local dev เท่านั้น - ไม่ใช้สำหรับ production) |
SMS_ALLOWED_USERS | No | หมายเลขโทรศัพท์ E.164 ที่คั่นด้วยเครื่องหมายจุลภาคที่ได้รับอนุญาตให้แชท |
SMS_ALLOW_ALL_USERS | No | ตั้งค่าเป็น true เพื่ออนุญาตให้ทุกคน (ไม่แนะนำ) |
SMS_HOME_CHANNEL | No | หมายเลขโทรศัพท์สำหรับ cron job / การส่งการแจ้งเตือน |
SMS_HOME_CHANNEL_NAME | No | ชื่อที่แสดงสำหรับ home channel (ค่าเริ่มต้น: Home) |
พฤติกรรมเฉพาะ SMS
- Plain text only - Markdown จะถูกลบโดยอัตโนมัติเนื่องจาก SMS แสดงผลเป็นตัวอักษรตามตัวอักษร
- 1600 character limit - การตอบกลับที่ยาวกว่าจะถูกแบ่งออกเป็นหลายข้อความที่ขอบเขตตามธรรมชาติ (ขึ้นบรรทัดใหม่, จากนั้นเว้นวรรค)
- Echo prevention - ข้อความจากหมายเลข Twilio ของคุณเองจะถูกเพิกเฉยเพื่อป้องกันการวนซ้ำ (loops)
- Phone number redaction - หมายเลขโทรศัพท์จะถูกลบ (redacted) ใน logs เพื่อความเป็นส่วนตัว
ความปลอดภัย
การตรวจสอบลายเซ็น Webhook
Hermes จะตรวจสอบว่า webhook ที่เข้ามามีต้นทางมาจาก Twilio จริงหรือไม่ โดยการตรวจสอบ header X-Twilio-Signature (HMAC-SHA1) สิ่งนี้ป้องกันไม่ให้ผู้โจมตีแทรกข้อความปลอมได้
SMS_WEBHOOK_URL เป็นสิ่งที่จำเป็น ต้องตั้งค่าให้เป็น URL สาธารณะที่กำหนดค่าใน Twilio Console ของคุณ adapter จะปฏิเสธที่จะเริ่มทำงานหากไม่มีค่านี้
สำหรับการพัฒนาในเครื่อง (local development) โดยไม่มี URL สาธารณะ คุณสามารถปิดการตรวจสอบได้:
# Local dev only — NOT for production
SMS_INSECURE_NO_SIGNATURE=trueรายชื่อผู้ใช้ที่อนุญาต (User allowlists)
โดยค่าเริ่มต้น gateway จะปฏิเสธผู้ใช้ทุกคน ให้กำหนดค่า allowlist:
# Recommended: restrict to specific phone numbers
SMS_ALLOWED_USERS=+15559876543,+15551112222
# Or allow all (NOT recommended for bots with terminal access)
SMS_ALLOW_ALL_USERS=true:::warning SMS ไม่มีระบบการเข้ารหัสในตัว (built-in encryption) อย่าใช้ SMS สำหรับการดำเนินการที่ละเอียดอ่อน เว้นแต่คุณจะเข้าใจถึงผลกระทบด้านความปลอดภัย สำหรับกรณีการใช้งานที่ละเอียดอ่อน ให้เลือกใช้ Signal หรือ Telegram :::
การแก้ไขปัญหา (Troubleshooting)
ข้อความไม่มาถึง
- ตรวจสอบว่า Twilio webhook URL ของคุณถูกต้องและสามารถเข้าถึงได้แบบสาธารณะ
- ตรวจสอบว่า
TWILIO_ACCOUNT_SIDและTWILIO_AUTH_TOKENถูกต้อง - ตรวจสอบ Twilio Console → Monitor → Logs → Messaging เพื่อดูข้อผิดพลาดในการส่ง
- ตรวจสอบให้แน่ใจว่าหมายเลขโทรศัพท์ของคุณอยู่ใน
SMS_ALLOWED_USERS(หรือSMS_ALLOW_ALL_USERS=true)
การตอบกลับไม่ถูกส่ง
- ตรวจสอบว่า
TWILIO_PHONE_NUMBERถูกตั้งค่าอย่างถูกต้อง (รูปแบบ E.164 พร้อมเครื่องหมาย+) - ตรวจสอบว่าบัญชี Twilio ของคุณมีหมายเลขที่รองรับ SMS
- ตรวจสอบ logs ของ Hermes gateway สำหรับข้อผิดพลาดของ Twilio API
Webhook port conflicts
หากพอร์ต 8080 ถูกใช้งานอยู่แล้ว ให้เปลี่ยนพอร์ต:
SMS_WEBHOOK_PORT=3001อัปเดต webhook URL ใน Twilio Console ให้ตรงกัน
📄 user-guide/messaging/telegram.md
sidebar_position: 1 title: "Telegram" description: "Set up Hermes Agent as a Telegram bot"
การตั้งค่า Telegram
Hermes Agent ทำงานร่วมกับ Telegram ในรูปแบบของ conversational bot ที่มีฟีเจอร์ครบครัน เมื่อเชื่อมต่อแล้ว คุณสามารถแชทกับ agent ของคุณได้จากทุกอุปกรณ์ ส่ง voice memos ที่จะถูก auto-transcribe, รับผลลัพธ์ของ scheduled task, และใช้ agent ใน group chats การเชื่อมต่อนี้สร้างขึ้นบน python-telegram-bot และรองรับ text, voice, images, และ file attachments
ขั้นตอนที่ 1: สร้าง Bot ผ่าน BotFather
บอท Telegram ทุกตัวจำเป็นต้องมี API token ที่ออกโดย @BotFather ซึ่งเป็นเครื่องมือจัดการบอทอย่างเป็นทางการของ Telegram
- เปิด Telegram และค้นหา @BotFather หรือเยี่ยมชม t.me/BotFather
- ส่ง
/newbot - เลือก display name (เช่น "Hermes Agent") - ส่วนนี้สามารถเป็นอะไรก็ได้
- เลือก username - ส่วนนี้ต้องเป็นเอกลักษณ์และต้องลงท้ายด้วย
bot(เช่นmy_hermes_bot) - BotFather จะตอบกลับด้วย API token ของคุณ ซึ่งมีลักษณะดังนี้:
123456789:ABCdefGHIjklMNOpqrSTUvwxYZ:::warning
เก็บ bot token ของคุณเป็นความลับ ใครก็ตามที่มี token นี้สามารถควบคุมบอทของคุณได้ หากมีการรั่วไหล ให้ยกเลิกทันทีผ่าน /revoke ใน BotFather
:::
ขั้นตอนที่ 2: ปรับแต่ง Bot ของคุณ (ทางเลือก)
คำสั่งเหล่านี้ของ BotFather ช่วยปรับปรุงประสบการณ์ผู้ใช้ คุณสามารถส่งข้อความถึง @BotFather และใช้คำสั่งเหล่านี้:
| Command | Purpose |
|---|---|
/setdescription | ข้อความ "บอทนี้ทำอะไรได้บ้าง?" ที่แสดงก่อนที่ผู้ใช้จะเริ่มแชท |
/setabouttext | ข้อความสั้นๆ บนหน้าโปรไฟล์ของบอท |
/setuserpic | อัปโหลดรูปโปรไฟล์สำหรับบอทของคุณ |
/setcommands | กำหนดเมนูคำสั่ง (ปุ่ม / ในแชท) |
/setprivacy | ควบคุมว่าบอทจะเห็นข้อความทั้งหมดในกลุ่มหรือไม่ (ดูขั้นตอนที่ 3) |
:::tip
สำหรับ /setcommands ชุดคำสั่งเริ่มต้นที่เป็นประโยชน์:
help - แสดงข้อมูลช่วยเหลือ
new - เริ่มการสนทนาใหม่
sethome - กำหนดแชทนี้เป็น home channel:::
ขั้นตอนที่ 3: โหมดความเป็นส่วนตัว (สำคัญสำหรับกลุ่ม)
บอท Telegram มี โหมดความเป็นส่วนตัว (privacy mode) ซึ่ง เปิดใช้งานโดยค่าเริ่มต้น นี่คือสาเหตุที่พบบ่อยที่สุดของความสับสนเมื่อใช้บอทในกลุ่ม
เมื่อโหมดความเป็นส่วนตัวเปิดอยู่ (ON) บอทของคุณจะเห็นได้เฉพาะ:
- ข้อความที่ขึ้นต้นด้วยคำสั่ง
/ - การตอบกลับโดยตรงไปยังข้อความของบอทเอง
- ข้อความบริการ (สมาชิกเข้าร่วม/ออกจากกลุ่ม, ข้อความปักหมุด, ฯลฯ)
- ข้อความในช่อง (channels) ที่บอทเป็นผู้ดูแล (admin)
เมื่อโหมดความเป็นส่วนตัวปิดอยู่ (OFF) บอทจะได้รับทุกข้อความในกลุ่ม
วิธีปิดโหมดความเป็นส่วนตัว
- ส่งข้อความถึง @BotFather
- ส่ง
/mybots - เลือกบอทของคุณ
- ไปที่ Bot Settings → Group Privacy → Turn off
:::warning คุณต้องลบและเพิ่มบอทกลับเข้าไปในกลุ่มใหม่ หลังจากเปลี่ยนการตั้งค่าความเป็นส่วนตัว Telegram จะแคชสถานะความเป็นส่วนตัวเมื่อบอทเข้าร่วมกลุ่ม และจะไม่อัปเดตจนกว่าบอทจะถูกลบและเพิ่มกลับเข้าไปใหม่ :::
:::tip ทางเลือกในการปิดโหมดความเป็นส่วนตัว: เลื่อนสถานะบอทเป็น group admin บอทที่เป็น admin จะได้รับทุกข้อความเสมอ ไม่ว่าการตั้งค่าความเป็นส่วนตัวจะเป็นอย่างไร และวิธีนี้ช่วยให้คุณไม่ต้องสลับโหมดความเป็นส่วนตัวทั่วโลก :::
ขั้นตอนที่ 4: ค้นหา User ID ของคุณ
Hermes Agent ใช้ Telegram user IDs แบบตัวเลขเพื่อควบคุมการเข้าถึง User ID ของคุณ ไม่ใช่ username ของคุณ - มันเป็นตัวเลขเช่น 123456789
วิธีที่ 1 (แนะนำ): ส่งข้อความถึง @userinfobot - บอทจะตอบกลับด้วย user ID ของคุณทันที
วิธีที่ 2: ส่งข้อความถึง @get_id_bot - เป็นอีกทางเลือกที่เชื่อถือได้
บันทึกตัวเลขนี้ไว้ คุณจะต้องใช้มันสำหรับขั้นตอนต่อไป
ขั้นตอนที่ 5: กำหนดค่า Hermes
Option A: การตั้งค่าแบบโต้ตอบ (แนะนำ)
hermes gateway setupเมื่อระบบแจ้งให้เลือก ให้เลือก Telegram ตัวช่วย (wizard) จะขอ bot token และ user IDs ที่อนุญาต จากนั้นจะเขียนการตั้งค่าให้คุณ
Option B: การตั้งค่าด้วยตนเอง
เพิ่มสิ่งต่อไปนี้ใน ~/.hermes/.env:
TELEGRAM_BOT_TOKEN=123456789:ABCdefGHIjklMNOpqrSTUvwxYZ
TELEGRAM_ALLOWED_USERS=123456789 # คั่นด้วยเครื่องหมายจุลภาคสำหรับผู้ใช้หลายคนเริ่มต้น Gateway
hermes gatewayบอทควรจะออนไลน์ภายในไม่กี่วินาที ส่งข้อความถึงบอทบน Telegram เพื่อตรวจสอบ
การส่งไฟล์ที่สร้างขึ้นจาก Terminals ที่ใช้ Docker-backed
หาก backend terminal ของคุณคือ docker โปรดทราบว่าไฟล์แนบของ Telegram จะถูกส่งโดย gateway process ไม่ใช่จากภายใน container นั่นหมายความว่า path สุดท้าย MEDIA:/... จะต้องสามารถอ่านได้บน host ที่ gateway กำลังทำงานอยู่
ข้อผิดพลาดที่พบบ่อย:
- agent เขียนไฟล์ภายใน Docker ไปที่
/workspace/report.txt - model ปล่อย
MEDIA:/workspace/report.txt - การส่งมอบของ Telegram ล้มเหลวเนื่องจาก
/workspace/report.txtมีอยู่ภายใน container เท่านั้น ไม่ได้อยู่บน host
รูปแบบที่แนะนำ:
terminal:
backend: docker
docker_volumes:
- "/home/user/.hermes/cache/documents:/output"จากนั้น:
- เขียนไฟล์ภายใน Docker ไปที่
/output/... - ปล่อย path ที่ มองเห็นได้จาก host ใน
MEDIA:, ตัวอย่างเช่น:MEDIA:/home/user/.hermes/cache/documents/report.txt
หากคุณมีส่วน docker_volumes: อยู่แล้ว ให้เพิ่ม mount ใหม่ในรายการเดียวกัน YAML duplicate keys จะเขียนทับค่าก่อนหน้าโดยไม่แจ้งเตือน
Webhook Mode
โดยค่าเริ่มต้น Hermes เชื่อมต่อกับ Telegram โดยใช้ long polling - gateway จะทำการร้องขอขาออกไปยังเซิร์ฟเวอร์ของ Telegram เพื่อดึงข้อมูลอัปเดตใหม่ วิธีนี้ทำงานได้ดีสำหรับการติดตั้งแบบ local และ always-on
สำหรับ cloud deployments (Fly.io, Railway, Render, ฯลฯ) webhook mode จะมีประสิทธิภาพด้านต้นทุนมากกว่า แพลตฟอร์มเหล่านี้สามารถปลุกเครื่องที่หยุดทำงานด้วยตนเองได้เมื่อมี inbound HTTP traffic แต่ไม่สามารถทำได้สำหรับการเชื่อมต่อขาออก เนื่องจาก polling เป็นขาออก บอทที่ใช้ polling จึงไม่สามารถเข้าสู่โหมด sleep ได้เลย Webhook mode จะเปลี่ยนทิศทาง - Telegram จะผลักดันการอัปเดตไปยัง HTTPS URL ของบอทของคุณ ทำให้สามารถใช้งานแบบ sleep-when-idle ได้
| Polling (default) | Webhook | |
|---|---|---|
| Direction | Gateway → Telegram (outbound) | Telegram → Gateway (inbound) |
| Best for | Local, always-on servers | Cloud platforms with auto-wake |
| Setup | No extra config | Set TELEGRAM_WEBHOOK_URL |
| Idle cost | Machine must stay running | Machine can sleep between messages |
การตั้งค่า
เพิ่มสิ่งต่อไปนี้ใน ~/.hermes/.env:
TELEGRAM_WEBHOOK_URL=https://my-app.fly.dev/telegram
# TELEGRAM_WEBHOOK_PORT=8443 # optional, default 8443
# TELEGRAM_WEBHOOK_SECRET=mysecret # optional, recommended| Variable | Required | Description |
|---|---|---|
TELEGRAM_WEBHOOK_URL | Yes | Public HTTPS URL ที่ Telegram จะส่งการอัปเดตมา URL path จะถูกดึงโดยอัตโนมัติ (เช่น /telegram จากตัวอย่างข้างต้น) |
TELEGRAM_WEBHOOK_PORT | No | Local port ที่ webhook server ฟัง (ค่าเริ่มต้น: 8443) |
TELEGRAM_WEBHOOK_SECRET | No | Secret token สำหรับการตรวจสอบว่าการอัปเดตมาจาก Telegram จริง แนะนำอย่างยิ่ง สำหรับ production deployments |
เมื่อตั้งค่า TELEGRAM_WEBHOOK_URL แล้ว gateway จะเริ่ม webhook server แบบ HTTP แทนการ polling เมื่อไม่ได้ตั้งค่า จะใช้โหมด polling - ไม่มีพฤติกรรมเปลี่ยนแปลงจากเวอร์ชันก่อนหน้า
ตัวอย่างการติดตั้งบน Cloud (Fly.io)
- เพิ่ม env vars ไปยัง Fly.io app secrets ของคุณ:
fly secrets set TELEGRAM_WEBHOOK_URL=https://my-app.fly.dev/telegram
fly secrets set TELEGRAM_WEBHOOK_SECRET=$(openssl rand -hex 32)- เปิดเผย webhook port ใน
fly.tomlของคุณ:
[[services]]
internal_port = 8443
protocol = "tcp"
[[services.ports]]
handlers = ["tls", "http"]
port = 443- Deploy:
fly deploylog ของ gateway ควรแสดง: [telegram] Connected to Telegram (webhook mode)
Proxy Support
หาก API ของ Telegram ถูกบล็อก หรือคุณต้องการส่งทราฟฟิกผ่าน proxy ให้ตั้งค่า proxy URL เฉพาะสำหรับ Telegram สิ่งนี้จะมีความสำคัญกว่า env vars ทั่วไปอย่าง HTTPS_PROXY / HTTP_PROXY
Option 1: config.yaml (แนะนำ)
telegram:
proxy_url: "socks5://127.0.0.1:1080"Option 2: environment variable
TELEGRAM_PROXY=socks5://127.0.0.1:1080Scheme ที่รองรับ: http://, https://, socks5://
Proxy จะใช้ได้กับทั้งการเชื่อมต่อ Telegram หลักและการขนส่ง IP fallback หากไม่ได้ตั้งค่า proxy เฉพาะสำหรับ Telegram, gateway จะใช้ HTTPS_PROXY / HTTP_PROXY / ALL_PROXY (หรือการตรวจจับ proxy อัตโนมัติของระบบ macOS)
Home Channel
ใช้คำสั่ง /sethome ในแชท Telegram ใดๆ (DM หรือกลุ่ม) เพื่อกำหนดให้เป็น home channel scheduled tasks (cron jobs) จะส่งผลลัพธ์ไปยังช่องนี้
คุณยังสามารถตั้งค่าด้วยตนเองใน ~/.hermes/.env:
TELEGRAM_HOME_CHANNEL=-1001234567890
TELEGRAM_HOME_CHANNEL_NAME="My Notes":::tip
Group chat IDs เป็นตัวเลขติดลบ (เช่น -1001234567890) ส่วนแชท DM ส่วนตัวของคุณมี ID เดียวกับ user ID ของคุณ
:::
Voice Messages
Incoming Voice (Speech-to-Text)
ข้อความเสียงที่คุณส่งบน Telegram จะถูก transcriber โดย STT provider ที่กำหนดค่าไว้ของ Hermes และถูกแทรกเป็นข้อความในบทสนทนา
localใช้faster-whisperบนเครื่องที่รัน Hermes - ไม่ต้องใช้ API keygroqใช้ Groq Whisper และต้องใช้GROQ_API_KEYopenaiใช้ OpenAI Whisper และต้องใช้VOICE_TOOLS_OPENAI_KEY
Outgoing Voice (Text-to-Speech)
เมื่อ agent สร้างเสียงผ่าน TTS จะถูกส่งเป็น voice bubbles ของ Telegram แบบ native - คือแบบวงกลมที่เล่นได้ในบรรทัดเดียว
- OpenAI และ ElevenLabs สร้าง Opus แบบ native - ไม่ต้องตั้งค่าเพิ่มเติม
- Edge TTS (provider ฟรีค่าเริ่มต้น) ส่งออก MP3 และต้องใช้ ffmpeg เพื่อแปลงเป็น Opus:
# Ubuntu/Debian
sudo apt install ffmpeg
# macOS
brew install ffmpegหากไม่มี ffmpeg เสียงจาก Edge TTS จะถูกส่งเป็นไฟล์เสียงปกติ (ยังเล่นได้ แต่ใช้ player รูปสี่เหลี่ยมแทน voice bubble)
กำหนดค่า TTS provider ใน config.yaml ภายใต้คีย์ tts.provider
Group Chat Usage
Hermes Agent ทำงานใน group chats ของ Telegram โดยมีข้อควรพิจารณาเล็กน้อย:
- Privacy mode กำหนดว่าบอทสามารถเห็นข้อความใดได้ (ดู Step 3)
TELEGRAM_ALLOWED_USERSยังคงใช้ได้ — เฉพาะผู้ใช้ที่ได้รับอนุญาตเท่านั้นที่สามารถกระตุ้นบอทได้ แม้ในกลุ่ม- คุณสามารถป้องกันไม่ให้บอทตอบสนองต่อการพูดคุยทั่วไปในกลุ่มได้ด้วย
telegram.require_mention: true - เมื่อใช้
telegram.require_mention: true, ข้อความในกลุ่มจะถูกยอมรับเมื่อ:- เป็น slash commands
- การตอบกลับไปยังข้อความของบอท
- การกล่าวถึง
@botusername - ตรงกับ regex wake words ที่คุณกำหนดไว้ใน
telegram.mention_patterns
- ใช้
telegram.ignored_threadsเพื่อให้ Hermes เงียบในหัวข้อฟอรัม (forum topics) เฉพาะของ Telegram แม้ว่ากลุ่มจะอนุญาตให้ตอบกลับได้อิสระหรือตอบกลับจากการกล่าวถึงก็ตาม - หาก
telegram.require_mentionไม่ได้ถูกตั้งค่าหรือเป็น false, Hermes จะคงพฤติกรรม open-group เดิมและตอบสนองต่อข้อความกลุ่มปกติที่มันมองเห็น
ตัวอย่างการกำหนดค่าการกระตุ้นในกลุ่ม
เพิ่มสิ่งนี้ใน ~/.hermes/config.yaml:
telegram:
require_mention: true
mention_patterns:
- "^\\s*chompy\\b"
ignored_threads:
- 31
- "42"ตัวอย่างนี้อนุญาตให้มีการกระตุ้นแบบตรงตามปกติทั้งหมด รวมถึงข้อความที่ขึ้นต้นด้วย chompy แม้ว่าข้อความนั้นจะไม่ได้ใช้ @mention ก็ตาม ข้อความในหัวข้อ Telegram 31 และ 42 จะถูกละเว้นเสมอก่อนที่การตรวจสอบ mention และ free-response จะทำงาน
หมายเหตุเกี่ยวกับ mention_patterns
- Patterns ใช้ Python regular expressions
- การจับคู่ไม่คำนึงถึงตัวพิมพ์เล็ก-ใหญ่ (case-insensitive)
- Patterns จะถูกตรวจสอบกับทั้งข้อความและคำบรรยายของสื่อ (media captions)
- รูปแบบ regex ที่ไม่ถูกต้องจะถูกละเว้นพร้อมคำเตือนใน gateway logs แทนที่จะทำให้บอทล่ม
- หากคุณต้องการให้ pattern จับคู่เฉพาะตอนต้นของข้อความ ให้ใช้
^เป็นตัวยึด (anchor)
Private Chat Topics (Bot API 9.4)
Telegram Bot API 9.4 (กุมภาพันธ์ 2026) ได้แนะนำ Private Chat Topics - บอทสามารถสร้างหัวข้อแบบฟอรัม (forum-style topic threads) ได้โดยตรงในแชท DM แบบ 1-on-1 ไม่จำเป็นต้องเป็น supergroup สิ่งนี้ช่วยให้คุณสามารถรัน workspace ที่แยกกันหลายส่วนภายใน DM ที่มีอยู่กับ Hermes
Use case
หากคุณทำงานในหลายโปรเจกต์ที่ต้องใช้เวลานาน หัวข้อจะรักษาบริบทของตัวเอง:
- Topic "Website" - ทำงานกับบริการเว็บ production ของคุณ
- Topic "Research" - ทบทวนวรรณกรรมและการสำรวจเอกสาร
- Topic "General" - งานทั่วไปและคำถามสั้นๆ
แต่ละหัวข้อจะได้รับ session, history, และ context ของตัวเอง - แยกออกจากส่วนอื่นโดยสมบูรณ์
Configuration
:::caution Prerequisites ก่อนเพิ่มหัวข้อใน config, ผู้ใช้ต้อง เปิดใช้งาน Topics mode ในแชท DM กับบอท:
- เปิดแชทส่วนตัวของคุณกับบอท Hermes ใน Telegram
- แตะที่ชื่อบอทด้านบนเพื่อเปิดข้อมูลแชท
- เปิดใช้งาน Topics (สวิตช์เพื่อเปลี่ยนแชทให้เป็นฟอรัม)
หากไม่ทำเช่นนี้ Hermes จะบันทึก The chat is not a forum เมื่อเริ่มต้น และข้ามการสร้างหัวข้อ นี่คือการตั้งค่าฝั่ง client ของ Telegram - บอทไม่สามารถเปิดใช้งานได้ด้วยโปรแกรม
เพิ่มหัวข้อภายใต้ platforms.telegram.extra.dm_topics ใน ~/.hermes/config.yaml:
platforms:
telegram:
extra:
dm_topics:
- chat_id: 123456789 # User ID ของ Telegram ของคุณ
topics:
- name: General
icon_color: 7322096
- name: Website
icon_color: 9367192
- name: Research
icon_color: 16766590
skill: arxiv # โหลด skill อัตโนมัติในหัวข้อนี้Fields:
| Field | Required | Description |
|---|---|---|
name | Yes | ชื่อที่แสดงของหัวข้อ |
icon_color | No | รหัสสีไอคอน Telegram (integer) |
icon_custom_emoji_id | No | Custom emoji ID สำหรับไอคอนหัวข้อ |
skill | No | Skill ที่จะโหลดอัตโนมัติใน session ใหม่ในหัวข้อนี้ |
thread_id | No | ถูกเติมโดยอัตโนมัติหลังการสร้างหัวข้อ - ห้ามตั้งค่าด้วยตนเอง |
How it works
- เมื่อ gateway เริ่มต้น, Hermes จะเรียกใช้
createForumTopicสำหรับแต่ละหัวข้อที่ยังไม่มีthread_id thread_idจะถูกบันทึกกลับไปยังconfig.yamlโดยอัตโนมัติ - การรีสตาร์ทครั้งต่อไปจะข้าม API call นี้- แต่ละหัวข้อจะแมปกับ session key ที่แยกกัน:
agent:main:telegram:dm:{chat_id}:{thread_id} - ข้อความในแต่ละหัวข้อมี history, memory flush, และ context ของตัวเอง
Skill binding
หัวข้อที่มีฟิลด์ skill จะโหลด skill นั้นโดยอัตโนมัติเมื่อเริ่ม session ใหม่ในหัวข้อนี้ วิธีนี้ทำงานเหมือนกับการพิมพ์ /skill-name ตั้งแต่ต้นการสนทนา - เนื้อหาของ skill จะถูกแทรกในข้อความแรก และข้อความถัดไปจะเห็นมันใน history ของการสนทนา
ตัวอย่างเช่น หัวข้อที่มี skill: arxiv จะมี arxiv skill โหลดไว้ล่วงหน้าทุกครั้งที่ session ของมันรีเซ็ต (เนื่องจาก idle timeout, daily reset, หรือ /reset ด้วยตนเอง)
:::tip
หัวข้อที่สร้างภายนอก config (เช่น การเรียก Telegram API ด้วยตนเอง) จะถูกค้นพบโดยอัตโนมัติเมื่อมี service message forum_topic_created เข้ามา คุณยังสามารถเพิ่มหัวข้อใน config ขณะที่ gateway กำลังทำงานอยู่ - มันจะถูกรับใน cache miss ครั้งถัดไป
:::
Group Forum Topic Skill Binding
Supergroups ที่เปิดใช้งาน Topics mode (หรือที่เรียกว่า "forum topics") มีการแยก session ต่อหัวข้ออยู่แล้ว - แต่คุณอาจต้องการ auto-load a skill เมื่อมีข้อความเข้ามาในหัวข้อกลุ่มเฉพาะ เหมือนกับที่การผูก skill ของหัวข้อ DM ทำงาน
Use case
Supergroup ของทีมที่มีหัวข้อฟอรัมสำหรับสายงานที่แตกต่างกัน:
- หัวข้อ Engineering → โหลด
software-developmentskill อัตโนมัติ - หัวข้อ Research → โหลด
arxivskill อัตโนมัติ - หัวข้อ General → ไม่มี skill, ผู้ช่วยทั่วไป
Configuration
เพิ่ม topic bindings ภายใต้ platforms.telegram.extra.group_topics ใน ~/.hermes/config.yaml:
platforms:
telegram:
extra:
group_topics:
- chat_id: -1001234567890 # Supergroup ID
topics:
- name: Engineering
thread_id: 5
skill: software-development
- name: Research
thread_id: 12
skill: arxiv
- name: General
thread_id: 1
# ไม่มี skill — วัตถุประสงค์ทั่วไปFields:
| Field | Required | Description |
|---|---|---|
chat_id | Yes | ID ตัวเลขของ supergroup (ตัวเลขติดลบที่ขึ้นต้นด้วย -100) |
name | No | ป้ายชื่อที่อ่านได้โดยมนุษย์สำหรับหัวข้อ (ข้อมูลเท่านั้น) |
thread_id | Yes | ID หัวข้อฟอรัมของ Telegram - แสดงในลิงก์ t.me/c/<group_id>/<thread_id> |
skill | No | Skill ที่จะโหลดอัตโนมัติใน session ใหม่ในหัวข้อนี้ |
How it works
- เมื่อมีข้อความเข้ามาใน group topic ที่แมปไว้, Hermes จะค้นหา
chat_idและthread_idในgroup_topicsconfig - หากรายการที่ตรงกันมีฟิลด์
skill, skill นั้นจะถูกโหลดอัตโนมัติสำหรับ session - เหมือนกับการผูก skill ของหัวข้อ DM - หัวข้อที่ไม่มีคีย์
skillจะมีการแยก session เท่านั้น (พฤติกรรมเดิม, ไม่เปลี่ยนแปลง) - ค่า
thread_idหรือchat_idที่ไม่ได้แมปจะถูกละเว้นอย่างเงียบๆ - ไม่มี error, ไม่มี skill
Differences from DM Topics
| DM Topics | Group Topics | |
|---|---|---|
| Config key | extra.dm_topics | extra.group_topics |
| Topic creation | Hermes สร้างหัวข้อผ่าน API หาก thread_id หายไป | Admin สร้างหัวข้อใน Telegram UI |
thread_id | ถูกเติมโดยอัตโนมัติหลังการสร้าง | ต้องตั้งค่าด้วยตนเอง |
icon_color / icon_custom_emoji_id | รองรับ | ไม่สามารถใช้ได้ (admin ควบคุมรูปลักษณ์) |
| Skill binding | ✓ | ✓ |
| Session isolation | ✓ | ✓ (มีอยู่แล้วสำหรับ forum topics) |
:::tip
ในการค้นหา thread_id ของหัวข้อ, เปิดหัวข้อใน Telegram Web หรือ Desktop และดูที่ URL: https://t.me/c/1234567890/5 - ตัวเลขสุดท้าย (5) คือ thread_id สำหรับ supergroups, chat_id คือ group ID ที่ขึ้นต้นด้วย -100 (เช่น group 1234567890 กลายเป็น -1001234567890)
:::
Recent Bot API Features
- Bot API 9.4 (ก.พ. 2026): Private Chat Topics - บอทสามารถสร้างหัวข้อฟอรัมในแชท DM แบบ 1-on-1 ผ่าน
createForumTopicดู Private Chat Topics ด้านบน - Privacy policy: Telegram กำหนดให้บอทต้องมีนโยบายความเป็นส่วนตัวแล้ว ตั้งค่าผ่าน BotFather ด้วย
/setprivacy_policyหรือ Telegram อาจสร้าง placeholder อัตโนมัติ สิ่งนี้สำคัญเป็นพิเศษหากบอทของคุณเป็นสาธารณะ - Message streaming: Bot API 9.x เพิ่มการรองรับการ stream การตอบกลับที่ยาวนาน ซึ่งสามารถปรับปรุง perceived latency สำหรับการตอบกลับของ agent ที่ยาวนาน
Interactive Model Picker
เมื่อคุณส่ง /model โดยไม่มี argument ในแชท Telegram, Hermes จะแสดง inline keyboard แบบโต้ตอบสำหรับการสลับ models:
- Provider selection - ปุ่มที่แสดงผู้ให้บริการแต่ละรายพร้อมจำนวน models (เช่น "OpenAI (15)", "✓ Anthropic (12)" สำหรับ provider ปัจจุบัน)
- Model selection - รายการ models แบบ paginated พร้อมการนำทาง Prev/Next, ปุ่ม Back เพื่อกลับไปยัง providers, และ Cancel
model และ provider ปัจจุบันจะแสดงที่ด้านบน การนำทางทั้งหมดเกิดขึ้นโดยการแก้ไขข้อความเดียวกันในที่เดิม (ไม่มีความยุ่งเหยิงในแชท)
:::tip
หากคุณทราบชื่อ model ที่แน่นอน, ให้พิมพ์ /model <name> โดยตรงเพื่อข้าม picker คุณยังสามารถพิมพ์ /model <name> --global เพื่อคงการเปลี่ยนแปลงข้าม session ได้
:::
DNS-over-HTTPS Fallback IPs
ในเครือข่ายที่จำกัดบางแห่ง, api.telegram.org อาจ resolve ไปยัง IP ที่ไม่สามารถเข้าถึงได้ ตัว adapter ของ Telegram มีกลไก fallback IP ที่พยายามเชื่อมต่อกับ IP ทางเลือกโดยอัตโนมัติโดยยังคงรักษา hostname และ SNI ของ TLS ที่ถูกต้อง
How it works
- หากตั้งค่า
TELEGRAM_FALLBACK_IPS, IP เหล่านั้นจะถูกใช้โดยตรง - มิฉะนั้น, adapter จะสอบถาม Google DNS และ Cloudflare DNS โดยอัตโนมัติผ่าน DNS-over-HTTPS (DoH) เพื่อค้นหา IP ทางเลือกสำหรับ
api.telegram.org - IP ที่ส่งคืนโดย DoH ที่แตกต่างจากผลลัพธ์ DNS ของระบบจะถูกใช้เป็น fallback
- หาก DoH ถูกบล็อกด้วย, IP seed ที่กำหนดไว้ล่วงหน้า (
149.154.167.220) จะถูกใช้เป็นทางเลือกสุดท้าย - เมื่อ fallback IP สำเร็จ, มันจะกลายเป็น "sticky" - การร้องขอครั้งต่อไปจะใช้มันโดยตรงโดยไม่ต้องพยายามเส้นทางหลักก่อน
Configuration
# Explicit fallback IPs (comma-separated)
TELEGRAM_FALLBACK_IPS=149.154.167.220,149.154.167.221หรือใน ~/.hermes/config.yaml:
platforms:
telegram:
extra:
fallback_ips:
- "149.154.167.220":::tip
โดยปกติคุณไม่จำเป็นต้องกำหนดค่านี้ด้วยตนเอง การค้นหาอัตโนมัติผ่าน DoH จัดการสถานการณ์เครือข่ายที่จำกัดส่วนใหญ่แล้ว env var TELEGRAM_FALLBACK_IPS จำเป็นเฉพาะเมื่อ DoH ถูกบล็อกในเครือข่ายของคุณเท่านั้น
:::
Proxy Support
หากเครือข่ายของคุณต้องการ HTTP proxy เพื่อเข้าถึงอินเทอร์เน็ต (พบบ่อยในสภาพแวดล้อมองค์กร), ตัว Telegram adapter จะอ่านตัวแปร environment proxy มาตรฐานและกำหนดเส้นทางการเชื่อมต่อทั้งหมดผ่าน proxy
Supported variables
adapter จะตรวจสอบตัวแปร environment เหล่านี้ตามลำดับ โดยใช้ตัวแรกที่ถูกตั้งค่า:
HTTPS_PROXYHTTP_PROXYALL_PROXYhttps_proxy/http_proxy/all_proxy(variants ตัวพิมพ์เล็ก)
Configuration
ตั้งค่า proxy ใน environment ของคุณก่อนเริ่ม gateway:
export HTTPS_PROXY=http://proxy.example.com:8080
hermes gatewayหรือเพิ่มใน ~/.hermes/.env:
HTTPS_PROXY=http://proxy.example.com:8080Proxy จะใช้ได้กับทั้ง primary transport และ all fallback IP transports ไม่จำเป็นต้องมีการตั้งค่า Hermes เพิ่มเติม - หาก env variable ถูกตั้งค่า, มันจะถูกใช้โดยอัตโนมัติ
:::note
ส่วนนี้ครอบคลุมชั้นการขนส่ง fallback ที่กำหนดเองที่ Hermes ใช้สำหรับการเชื่อมต่อ Telegram client มาตรฐาน httpx ที่ใช้ในส่วนอื่น ๆ อยู่แล้วเคารพ proxy env vars โดยธรรมชาติ
:::
Message Reactions
บอทสามารถเพิ่ม emoji reactions ให้กับข้อความเพื่อเป็น feedback การประมวลผลด้วยภาพ:
- 👀 เมื่อบอทเริ่มประมวลผลข้อความของคุณ
- ✅ เมื่อการตอบกลับถูกส่งมอบสำเร็จ
- ❌ หากเกิดข้อผิดพลาดระหว่างการประมวลผล
Reactions ถูกปิดใช้งานโดยค่าเริ่มต้น เปิดใช้งานใน config.yaml:
telegram:
reactions: trueหรือผ่าน environment variable:
TELEGRAM_REACTIONS=true:::note ต่างจาก Discord (ที่ reactions เป็นแบบ additive), Telegram's Bot API จะแทนที่ reactions ทั้งหมดของบอทในการเรียกครั้งเดียว การเปลี่ยนจาก 👀 เป็น ✅/❌ เกิดขึ้นแบบ atomic - คุณจะไม่เห็นทั้งสองอย่างพร้อมกัน :::
:::tip หากบอทไม่มีสิทธิ์ในการเพิ่ม reactions ในกลุ่ม, การเรียก reaction จะล้มเหลวอย่างเงียบๆ และการประมวลผลข้อความจะดำเนินต่อไปตามปกติ :::
Per-Channel Prompts
กำหนด system prompts ชั่วคราวให้กับกลุ่มหรือหัวข้อฟอรัม Telegram เฉพาะ Prompt จะถูกแทรกใน runtime ในทุกรอบ - ไม่เคยถูกบันทึกใน transcript history - ดังนั้นการเปลี่ยนแปลงจึงมีผลทันที
telegram:
channel_prompts:
"-1001234567890": |
You are a research assistant. Focus on academic sources,
citations, and concise synthesis.
"42": |
This topic is for creative writing feedback. Be warm and
constructive.Keys คือ chat IDs (กลุ่ม/supergroups) หรือ forum topic IDs สำหรับกลุ่มฟอรัม, topic-level prompts จะแทนที่ group-level prompt:
- ข้อความใน topic
42ภายในกลุ่ม-1001234567890→ ใช้ prompt ของ topic42 - ข้อความใน topic
99(ไม่มีรายการชัดเจน) → ย้อนกลับไปใช้ prompt ของกลุ่ม-1001234567890 - ข้อความในกลุ่มที่ไม่มีรายการ → ไม่มีการใช้ channel prompt
Numeric YAML keys จะถูก normalize เป็น strings โดยอัตโนมัติ
Troubleshooting
| Problem | Solution |
|---|---|
| Bot not responding at all | ตรวจสอบว่า TELEGRAM_BOT_TOKEN ถูกต้องหรือไม่ ตรวจสอบ logs ของ hermes gateway สำหรับข้อผิดพลาด |
| Bot responds with "unauthorized" | user ID ของคุณไม่อยู่ใน TELEGRAM_ALLOWED_USERS ตรวจสอบอีกครั้งกับ @userinfobot |
| Bot ignores group messages | โหมดความเป็นส่วนตัวน่าจะเปิดอยู่ ปิดมัน (ขั้นตอนที่ 3) หรือทำให้บอทเป็น group admin จำไว้ว่าต้องลบและเพิ่มบอทกลับเข้าไปใหม่หลังจากเปลี่ยนความเป็นส่วนตัว |
| Voice messages not transcribed | ตรวจสอบว่า STT พร้อมใช้งาน: ติดตั้ง faster-whisper สำหรับการ transcribe แบบ local หรือตั้งค่า GROQ_API_KEY / VOICE_TOOLS_OPENAI_KEY ใน ~/.hermes/.env |
| Voice replies are files, not bubbles | ติดตั้ง ffmpeg (จำเป็นสำหรับการแปลง Opus ของ Edge TTS) |
| Bot token revoked/invalid | สร้าง token ใหม่ผ่าน /revoke แล้วตามด้วย /newbot หรือ /token ใน BotFather อัปเดตไฟล์ .env ของคุณ |
| Webhook not receiving updates | ตรวจสอบว่า TELEGRAM_WEBHOOK_URL สามารถเข้าถึงได้จากสาธารณะ (ทดสอบด้วย curl) ตรวจสอบให้แน่ใจว่า platform/reverse proxy ของคุณกำหนดเส้นทาง inbound HTTPS traffic จาก port ของ URL ไปยัง local listen port ที่กำหนดโดย TELEGRAM_WEBHOOK_PORT (ไม่จำเป็นต้องเป็นตัวเลขเดียวกัน) ตรวจสอบว่า SSL/TLS ทำงานอยู่ - Telegram ส่งเฉพาะไปยัง HTTPS URLs เท่านั้น ตรวจสอบกฎ firewall |
Exec Approval
เมื่อ agent พยายามรันคำสั่งที่อาจเป็นอันตราย, มันจะขอการอนุมัติจากคุณในแชท:
⚠️ คำสั่งนี้อาจเป็นอันตราย (recursive delete). ตอบ "yes" เพื่ออนุมัติ
ตอบ "yes"/"y" เพื่ออนุมัติ หรือ "no"/"n" เพื่อปฏิเสธ
Security
:::warning
ควรตั้งค่า TELEGRAM_ALLOWED_USERS เสมอ เพื่อจำกัดว่าใครสามารถโต้ตอบกับบอทของคุณได้ หากไม่มีสิ่งนี้, gateway จะปฏิเสธผู้ใช้ทั้งหมดโดยค่าเริ่มต้นเพื่อความปลอดภัย
:::
ห้ามแชร์ bot token ของคุณสู่สาธารณะเด็ดขาด หากถูกบุกรุก, ให้ยกเลิกทันทีผ่านคำสั่ง /revoke ของ BotFather
สำหรับรายละเอียดเพิ่มเติม, ดู Security documentation คุณยังสามารถใช้ DM pairing สำหรับแนวทางที่ยืดหยุ่นกว่าในการอนุญาตผู้ใช้
extent analysis
TL;DR
- ไม่มีข้อมูลเพียงพอในเนื้อหาที่ให้มาเพื่อกำหนดแนวทางแก้ไขที่ชัดเจนสำหรับปัญหาที่เกิดขึ้น
Guidance
- ตรวจสอบว่าปัญหาเกี่ยวข้องกับ Hermes Agent และการเชื่อมต่อกับแพลตฟอร์มการส่งข้อความอย่างไร
- ระบุแพลตฟอร์มการส่งข้อความที่เกี่ยวข้อง (เช่น Signal, Slack, SMS, Telegram) และตรวจสอบการกำหนดค่าและขั้นตอนการเชื่อมต่อ
- หากมีข้อผิดพลาดหรือปัญหาในการเชื่อมต่อ ตรวจสอบสิทธิ์การเข้าถึงและข้อมูลรับรอง
- หากยังไม่มีคำตอบที่ชัดเจน อาจต้องมีการตรวจสอบเพิ่มเติมหรือรายละเอียดเพิ่มเติมเกี่ยวกับปัญหา
Notes
- เนื้อหาที่ให้มาไม่ได้ระบุปัญหาหรืออาการที่ชัดเจน ทำให้ยากต่อการให้คำแนะนำที่เฉพาะเจาะจง
- การแก้ไขปัญหาเกี่ยวข้องกับการตรวจสอบและแก้ไขการกำหนดค่า, สิทธิ์การเข้าถึง, และข้อมูลรับรองสำหรับ Hermes Agent และแพลตฟอร์มการส่งข้อความที่เกี่ยวข้อง
Recommendation
- ไม่สามารถแนะนำได้โดยไม่มีข้อมูลเพิ่มเติมเกี่ยวกับปัญหาหรืออาการที่เกิดขึ้น
FAIL-SAFE: เนื่องจากขาดข้อมูลเพียงพอในการระบุปัญหาหรืออาการที่ชัดเจน จึงไม่สามารถให้
Vote matrix · Quick signals
Still need to ship something?
×6Another batch ranked right after the header list — different links, same matching logic.
TRENDING
- Feature Request: Configurable per-minute rate limiting (RPM) for models to prevent 429 errors
- Android: Hermes App + Termux install share ~/.hermes and cause silent permission loops
- hermes update emits unicode-animations ANSI demo in non-interactive logs
- hermes update downgrades aiohttp from 3.13.4 to 3.13.3
- npm install warns about deprecated @babel/plugin-proposal-private-methods
- DingTalk inbound media URLs are skipped as unreadable native image paths
- fix(dashboard): ChatPage clears header action buttons on ALL pages, not just Sessions
- [Bug]: check_web_api_key() hardcodes built-in backends — third-party web search plugins silently disabled
- Hermes Web UI 修复经验:GatewayManager 补丁、进程 D 状态、数据库升级问题
- Telegram gateway can silently drop turn after /stop with response=0 chars while internal work continues
- Bug Report: v0.14.0 上下文污染 — 历史回复碎片回注到新请求
- Bug: hermes skills search table truncates Identifier column — install fails with copied value
- [skills-index-watchdog] Skills index is stale or degraded (degraded)
- Discord approval embed not rendering on web/mobile — embed data present in API but invisible
- Idea: Discord voice-channel participation / opt-in auto-join mode
- [Feature]: Claude Code--ultrawork
- build-arm64 job deterministically fails on cold cache (Azure SAS token expires mid-build)
- [Enhancement] computer_use: action=type should fall back to key events for terminal emulators (Ghostty/Terminal.app/iTerm2)
- Feature Request: Session Recovery on Temporary Provider Outage
- [Bug]: Hermes dashboard not working on NixOS (container)
- [Feature]: Add option to ignore @all/@everyone mentions in Feishu group chats
- QQ Bot WebSocket 频繁断开:长时间工具执行阻塞 asyncio 事件循环导致心跳超时
- patch tool: new_string escape sequences (\t) get written literally
- Feature Request: i18n / 多语言支持(国际化)
- Bug: web_crawl schema lets models auto-guess "instructions" instead of asking the user via clarify
- feat: `!command` prefix for direct shell execution (like Claude Code)
- Expose currently-running cron jobs via /api/jobs (or new endpoint)
- [Bug]: Kanban parent-child handoff: scratch workspace GC destroys artifacts before child can read them
- [Bug, Windows] hermes gateway restart loses session context — planned_stop_marker not written before SIGTERM
- [Bug]: Codex→DeepSeek fallback sends assistant turns without reasoning_content → HTTP 400 (require-side cross-provider failover)
- [Bug]: Update got stuck half way, reboot it, then ModuleNotFoundError: No module named 'hermes_cli'
- Kanban dispatcher corrupt-board handling and multi-profile gateway ownership ambiguity
- Gateway can resend a short fallback message when the real final Telegram response was already delivered
- [BUG] Bedrock: Fix 'Invalid API Key format' for presigned URL tokens
- Secret redaction corrupts code syntax in tool output (write_file, execute_code, terminal)
- Unable to connect Ollama Cloud with Pro Subscription to Hermes
- feat: fuzzy substring matching for /skill autocomplete
- PRD: Autonomous market-impact prediction briefing system
- Kanban dashboard should support task/card deep links
- [Feature] Native Feishu CardKit Streaming: consolidate best-in-class implementations
- [Feature]: Inject mental model into context when using Hindsight
- Interactive CLI hides tool output despite display.tool_progress=all, and hermes chat -v does not restore it
- fix(api_server): _handle_responses drops text.format JSON schema — structured output constraints silently ignored
- state.db FTS corruption goes undetected — no integrity check, no repair path
- bug: fallback routing can select text-only models for image requests and hide the primary failure
- feat(kanban): persist worker session_id per run and pass --resume on respawn after unblock
- feat(kanban): support GitHub/OMO lifecycle bridge for Xiyou-style automation
- Expose update-safe TUI/composer hooks for voice transcript and composer events
- Hide or configure voice transcript status rows in editable dictation mode
- [Feature]: Per-Tool / Per-Toolset Approval Policies
- Context compression creates orphan sessions missing from state.db
- messaging platform
- feat: Add read-only / silent monitoring mode for WhatsApp adapter
- double-.hermes path mismatch, the HOME env var leak, and the fallback-notification UX problem
- Bug: Plattform-Bundle name `hermes-yuanbao` in `agent.disabled_toolsets` silently kills ALL tools in gateway path (Telegram + cron), CLI unaffected
- CLI /yolo (in-chat) does not bypass dangerous command approvals — env var freeze + missing enable_session_yolo call
- OpenAI Codex provider crashes with "'NoneType' object is not iterable" (HTTP None)
- DEEPSEEK_API_KEY blocked by env blocklist in gateway process — cron jobs fail with deepseek provider
- fix(feishu): Card action callback routing issues - invalid message_id and unrecognized /card command
- Discord plugin: profiles without explicit `discord:` block silently get `require_mention=true` + `auto_thread=true` (regression in cc8e5ec2a)
- [Bug]: DISCORD_ALLOWED_ROLES ignored by gateway _is_user_authorized — role-authorized users get 'Unauthorized user' rejection
- [Bug]: /new, /clear, and /reset commands freeze the terminal session
- openai-codex subscription backend returns HTTP 200 with response.output=None, causing Slack/cron failures
- RFC: Centralized Model/Provider Registry
- bug: openai-codex provider — TypeError: 'NoneType' object is not iterable on every request (gpt-5.5)
- [Feature]: Source-aware instruction gate — architectural mitigation for indirect prompt injection
- Named custom provider stale_timeout_seconds ignored because runtime provider is normalized to `custom`
- guard test (ignore)
- [Feature]: per-platform LLM request_overrides (extra_body / reasoning_effort / service_tier)
- One-shot smoke: add Flue-backed orchestration fixture
- Gateway should not treat stale Codex app-server progress as final response after post-tool silence
- `docker_run_as_host_user: true` breaks bundled skills: Hermes home is mounted into `/root/.hermes` but the container runs as a non-root user (`HOME=/home/pn`)
- [Bug]: gateway api_server streaming bypasses server-side tool-call loop when chat_template_kwargs.enable_thinking=false (model emits tool name as plain text)
- [Feature]: Pre-install python-telegram-bot in Umbrel Hermes Docker image
- YouTube Shorts filter not working in youtube-content skill
- v0.15.0 PyPI release breaks ALL platforms — plugin.yaml manifests missing from package
- RFC: On-demand tool/skill/MCP discovery — decouple schema registration from process lifecycle
- Pixshelf: local-first stock photo workflow command center
- [Bug]: baoyu infographic skill should not silently bypass image_generate
- Pixshelf v1.5: manual submission tracking for stock agencies
- `hermes config set` silently accepts unknown keys, writing them where the runtime never reads
- Honcho memory prefetch hang on fresh CLI subprocess in v0.15.0 (regression from #27190)
- [Bug] v0.15.0 Docker image: stage2-hook.sh, main-wrapper.sh missing; container_boot module removed
- Feature: Reduce cache-read token overhead for DeepSeek providers — configurable cache_ttl, skills snapshot trimming, memory compaction
- Windows: three bugs from daily use (plugin discovery, gateway exit code, Unicode decode
- holographic memory: HRR silently degrades to FTS5 when numpy is missing
- Make max_tokens configurable for aux vision calls
- Conversation compression desynchronizes session ID between agent context and gateway routing, causing silent message loss
- [Bug]: v0.15.0 Docker image:The TUI cannot be used in the dashboard.
- cron: skip_memory=True blocks fact_store/memory tools from all cron jobs
- TUI: Node.js OOM crash when agent uses browser tools repeatedly
- feat: model_profiles — per-model toolset and memory config
- Automatic background skill patching disrupts active sessions (severe impact on local models)
- ensure_hermes_home() creates root-owned dirs in profile subdirectories when kanban workers are dispatched
- Feature: opt-in webhook bypass for DISCORD_ALLOW_BOTS — allow operator-initiated probes without weakening bot-loop guard
- v0.15.0: Codex requests fail HTTP 400 when participant display_name contains non-ASCII (emoji breaks input[].name pattern)
- Architecture: State Persistence Precedence (Memory vs Skills vs Hooks)
- [Bug]: cronjob tool: create action always fails with "schedule is required for create" even when parameters are provided
- codex-oauth: 'NoneType' object is not iterable in _run_codex_stream (gpt-5.5) — every turn fails non-retryably
- Docs/Config: Plugin local scope enablement ambiguity
- [Bug]: CLI freezes after using /new command (WSL)
- Profile Codex auth can ignore global credential pool when local state is stale
- [workflow-engine] CRITICAL: variable substitution crashes on regex metachars in user input
- [workflow-engine] HIGH: loop and bash nodes leak subprocesses on timeout
- [workflow-engine] HIGH: README documents config env vars the engine never reads
- [workflow-engine] MEDIUM: workflow_run rate limit bypassable via concurrent calls (TOCTOU)
- [workflow-engine] chore: manifest gaps, side-effectful register(), dead code, unauth kanban dispatch
- [mcp_lazy] HIGH: synthetic mcp_server_<name> stub collides with a real MCP server named 'server'
- [mcp_lazy] HIGH: promote_server eager flag documented but never persisted
- [mcp_lazy] MEDIUM: _prev_mode dict leaks and goes stale; not cleared on session evict
- [mcp_lazy] MEDIUM: get_pool has unlocked check-then-set race on pool creation
- [mcp_lazy] MEDIUM: pre_tool_call gives no guidance for unpromoted server-stub calls
- [mcp_lazy] chore: undeclared pre_tool_call hook, nonexistent 'mcp_load_tools' name in docs, missing tests
- [a2a_fleet] CRITICAL: server never auto-starts — register() runs outside an event loop
- [a2a_fleet] CRITICAL: auth_required defaults to false on a cross-machine surface
- [a2a_fleet] HIGH: remove invented disable() hook — loader never calls it, port leaks on reload
- [a2a_fleet] HIGH: plugin.yaml missing kind / provides_tools / requires_env (token env undeclared)
- [a2a_fleet] MEDIUM: tighten wide-open CORS, anonymous /health peer leak, and peer-URL SSRF
- [a2a_fleet] MEDIUM: relocate tests to tests/plugins/ and cover sync-register + auth-default paths
- xai-oauth auxiliary client incorrectly uses Responses API (CodexAuxiliaryClient), causing 403 on compression/vision/web_extract
- [Bug]: Direct Copilot gpt-5.5 large resumes are killed by 12s Codex TTFB watchdog
- [Bug]: `hermes uninstall` does not work on Windows
- TUI: Thinking block leaks raw JSON and Σ character
- Hostinger VPS: migration Hermes Agent → Hermes WebUI impossible (tini + UID mismatch + sessions)
- /goal judge over-continues exploratory goals unless the assistant explicitly says the goal is complete
- /goal auto-continuation can be amplified by preflight compression/session split and resurrect stale task state
- Dashboard infinite reload loop in loopback mode — GET /api/auth/me returns 401 on every page load
- [Bug]: Provider/LLM switch leaves stale encrypted_content causing 400 errors on Telegram sessions
- [Bug]: Infinite reload loop / React state loop on Sessions tab (Firefox + Chrome) — repeated 401 on /api/auth/me (v0.15.0)
- show_reasoning should work independently of streaming in CLI mode
- Feature Request: Strip reasoning/<think> blocks from TTS preprocessing
- mcp add / mcp test raise NameError when mcp package not installed
- v0.14.0 dashboard breaks behind reverse proxies — two regressions
- Skills hub creates empty category directories when no skills installed
- [Bug]: Custom endpoint: ChatCompletions returns content, but Hermes treats response as empty (v0.14.0)
- fix: atomic_replace() fails with EXDEV when HERMES_HOME is a cross-filesystem symlink
- fix(gateway): Feishu session cancellation orphans session guard, permanently blocking messages
- Custom endpoint pricing can overestimate Crof qwen3.5-9b cost by 1,000,000x
- MCP OAuth callback: module-level port global causes port collisions and structural weaknesses vs upstream
- Bug: send_message tool bypasses validate_media_delivery_path security check
- Proposal: Add Mnemosyne to official memory provider documentation
- feat(swarm): support custom verifier/synthesizer body + skills
- Template conversion failed
- Error occurred in the operation of the agent node in the workflow.
- PubSub client overrides Sentinel client when REDIS_USE_SENTINEL is enabled
- Frontend description of the Retrieval node output does not match the actual output
- JSON type input var raise Intenal server error
- cannot extract elements from a scalar
- 负载均衡 为模型配置多组凭据,并自动调用,此功能无法选择
- add models is error
- panic: could not create filter
- Persist partially generated messages when /chat-messages/:task_id/stop is called
- MCP server connection fails with 403 — request never leaves Dify (SSRF proxy suspected)
- Support durable async execution backends for long-running workflow steps
- [Xiaomi MiMo] Credentials validation fails with 400 "Not supported model mimo-v2-flash" when using Token Plan endpoint (v0.0.7)
- After clicking preview on a parent-child segmented knowledge base, it shows 0 chunks
- Retrieval score differs between UI upload (.docx) and API upload (.txt) despite identical chunk content and embedding model
- gemini cli crash again
- Xbox gift card code damage
- Damage caused by the gemini cli crash
- ioctl(2) failed, EBADF (Bad File Descriptor)
- Feat: Support Bun as an alternative runtime/package manager for updates and extensions
- fatal error again!!!!
- ioctl error
- Critical Crash: ioctl(2) failed, EBADF in ShellExecutionService.resizePty
- ioctl(2) failed, EBADF
- v0.44.0 Regression: Critical crash with ioctl(2) failed, EBADF during PTY resize
- Crash on startup: ioctl(2) failed, EBADF in UnixTerminal.resize
- Crash: `ioctl(2) failed, EBADF` in `node-pty` during PTY resize on macOS
- Gemini CLI crashes with `ioctl(2) failed, EBADF` in `node-pty` during `resizePty`
- Remote Role
- ERROR ioctl(2) failed, EBADF /home/mich
- RangeError: Maximum call stack size exceeded
- EBADF Error during folder creationg broke session and terminal glitches
- MAIP / Gargoub Project - Mediterania - North Coast
- Gemini cli crash again in this morning
- ERROR ioctl(2) failed, EBADF
- Verified node install fails — Checksum verification failed (Cloud)
- The extended debugging key did not arrive during registration.
- CollaborationPane unmounts collaboration store on single-user instances, causing permanent "No network connection" state
- Workflow cannot be saved when the name contains "->" (Potentially malicious string)
- automation does not work and does not show an error
- Raj Ai Automation
- Default Data Loader: DOMMatrix is not defined error
- Feature: Per-node execution timestamp overlay on canvas during workflow run
- AI Agent + Vertex `gemini-3.5-flash`: 400 "missing thought_signature" on sequential multi-turn tool calls (post-#24982)
- PDF Loader in Pinecone Vector Store fails due to pdf-parse version conflict (v2 not supported)
- emailReadImap: add UID deduplication, batch size cap, and numeric uid enforcement
- Manual node execution fails with "Could not find a node" when autosave is disabled (N8N_WORKFLOWS_AUTOSAVE_DISABLED)
- Schedule Trigger stopped firing — workflow Published & active, manual executions succeed, no automated fires for 2+ hours
- [MCP SDK] create_workflow_from_code intermittently returns HTTP 500, often as a false negative (workflow persists anyway, causing duplicates on retry)
- Credential-load wedge: workflows using googleApi/jwtAuth credentials silently fail to execute after key rotation
- Google Sheets Trigger every minute is not working manual Execute is working sent email
- [BUG] Plugin marketplace MCP connector remains stuck "still connecting" when mcp-remote requires OAuth
- [redacted at user request]
- Opus 4.7 behavioral regression: loaded instruction-following discipline degraded in recent Claude Code/Cowork updates
- [BUG] Tailscale via Homebrew CLI + Mac App Store GUI, both Macs on macOS, Cowork blocked by VPN detector despite Tailscale being a mesh VPN with no traffic interception
- stopShellPty on tab switch kills active sessions (exit 143) — regression in May 27 build
- [BUG] Long URLs are broken into multiple lines and become unclickable in terminal output
- [BUG] claude rm/stop/reap SIGKILLs background session tree without SIGTERM grace, orphaning git index.lock and similar
- [BUG] Default git workflow in the system prompt was pushed without context or consent
- [MODEL] Inconsistent output quality / Ignoring instructions (overfitting and inappropriate repetition of Korean vocabulary)
- You've hit your weekly limit · resets May 31 at 5pm (Asia/Shanghai)
- Paid yearly subscription silently downgraded to Free with no user action
- [Regression v2.1.153] Plugin bash hooks fail with "echo: write error: Permission denied" on Windows (claude-mem, shell: "bash")
- [BUG] Connector toggles in conversation are not clickable — must click text label instead
- [remote-control] Input from mobile app/browser not reaching host session — output works fine
- Model fails to read/reference CLAUDE.md contents despite being loaded in context
- [BUG] Claude Desktop reinstall destroys Code chat history (transcripts + Recents) while regular Chat history, project files, and memory all survive
- Bypass mode clamps to Accept Edits even with the toggle ON (Claude Code Desktop 1.9255.2 / CC 2.1.149)
- [BUG] TUI input freezes randomly mid-typing — entire prompt becomes unresponsive for minutes
- [BUG] Cowork downloads Linux ELF binary instead of macOS binary on macOS Sonoma 14.8.7 — exit code 132 (SIGILL) on every session
- [Feature Request] Persistent project memory — sessions forget everything on close, forcing users to keep many sessions open
- [Bug] Thread context stale after sleep/resume, returns outdated date and calendar data
- [FEATURE] Add context window usage indicator and warning before auto-compaction
- [BUG] Dictation error: Invalid character in header content ["x-config-keyterms"] on Windows
- [Bug] Anthropic API Error: Server rate limiting despite normal usage
- Does delegating work to `claude -p` subprocesses reduce context accumulation in the parent session?
- [BUG] Claude Code hangs on M1 Mac when terminal says "opening browser to sign in" and browser opens
- [BUG] Claude_Preview MCP preview_start spawns dev server with main-repo cwd instead of session's worktree cwd
- [Bug] Anthropic API Error: Server rate limiting during request execution
- [Bug] Anthropic API Error: Server rate limiting on concurrent requests
- [Bug] Ultraplan ready notification fires before cloud agent completes execution
- [BUG] API 500 ERROR ALL THROUGHOUT THE DAY
- [BUG] Cowork: Live Artifacts folder path changed in 1.9255.2, no automatic migration from Documents\Claude\Artifacts
- [Bug] Auto-compact never triggers despite statusline reporting "100% context used" (v2.1.153, Max sub, 200K mode)
- [BUG] [Desktop / macOS] 'Open in → New Window' detached session: font renders smaller than main, no per-window controls, Cmd+/Cmd- keystrokes routed to main window instead
- Feature request: option to switch between classic and new minimal UI
- [Feature Request] Show timestamps for each message
- [BUG] Terminal corruption when permission prompt appears while navigating Agent Teams agent selection menu
- [FEATURE] Allow users to customize the background color of the Claude desktop app beyond the current light/dark theme presets.
- [BUG] Statusline not displaying on Windows [fixed]
- Background agent UI Stop button is a no-op for stuck agents — process keeps consuming tokens
- Background agents silently die on session pause/resume — no completion notification, no work recovery
- Add option to hide email address from welcome banner
- [BUG] SSH Remote: `projects` field in remote ~/.claude.json becomes null after desktop restart — jsonl files intact, UI shows 'No messages yet' for every session
- [Bug] Claude Code not applying fixes despite claiming to complete tasks
- billing is unfair and poorly documented
- [BUG] Claude Code on the web: declared plugins inactive on first session, require restart to fully load
- [BUG] Restore from archive deleted sessions instead of restoring them
- [BUG] M365 connector fails with AADSTS50011 in Cowork — localhost vs 127.0.0.1 redirect URI mismatch
- claude agents: workflow slash-commands missing from dispatch-input completion (regression-adjacent to #61424)
- Claude Desktop's Info.plist missing TCC usage strings, blocks all EventKit-based MCP servers
- False-positive safety blocks on self-administered governance amendments — request for owner-authority mode for verified professional users
- [BUG] Stop pushing "AUTO"-mode
- [DOCS] Plugin marketplace guide omits `skipLfs` option for git-based sources
- [DOCS] MCP docs omit combined startup notification for MCP server and connector authentication
- [DOCS] Agent view docs omit macOS Privacy & Security identity for background agents
- [DOCS] Npm update docs do not explain release-channel behavior for `claude update`
- [DOCS] Agent SDK docs omit `subagent_type: "claude"` worktree and output persistence behavior
- [DOCS] Background session docs omit `$CLAUDE_JOB_DIR` temp-file behavior
- [FR] mask env-var values in 'claude mcp get <server>' output
- [FR] subagent worktrees should not inherit stale local 'user.email' from prior dispatches
- [BUG] Windows: Grep tool leaks rg.exe + conhost.exe processes (~2000 zombies / 14 GB RAM in long sessions)
- [BUG] Stats dashboard "Peak hour" appears off by one hour
- [BUG] Diff highlight (teal SGR background) bleeds past changed text in 2.1.150–2.1.153
- [FEATURE] confirm before deleting session
- Plugin PostToolUse hooks still silently skip in Claude Desktop / Cowork (re-filing closed #51904)
- /code-review skill: silent fallback to main...HEAD reviews other people's commits, and JSON-only output is hard to read
- Monitor tool doesn't source the shell snapshot like Bash does; PATH-dependent tools (jq, sleep, etc.) fail in Monitor commands on macOS/Nix
- [Bug] Long input lines truncated with ellipsis while typing instead of wrapping in terminal UI
- [FEATURE] VS Code extension: Render submitted user messages as Markdown in chat
- OSC 52 copy from Claude TUI doesn't reach clipboard inside tmux (regression in 2.1.146–2.1.153)
- [BUG] RemoteTrigger create/update returns HTTP 400 with circular error: "event_type is required" / "unknown field event_type"
- [BUG] Option to hide or minimize the built-in "status footer" (multi-line debug/cost panel) [re-raise of #31475]
- [Bug] Feedback submissions being closed without review or action
- [FEATURE] Word-jump cursor navigation in Chat input (option+arrow / bindable actions)
- [FEATURE] ! shell mode: filesystem tab completion
- [BUG] API Error: Usage credits required for 1M context
- claude agents: OSC 52 clipboard emission broken in tmux (regression in 2.1.146–2.1.153)
- CLI crashes on macOS 15 M3 - exit code 1
- [FEATURE] Support Cmd+V image paste from clipboard
- [FEATURE] Enhance claude.ai M365 connector to support MS Planner
- [BUG] Slash command autocomplete hijacks pasted absolute file paths starting with /
- PreToolUse hook `if` filter false-positives on complex Bash commands
- [BUG] Diff panel hangs/whites out
- Feature Request: Support drag-and-drop for binary documents (.wps, .doc, .docx, .xlsx, .pdf) in VS Code extension
- [BUG] activation of 1M context in VSCode
- [FEATURE] Support i18n / language localization for built-in slash command outputs
- Ctrl+V para colar imagens deixou de funcionar no CLI (Windows, PowerShell)
- [FEATURE] Please add Norwegian (Bokmål/Nynorsk) language support to the Claude Code interface
- [BUG] OTel log events (claude_code.user_prompt, api_request_body, tool_decision, hook_execution_complete) emitted with empty trace_id/span_id while sibling spans correlate correctly
- [BUG] Cowork crashes on every message, no VM logs generated, missing AppData\Roaming\Claude
- [FEATURE] first-class session handoff + per-session token budgets for unattended runs
- [FEATURE] Smart paste: convert clipboard code to file reference chips (like Cursor)
- [Feature Request] Restore chat pin functionality to title chat submenu
- [BUG] SIGILL issues with version 2.1.153
- [BUG] Cowork plugin upload fails with generic "Plugin validation failed" when a `description` field in any SKILL.md frontmatter contains angle brackets (`<…>`)
- [BUG] Desktop App 2.1.144+: startup scanner deletes cliSessionId from claude-code-sessions local files on every launch — session not found on disk
- [Feature Request] Add keyboard shortcut to copy last message with proper formatting
- [MODEL] Opus 4.7 not 1M
- Allow naming/renaming background agents in `claude agents` view
- Stale worktrees in .claude/worktrees/ are never cleaned up, consuming massive disk space
- Agent worktrees are never cleaned up, silently consuming disk space
- Subagent worktrees not auto-cleaned when reviewer writes scratch files
- [Bug] Skill initialization hangs for extended duration in Plan Mode
- Claude Desktop writes malformed registry Run entry (nested escaped quotes) - crashes Windows Task Manager and other Run-key parsers
- IME candidate window shows at bottom-right corner instead of caret position (Windows CMD)
- [BUG] Pressing 'Escape' doesn't close the /BTW conversation when the main conversation is asking for approval
- [BUG] Opus 4.7 (1M) intermittently emits empty-string values for tool_use.input fields, killing the session
- FleetView agent UI shows "running" with incrementing elapsed time after agent has returned
- /doctor flags context-scoped cmd+c binding as macOS conflict (false positive)
- [BUG] Text Rendering in Elvish
- Desktop app: Bypass Permissions mode flips to Accept Edits on first prompt (M5 / macOS 26.5)
- [Workaround] Date-Weekday Verification Hook — Prevents Claude from writing wrong weekdays
- [BUG] Claude Code create c:/memfs directory without asking me.
- [BUG] Claude Code's Bash execution waits forever with no processes running
- [BUG] usage stays stuck waiting for 5 hr limit after upgrading to premium seat in team plan
- [Workflow tool] resume cache is unreachable for nontrivial workflows because LLM dispatchers can't transcribe args byte-exactly
- Code review (Preview): "Add a repository" shows no results for private GitHub org repos
- [BUG] /context commands blows up context
- [Feature Request] Add precache expiry hook to enable proactive compaction before token eviction
- [BUG] Context indicator shows 0% at session start despite ~20K+ tokens already loaded
- [Feature Request] Add semantic search for --resume session history
- [Feature Request] Add session search, tagging, and filtering capabilities
- [BUG] Cowork Dispatch reports "desktop not available" on Windows 11 while standard Cowork works normally
- [Bug] Claude Code provides incorrect suggestions with high confidence despite errors
- defaultMode: acceptEdits silently overrides per-path permissions.ask rules for Write/Edit
- [FEATUR configurable tip interval (e.g. tipIntervalSeconds: 30 in settings)E]
- Plugin marketplace fails to load: schema rejects 'displayName' key (v2.1.153)
- claude agents: in-session copy uses broken OSC 52 path while overview correctly uses tmux buffer
- [BUG] Plugin agent descriptions (and custom agents) load unconditionally into context — no parity with disable-model-invocation for skills
- Crashed ultrareview consumed a free credit despite producing zero findings
- [Bug] Character rendering issue - invisible or missing text display
- [BUG] Cowork: processo Claude Code encerra com código 3 — .claude.json não contém token de autenticação (Windows 11 25H2)
- [BUG] 2.1.153 silently discards tools/list response from rmcp 0.12.0 HTTP MCP server (works in 2.1.152, wire-identical handshake)
- VS Code extension: option to auto-resume last session when reopening a workspace folder
- [Bug] Conversation continuation failure
- [BUG] Cowork crashes every time I start a new chat or attempt to continue an existing one in any project. The error displayed is: "Claude Code è andato in crash
- [Bug] Unannounced quota changes
- Native update/install fails with 'socket connection was closed unexpectedly' behind proxy — undici TLS incompatibility
- [BUG] Session name reverting after manual change
- [BUG] 非正常思考,上下文过长时,一直显示思考,点击interrupt按钮失效
- Honor `tools:` frontmatter when an agent is invoked via `@mention` — strip `Task` only when the agent did not declare it
- macOS TCC popup still recurring on v2.1.153 — "2.1.153" would like to access data from other apps
- Claude Code leaks pty handles — exhausts pseudo-terminals on macOS after long session
- [Bug] Agent fails to execute or respond to user input
- [BUG] Persistent "Expecting value: line 1 column 1 (char 0)" JSON parse error after tool execution
- [Feature Request] Implement proactive unit test coverage recommendations for recurring bugs
- VS Code panel lacks status line + terminal lacks image paste in Codespaces, forcing a tradeoff
- `/powerup` only shows ~10 lessons — allow viewing the full catalog
- [Bug] Context contamination after auto-compact with unrelated email draft of Tejo/Sado Basin
- [Bug] VSCode terminal output displays corrupted text with garbled symbols
- [Feature Request] Add LaTeX/KaTeX math rendering to TUI
- [Bug] Sub-agent PR review results not validated by orchestrating agent
- Subagents on Pro 1M tier: trivial probes pass, real workloads fail at first tool call (probe-vs-workload divergence)
- Path-scoped rules and subdirectory CLAUDE.md not loaded when creating new files matching the pattern
- AskUserQuestion: cancelling during extended thinking poisons the whole session with 400 'thinking blocks cannot be modified' (2.1.153); concurrent prompts overwrite each other
- Ideas Missing from Claude Cowork Menu (Windows)
- [BUG_BOUNTY_SAFE_POC_2026] Prompt Injection RCE Test - Command Execution Proof
- [BUG] Cowork scheduled task: execution history row not showing after successful run
- Resuming an extended-thinking session fails permanently with 400 "thinking blocks cannot be modified" (transcript stores thinking text as empty but keeps signature)
- [Bug] Plugin-registered CwdChanged and FileChanged hooks don't fire (settings.json works) — v2.1.153
- Auto-archive on PR merge / branch delete — clarify autoArchiveSessions semantics or add dedicated opt-out
- `claude mcp add` echoes Authorization header value verbatim to stdout, leaks bearer tokens to terminal and session transcripts
- [BUG] Bug report — /insights skill, Claude Code The /insights skill outputs a malformed file path.
- Plugin slash commands render with '*'-inline format instead of two-column, despite matching official plugin shape
- [Bug] Unexpected long text generation without user input or goal
- [Bug] Thinking blocks causing task progression blocked without user modification
- [BUG] (Critical!) contamination by an unknown session simirlar to the report => [Bug] Context contamination after auto-compact with unrelated email draft of Tejo/Sado Basin #63137
- [Critical] Opus 4.7 Korean output degeneration — Korean grammar itself collapses in long contexts
- [BUG] Title: Autocompact buffer persists across /clear — wastes tokens for irrelevant old context
- [Bug] Auto-Compact loses user input before processing in conversation history
- Feature: per-invocation effort parameter + runtime session-config introspection for skills
- Auto-mode classifier mislabels Azure DevOps vote -5 as "Reject" when denying PR vote actions
- [BUG] Claude Desktop and Claude Code CLI never re-register MCP tools after OAuth 2.1 handshake on a remote HTTP server
- [BUG] Workspace file tags leak across sessions
- [BUG] Ink renderer crashes on Windows 11 build 26200 (Canary) duplicate banners, terminal mode leaks, mid-operation aborts
- [BUG] Claude Code Desktop issue
- PTY master fd leak in Claude desktop app exhausts macOS kern.tty.ptmx_max after ~2-3 days
- [BUG] Claude Code — Session Management after Unexpected Interruption
- [Windows] Cowork OpenTelemetry exporter does not initialize - zero events emitted to any destination, including loopback
- [Bug] Opus 4.7: 400 `thinking blocks ... cannot be modified` on long extended-thinking sessions, triggered by history-altering events (scheduled prompts / parallel tool-call cancellation)
- [BUG] API Error: Server is temporarily limiting requests (not your usage limit) · Rate limited
- Multi-plugin custom marketplace: only first plugin registered in installed_plugins.json, skills don't load
- [BUG] Git push through the SDK's git proxy fan-outs into ~500 GitHub REST API calls, exhausting the 5,000/hour budget after a handful of pushes
- [BUG] Claude took liberties it really shouldn't with my global config
- [BUG] Agent window focus lost after navigating with arrow keys, causing scroll deadlock
- [BUG] `--model` flag silently ignored in interactive sessions (works in `--print` only)
- [BUG] Dispatch permanently shows "desktop appears offline" on Windows 11 - never worked on first use
- feat: support per-command enableWeakerNetworkIsolation as safer alternative to dangerouslyDisableSandbox
- /code-review outputs a raw JSON array instead of readable findings
- [BUG] Cowork — Additional allowed domains ignored on Team plan; same domain works on Pro plan
- Haiku
- [Bug] False positive blocking beneficial outcomes in tool execution
- 3P Bedrock SSO: credentials silently expire without triggering re-auth on day 2+
- CLAUDE_AUTOCOMPACT_PCT_OVERRIDE in settings.json env block silently ignored by autocompact logic
- Auto-compaction deletes main session JSONL before verifying summary completion, causing data loss
- [Bug] Claude Code not executing stated actions or producing expected results
- [FEATURE] Deferred Messages — Queue Input for End of Turn
- [BUG] Up/Down arrows in input box navigate history instead of moving cursor — regression in 2.1.149+
- Cancelling a parallel tool-call batch corrupts thinking blocks -> 400 "thinking blocks cannot be modified" permanently wedges the session
- Claude Code caused data loss, then contradicted itself about recovery (two incidents, one session)
- [Bug] Unclear error messages from Claude Code CLI
- [Bug] Agent tool rejecting due to context size limit exceeded
- claude agents: daemon and bg-spare processes spin at ~100% CPU when idle
- [BUG] Compaction fails with "context window limit" error even when context usage is low (e.g., 20%) — regression in v2.1.153
- Remote Control entitlement lost after May 27-28 incident — `Error: Remote Control is not yet enabled for your account` on active Max subscription
- PreToolUse hook exit code 2 does not block Write tool
- [Bug] Thinking blocks in latest assistant message are immutable
- GUI: dispatch file:// and custom-scheme clicks to OS shell handler
- Show current model in statusLine by default
- [Bug] Agent console becomes unresponsive to keyboard input after multiple agents initialized
- [FEATURE] PreToolUse hooks should have a way of updating the environment
- [Bug] Unable to start or use Claude Code CLI
- [BUG] Repository not visible in Claude Code web repo picker
- Session permanently wedged on 400 "thinking blocks cannot be modified" after parallel tool_results
- [Bug] @ autocomplete loses sibling repos after a file edit in multi-repo workspace
- Unclear error message when creating sub-agent without authentication
- [Bug] Anthropic API errors causing frequent failures and high token usage
- [BUG] @ mention file picker only shows packages, not individual files (desktop app - Code tab)
- [Bug] TUI panel footer remains sticky and consumes excessive terminal space
- PR-status polling exhausts GitHub GraphQL rate limit on repos with many open PRs
- [BUG] Windows: welcome panel not shown in some project folders (2.1.153)
- [Bug] Anthropic API Error: thinking blocks corrupted during context compaction with extended thinking enabled
- API 400 "thinking blocks cannot be modified" permanently bricks session during agent activation (interleaved thinking + tool use)
- Right-click Copy copies the whole message instead of the selection; pasted text retains dark background
- Mid-session model switch corrupts conversation when extended thinking is enabled (API 400: 'thinking blocks cannot be modified')
- [BUG] Markdown file links in chat output do not open files when clicked (VS Code extension)
- Stuck retry loop: `400 thinking blocks cannot be modified` on large interleaved-thinking turns using AskUserQuestion
- [FEATURE] Prompt user for approval before auto-compaction proceeds
- Custom MCP connectors not attachable to scheduled routines — no UUID discovery path
- [BUG] Claude in Chrome — Navigation blocked for teams.cloud.microsoft and outlook.cloud.microsoft after Microsoft domain migration**
- [BUG] Claude Desktop — Personal plugins panel renders list but is entirely non-interactive (macOS, v1.9255.2)
- [Bug] error when using Workflows
- [BUG] Persistent "update available" notification despite being on latest version
- [BUG] Sweep Agent from /code-review never completes
- [Bug] Tool calls not executing or returning results
- [FEATURE] Cloud-synced memory and settings across machines
- [Bug] Terminal UI freezes when Ctrl+O view exits during interactive prompt in plan mode
- Continuous api errors when using claude code with Opus 4.7 with thinking on low
- [Feature Request] Add support for installing and using previous Claude Code versions
- [Bug] Extended Thinking: Summarized thinking blocks fail signature validation when resent to API
- [Bug] Anthropic API Error: 'thinking' blocks cannot be modified
- [Bug] Anthropic API Error: Thinking blocks cannot be modified with extended thinking mode
- Feature request: Lazy/on-demand MCP server connections
- [Bug] Tool Arguments Parsed as String Instead of Object
- [Bug] Anthropic API Error: Insufficient context provided
- [Bug] Claude Opus occasionally uses moskovian(russian) orthography instead of Ukrainian in system-prompted responses
- Opus 4.8: backgrounded task completions (subagents AND Bash) crash with 400 "thinking blocks cannot be modified"
- [Bug] Opus 4.7 fabricates stable preferences ("my default") to rationalize arbitrary choices when challenged
- [Bug] Unable to update Claude Code CLI
- [BUG] Desktop app: /remote-control mints link + connects bridge (main.log) but in-chat link/QR panel never renders
- Feature: sessionColor and sessionName in .claude/settings.json
- [BUG] Anthropic API error: thinking blocks
- [FEATURE] Support Remote MCPs in Cowork as in Claude Code
- [Bug] Anthropic API Error: 400 Bad Request with Redacted Thinking - 0 4.7 & 4.8
- [Bug] Anthropic API Error: Cannot modify thinking blocks from different model versions
- Interleaved thinking + multi-tool turn corrupts thinking block (text blanked, signature kept) → permanent 400 'blocks must remain as they were'
- [BUG] Mode/permission changes mid-tool-loop (effortLevel: xhigh) poisons entire session
- Session failure log: Opus 4.6 ignores its own rules for an entire session
- [BUG] "400 Guardrail was enabled" error when using Claude Opus 4.8 with AWS Bedrock
- [Feature Request] Add subagent approach selection option to avoid accidental feedback
- Persistent 400 'thinking blocks in the latest assistant message cannot be modified' — interleaved thinking persisted with empty text + signature bricks sessions
- [BUG] DesktopvsApp
- [BUG] Opus 4.7 cache hit rate collapse after May 27 incident — Messages 1.1k→88.9k in 9 minutes, $630/session
- [Bug] Anthropic API Error: Invalid thinking block format
- [BUG] FUCK CLAUDE
- Opus 4.8 extended thinking: Stop hook block re-entry corrupts thinking blocks → 400
- [Bug] 4.8 Fails when accessing previous model history
- [Bug] Unintended File Modifications During Execution
- [DOCS] Model configuration docs omit lean system prompt default scope and model exceptions
- Add "Always allow globally" option to permission prompts
- Server-side model upgrade (Opus 4.7→4.8) wedges in-flight sessions with `thinking blocks cannot be modified` 400
- [DOCS] AskUserQuestion docs missing multiple-choice prompt decision threshold
- [DOCS] Agent view docs omit shell-command background session launch syntax
- [DOCS] Agent view dispatch input docs incorrectly imply `/logout` dispatches as a prompt
- [DOCS] Claude in Chrome docs omit connected-browser selection behavior
- [DOCS] Plugin docs omit `defaultEnabled: false` for opt-in plugins
- Feature Request: Customizable chat text colors for user and assistant messages
- [DOCS] `/plugin` Discover tab docs omit directory-based suggested plugin pins
- VSCode Chrome integration silently fails: 3 distinct bugs
- [DOCS] MCP stdio docs omit session environment variables
- [Bug] Anthropic API error on second request within session with Claude Opus 4.8
- Cowork emits a blank session "index" handoff on focus when a CLI session is paused awaiting input
- [DOCS] MCP docs omit `claude mcp list/get` pending-approval output for unapproved project servers
- [BUG] /compact fails with 400 error when last assistant turn contains thinking blocks
- [DOCS] `/claude-api` docs omit Opus 4.8 migration guidance
- [DOCS] Fast mode docs still recommend deprecated Opus 4.6 override variable
- [DOCS] Bash tool docs omit `$TMPDIR` consistency across sandboxed and unsandboxed commands
- [Bug] Anthropic API Error: 400 Bad Request on Extended Thinking
- [DOCS] Background session docs omit worktree-isolation behavior for spawned subagents
- Built-in mechanistic self-verification of verifiable claims (symmetric to the auto permission gate)
- [DOCS] Worktree docs do not clarify `worktree.baseRef: "head"` inside linked worktrees
- [BUG] Excessive RAM usage with multiple parallel chats (~10 sessions → 30 GB memory pressure, macOS OOM)
- [DOCS] Managed MCP policy docs omit invalid `allowedMcpServers`/`deniedMcpServers` entry behavior
- [DOCS] Effort docs omit `CLAUDE_CODE_ALWAYS_ENABLE_EFFORT` unsupported-model behavior
- Regression (2.1.147–2.1.150?): resuming an extended-thinking session after a CC update/model-switch → unrecoverable 400, session bricked
- [DOCS] Windows updater docs omit `claude.exe` in-use recovery guidance
- [DOCS] VS Code auto mode docs still tie mode-picker visibility to bypass-permissions setting
- [DOCS] MCP docs omit `/mcp` tool list and detail rendering behavior
- [DOCS] Fine-grained tool streaming docs still describe provider opt-in behavior
- bypassPermissions: session startup reads flat pref, GUI toggle writes per-account pref — they never sync
- [BUG] Claude Desktop Code tab causes disk write limit violation — 8.5GB in 11 min, macOS kills app (M5, v1.9659.1)
- Ultrareview v2.1.96: docs describe /tasks command + claude ultrareview --json subcommand that don't exist; findings hard to read after completion
- I'd be happy to help create a GitHub issue title, but I don't see the error message in your message. Could you please share the specific error you're encountering? That way I can generate an accurate and descriptive issue title for you.
- [BUG] Claude in Chrome `file_upload` rejects all scheduled-task sessions with misleading error (real cause: INVALID_SESSION)
- Extended thinking: signed thinking block 'cannot be modified' (400) permanently wedges session
- RTL text support for Hebrew (and Arabic) in Claude Code
- [Bug] Random errors occurring across multiple operations