콘텐츠로 이동

Telegram, Discord, Slack

스트리밍 모드, 반응 이모지, 히스토리 로깅을 지원하는 세 가지 주요 메시징 플랫폼입니다.

Telegram, Discord, Slack은 대부분의 Revka 운영자가 가장 먼저 선택하는 세 가지 메시징 플랫폼입니다. 세 플랫폼 모두 실시간으로 동작하며 공개 인바운드 포트가 필요 없습니다(각 플랫폼이 아웃바운드 연결로 메시지를 가져오므로 NAT 환경이나 Raspberry Pi에서도 동작합니다). 또한 추가 Cargo 기능 없이 기본 빌드에 포함되어 있습니다. 이 페이지는 플랫폼별 레퍼런스로, 구성 키, 스트리밍 모드, 수신 확인 반응, Discord 히스토리 로깅 변형, Slack 퍼머링크 확장을 다룹니다.

모든 채널은 ~/.revka/config.toml[channels_config] 아래에 위치하며 revka daemon 내에서 실행됩니다. 채널을 처음 연결하는 경우, 허용 목록 모델 및 폴링과 웹훅의 차이점에 대해서는 메시징 채널 연결하기를 참고하시고, 공통 트레이트 모델은 채널 개요를 참조하세요. 단계별 Telegram 연결 안내(예: /bind 페어링 흐름 포함)는 Telegram 및 Matrix 설정하기를 참고하세요.

Telegram과 Discord는 stream_mode 키(StreamMode 열거형)를 공유합니다. Slack은 드래프트 업데이트를 지원하지만 다중 메시지 분할은 지원하지 않으므로, 대신 stream_drafts 불리언 값을 사용합니다.

모드동작플랫폼
끄기"off"생성이 완료된 후 전체 응답을 단일 메시지로 전송합니다. 기본값.Telegram, Discord
부분"partial"수정 가능한 드래프트를 게시하고 토큰이 도착하는 대로 실시간으로 편집하며, 최종적으로 전체 텍스트로 확정합니다. draft_update_interval_ms로 속도를 제한합니다.Telegram, Discord, Slack (stream_drafts = true)
다중 메시지"multi_message"단락 경계(\n\n)로 분할된 별도 메시지로 응답을 전달하며, multi_message_delay_ms 간격으로 전송합니다. 코드 펜스는 절대 분할하지 않습니다.Discord

수신 확인(ack) 반응은 답장 텍스트가 존재하기 전에 발신자에게 메시지가 수신되어 처리 중임을 알려줍니다. [channels_config] 아래의 전역 스위치로 제어됩니다.

[channels_config]
ack_reactions = true # default: add 👀 on receipt, ✅/⚠️ on completion
show_tool_calls = false # default: don't forward per-tool 🔧 notices to chat
유형기본값의미
ack_reactionsbooltrue수신 시 👀 반응을, 완료 시 ✅ / ⚠️ 반응을 인바운드 채널 메시지에 추가합니다.
show_tool_callsboolfalse도구별 알림(예: 🔧 web_search_tool: …)을 채널 사용자에게 전달합니다. false인 경우 도구 호출은 서버 측에만 기록됩니다.

Telegram은 이에 더해 자체 동작을 추가합니다. 메시지 처리를 시작할 때 setMessageReaction을 통해 ⚡️, 👌, 👀, 🔥, 👍무작위로 선택한 이모지 반응을 추가합니다. Telegram은 또한 채널별 ack_reactions 재정의(아래 참조)를 지원하며, 이 값이 전역 설정보다 우선합니다.

Telegram은 가장 빠르게 설정할 수 있는 채널입니다. @BotFather로 봇을 생성하고, 토큰을 붙여넣으면 몇 분 안에 에이전트와 대화할 수 있습니다. getUpdates 롱 폴링으로 메시지를 수신하고 sendMessage로 응답합니다.

