ForcePilot/backend/package/yuxi/channel/extensions/intercom/monitor.py
Kris 2ddcf1cc55 feat(channel): 添加 Intercom 渠道扩展
新增 Intercom 渠道扩展,支持在 Yuxi 平台中集成 Intercom 客服渠道。

包含以下功能模块:
- client: Intercom API 客户端封装
- config: 渠道配置管理
- gateway: SSE/WebSocket 网关接入
- webhook: Webhook 事件处理
- streaming: 流式消息处理
- format: 消息格式转换
- outbound: 外发消息管理
- handoff: 转人工会话切换
- pairing: 用户配对与绑定
- security: 安全签名校验
- dedupe: 消息去重
- monitor: 渠道状态监控
- status: 会话状态管理
- session_guard: 会话防护
- types: 类型定义
2026-05-21 11:01:49 +08:00

55 lines
1.8 KiB
Python

import logging
from yuxi.channel.extensions.intercom.format import html_to_text
from yuxi.channel.extensions.intercom.types import IntercomInboundEvent, IntercomAdminIdentity
from yuxi.channel.message.models import GroupContext, MessageType, PeerInfo, UnifiedMessage
from yuxi.channel.routing.models import PeerKind
logger = logging.getLogger(__name__)
class IntercomMonitor:
@staticmethod
def is_echo(event: IntercomInboundEvent, identity: IntercomAdminIdentity) -> bool:
return event.author_type in ("admin", "bot") and event.author_id == identity.admin_id
@staticmethod
def convert_event(
event: IntercomInboundEvent,
account_id: str,
) -> UnifiedMessage | None:
body_text = html_to_text(event.body_html)
if not body_text and not event.attachments:
return None
message_type = _detect_type(event)
return UnifiedMessage(
msg_id=f"intercom:{event.message_id}",
channel_type="intercom",
account_id=account_id,
content=body_text,
sender=PeerInfo(
kind=PeerKind.DIRECT,
id=event.author_id,
display_name=event.author_name,
),
message_type=message_type,
group=GroupContext(id=event.conversation_id),
raw_payload=event.raw,
timestamp=event.created_at if event.created_at else None,
)
def _detect_type(event: IntercomInboundEvent) -> MessageType:
if event.attachments:
for att in event.attachments:
content_type = att.get("content_type", "")
if content_type.startswith("image/"):
return MessageType.IMAGE
if content_type.startswith("video/"):
return MessageType.VIDEO
return MessageType.FILE
return MessageType.TEXT