콘텐츠로 이동

채널 개요

채널 트레이트 모델, 전달 모드, 허용 목록 의미론, 빌드 기능 플래그 매트릭스.

채널은 Revka 에이전트가 메시징 플랫폼, 음성 시스템, 자동화 엔드포인트를 통해 사람들과 연결하는 방식입니다. Revka는 단일 통합 서브시스템을 통해 37개의 채널에 연결합니다. 모든 채널은 하나의 Channel 트레이트를 구현하고, ~/.revka/config.toml[channels_config] 네임스페이스 아래에 설정되며, 발신자별 대화 기록 관리, 동시 메시지 처리, 지수 백오프 재연결을 제공하는 수퍼바이저에 의해 관리됩니다.

이 페이지는 해당 서브시스템의 레퍼런스 허브입니다. 채널 트레이트와 선택적 기능, 각 채널의 메시지 수신 방식(그리고 공개 주소가 필요한 채널), 허용 목록을 통한 수신 발신자 제어, 사용자가 실행할 수 있는 채팅 내 명령어, 그리고 선택적 채널을 빌드 시 제어하는 Cargo 기능 플래그를 다룹니다.

첫 번째 채널을 연결하고 싶다면 메시징 채널 연결하기에서 시작하세요. 플랫폼별 설정은 이 페이지 하단의 카탈로그 페이지로 이동하세요.

모든 채널은 ~/.revka/config.toml[channels_config] 아래에 해당 서브 테이블을 추가하여 활성화합니다. 가장 간단한 채널은 자격 증명이 필요 없는 내장 CLI 채널입니다.

[channels_config]
cli = true

각 플랫폼은 해당 플랫폼의 자격 증명과 옵션을 가진 자체 테이블을 추가합니다. 예를 들어 [channels_config.telegram]은 다음과 같습니다.

[channels_config.telegram]
bot_token = "123456:TELEGRAM-TOKEN"
allowed_users = ["myusername"]
stream_mode = "off"
mention_only = false

채널은 revka daemon (게이트웨이 + 채널 + 하트비트 + 크론) 내에서 실행되거나 revka channel start로 독립 실행할 수 있습니다. 채널은 대시보드와 API만 제공하는 단독 revka gateway에서는 실행되지 않습니다. 수퍼바이저는 충돌이 발생한 채널 태스크를 자동으로 재시작하고 재연결 시 지수 백오프를 적용합니다.

모든 채널은 Channel 트레이트를 구현합니다. 필수 메서드인 sendlisten 외에 모든 기능은 선택 사항이며 기본적으로 no-op이므로, 채널은 자신의 플랫폼이 지원하는 기능만 노출합니다. 이것이 스트리밍, 리액션, 고정 기능이 Discord와 Slack에서는 작동하지만 IRC나 이메일에서는 아무런 오류 없이 제공되지 않는 이유입니다.

기능목적구현 채널
send()아웃바운드 메시지 전달전체
listen()인바운드 메시지 루프전체 (웹훅 채널의 경우 keepalive no-op)
health_check()revka channel doctor용 활성 상태 검사일부 (Discord, Slack, Mattermost 등)
start_typing() / stop_typing()입력 중 표시Telegram, Discord, Slack, Mattermost, Matrix
supports_draft_updates()점진적 편집 스트리밍Telegram(부분), Discord, Slack, Matrix
supports_multi_message_streaming()문단 분할 전달Discord, Matrix
send_draft() / update_draft() / finalize_draft() / cancel_draft()드래프트 라이프사이클Telegram, Discord, Slack, Matrix
update_draft_progress()도구 실행 상태 업데이트Slack, Matrix
add_reaction() / remove_reaction()이모지 반응Discord, Telegram (ack), Slack, Matrix
pin_message() / unpin_message()메시지 고정Matrix (Voice Call)
redact_message()메시지 삭제Matrix

드래프트 업데이트를 지원하는 채널은 최대 세 가지 값을 가지는 stream_mode 설정 키를 노출합니다. 모든 채널이 모든 모드를 지원하는 것은 아닙니다. Slack은 예외적으로 stream_mode 대신 불리언 stream_drafts 키를 사용하며, off/partial 방식의 드래프트 스트리밍만 지원합니다 — Slack에는 multi_message 모드가 없습니다.

stream_mode동작지원 채널
off생성이 완료된 후 전체 응답을 한 번에 전송합니다.모든 스트리밍 지원 채널 (Telegram 기본값)
partial편집 가능한 드래프트 메시지가 게시되고 모델 스트리밍 중 토큰 단위로 업데이트된 후 최종 확정됩니다. 편집 스로틀은 draft_update_interval_ms입니다.Telegram, Discord, Slack, Matrix
multi_message토큰이 도착하는 대로 문단 경계(\n\n)에서 분할된 별도 메시지로 응답이 전달됩니다. 코드 펜스는 분할되지 않습니다. 속도는 multi_message_delay_ms로 설정합니다.Discord, Matrix
[channels_config.discord]
bot_token = "DISCORD-BOT-TOKEN"
stream_mode = "multi_message" # off | partial | multi_message
draft_update_interval_ms = 1000 # edit throttle for partial mode
multi_message_delay_ms = 800 # delay between paragraph sends in multi_message mode