[channels_config.telegram]
bot_token = "123456:TELEGRAM-TOKEN" # required, from @BotFather
allowed_users = ["*"] # tighten after testing
stream_mode = "off" # off | partial
draft_update_interval_ms = 1000 # edit throttle for partial mode
mention_only = false # only respond to @mentions in groups
interrupt_on_new_message = false # cancel in-flight reply on a new message
# ack_reactions = true # optional per-channel override of the global setting
# proxy_url = "socks5://127.0.0.1:9050"
# notification_chat_id = "123456789" # target for workflow notify/approval prompts
필드유형 / 값기본값의미
bot_tokenstring (필수)@BotFather에서 발급받은 Bot API 토큰입니다.
allowed_userslist[] (전체 차단)Telegram 사용자 이름(@ 제외) 또는 숫자 사용자 ID, 또는 "*"입니다.
stream_mode"off" | "partial""off"답장 전달 모드입니다.
draft_update_interval_msinteger1000partial 모드에서 드래프트 스트리밍 시 편집 속도 제한입니다.
mention_onlyboolfalse그룹 채팅에서 응답하기 위해 @멘션을 요구합니다. DM은 항상 처리됩니다.
interrupt_on_new_messageboolfalse동일한 발신자가 같은 채팅에서 다시 메시지를 보내면 진행 중인 생성을 취소합니다.
ack_reactionsbool (선택)전역 설정 상속[channels_config].ack_reactions의 채널별 재정의입니다.
proxy_urlstring전역 [proxy]를 재정의하는 채널별 HTTP/HTTPS/SOCKS5 프록시입니다.
notification_chat_idstring"telegram"을 대상으로 하는 워크플로 notify 단계 및 승인 프롬프트에 사용할 채팅 ID입니다.

채널을 추가하고 데몬을 시작합니다.

Terminal window
revka channel add telegram '{"bot_token":"123456:TELEGRAM-TOKEN","name":"my-bot"}'
revka daemon

허용 목록은 기본적으로 모든 사람을 차단하므로, 새로운 발신자는 거부되며 Revka가 허용 목록 추가를 위한 정확한 revka channel bind-telegram <id> 명령어를 응답으로 보내줍니다. 전체 /bind 페어링 흐름은 Telegram 및 Matrix 설정하기를 참고하세요.

다음 명령어는 허용된 Telegram(및 Discord) 발신자가 사용할 수 있습니다. 발신자 범위로 적용되며 데몬을 재시작할 필요가 없습니다.

명령어효과
/models사용 가능한 프로바이더와 현재 선택 항목을 표시합니다.
/models <provider>이 발신자의 세션에서 프로바이더를 전환합니다.
/model현재 모델을 표시합니다.
/model <model-id>이 발신자의 세션에서 모델을 전환합니다.
/new이 발신자의 대화 히스토리를 초기화하고 새로 시작합니다.

Discord는 Gateway WebSocket(op IDENTIFY)으로 연결되어 길드 및 DM 메시지를 실시간으로 수신하고, REST를 통해 답장을 보냅니다. 세 가지 stream_mode 값을 모두 지원하고, 타이핑 표시기, 이모지 반응, 승인 키워드 인터셉트를 지원하는 세 플랫폼 중 가장 풍부한 스트리밍 기능을 제공합니다.

