瀏覽代碼

feat: add Feishu(飞书) tool for sending message to chat group bot via webhook (#3059)

Co-authored-by: crazywoola <427733928@qq.com>
arkii 1 年之前
父節點
當前提交
5e591fc1b7

+ 1 - 0
api/core/tools/provider/_position.yaml

@@ -25,3 +25,4 @@
 - wecom
 - qrcode
 - dingtalk
+- feishu

File diff suppressed because it is too large
+ 1 - 0
api/core/tools/provider/builtin/feishu/_assets/icon.svg


+ 8 - 0
api/core/tools/provider/builtin/feishu/feishu.py

@@ -0,0 +1,8 @@
+from core.tools.provider.builtin.feishu.tools.feishu_group_bot import FeishuGroupBotTool
+from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
+
+
+class FeishuProvider(BuiltinToolProviderController):
+    def _validate_credentials(self, credentials: dict) -> None:
+        FeishuGroupBotTool()
+        pass

+ 13 - 0
api/core/tools/provider/builtin/feishu/feishu.yaml

@@ -0,0 +1,13 @@
+identity:
+  author: Arkii Sun
+  name: feishu
+  label:
+    en_US: Feishu
+    zh_Hans: 飞书
+    pt_BR: Feishu
+  description:
+    en_US: Feishu group bot
+    zh_Hans: 飞书群机器人
+    pt_BR: Feishu group bot
+  icon: icon.svg
+credentials_for_provider:

+ 50 - 0
api/core/tools/provider/builtin/feishu/tools/feishu_group_bot.py

@@ -0,0 +1,50 @@
+from typing import Any, Union
+
+import httpx
+
+from core.tools.entities.tool_entities import ToolInvokeMessage
+from core.tools.tool.builtin_tool import BuiltinTool
+from core.tools.utils.uuid_utils import is_valid_uuid
+
+
+class FeishuGroupBotTool(BuiltinTool):
+    def _invoke(self, user_id: str, tool_parameters: dict[str, Any]
+                ) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
+        """
+            invoke tools
+            API document: https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot
+        """
+
+        url = "https://open.feishu.cn/open-apis/bot/v2/hook"
+
+        content = tool_parameters.get('content', '')
+        if not content:
+            return self.create_text_message('Invalid parameter content')
+
+        hook_key = tool_parameters.get('hook_key', '')
+        if not is_valid_uuid(hook_key):
+            return self.create_text_message(
+                f'Invalid parameter hook_key ${hook_key}, not a valid UUID')
+
+        msg_type = 'text'
+        api_url = f'{url}/{hook_key}'
+        headers = {
+            'Content-Type': 'application/json',
+        }
+        params = {}
+        payload = {
+            "msg_type": msg_type,
+            "content": {
+                "text": content,
+            }
+        }
+
+        try:
+            res = httpx.post(api_url, headers=headers, params=params, json=payload)
+            if res.is_success:
+                return self.create_text_message("Text message sent successfully")
+            else:
+                return self.create_text_message(
+                    f"Failed to send the text message, status code: {res.status_code}, response: {res.text}")
+        except Exception as e:
+            return self.create_text_message("Failed to send message to group chat bot. {}".format(e))

+ 40 - 0
api/core/tools/provider/builtin/feishu/tools/feishu_group_bot.yaml

@@ -0,0 +1,40 @@
+identity:
+  name: feishu_group_bot
+  author: Arkii Sun
+  label:
+    en_US: Send Group Message
+    zh_Hans: 发送群消息
+    pt_BR: Send Group Message
+  icon: icon.png
+description:
+  human:
+    en_US: Sending a group message on Feishu via the webhook of group bot
+    zh_Hans: 通过飞书的群机器人webhook发送群消息
+    pt_BR: Sending a group message on Feishu via the webhook of group bot
+  llm: A tool for sending messages to a chat group on Feishu(飞书) .
+parameters:
+  - name: hook_key
+    type: secret-input
+    required: true
+    label:
+      en_US: Feishu Group bot webhook key
+      zh_Hans: 群机器人webhook的key
+      pt_BR: Feishu Group bot webhook key
+    human_description:
+      en_US: Feishu Group bot webhook key
+      zh_Hans: 群机器人webhook的key
+      pt_BR: Feishu Group bot webhook key
+    form: form
+  - name: content
+    type: string
+    required: true
+    label:
+      en_US: content
+      zh_Hans: 消息内容
+      pt_BR: content
+    human_description:
+      en_US: Content to sent to the group.
+      zh_Hans: 群消息文本
+      pt_BR: Content to sent to the group.
+    llm_description: Content of the message
+    form: llm