Mainstream messaging
상태: WhatsApp Web(Baileys)을 통해 프로덕션 준비 완료. Gateway가 연결된 세션을 소유합니다.
설치(필요 시)
- 온보딩(
openclaw onboard) 및openclaw channels add --channel whatsapp는 처음 선택할 때 WhatsApp Plugin 설치를 안내합니다. openclaw channels login --channel whatsapp도 아직 Plugin이 없으면 설치 흐름을 제공합니다.- 개발 채널 + git 체크아웃: 기본값은 로컬 Plugin 경로입니다.
- Stable/Beta: 현재 공식 릴리스 태그의 npm 패키지
@openclaw/whatsapp를 사용합니다.
수동 설치도 계속 사용할 수 있습니다.
openclaw plugins install @openclaw/whatsapp
현재 공식 릴리스 태그를 따르려면 기본 패키지를 사용하세요. 재현 가능한 설치가 필요할 때만 정확한 버전을 고정하세요.
Windows에서는 WhatsApp Plugin이 npm 설치 중 PATH의 Git을 필요로 합니다. Baileys/libsignal 종속성 중
하나가 git URL에서 가져와지기 때문입니다. Git for Windows를 설치한 다음,
셸을 다시 시작하고 설치를 다시 실행하세요.
winget install --id Git.Git -e
Portable Git도 해당 bin 디렉터리가 PATH에 있으면 작동합니다.
알 수 없는 발신자의 기본 DM 정책은 페어링입니다.
채널 간 진단 및 복구 플레이북입니다.
전체 채널 구성 패턴과 예시입니다.
빠른 설정
Configure WhatsApp access policy
{
channels: {
whatsapp: {
dmPolicy: "pairing",
allowFrom: ["+15551234567"],
groupPolicy: "allowlist",
groupAllowFrom: ["+15551234567"],
},
},
}
Link WhatsApp (QR)
openclaw channels login --channel whatsapp
특정 계정의 경우:
openclaw channels login --channel whatsapp --account work
로그인 전에 기존/사용자 지정 WhatsApp Web 인증 디렉터리를 연결하려면:
openclaw channels add --channel whatsapp --account work --auth-dir /path/to/wa-auth
openclaw channels login --channel whatsapp --account work
Start the gateway
openclaw gateway
Approve first pairing request (if using pairing mode)
openclaw pairing list whatsapp
openclaw pairing approve whatsapp <CODE>
페어링 요청은 1시간 후 만료됩니다. 보류 중인 요청은 채널당 3개로 제한됩니다.
배포 패턴
Dedicated number (recommended)
가장 깔끔한 운영 모드입니다.
- OpenClaw용 별도 WhatsApp ID
- 더 명확한 DM 허용 목록과 라우팅 경계
- 셀프 채팅 혼동 가능성 감소
최소 정책 패턴:
{
channels: {
whatsapp: {
dmPolicy: "allowlist",
allowFrom: ["+15551234567"],
},
},
}
Personal-number fallback
온보딩은 개인 번호 모드를 지원하며 셀프 채팅 친화적인 기준 구성을 작성합니다.
dmPolicy: "allowlist"allowFrom에 개인 번호 포함selfChatMode: true
런타임에서는 셀프 채팅 보호가 연결된 자기 번호와 allowFrom을 기준으로 작동합니다.
WhatsApp Web-only channel scope
메시징 플랫폼 채널은 현재 OpenClaw 채널 아키텍처에서 WhatsApp Web 기반(Baileys)입니다.
기본 제공 채팅 채널 레지스트리에는 별도의 Twilio WhatsApp 메시징 채널이 없습니다.
런타임 모델
- Gateway가 WhatsApp 소켓과 재연결 루프를 소유합니다.
- 재연결 watchdog은 인바운드 앱 메시지 양만이 아니라 WhatsApp Web 전송 활동을 사용하므로, 조용한 연결된 기기 세션은 최근 메시지를 보낸 사람이 없다는 이유만으로 다시 시작되지 않습니다. 더 긴 애플리케이션 침묵 상한은 전송 프레임이 계속 도착하지만 watchdog 창 동안 처리된 애플리케이션 메시지가 없을 때 여전히 재연결을 강제합니다. 최근 활성 세션의 일시적 재연결 후에는 해당 애플리케이션 침묵 검사가 첫 복구 창에 정상 메시지 제한 시간을 사용합니다.
- Baileys 소켓 타이밍은
web.whatsapp.*아래에서 명시적입니다.keepAliveIntervalMs는 WhatsApp Web 애플리케이션 ping을 제어하고,connectTimeoutMs는 열기 핸드셰이크 제한 시간을 제어하며,defaultQueryTimeoutMs는 Baileys 쿼리 제한 시간을 제어합니다. - 아웃바운드 전송에는 대상 계정에 대한 활성 WhatsApp 리스너가 필요합니다.
- 그룹 전송은 텍스트와 미디어 캡션의
@+<digits>및@<digits>토큰에 대해, 토큰이 LID 기반 그룹을 포함한 현재 WhatsApp 참가자 메타데이터와 일치할 때 네이티브 멘션 메타데이터를 첨부합니다. - 상태 및 브로드캐스트 채팅은 무시됩니다(
@status,@broadcast). - 재연결 watchdog은 인바운드 앱 메시지 양만이 아니라 WhatsApp Web 전송 활동을 따릅니다. 조용한 연결된 기기 세션은 전송 프레임이 계속되는 동안 유지되지만, 전송 중단은 더 늦은 원격 연결 해제 경로보다 훨씬 전에 재연결을 강제합니다.
- 직접 채팅은 DM 세션 규칙을 사용합니다(
session.dmScope; 기본값main은 DM을 에이전트 기본 세션으로 합칩니다). - 그룹 세션은 격리됩니다(
agent:<agentId>:whatsapp:group:<jid>). - WhatsApp Channels/Newsletters는 네이티브
@newsletterJID로 명시적 아웃바운드 대상이 될 수 있습니다. 아웃바운드 뉴스레터 전송은 DM 세션 의미 체계가 아니라 채널 세션 메타데이터(agent:<agentId>:whatsapp:channel:<jid>)를 사용합니다. - WhatsApp Web 전송은 Gateway 호스트의 표준 프록시 환경 변수(
HTTPS_PROXY,HTTP_PROXY,NO_PROXY/ 소문자 변형)를 따릅니다. 채널별 WhatsApp 프록시 설정보다는 호스트 수준 프록시 구성을 선호하세요. messages.removeAckAfterReply가 활성화되면, OpenClaw는 표시되는 답장이 전달된 후 WhatsApp ack 반응을 지웁니다.
Plugin 훅과 개인정보 보호
WhatsApp 인바운드 메시지에는 개인 메시지 내용, 전화번호,
그룹 식별자, 발신자 이름, 세션 상관 필드가 포함될 수 있습니다. 이러한 이유로
WhatsApp은 명시적으로 옵트인하지 않는 한 인바운드 message_received 훅 페이로드를 Plugin에
브로드캐스트하지 않습니다.
{
channels: {
whatsapp: {
pluginHooks: {
messageReceived: true,
},
},
},
}
옵트인을 하나의 계정으로 범위 지정할 수 있습니다.
{
channels: {
whatsapp: {
accounts: {
work: {
pluginHooks: {
messageReceived: true,
},
},
},
},
},
}
인바운드 WhatsApp 메시지 내용과 식별자를 수신해도 된다고 신뢰하는 Plugin에만 이를 활성화하세요.
액세스 제어 및 활성화
DM policy
channels.whatsapp.dmPolicy는 직접 채팅 액세스를 제어합니다.
pairing(기본값)allowlistopen(allowFrom에"*"가 포함되어야 함)disabled
allowFrom은 E.164 스타일 번호를 받습니다(내부적으로 정규화됨).
allowFrom은 DM 발신자 액세스 제어 목록입니다. WhatsApp 그룹 JID 또는 @newsletter 채널 JID로의 명시적 아웃바운드 전송을 제한하지 않습니다.
다중 계정 재정의: channels.whatsapp.accounts.<id>.dmPolicy(및 allowFrom)는 해당 계정의 채널 수준 기본값보다 우선합니다.
런타임 동작 세부 정보:
- 페어링은 채널 허용 저장소에 유지되고 구성된
allowFrom과 병합됩니다. - 예약된 자동화와 Heartbeat 수신자 fallback은 명시적 전달 대상 또는 구성된
allowFrom을 사용합니다. DM 페어링 승인은 암시적 Cron 또는 Heartbeat 수신자가 아닙니다. - 허용 목록이 구성되지 않은 경우, 연결된 자기 번호가 기본적으로 허용됩니다.
- OpenClaw는 아웃바운드
fromMeDM(연결된 기기에서 자신에게 보내는 메시지)을 자동 페어링하지 않습니다.
Group policy + allowlists
그룹 액세스에는 두 계층이 있습니다.
-
그룹 멤버십 허용 목록(
channels.whatsapp.groups)groups가 생략되면 모든 그룹이 대상이 될 수 있습니다.groups가 있으면 그룹 허용 목록으로 작동합니다("*"허용).
-
그룹 발신자 정책(
channels.whatsapp.groupPolicy+groupAllowFrom)open: 발신자 허용 목록을 우회합니다.allowlist: 발신자가groupAllowFrom(또는*)과 일치해야 합니다.disabled: 모든 그룹 인바운드를 차단합니다.
발신자 허용 목록 fallback:
groupAllowFrom이 설정되지 않으면, 런타임은 사용 가능한 경우allowFrom으로 fallback합니다.- 발신자 허용 목록은 멘션/답장 활성화 전에 평가됩니다.
참고: channels.whatsapp 블록이 전혀 없으면, 런타임 그룹 정책 fallback은 channels.defaults.groupPolicy가 설정되어 있더라도 allowlist입니다(경고 로그와 함께).
Mentions + /activation
그룹 답장은 기본적으로 멘션이 필요합니다.
멘션 감지에는 다음이 포함됩니다.
- 봇 ID에 대한 명시적 WhatsApp 멘션
- 구성된 멘션 정규식 패턴(
agents.list[].groupChat.mentionPatterns, fallbackmessages.groupChat.mentionPatterns) - 권한이 부여된 그룹 메시지의 인바운드 음성 메모 전사
- 암시적 봇 답장 감지(답장 발신자가 봇 ID와 일치)
보안 참고:
- 인용/답장은 멘션 게이트만 충족합니다. 발신자 권한을 부여하지는 않습니다.
groupPolicy: "allowlist"에서는 허용 목록에 없는 발신자가 허용 목록 사용자의 메시지에 답장하더라도 여전히 차단됩니다.
세션 수준 활성화 명령:
/activation mention/activation always
activation은 세션 상태를 업데이트합니다(전역 구성이 아님). 소유자 게이트가 적용됩니다.
개인 번호 및 셀프 채팅 동작
연결된 자기 번호가 allowFrom에도 있으면, WhatsApp 셀프 채팅 보호가 활성화됩니다.
- 셀프 채팅 턴의 읽음 확인 건너뛰기
- 자신을 ping하게 될 멘션 JID 자동 트리거 동작 무시
messages.responsePrefix가 설정되지 않은 경우, 셀프 채팅 답장은 기본적으로[{identity.name}]또는[openclaw]를 사용합니다.
메시지 정규화 및 컨텍스트
Inbound envelope + reply context
수신 WhatsApp 메시지는 공유 인바운드 envelope로 래핑됩니다.
인용된 답장이 있으면, 컨텍스트가 다음 형식으로 추가됩니다.
[Replying to <sender> id:<stanzaId>]
<quoted body or media placeholder>
[/Replying]
답장 메타데이터 필드도 사용 가능한 경우 채워집니다(ReplyToId, ReplyToBody, ReplyToSender, 발신자 JID/E.164).
인용된 답장 대상이 다운로드 가능한 미디어인 경우, OpenClaw는 이를
일반 인바운드 미디어 저장소를 통해 저장하고 MediaPath/MediaType으로 노출하여
에이전트가 <media:image>만 보는 대신 참조된 이미지를 검사할 수 있게 합니다.
Media placeholders and location/contact extraction
미디어 전용 인바운드 메시지는 다음과 같은 placeholder로 정규화됩니다.
<media:image><media:video><media:audio><media:document><media:sticker>
권한이 부여된 그룹 음성 메모는 본문이 <media:audio>뿐일 때 멘션 게이트 전에 전사되므로,
음성 메모에서 봇 멘션을 말하면 답장을 트리거할 수 있습니다. 전사문이 여전히 봇을 멘션하지 않으면,
원시 placeholder 대신 보류 중인 그룹 기록에 전사문이 유지됩니다.
위치 본문은 간결한 좌표 텍스트를 사용합니다. 위치 레이블/댓글과 연락처/vCard 세부 정보는 인라인 프롬프트 텍스트가 아니라 fenced 신뢰할 수 없는 메타데이터로 렌더링됩니다.
Pending group history injection
그룹의 경우 처리되지 않은 메시지는 버퍼링되었다가 봇이 최종적으로 트리거될 때 컨텍스트로 주입될 수 있습니다.
- 기본 제한:
50 - 설정:
channels.whatsapp.historyLimit - 폴백:
messages.groupChat.historyLimit 0은 비활성화
삽입 마커:
[마지막 답장 이후의 채팅 메시지 - 컨텍스트용][현재 메시지 - 여기에 응답]
읽음 확인
수락된 인바운드 WhatsApp 메시지에는 기본적으로 읽음 확인이 활성화됩니다.
전역으로 비활성화:
{
channels: {
whatsapp: {
sendReadReceipts: false,
},
},
}
계정별 재정의:
{
channels: {
whatsapp: {
accounts: {
work: {
sendReadReceipts: false,
},
},
},
},
}
셀프 채팅 턴은 전역으로 활성화되어 있어도 읽음 확인을 건너뜁니다.
전달, 청킹 및 미디어
텍스트 청킹
- 기본 청크 제한:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"newline모드는 문단 경계(빈 줄)를 우선 사용한 다음, 길이 제한에 안전한 청킹으로 폴백합니다.
아웃바운드 미디어 동작
- 이미지, 비디오, 오디오(PTT 음성 메모), 문서 페이로드를 지원합니다.
- 오디오 미디어는 Baileys
audio페이로드에ptt: true로 전송되므로 WhatsApp 클라이언트가 푸시 투 토크 음성 메모로 렌더링합니다. - 답장 페이로드는
audioAsVoice를 유지합니다. WhatsApp용 TTS 음성 메모 출력은 공급자가 MP3 또는 WebM을 반환하더라도 이 PTT 경로를 계속 사용합니다. - 네이티브 Ogg/Opus 오디오는 음성 메모 호환성을 위해
audio/ogg; codecs=opus로 전송됩니다. - Microsoft Edge TTS MP3/WebM 출력을 포함한 Ogg가 아닌 오디오는 PTT 전달 전에
ffmpeg로 48 kHz 모노 Ogg/Opus로 트랜스코딩됩니다. /tts latest는 최신 어시스턴트 답장을 하나의 음성 메모로 보내고 같은 답장의 반복 전송을 억제합니다./tts chat on|off|default는 현재 WhatsApp 채팅의 자동 TTS를 제어합니다.- 애니메이션 GIF 재생은 비디오 전송 시
gifPlayback: true로 지원됩니다. - 여러 미디어 답장 페이로드를 보낼 때 캡션은 첫 번째 미디어 항목에 적용됩니다. 단, PTT 음성 메모는 WhatsApp 클라이언트가 음성 메모 캡션을 일관되게 렌더링하지 않으므로 오디오를 먼저 보내고 보이는 텍스트를 별도로 보냅니다.
- 미디어 소스는 HTTP(S),
file://또는 로컬 경로일 수 있습니다.
미디어 크기 제한 및 폴백 동작
- 인바운드 미디어 저장 한도:
channels.whatsapp.mediaMaxMb(기본값50) - 아웃바운드 미디어 전송 한도:
channels.whatsapp.mediaMaxMb(기본값50) - 계정별 재정의는
channels.whatsapp.accounts.<accountId>.mediaMaxMb를 사용합니다. - 이미지는 제한에 맞도록 자동 최적화됩니다(크기 조정/품질 스윕).
- 미디어 전송 실패 시 첫 번째 항목 폴백은 응답을 조용히 누락하는 대신 텍스트 경고를 보냅니다.
답장 인용
WhatsApp은 아웃바운드 답장이 인바운드 메시지를 눈에 보이게 인용하는 네이티브 답장 인용을 지원합니다. channels.whatsapp.replyToMode로 제어합니다.
| 값 | 동작 |
|---|---|
"off" |
절대 인용하지 않고 일반 메시지로 전송 |
"first" |
첫 번째 아웃바운드 답장 청크만 인용 |
"all" |
모든 아웃바운드 답장 청크를 인용 |
"batched" |
즉시 답장은 인용하지 않고 대기열에 있는 배치 답장을 인용 |
기본값은 "off"입니다. 계정별 재정의는 channels.whatsapp.accounts.<id>.replyToMode를 사용합니다.
{
channels: {
whatsapp: {
replyToMode: "first",
},
},
}
반응 수준
channels.whatsapp.reactionLevel은 에이전트가 WhatsApp에서 이모지 반응을 얼마나 넓게 사용할지 제어합니다.
| 수준 | 확인 반응 | 에이전트 시작 반응 | 설명 |
|---|---|---|---|
"off" |
아니요 | 아니요 | 반응 없음 |
"ack" |
예 | 아니요 | 확인 반응만(답장 전 수신 확인) |
"minimal" |
예 | 예(보수적) | 보수적 지침이 적용된 확인 + 에이전트 반응 |
"extensive" |
예 | 예(권장) | 권장 지침이 적용된 확인 + 에이전트 반응 |
기본값: "minimal".
계정별 재정의는 channels.whatsapp.accounts.<id>.reactionLevel을 사용합니다.
{
channels: {
whatsapp: {
reactionLevel: "ack",
},
},
}
확인 반응
WhatsApp은 channels.whatsapp.ackReaction을 통해 인바운드 수신 시 즉시 확인 반응을 지원합니다.
확인 반응은 reactionLevel에 의해 제어됩니다. reactionLevel이 "off"이면 억제됩니다.
{
channels: {
whatsapp: {
ackReaction: {
emoji: "👀",
direct: true,
group: "mentions", // always | mentions | never
},
},
},
}
동작 참고 사항:
- 인바운드가 수락된 직후 전송됩니다(답장 전).
- 실패는 기록되지만 정상 답장 전달을 차단하지 않습니다.
- 그룹 모드
mentions는 멘션으로 트리거된 턴에 반응합니다. 그룹 활성화always는 이 확인을 우회합니다. - WhatsApp은
channels.whatsapp.ackReaction을 사용합니다(레거시messages.ackReaction은 여기에서 사용되지 않습니다).
다중 계정 및 자격 증명
계정 선택 및 기본값
- 계정 ID는
channels.whatsapp.accounts에서 가져옵니다. - 기본 계정 선택:
default가 있으면 사용하고, 없으면 구성된 첫 번째 계정 ID(정렬됨)를 사용합니다. - 계정 ID는 조회를 위해 내부적으로 정규화됩니다.
자격 증명 경로 및 레거시 호환성
- 현재 인증 경로:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - 백업 파일:
creds.json.bak ~/.openclaw/credentials/의 레거시 기본 인증은 기본 계정 흐름에서 여전히 인식/마이그레이션됩니다.
로그아웃 동작
openclaw channels logout --channel whatsapp [--account <id>]는 해당 계정의 WhatsApp 인증 상태를 지웁니다.
Gateway에 도달할 수 있으면, 로그아웃은 선택한 계정의 활성 WhatsApp 리스너를 먼저 중지하여 연결된 세션이 다음 재시작까지 메시지를 계속 받지 않게 합니다. openclaw channels remove --channel whatsapp도 계정 설정을 비활성화하거나 삭제하기 전에 활성 리스너를 중지합니다.
레거시 인증 디렉터리에서는 Baileys 인증 파일이 제거되는 동안 oauth.json은 보존됩니다.
도구, 작업 및 설정 쓰기
- 에이전트 도구 지원에는 WhatsApp 반응 작업(
react)이 포함됩니다. - 작업 게이트:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- 채널 시작 설정 쓰기는 기본적으로 활성화됩니다(
channels.whatsapp.configWrites=false로 비활성화).
문제 해결
연결되지 않음(QR 필요)
증상: 채널 상태가 연결되지 않았다고 보고합니다.
해결:
openclaw channels login --channel whatsapp
openclaw channels status
연결되었지만 연결 끊김 / 재연결 루프
증상: 연결된 계정에서 반복적인 연결 끊김 또는 재연결 시도가 발생합니다.
조용한 계정은 일반 메시지 타임아웃을 지나서도 연결 상태를 유지할 수 있습니다. watchdog은 WhatsApp Web 전송 활동이 멈추거나, 소켓이 닫히거나, 애플리케이션 수준 활동이 더 긴 안전 기간을 넘어 조용할 때 다시 시작됩니다.
로그에 반복적인 status=408 Request Time-out Connection was lost가 표시되면 web.whatsapp 아래의 Baileys 소켓 타이밍을 조정하세요. 먼저 keepAliveIntervalMs를 네트워크의 유휴 타임아웃보다 짧게 줄이고, 느리거나 손실이 있는 링크에서는 connectTimeoutMs를 늘리세요.
{
web: {
whatsapp: {
keepAliveIntervalMs: 15000,
connectTimeoutMs: 60000,
defaultQueryTimeoutMs: 60000,
},
},
}
해결:
openclaw doctor
openclaw logs --follow
~/.openclaw/logs/whatsapp-health.log에 Gateway inactive라고 나오지만 openclaw gateway status와 openclaw channels status --probe에서 gateway와 WhatsApp이 정상이라고 표시되면 openclaw doctor를 실행하세요. Linux에서 doctor는 여전히 ~/.openclaw/bin/ensure-whatsapp.sh를 호출하는 레거시 crontab 항목에 대해 경고합니다. cron에는 systemd 사용자 버스 환경이 없을 수 있어 해당 이전 스크립트가 gateway 상태를 잘못 보고할 수 있으므로, crontab -e로 오래된 항목을 제거하세요.
필요한 경우 channels login으로 다시 연결하세요.
프록시 뒤에서 QR 로그인이 타임아웃됨
증상: openclaw channels login --channel whatsapp가 사용 가능한 QR 코드를 표시하기 전에 status=408 Request Time-out 또는 TLS 소켓 연결 끊김으로 실패합니다.
WhatsApp Web 로그인은 gateway 호스트의 표준 프록시 환경(HTTPS_PROXY, HTTP_PROXY, 소문자 변형 및 NO_PROXY)을 사용합니다. gateway 프로세스가 프록시 환경을 상속하는지, 그리고 NO_PROXY가 mmg.whatsapp.net과 일치하지 않는지 확인하세요.
전송 시 활성 리스너 없음
대상 계정에 활성 gateway 리스너가 없으면 아웃바운드 전송이 빠르게 실패합니다.
gateway가 실행 중이고 계정이 연결되어 있는지 확인하세요.
답장이 기록에는 보이지만 WhatsApp에는 보이지 않음
기록 행은 에이전트가 생성한 내용을 기록합니다. WhatsApp 전달은 별도로 확인됩니다. OpenClaw는 Baileys가 하나 이상의 보이는 텍스트 또는 미디어 전송에 대해 아웃바운드 메시지 ID를 반환한 뒤에만 자동 답장이 전송된 것으로 간주합니다.
확인 반응은 독립적인 답장 전 수신 확인입니다. 반응이 성공했다고 해서 이후의 텍스트 또는 미디어 답장이 WhatsApp에 수락되었음을 증명하지는 않습니다.
gateway 로그에서 auto-reply delivery failed 또는 auto-reply was not accepted by WhatsApp provider를 확인하세요.
그룹 메시지가 예기치 않게 무시됨
다음 순서로 확인하세요.
groupPolicygroupAllowFrom/allowFromgroups허용 목록 항목- 멘션 게이팅(
requireMention+ 멘션 패턴) openclaw.json(JSON5)의 중복 키: 나중 항목이 앞선 항목을 재정의하므로 범위마다 하나의groupPolicy만 유지하세요.
Bun 런타임 경고
WhatsApp gateway 런타임은 Node를 사용해야 합니다. Bun은 안정적인 WhatsApp/Telegram gateway 운영에 호환되지 않는 것으로 표시됩니다.
시스템 프롬프트
WhatsApp은 groups 및 direct 맵을 통해 그룹과 직접 채팅에 Telegram 스타일 시스템 프롬프트를 지원합니다.
그룹 메시지의 해석 계층:
유효한 groups 맵이 먼저 결정됩니다. 계정이 자체 groups를 정의하면 루트 groups 맵을 완전히 대체합니다(깊은 병합 없음). 그런 다음 프롬프트 조회가 결과로 나온 단일 맵에서 실행됩니다.
- 그룹별 시스템 프롬프트(
groups["<groupId>"].systemPrompt): 특정 그룹 항목이 맵에 존재하고 그systemPrompt키가 정의되어 있을 때 사용됩니다.systemPrompt가 빈 문자열("")이면 와일드카드는 억제되고 시스템 프롬프트가 적용되지 않습니다. - 그룹 와일드카드 시스템 프롬프트(
groups["*"].systemPrompt): 특정 그룹 항목이 맵에 전혀 없거나, 존재하지만systemPrompt키를 정의하지 않을 때 사용됩니다.
직접 메시지의 해석 계층:
유효한 direct 맵이 먼저 결정됩니다. 계정이 자체 direct를 정의하면 루트 direct 맵을 완전히 대체합니다(깊은 병합 없음). 그런 다음 프롬프트 조회가 결과로 나온 단일 맵에서 실행됩니다.
- 특정 direct 시스템 프롬프트 (
direct["<peerId>"].systemPrompt): 특정 피어 항목이 맵에 존재하고 그리고 그systemPrompt키가 정의되어 있을 때 사용됩니다.systemPrompt가 빈 문자열("")이면 와일드카드가 억제되고 시스템 프롬프트가 적용되지 않습니다. - direct 와일드카드 시스템 프롬프트 (
direct["*"].systemPrompt): 특정 피어 항목이 맵에 전혀 없거나, 존재하지만systemPrompt키를 정의하지 않을 때 사용됩니다.
Telegram 다중 계정 동작과의 차이: Telegram에서는 다중 계정 설정에서 모든 계정에 대해 루트 groups가 의도적으로 억제됩니다. 자체 groups를 정의하지 않은 계정도 포함됩니다. 이는 봇이 속하지 않은 그룹의 그룹 메시지를 받지 못하게 하기 위한 것입니다. WhatsApp은 이 보호 장치를 적용하지 않습니다. 구성된 계정 수와 관계없이, 루트 groups와 루트 direct는 계정 수준 재정의를 정의하지 않은 계정에 항상 상속됩니다. 다중 계정 WhatsApp 설정에서 계정별 그룹 또는 direct 프롬프트를 원한다면 루트 수준 기본값에 의존하지 말고 각 계정 아래에 전체 맵을 명시적으로 정의하세요.
중요 동작:
channels.whatsapp.groups는 그룹별 구성 맵이면서 채팅 수준 그룹 허용 목록입니다. 루트 또는 계정 범위에서groups["*"]는 해당 범위에서 "모든 그룹이 허용됨"을 의미합니다.- 해당 범위에서 이미 모든 그룹을 허용하려는 경우에만 와일드카드 그룹
systemPrompt를 추가하세요. 여전히 고정된 그룹 ID 집합만 대상이 되도록 하려면 프롬프트 기본값에groups["*"]를 사용하지 마세요. 대신 명시적으로 허용 목록에 올린 각 그룹 항목에 프롬프트를 반복해서 지정하세요. - 그룹 허용과 발신자 승인은 별도의 검사입니다.
groups["*"]는 그룹 처리에 도달할 수 있는 그룹 집합을 넓히지만, 그 자체만으로 해당 그룹의 모든 발신자를 승인하지는 않습니다. 발신자 접근은 여전히channels.whatsapp.groupPolicy와channels.whatsapp.groupAllowFrom으로 별도로 제어됩니다. channels.whatsapp.direct에는 DM에 대해 같은 부작용이 없습니다.direct["*"]는 DM이 이미dmPolicy와allowFrom또는 페어링 저장소 규칙에 의해 허용된 뒤에 기본 direct 채팅 구성만 제공합니다.
예:
{
channels: {
whatsapp: {
groups: {
// Use only if all groups should be admitted at the root scope.
// Applies to all accounts that do not define their own groups map.
"*": { systemPrompt: "Default prompt for all groups." },
},
direct: {
// Applies to all accounts that do not define their own direct map.
"*": { systemPrompt: "Default prompt for all direct chats." },
},
accounts: {
work: {
groups: {
// This account defines its own groups, so root groups are fully
// replaced. To keep a wildcard, define "*" explicitly here too.
"[email protected]": {
requireMention: false,
systemPrompt: "Focus on project management.",
},
// Use only if all groups should be admitted in this account.
"*": { systemPrompt: "Default prompt for work groups." },
},
direct: {
// This account defines its own direct map, so root direct entries are
// fully replaced. To keep a wildcard, define "*" explicitly here too.
"+15551234567": { systemPrompt: "Prompt for a specific work direct chat." },
"*": { systemPrompt: "Default prompt for work direct chats." },
},
},
},
},
},
}
구성 참조 포인터
기본 참조:
핵심 WhatsApp 필드:
- 접근:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups - 전달:
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction,reactionLevel - 다중 계정:
accounts.<id>.enabled,accounts.<id>.authDir, 계정 수준 재정의 - 운영:
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.*,web.whatsapp.* - 세션 동작:
session.dmScope,historyLimit,dmHistoryLimit,dms.<id>.historyLimit - 프롬프트:
groups.<id>.systemPrompt,groups["*"].systemPrompt,direct.<id>.systemPrompt,direct["*"].systemPrompt