채널이 인바운드 메시지를 수신하는 방식에 따라 공개 주소의 필요 여부가 결정됩니다. 폴링/아웃바운드 연결 채널은 Revka에서 직접 연결을 시작하며(롱폴링, WebSocket/게이트웨이, 주기적 REST), 공개 포트 없이 NAT 뒤에서도 작동합니다. 웹훅/푸시 채널은 플랫폼이 도달 가능한 HTTPS 콜백 URL로 이벤트를 POST해야 합니다.

채널수신 방식공개 인바운드 포트 필요 여부기능 플래그
CLIstdin아니오
Telegram롱폴링아니오
Discord게이트웨이 WebSocket아니오
Slack소켓 모드 / 폴링아니오
MattermostREST 폴링아니오
Matrixsync API (E2EE)아니오channel-matrix
Signalsignal-cli SSE 브릿지아니오
WhatsApp Cloud API웹훅 (푸시)
WhatsApp WebWebSocket (wa-rs)아니오whatsapp-web
IRCTLS 소켓아니오
Nostr릴레이 WebSocket아니오channel-nostr
Bluesky폴링아니오
Twitter / X필터 스트림아니오
Reddit폴링아니오
Notion폴링아니오
Lark / FeishuWebSocket (기본) 또는 웹훅웹훅 모드만 해당channel-lark
DingTalk스트림 모드 WS아니오
WeCom아웃바운드 전용 (웹훅)아니오
WATI웹훅 (푸시)
QQ봇 게이트웨이 WS아니오
Mochat폴링아니오
Nextcloud Talk웹훅 (푸시)
Linq웹훅 (푸시)
iMessagemacOS AppleScript아니오 (macOS 전용)
Email (IMAP)IMAP IDLE아니오
Gmail PushPub/Sub 웹훅
Generic WebhookHTTP 서버대부분 예
MQTT브로커 구독자아니오 (아웃바운드 연결)
Voice Call텔레포니 웹훅
Voice Wake마이크 캡처아니오voice-wake
ACP Serverstdio JSON-RPC아니오

모든 인바운드 채널은 발신자 허용 목록을 적용하며, 그 의미론은 플랫폼 전반에서 일관됩니다.

  • 빈 목록 [] → 모두 거부. 이것이 기본값입니다 — 새로 추가된 채널은 연결되어 수신 대기하지만 신원을 추가하기 전까지 모든 메시지를 무시합니다.
  • 단일 항목 "*" → 모든 발신자를 허용합니다. 임시 인증 목적으로만 사용하세요.
  • 명시적 목록 → 나열된 발신자만 허용합니다.

각 플랫폼은 발신자를 식별하는 방식이 다르기 때문에 필드 이름도 채널마다 다릅니다.

채널허용 목록 필드
Telegram, Discord, Slack, Mattermost, Matrix, IRC, Lark, Feishu, DingTalk, QQ, Nextcloud Talk, WeCom, Mochat, Twitterallowed_users
Signalallowed_from
WhatsApp (Cloud API & Web), WATIallowed_numbers
Email, Linq, Gmail Pushallowed_senders
iMessageallowed_contacts
Nostrallowed_pubkeys
ClawdTalkallowed_destinations

Telegram의 경우 허용 목록에 추가하는 CLI 헬퍼가 있습니다.

Terminal window
revka channel bind-telegram revka_user # by username (no leading @)
revka channel bind-telegram 123456789 # by numeric user ID

다른 모든 채널은 config.toml에서 해당 허용 목록 필드를 직접 편집하세요. 응답이 정상적으로 수신됨을 확인한 후 "*"를 명시적 신원으로 교체하세요.

텍스트 명령어를 수신하는 채널(특히 TelegramDiscord)에서 허용 목록에 등록된 사용자는 CLI 없이, 재시작 없이 세션을 인라인으로 제어할 수 있습니다. 이는 채팅 명령어이며, revka 서브커맨드가 아닙니다.

명령어동작
/models사용 가능한 프로바이더와 현재 선택 항목 표시
/models <provider>현재 발신자 세션의 프로바이더 변경
/model현재 모델 표시 (캐시된 모델 ID가 있는 경우 함께 표시)
/model <model-id>현재 발신자 세션의 모델 변경
/new대화 기록을 지우고 새 세션 시작

프로바이더 또는 모델을 변경하면 크로스 모델 컨텍스트 오염을 방지하기 위해 해당 발신자의 인메모리 대화 기록만 초기화됩니다. /new는 프로바이더나 모델을 변경하지 않고 기록만 초기화합니다. 모델 목록은 revka models refresh --provider <ID>로 갱신됩니다. CLI 채널은 인터랙티브 터미널 세션을 종료하기 위한 /quit/exit도 추가로 지원합니다.

