diff --git a/api/core/tools/provider/_position.yaml b/api/core/tools/provider/_position.yaml index 5e6e8dcb7a..5c9454c11c 100644 --- a/api/core/tools/provider/_position.yaml +++ b/api/core/tools/provider/_position.yaml @@ -30,3 +30,4 @@ - qrcode - dingtalk - feishu +- slack diff --git a/api/core/tools/provider/builtin/slack/_assets/icon.svg b/api/core/tools/provider/builtin/slack/_assets/icon.svg new file mode 100644 index 0000000000..e43c2c47dc --- /dev/null +++ b/api/core/tools/provider/builtin/slack/_assets/icon.svg @@ -0,0 +1,22 @@ + + + Slack + + + + + + + diff --git a/api/core/tools/provider/builtin/slack/slack.py b/api/core/tools/provider/builtin/slack/slack.py new file mode 100644 index 0000000000..2de7911f63 --- /dev/null +++ b/api/core/tools/provider/builtin/slack/slack.py @@ -0,0 +1,8 @@ +from core.tools.provider.builtin.slack.tools.slack_webhook import SlackWebhookTool +from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController + + +class SlackProvider(BuiltinToolProviderController): + def _validate_credentials(self, credentials: dict) -> None: + SlackWebhookTool() + pass diff --git a/api/core/tools/provider/builtin/slack/slack.yaml b/api/core/tools/provider/builtin/slack/slack.yaml new file mode 100644 index 0000000000..7278793900 --- /dev/null +++ b/api/core/tools/provider/builtin/slack/slack.yaml @@ -0,0 +1,13 @@ +identity: + author: Pan YANG + name: slack + label: + en_US: Slack + zh_Hans: Slack + pt_BR: Slack + description: + en_US: Slack Webhook + zh_Hans: Slack Webhook + pt_BR: Slack Webhook + icon: icon.svg +credentials_for_provider: diff --git a/api/core/tools/provider/builtin/slack/tools/slack_webhook.py b/api/core/tools/provider/builtin/slack/tools/slack_webhook.py new file mode 100644 index 0000000000..18e4eb86c8 --- /dev/null +++ b/api/core/tools/provider/builtin/slack/tools/slack_webhook.py @@ -0,0 +1,43 @@ +from typing import Any, Union + +import httpx + +from core.tools.entities.tool_entities import ToolInvokeMessage +from core.tools.tool.builtin_tool import BuiltinTool + + +class SlackWebhookTool(BuiltinTool): + def _invoke(self, user_id: str, tool_parameters: dict[str, Any] + ) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]: + """ + Incoming Webhooks + API Document: https://api.slack.com/messaging/webhooks + """ + + content = tool_parameters.get('content', '') + if not content: + return self.create_text_message('Invalid parameter content') + + webhook_url = tool_parameters.get('webhook_url', '') + + if not webhook_url.startswith('https://hooks.slack.com/services/'): + return self.create_text_message( + f'Invalid parameter webhook_url ${webhook_url}, not a valid Slack webhook URL') + + headers = { + 'Content-Type': 'application/json', + } + params = {} + payload = { + "text": content, + } + + try: + res = httpx.post(webhook_url, headers=headers, params=params, json=payload) + if res.is_success: + return self.create_text_message("Text message was 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 through webhook. {}".format(e)) \ No newline at end of file diff --git a/api/core/tools/provider/builtin/slack/tools/slack_webhook.yaml b/api/core/tools/provider/builtin/slack/tools/slack_webhook.yaml new file mode 100644 index 0000000000..b838d74373 --- /dev/null +++ b/api/core/tools/provider/builtin/slack/tools/slack_webhook.yaml @@ -0,0 +1,40 @@ +identity: + name: slack_webhook + author: Pan YANG + label: + en_US: Incoming Webhook to send message + zh_Hans: 通过入站 Webhook 发送消息 + pt_BR: Incoming Webhook to send message + icon: icon.svg +description: + human: + en_US: Sending a message on Slack via the Incoming Webhook + zh_Hans: 通过入站 Webhook 在 Slack 上发送消息 + pt_BR: Sending a message on Slack via the Incoming Webhook + llm: A tool for sending messages to a chat on Slack. +parameters: + - name: webhook_url + type: string + required: true + label: + en_US: Slack Incoming Webhook url + zh_Hans: Slack 入站 Webhook 的 url + pt_BR: Slack Incoming Webhook url + human_description: + en_US: Slack Incoming Webhook url + zh_Hans: Slack 入站 Webhook 的 url + pt_BR: Slack Incoming Webhook url + 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 channel or person. + zh_Hans: 消息内容文本 + pt_BR: Content to sent to the channel or person. + llm_description: Content of the message + form: llm