ForcePilot/backend/package/yuxi/channel/extensions/feishu/tools/chat.py
Kris 5e91bb9985 feat(feishu): 新增飞书渠道完整插件实现
新增飞书渠道插件,包含基础配置、事件处理、消息收发、工具调用、权限管理等完整功能模块,支持WebSocket长连接、卡片消息、流式响应、群管理、审批通知等能力
2026-05-21 10:46:42 +08:00

210 lines
6.8 KiB
Python

from __future__ import annotations
import logging
from yuxi.channel.extensions.feishu.client import get_client, get_chat_info, get_chat_members, get_user_info
logger = logging.getLogger(__name__)
FEISHU_CHAT_TOOLS = [
{
"name": "feishu_chat_info",
"description": "获取飞书群聊信息",
"parameters": {"chat_id": "群聊 ID"},
},
{
"name": "feishu_chat_members",
"description": "获取飞书群聊成员列表",
"parameters": {"chat_id": "群聊 ID"},
},
{
"name": "feishu_chat_member_info",
"description": "获取飞书用户详细信息",
"parameters": {"user_id": "用户 open_id"},
},
{
"name": "feishu_create_group",
"description": "创建飞书群组",
"parameters": {"name": "群名称", "user_ids": "初始成员 ID 列表(可选)", "description": "群描述(可选)"},
},
{
"name": "feishu_update_group",
"description": "更新群组信息(名称/描述)",
"parameters": {"chat_id": "群聊 ID", "name": "新名称(可选)", "description": "新描述(可选)"},
},
{
"name": "feishu_delete_group",
"description": "解散群组",
"parameters": {"chat_id": "群聊 ID"},
},
{
"name": "feishu_add_group_members",
"description": "添加群成员",
"parameters": {"chat_id": "群聊 ID", "member_ids": "成员 open_id 列表"},
},
{
"name": "feishu_remove_group_members",
"description": "移除群成员",
"parameters": {"chat_id": "群聊 ID", "member_ids": "成员 open_id 列表"},
},
]
async def get_chat_tool_info(
app_id: str,
app_secret: str,
domain: str,
chat_id: str,
http_timeout_ms: int = 30000,
) -> dict:
try:
client = get_client(app_id, app_secret, domain, http_timeout_ms)
result = await get_chat_info(client, chat_id)
if result:
return {"success": True, **result}
return {"success": False, "error": "Chat not found"}
except Exception:
logger.exception("Feishu get_chat_tool_info error")
return {"success": False, "error": "Internal error"}
async def get_chat_tool_members(
app_id: str,
app_secret: str,
domain: str,
chat_id: str,
http_timeout_ms: int = 30000,
) -> dict:
try:
client = get_client(app_id, app_secret, domain, http_timeout_ms)
return await get_chat_members(client, chat_id)
except Exception:
logger.exception("Feishu get_chat_tool_members error")
return {"success": False, "error": "Internal error", "members": []}
async def get_chat_tool_member_info(
app_id: str,
app_secret: str,
domain: str,
chat_id: str,
member_id: str,
http_timeout_ms: int = 30000,
) -> dict:
try:
client = get_client(app_id, app_secret, domain, http_timeout_ms)
from yuxi.channel.extensions.feishu.client import get_chat_members as _get_members
members_result = await _get_members(client, chat_id)
if not members_result.get("success"):
return {"success": False, "error": "Unable to fetch chat members"}
members = members_result.get("members", [])
target = next((m for m in members if m.get("open_id") == member_id), None)
if target:
return {"success": True, "member": target}
return {"success": False, "error": "Member not found"}
except Exception:
logger.exception("Feishu get_chat_tool_member_info error")
return {"success": False, "error": "Internal error"}
async def create_group_chat(
app_id: str,
app_secret: str,
domain: str,
name: str,
user_ids: list[str] | None = None,
description: str = "",
http_timeout_ms: int = 30000,
) -> dict:
try:
client = get_client(app_id, app_secret, domain, http_timeout_ms)
from yuxi.channel.extensions.feishu.client import create_chat as _create_chat
return await _create_chat(client, name, description, user_ids, "group")
except ImportError:
return {"success": False, "error": "lark-oapi SDK not installed"}
except Exception:
logger.exception("Feishu create_group_chat error")
return {"success": False, "error": "Internal error"}
async def update_group_chat(
app_id: str,
app_secret: str,
domain: str,
chat_id: str,
name: str = "",
description: str = "",
http_timeout_ms: int = 30000,
) -> dict:
try:
client = get_client(app_id, app_secret, domain, http_timeout_ms)
from yuxi.channel.extensions.feishu.client import update_chat as _update_chat
return await _update_chat(client, chat_id, name, description)
except ImportError:
return {"success": False, "error": "lark-oapi SDK not installed"}
except Exception:
logger.exception("Feishu update_group_chat error")
return {"success": False, "error": "Internal error"}
async def delete_group_chat(
app_id: str,
app_secret: str,
domain: str,
chat_id: str,
http_timeout_ms: int = 30000,
) -> dict:
try:
client = get_client(app_id, app_secret, domain, http_timeout_ms)
from yuxi.channel.extensions.feishu.client import delete_chat as _delete_chat
return await _delete_chat(client, chat_id)
except ImportError:
return {"success": False, "error": "lark-oapi SDK not installed"}
except Exception:
logger.exception("Feishu delete_group_chat error")
return {"success": False, "error": "Internal error"}
async def add_group_members(
app_id: str,
app_secret: str,
domain: str,
chat_id: str,
member_ids: list[str],
http_timeout_ms: int = 30000,
) -> dict:
try:
client = get_client(app_id, app_secret, domain, http_timeout_ms)
from yuxi.channel.extensions.feishu.client import add_chat_members as _add
return await _add(client, chat_id, member_ids)
except ImportError:
return {"success": False, "error": "lark-oapi SDK not installed"}
except Exception:
logger.exception("Feishu add_group_members error")
return {"success": False, "error": "Internal error"}
async def remove_group_members(
app_id: str,
app_secret: str,
domain: str,
chat_id: str,
member_ids: list[str],
http_timeout_ms: int = 30000,
) -> dict:
try:
client = get_client(app_id, app_secret, domain, http_timeout_ms)
from yuxi.channel.extensions.feishu.client import remove_chat_members as _remove
return await _remove(client, chat_id, member_ids)
except ImportError:
return {"success": False, "error": "lark-oapi SDK not installed"}
except Exception:
logger.exception("Feishu remove_group_members error")
return {"success": False, "error": "Internal error"}