대부분의 채널은 모든 빌드에 컴파일됩니다. 일부 채널은 무거운 의존성을 가져오므로 Cargo 기능 플래그 뒤에 게이트됩니다 — 기본 빌드에는 포함되지 않으며 컴파일 시점에 명시적으로 활성화해야 합니다.

기능 플래그활성화 대상비고
channel-matrixMatrix (Client-Server API, E2EE)matrix-sdk를 가져옵니다.
channel-larkLark 및 Feishuchannel-feishuchannel-lark의 별칭입니다 — Lark와 Feishu는 동일한 플랫폼입니다.
channel-nostrNostr (NIP-04 / NIP-17)nostr-sdk를 가져옵니다.
whatsapp-webWhatsApp Web 모드 (wa-rs)WhatsApp Cloud API 모드는 플래그가 필요 없으며, 네이티브 Web 클라이언트만 게이트됩니다.
voice-wake로컬 마이크 웨이크워드 감지cpal을 사용하며, Linux에서는 libasound2-dev가 필요합니다.

빌드 또는 체크 시 --features로 활성화하세요.

Terminal window
# Matrix
cargo build --release --locked --features channel-matrix
# Matrix + Lark together
cargo build --release --locked --features channel-matrix,channel-lark
# WhatsApp Web mode
cargo build --release --locked --features whatsapp-web

전체 Cargo 기능 카탈로그와 아키텍처 결정 레코드는 Cargo 기능 플래그 및 ADR을 참조하세요.

revka channelconfig.toml을 직접 편집하지 않고 채널을 관리하기 위한 커맨드라인 인터페이스입니다. 서브커맨드 목록은 다음과 같습니다.

서브커맨드동작
revka channel list설정된 모든 채널 나열
revka channel start설정된 모든 채널 시작
revka channel doctor설정된 모든 채널에 대해 health_check() 실행
revka channel add <type> <config_json>인라인 JSON 설정 블롭으로 채널 추가
revka channel remove <name>설정 이름으로 채널 제거
revka channel bind-telegram <identity>Telegram 사용자명(@ 없이) 또는 숫자 사용자 ID를 허용 목록에 추가
revka channel send <message> --channel-id <NAME> --recipient <TARGET>일회성 메시지 전송

revka channel addtelegram, discord, slack, whatsapp, matrix, imessage, email 타입을 지원하며, 그 외 채널은 config.toml을 직접 편집하거나 온보딩 마법사 (revka onboard --channels-only)를 통해 설정합니다.

Terminal window
# Inspect, then start, the configured channels
revka channel list
revka channel start
# Add a Telegram bot and allowlist yourself
revka channel add telegram '{"bot_token":"123456:TELEGRAM-TOKEN","name":"my-bot"}'
revka channel bind-telegram 123456789
# Health-check everything when a channel looks stuck
revka channel doctor
# Send a scripted alert through a channel and exit
revka channel send 'Nightly backup completed.' --channel-id slack --recipient C1234567890

revka channel send는 단일 메시지를 전달하고 종료합니다 — 스크립트 기반 알림(센서 경보, 크론 결과, 배포 알림)을 위해 설계되었습니다. --channel-id는 채널의 설정 이름이고, --recipient는 플랫폼별 대상입니다. 전체 CLI 레퍼런스는 revka channel & integrations를 참조하세요.

채널이 실행 중일 때, 채널 런타임은 config.toml을 감시하고 다음 인바운드 메시지 시점에 데몬 재시작 없이 정해진 변경 사항을 즉시 적용합니다.

  • default_provider
  • default_model
  • default_temperature
  • api_key / api_url
  • reliability.*

그 외의 변경 사항 — 채널 추가 또는 제거, 토큰 교체, 허용 목록 편집 — 은 핫 리로드되지 않습니다. 변경 사항을 적용하려면 채널(revka channel start)이나 데몬을 재시작하세요. 핫 리로드는 데몬 아래의 채널 런타임에 적용되며, 인터랙티브 revka agent 세션에는 적용되지 않습니다.

채널은 연결되는데 응답이 없다면 원인은 거의 항상 다음 중 하나입니다. 발신자가 올바른 허용 목록 필드에 없는 경우, 봇이 대상 룸이나 채널의 멤버십/권한이 없는 경우, 토큰이 유효하지 않거나 만료된 경우, 웹훅 채널에 도달 가능한 HTTPS 콜백이 없는 경우, 또는 설정 변경 후 데몬을 재시작하지 않은 경우입니다. 채널별 상태 확인은 revka channel doctor, 전체 시스템 진단은 revka doctor를 실행하세요.

플랫폼별 설정 세부 사항, 설정 키, 플랫폼별 참고 사항은 아래 카탈로그 페이지에서 확인하세요.