[channels_config.discord]
bot_token = "DISCORD-BOT-TOKEN" # required
guild_id = "123456789012345678" # optional: restrict to one guild
allowed_users = ["*"] # tighten after testing
listen_to_bots = false # process messages from other bots
mention_only = false # require an @mention
interrupt_on_new_message = false # cancel in-flight reply on a new message
stream_mode = "multi_message" # off | partial | multi_message
draft_update_interval_ms = 1000 # edit throttle (partial mode)
multi_message_delay_ms = 800 # delay between chunks (multi_message mode)
# proxy_url = "socks5://127.0.0.1:9050"
# notification_channel_id = "123456789012345678"
필드유형 / 값기본값의미
bot_tokenstring (필수)Discord 개발자 포털에서 발급받은 봇 토큰입니다.
guild_idstring봇을 단일 길드(서버)로 제한합니다.
allowed_userslist[] (전체 차단)Discord 사용자 ID, 또는 "*"입니다.
listen_to_botsboolfalse다른 봇의 메시지를 처리합니다. 봇은 자신의 메시지는 항상 무시합니다.
mention_onlyboolfalse@멘션을 요구하며, 다른 길드 메시지는 무시합니다.
interrupt_on_new_messageboolfalse동일한 발신자가 같은 채널에서 다시 메시지를 보내면 진행 중인 생성을 취소합니다.
stream_mode"off" | "partial" | "multi_message""off"답장 전달 모드입니다.
draft_update_interval_msinteger1000partial 모드에서 편집 속도 제한(PATCH /channels/{id}/messages/{id})입니다.
multi_message_delay_msinteger800multi_message 모드에서 단락 청크 간 지연 시간입니다.
proxy_urlstring채널별 HTTP/HTTPS/SOCKS5 프록시입니다.
notification_channel_idstring"discord"를 대상으로 하는 워크플로 notify 단계에 사용할 채널 ID입니다.

추가 후 시작합니다.

Terminal window
revka channel add discord '{"bot_token":"DISCORD-BOT-TOKEN","name":"my-discord"}'
revka daemon

Discord History 채널은 Discord의 별도 변형으로, 자체 [channels_config.discord_history] 키로 구성됩니다. @멘션 메시지만 에이전트로 전달하면서 봇 이외의 모든 메시지를 전용 discord.db 메모리 백엔드에 로깅하여, Revka를 호출 시 응답하는 영구적인 길드 아카이브로 전환합니다. 팀이 봇과 함께 검색 가능한 메시지 히스토리를 원할 때 사용하세요.

[channels_config.discord_history]
bot_token = "DISCORD-BOT-TOKEN" # required
guild_id = "123456789012345678" # optional: restrict logging to one guild
allowed_users = ["*"] # empty = allow all (open logging)
channel_ids = [] # channels to watch; empty = all
store_dms = true # persist DM messages to discord.db
respond_to_dms = true # forward DM @mentions to the agent
# proxy_url = "socks5://127.0.0.1:9050"
필드유형 / 값기본값의미
bot_tokenstring (필수)Discord 개발자 포털에서 발급받은 봇 토큰입니다.
guild_idstring로깅을 단일 길드로 제한합니다.
allowed_userslist[]전체 허용Discord 사용자 ID, 또는 "*"입니다. 참고: 표준 Discord와 달리 여기서 빈 목록은 전체 차단이 아닌 개방형 로깅을 의미합니다.
channel_idslist[] (전체 감시)감시할 채널 ID 목록입니다.
store_dmsbooltrueDM 메시지를 discord.db에 저장합니다.
respond_to_dmsbooltrueDM에서 수신된 @멘션을 에이전트로 전달합니다.
proxy_urlstring채널별 프록시입니다.

discord_search 도구 현재 사용 불가

섹션 제목: “discord_search 도구 ”

discord_search 에이전트 도구는 discord.db History 백엔드를 쿼리하도록 설계되었습니다. 키워드 query에 일치하는 메시지를 반환하며, channel_id 또는 RFC 3339 형식의 since/until 시간 범위로 선택적 필터링이 가능합니다. 도구 코드는 트리에 남아 있지만 현재 연결되지 않은 상태입니다. 의존하던 SQLite 메모리 백엔드가 제거되었고, 해당 도구는 discord 기반 Memory 핸들이 제공될 때만 등록됩니다. Kumiho 그래프 메모리 위에 재도입되기 전까지는 에이전트 도구 목록에 표시되지 않습니다. 현재 세션 간 영구적인 메시지 검색이 필요하다면 Kumiho 메모리 도구를 사용하세요.

Slack은 실시간 이벤트를 위해 앱 수준 토큰(xapp-...)을 사용하는 Socket Mode로 연결되며, 앱 토큰이 없는 경우 conversations.history 폴링으로 대체합니다. chat.update를 통한 드래프트 스트리밍, 반응으로 취소, 타이핑 표시기, 파일 첨부, 퍼머링크 확장을 지원합니다.

