新增飞书机器人适配器全套功能,包括: - 基础适配器入口与工具导出 - 消息格式化、卡片渲染、回复调度逻辑 - 会话ID生成、模型覆盖策略 - 消息发送缓存、顺序队列管理 - 飞书签名验证、加解密webhook请求 - 审批权限校验、机器人菜单事件处理 - 文档评论、钉消息、语音转码处理 - 静态/动态目录管理、子代理生命周期管理 - 各类工具集:聊天、云盘、文档、知识库API封装
42 lines
1.2 KiB
Python
42 lines
1.2 KiB
Python
from __future__ import annotations
|
|
|
|
import re
|
|
from dataclasses import dataclass
|
|
from typing import Any
|
|
|
|
from yuxi.utils.logging_config import logger
|
|
|
|
_APPROVER_ID_RE = re.compile(r"^ou_[a-f0-9]+$", re.IGNORECASE)
|
|
|
|
|
|
@dataclass
|
|
class FeishuApprovalAdapter:
|
|
approvers: list[str]
|
|
timeout_s: float = 300.0
|
|
|
|
def normalize_approver_id(self, raw_id: str) -> str | None:
|
|
cleaned = raw_id.strip()
|
|
if _APPROVER_ID_RE.match(cleaned):
|
|
return cleaned
|
|
if cleaned.startswith("on_"):
|
|
return cleaned
|
|
if cleaned.startswith("ou_"):
|
|
return cleaned
|
|
logger.debug("[FeishuApproval] Invalid approver ID format: %s", cleaned)
|
|
return None
|
|
|
|
def check_approval(self, open_id: str) -> bool:
|
|
for approver in self.approvers:
|
|
normalized = self.normalize_approver_id(approver)
|
|
if normalized and normalized == open_id:
|
|
return True
|
|
return False
|
|
|
|
@classmethod
|
|
def from_config(cls, config: dict[str, Any]) -> FeishuApprovalAdapter:
|
|
approval_cfg = config.get("approval", {}) or {}
|
|
return cls(
|
|
approvers=approval_cfg.get("approvers", []),
|
|
timeout_s=float(approval_cfg.get("timeout", 300)),
|
|
)
|