채널 개요
채널 트레이트 모델, 전달 모드, 허용 목록 의미론, 빌드 기능 플래그 매트릭스.
채널은 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 트레이트를 구현합니다. 필수 메서드인 send와 listen 외에 모든 기능은 선택 사항이며 기본적으로 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_messagedraft_update_interval_ms = 1000 # edit throttle for partial modemulti_message_delay_ms = 800 # delay between paragraph sends in multi_message mode전달 모드 요약
섹션 제목: “전달 모드 요약”채널이 인바운드 메시지를 수신하는 방식에 따라 공개 주소의 필요 여부가 결정됩니다. 폴링/아웃바운드 연결 채널은 Revka에서 직접 연결을 시작하며(롱폴링, WebSocket/게이트웨이, 주기적 REST), 공개 포트 없이 NAT 뒤에서도 작동합니다. 웹훅/푸시 채널은 플랫폼이 도달 가능한 HTTPS 콜백 URL로 이벤트를 POST해야 합니다.
| 채널 | 수신 방식 | 공개 인바운드 포트 필요 여부 | 기능 플래그 |
|---|---|---|---|
| CLI | stdin | 아니오 | — |
| Telegram | 롱폴링 | 아니오 | — |
| Discord | 게이트웨이 WebSocket | 아니오 | — |
| Slack | 소켓 모드 / 폴링 | 아니오 | — |
| Mattermost | REST 폴링 | 아니오 | — |
| Matrix | sync API (E2EE) | 아니오 | channel-matrix |
| Signal | signal-cli SSE 브릿지 | 아니오 | — |
| WhatsApp Cloud API | 웹훅 (푸시) | 예 | — |
| WhatsApp Web | WebSocket (wa-rs) | 아니오 | whatsapp-web |
| IRC | TLS 소켓 | 아니오 | — |
| Nostr | 릴레이 WebSocket | 아니오 | channel-nostr |
| Bluesky | 폴링 | 아니오 | — |
| Twitter / X | 필터 스트림 | 아니오 | — |
| 폴링 | 아니오 | — | |
| Notion | 폴링 | 아니오 | — |
| Lark / Feishu | WebSocket (기본) 또는 웹훅 | 웹훅 모드만 해당 | channel-lark |
| DingTalk | 스트림 모드 WS | 아니오 | — |
| WeCom | 아웃바운드 전용 (웹훅) | 아니오 | — |
| WATI | 웹훅 (푸시) | 예 | — |
| 봇 게이트웨이 WS | 아니오 | — | |
| Mochat | 폴링 | 아니오 | — |
| Nextcloud Talk | 웹훅 (푸시) | 예 | — |
| Linq | 웹훅 (푸시) | 예 | — |
| iMessage | macOS AppleScript | 아니오 (macOS 전용) | — |
| Email (IMAP) | IMAP IDLE | 아니오 | — |
| Gmail Push | Pub/Sub 웹훅 | 예 | — |
| Generic Webhook | HTTP 서버 | 대부분 예 | — |
| MQTT | 브로커 구독자 | 아니오 (아웃바운드 연결) | — |
| Voice Call | 텔레포니 웹훅 | 예 | — |
| Voice Wake | 마이크 캡처 | 아니오 | voice-wake |
| ACP Server | stdio JSON-RPC | 아니오 | — |
허용 목록 필드 레퍼런스
섹션 제목: “허용 목록 필드 레퍼런스”모든 인바운드 채널은 발신자 허용 목록을 적용하며, 그 의미론은 플랫폼 전반에서 일관됩니다.
- 빈 목록
[]→ 모두 거부. 이것이 기본값입니다 — 새로 추가된 채널은 연결되어 수신 대기하지만 신원을 추가하기 전까지 모든 메시지를 무시합니다. - 단일 항목
"*"→ 모든 발신자를 허용합니다. 임시 인증 목적으로만 사용하세요. - 명시적 목록 → 나열된 발신자만 허용합니다.
각 플랫폼은 발신자를 식별하는 방식이 다르기 때문에 필드 이름도 채널마다 다릅니다.
| 채널 | 허용 목록 필드 |
|---|---|
| Telegram, Discord, Slack, Mattermost, Matrix, IRC, Lark, Feishu, DingTalk, QQ, Nextcloud Talk, WeCom, Mochat, Twitter | allowed_users |
| Signal | allowed_from |
| WhatsApp (Cloud API & Web), WATI | allowed_numbers |
| Email, Linq, Gmail Push | allowed_senders |
| iMessage | allowed_contacts |
| Nostr | allowed_pubkeys |
| ClawdTalk | allowed_destinations |
Telegram의 경우 허용 목록에 추가하는 CLI 헬퍼가 있습니다.
revka channel bind-telegram revka_user # by username (no leading @)revka channel bind-telegram 123456789 # by numeric user ID다른 모든 채널은 config.toml에서 해당 허용 목록 필드를 직접 편집하세요. 응답이 정상적으로 수신됨을 확인한 후 "*"를 명시적 신원으로 교체하세요.
채팅 내 런타임 명령어
섹션 제목: “채팅 내 런타임 명령어”텍스트 명령어를 수신하는 채널(특히 Telegram과 Discord)에서 허용 목록에 등록된 사용자는 CLI 없이, 재시작 없이 세션을 인라인으로 제어할 수 있습니다. 이는 채팅 명령어이며, revka 서브커맨드가 아닙니다.
| 명령어 | 동작 |
|---|---|
/models | 사용 가능한 프로바이더와 현재 선택 항목 표시 |
/models <provider> | 현재 발신자 세션의 프로바이더 변경 |
/model | 현재 모델 표시 (캐시된 모델 ID가 있는 경우 함께 표시) |
/model <model-id> | 현재 발신자 세션의 모델 변경 |
/new | 대화 기록을 지우고 새 세션 시작 |
프로바이더 또는 모델을 변경하면 크로스 모델 컨텍스트 오염을 방지하기 위해 해당 발신자의 인메모리 대화 기록만 초기화됩니다. /new는 프로바이더나 모델을 변경하지 않고 기록만 초기화합니다. 모델 목록은 revka models refresh --provider <ID>로 갱신됩니다. CLI 채널은 인터랙티브 터미널 세션을 종료하기 위한 /quit과 /exit도 추가로 지원합니다.
빌드 기능 플래그
섹션 제목: “빌드 기능 플래그”대부분의 채널은 모든 빌드에 컴파일됩니다. 일부 채널은 무거운 의존성을 가져오므로 Cargo 기능 플래그 뒤에 게이트됩니다 — 기본 빌드에는 포함되지 않으며 컴파일 시점에 명시적으로 활성화해야 합니다.
| 기능 플래그 | 활성화 대상 | 비고 |
|---|---|---|
channel-matrix | Matrix (Client-Server API, E2EE) | matrix-sdk를 가져옵니다. |
channel-lark | Lark 및 Feishu | channel-feishu는 channel-lark의 별칭입니다 — Lark와 Feishu는 동일한 플랫폼입니다. |
channel-nostr | Nostr (NIP-04 / NIP-17) | nostr-sdk를 가져옵니다. |
whatsapp-web | WhatsApp Web 모드 (wa-rs) | WhatsApp Cloud API 모드는 플래그가 필요 없으며, 네이티브 Web 클라이언트만 게이트됩니다. |
voice-wake | 로컬 마이크 웨이크워드 감지 | cpal을 사용하며, Linux에서는 libasound2-dev가 필요합니다. |
빌드 또는 체크 시 --features로 활성화하세요.
# Matrixcargo build --release --locked --features channel-matrix
# Matrix + Lark togethercargo build --release --locked --features channel-matrix,channel-lark
# WhatsApp Web modecargo build --release --locked --features whatsapp-web# Quick local check with only hardware supportcargo check --features hardware
# Add Matrix when neededcargo check --features hardware,channel-matrixsetup.bat --minimal :: default featuressetup.bat --standard :: Matrix + Lark/Feishusetup.bat --full :: all features전체 Cargo 기능 카탈로그와 아키텍처 결정 레코드는 Cargo 기능 플래그 및 ADR을 참조하세요.
CLI 채널
섹션 제목: “CLI 채널”revka channel은 config.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 add는 telegram, discord, slack, whatsapp, matrix, imessage, email 타입을 지원하며, 그 외 채널은 config.toml을 직접 편집하거나 온보딩 마법사 (revka onboard --channels-only)를 통해 설정합니다.
# Inspect, then start, the configured channelsrevka channel listrevka channel start
# Add a Telegram bot and allowlist yourselfrevka channel add telegram '{"bot_token":"123456:TELEGRAM-TOKEN","name":"my-bot"}'revka channel bind-telegram 123456789
# Health-check everything when a channel looks stuckrevka channel doctor
# Send a scripted alert through a channel and exitrevka channel send 'Nightly backup completed.' --channel-id slack --recipient C1234567890revka channel send는 단일 메시지를 전달하고 종료합니다 — 스크립트 기반 알림(센서 경보, 크론 결과, 배포 알림)을 위해 설계되었습니다. --channel-id는 채널의 설정 이름이고, --recipient는 플랫폼별 대상입니다. 전체 CLI 레퍼런스는 revka channel & integrations를 참조하세요.
핫 리로드
섹션 제목: “핫 리로드”채널이 실행 중일 때, 채널 런타임은 config.toml을 감시하고 다음 인바운드 메시지 시점에 데몬 재시작 없이 정해진 변경 사항을 즉시 적용합니다.
default_providerdefault_modeldefault_temperatureapi_key/api_urlreliability.*
그 외의 변경 사항 — 채널 추가 또는 제거, 토큰 교체, 허용 목록 편집 — 은 핫 리로드되지 않습니다. 변경 사항을 적용하려면 채널(revka channel start)이나 데몬을 재시작하세요. 핫 리로드는 데몬 아래의 채널 런타임에 적용되며, 인터랙티브 revka agent 세션에는 적용되지 않습니다.
채널 검증
섹션 제목: “채널 검증”채널은 연결되는데 응답이 없다면 원인은 거의 항상 다음 중 하나입니다. 발신자가 올바른 허용 목록 필드에 없는 경우, 봇이 대상 룸이나 채널의 멤버십/권한이 없는 경우, 토큰이 유효하지 않거나 만료된 경우, 웹훅 채널에 도달 가능한 HTTPS 콜백이 없는 경우, 또는 설정 변경 후 데몬을 재시작하지 않은 경우입니다. 채널별 상태 확인은 revka channel doctor, 전체 시스템 진단은 revka doctor를 실행하세요.
채널 카탈로그
섹션 제목: “채널 카탈로그”플랫폼별 설정 세부 사항, 설정 키, 플랫폼별 참고 사항은 아래 카탈로그 페이지에서 확인하세요.
관련 페이지
섹션 제목: “관련 페이지”- 메시징 채널 연결하기 — 첫 번째 채널을 설정하는 엔드투엔드 가이드.
- revka channel & integrations — 채널 서브커맨드의 전체 CLI 레퍼런스.
- Config: channels, tools & integrations — 채널 설정 키.
- Cargo 기능 플래그 및 ADR — 전체 빌드 기능 카탈로그.
- 터널로 게이트웨이 노출하기 — 공개 콜백이 필요한 웹훅 채널에 적용.
- 웹훅 인그레스 — 게이트웨이 웹훅 API.
- revka gateway, daemon & service — 채널을 상시 실행 데몬의 일부로 운영하기.
- 보안 모델 — 허용 목록 기본값 뒤의 신뢰 모델.