[channels_config.slack]
bot_token = "xoxb-..." # required, bot OAuth token
app_token = "xapp-..." # app-level token for Socket Mode
channel_id = "C1234567890" # single channel; "*" or omit = all accessible
channel_ids = ["C123...", "D456..."] # explicit list; takes precedence over channel_id
allowed_users = ["*"] # tighten after testing
thread_replies = true # reply in the originating thread
mention_only = false # require an @mention in groups; DMs always allowed
use_markdown_blocks = true # use the markdown block type (12k char limit)
stream_drafts = false # progressive draft updates via chat.update
draft_update_interval_ms = 1200 # edit throttle for draft streaming
cancel_reaction = "x" # emoji name (no colons) that cancels an in-flight request
interrupt_on_new_message = false # newer message from same sender cancels and restarts
# proxy_url = "socks5://127.0.0.1:9050"
# notification_channel_id = "C1234567890"
필드유형 / 값기본값의미
bot_tokenstring (필수)봇 OAuth 토큰(xoxb-...)입니다.
app_tokenstringSocket Mode를 활성화하는 앱 수준 토큰(xapp-...)입니다. 없으면 Slack은 폴링으로 대체됩니다.
channel_idstring단일 채널 ID입니다. 생략하거나 "*"를 사용하면 접근 가능한 모든 채널을 자동 검색합니다.
channel_idslist[]감시할 채널/DM ID 명시 목록입니다. channel_id보다 우선합니다.
allowed_userslist[] (전체 차단)Slack 사용자 ID, 또는 "*"입니다.
thread_repliesbooltrue원본 스레드에 답장합니다. false이면 채널 루트에 게시됩니다.
mention_onlyboolfalse그룹에서 @멘션을 요구합니다. DM은 항상 허용됩니다.
use_markdown_blocksboolfalsesection 블록(3,000자) 대신 최신 markdown 블록 유형(12,000자 제한)을 사용합니다. 워크스페이스가 지원하는 경우에만 활성화하세요.
stream_draftsboolfalsechat.update를 통한 점진적 드래프트 스트리밍을 활성화합니다.
draft_update_interval_msinteger1200드래프트 스트리밍 중 편집 속도 제한입니다.
cancel_reactionstring사용자가 반응하면 진행 중인 요청을 취소하는 이모지 이름(콜론 없이), 예: "x". 비활성화하려면 설정하지 마세요.
interrupt_on_new_messageboolfalse동일한 채널에서 동일한 발신자의 새 메시지가 오면 진행 중인 요청을 취소하고 히스토리를 유지한 채 재시작합니다.
proxy_urlstring채널별 프록시입니다.
notification_channel_idstring"slack"을 대상으로 하는 워크플로 notify 단계 및 승인 프롬프트에 사용할 채널 ID입니다.

추가 후 시작합니다.

Terminal window
revka channel add slack '{"bot_token":"xoxb-...","app_token":"xapp-...","name":"my-slack"}'
revka daemon

인바운드 Slack 메시지에 다른 Slack 메시지 링크가 포함되어 있으면, Revka는 이를 해석하여 에이전트가 별도의 도구 호출 없이 참조된 콘텐츠를 볼 수 있도록 합니다. https://<workspace>.slack.com/archives/<channel>/p<timestamp> 형식의 퍼머링크를 파싱하고 해당 컨텍스트를 가져옵니다.

  • 메시지당 최대 퍼머링크 3개가 확장됩니다(채널 + 타임스탬프 기준 중복 제거).
  • 스레드 퍼머링크는 주변 답장을 최대 최근 20개까지 가져오며, 이전 답장은 … N earlier thread messages omitted …로 요약됩니다.
  • 확장된 전체 콘텐츠는 메시지당 최대 8,000자로 제한됩니다.

확장은 투명하게 처리됩니다. 확인된 Message: 또는 Thread: 텍스트가 에이전트가 읽는 내용 앞에 추가됩니다. 이 기능은 Slack 외 URL을 위한 크로스 채널 링크 인리처와 함께 사용하면 효과적입니다.