ForcePilot/backend/package/yuxi/channels/adapters/slack/room_context.py
Kris a2aa782b86 feat(slack adapter): 实现完整的Slack频道适配器基础功能
新增Slack适配器全套核心模块,包括消息处理流水线、会话管理、配置适配、权限控制等完整功能:
1. 新增语音、视觉相关的TTS和图像分析导出接口
2. 实现消息预处理、路由、线程上下文处理的完整流水线
3. 新增账号管理、缓存机制、房间上下文提取功能
4. 支持Webhook和Socket Mode两种事件接收方式
5. 实现权限白名单、审批配对、自动状态管理功能
6. 新增配置迁移、作用域校验、重连策略等辅助模块
2026-05-12 00:48:57 +08:00

52 lines
1.5 KiB
Python

from __future__ import annotations
from dataclasses import dataclass
from slack_sdk.errors import SlackApiError
from yuxi.utils.logging_config import logger
@dataclass
class RoomContext:
topic: str = ""
purpose: str = ""
channel_name: str = ""
@property
def is_empty(self) -> bool:
return not (self.topic or self.purpose or self.channel_name)
def to_system_prompt_fragment(self) -> str:
parts = []
if self.channel_name:
parts.append(f"频道名称: #{self.channel_name}")
if self.topic:
parts.append(f"频道主题: {self.topic}")
if self.purpose:
parts.append(f"频道用途: {self.purpose}")
return "\n".join(parts)
async def extract_room_context(
client,
channel_id: str,
) -> RoomContext:
try:
if not channel_id or channel_id.startswith("D"):
return RoomContext()
resp = await client.conversations_info(channel=channel_id)
ch = resp.get("channel", {})
return RoomContext(
topic=ch.get("topic", {}).get("value", ""),
purpose=ch.get("purpose", {}).get("value", ""),
channel_name=ch.get("name", ""),
)
except SlackApiError as e:
logger.debug(f"Failed to extract room context for {channel_id}: {e}")
return RoomContext()
except Exception:
logger.debug(f"Room context extraction failed for {channel_id}", exc_info=True)
return RoomContext()