mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-08-13 07:49:04 +08:00
Feat: add OneBot protocol tool (#7583)
This commit is contained in:
parent
70d6ab0bf5
commit
8807d880dc
BIN
api/core/tools/provider/builtin/onebot/_assets/icon.ico
Normal file
BIN
api/core/tools/provider/builtin/onebot/_assets/icon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 37 KiB |
12
api/core/tools/provider/builtin/onebot/onebot.py
Normal file
12
api/core/tools/provider/builtin/onebot/onebot.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from core.tools.errors import ToolProviderCredentialValidationError
|
||||||
|
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
|
||||||
|
|
||||||
|
|
||||||
|
class OneBotProvider(BuiltinToolProviderController):
|
||||||
|
|
||||||
|
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
|
||||||
|
|
||||||
|
if not credentials.get("ob11_http_url"):
|
||||||
|
raise ToolProviderCredentialValidationError('OneBot HTTP URL is required.')
|
35
api/core/tools/provider/builtin/onebot/onebot.yaml
Normal file
35
api/core/tools/provider/builtin/onebot/onebot.yaml
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
identity:
|
||||||
|
author: RockChinQ
|
||||||
|
name: onebot
|
||||||
|
label:
|
||||||
|
en_US: OneBot v11 Protocol
|
||||||
|
zh_Hans: OneBot v11 协议
|
||||||
|
description:
|
||||||
|
en_US: Unofficial OneBot v11 Protocol Tool
|
||||||
|
zh_Hans: 非官方 OneBot v11 协议工具
|
||||||
|
icon: icon.ico
|
||||||
|
credentials_for_provider:
|
||||||
|
ob11_http_url:
|
||||||
|
type: text-input
|
||||||
|
required: true
|
||||||
|
label:
|
||||||
|
en_US: HTTP URL
|
||||||
|
zh_Hans: HTTP URL
|
||||||
|
description:
|
||||||
|
en_US: Forward HTTP URL of OneBot v11
|
||||||
|
zh_Hans: OneBot v11 正向 HTTP URL
|
||||||
|
help:
|
||||||
|
en_US: Fill this with the HTTP URL of your OneBot server
|
||||||
|
zh_Hans: 请在你的 OneBot 协议端开启 正向 HTTP 并填写其 URL
|
||||||
|
access_token:
|
||||||
|
type: secret-input
|
||||||
|
required: false
|
||||||
|
label:
|
||||||
|
en_US: Access Token
|
||||||
|
zh_Hans: 访问令牌
|
||||||
|
description:
|
||||||
|
en_US: Access Token for OneBot v11 Protocol
|
||||||
|
zh_Hans: OneBot 协议访问令牌
|
||||||
|
help:
|
||||||
|
en_US: Fill this if you set a access token in your OneBot server
|
||||||
|
zh_Hans: 如果你在 OneBot 服务器中设置了 access token,请填写此项
|
@ -0,0 +1,62 @@
|
|||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
import requests
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class SendGroupMsg(BuiltinTool):
|
||||||
|
"""OneBot v11 Tool: Send Group Message"""
|
||||||
|
|
||||||
|
def _invoke(
|
||||||
|
self,
|
||||||
|
user_id: str,
|
||||||
|
tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
|
||||||
|
# Get parameters
|
||||||
|
send_group_id = tool_parameters.get('group_id', '')
|
||||||
|
|
||||||
|
message = tool_parameters.get('message', '')
|
||||||
|
if not message:
|
||||||
|
return self.create_json_message(
|
||||||
|
{
|
||||||
|
'error': 'Message is empty.'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
auto_escape = tool_parameters.get('auto_escape', False)
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
resp = requests.post(
|
||||||
|
f'{self.runtime.credentials['ob11_http_url']}/send_group_msg',
|
||||||
|
json={
|
||||||
|
'group_id': send_group_id,
|
||||||
|
'message': message,
|
||||||
|
'auto_escape': auto_escape
|
||||||
|
},
|
||||||
|
headers={
|
||||||
|
'Authorization': 'Bearer ' + self.runtime.credentials['access_token']
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if resp.status_code != 200:
|
||||||
|
return self.create_json_message(
|
||||||
|
{
|
||||||
|
'error': f'Failed to send group message: {resp.text}'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
return self.create_json_message(
|
||||||
|
{
|
||||||
|
'response': resp.json()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
return self.create_json_message(
|
||||||
|
{
|
||||||
|
'error': f'Failed to send group message: {e}'
|
||||||
|
}
|
||||||
|
)
|
@ -0,0 +1,46 @@
|
|||||||
|
identity:
|
||||||
|
name: send_group_msg
|
||||||
|
author: RockChinQ
|
||||||
|
label:
|
||||||
|
en_US: Send Group Message
|
||||||
|
zh_Hans: 发送群消息
|
||||||
|
description:
|
||||||
|
human:
|
||||||
|
en_US: Send a message to a group
|
||||||
|
zh_Hans: 发送消息到群聊
|
||||||
|
llm: A tool for sending a message segment to a group
|
||||||
|
parameters:
|
||||||
|
- name: group_id
|
||||||
|
type: number
|
||||||
|
required: true
|
||||||
|
label:
|
||||||
|
en_US: Target Group ID
|
||||||
|
zh_Hans: 目标群 ID
|
||||||
|
human_description:
|
||||||
|
en_US: The group ID of the target group
|
||||||
|
zh_Hans: 目标群的群 ID
|
||||||
|
llm_description: The group ID of the target group
|
||||||
|
form: llm
|
||||||
|
- name: message
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
label:
|
||||||
|
en_US: Message
|
||||||
|
zh_Hans: 消息
|
||||||
|
human_description:
|
||||||
|
en_US: The message to send
|
||||||
|
zh_Hans: 要发送的消息。支持 CQ码(需要同时设置 auto_escape 为 true)
|
||||||
|
llm_description: The message to send
|
||||||
|
form: llm
|
||||||
|
- name: auto_escape
|
||||||
|
type: boolean
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
label:
|
||||||
|
en_US: Auto Escape
|
||||||
|
zh_Hans: 自动转义
|
||||||
|
human_description:
|
||||||
|
en_US: If true, the message will be treated as a CQ code for parsing, otherwise it will be treated as plain text for direct sending. Since Dify currently does not support passing Object-format message chains, developers can send complex message components through CQ codes.
|
||||||
|
zh_Hans: 若为 true 则会把 message 视为 CQ 码解析,否则视为 纯文本 直接发送。由于 Dify 目前不支持传入 Object格式 的消息,故开发者可以通过 CQ 码来发送复杂消息组件。
|
||||||
|
llm_description: If true, the message will be treated as a CQ code for parsing, otherwise it will be treated as plain text for direct sending.
|
||||||
|
form: form
|
@ -0,0 +1,61 @@
|
|||||||
|
from typing import Any, Union
|
||||||
|
|
||||||
|
import requests
|
||||||
|
|
||||||
|
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||||
|
from core.tools.tool.builtin_tool import BuiltinTool
|
||||||
|
|
||||||
|
|
||||||
|
class SendPrivateMsg(BuiltinTool):
|
||||||
|
"""OneBot v11 Tool: Send Private Message"""
|
||||||
|
|
||||||
|
def _invoke(
|
||||||
|
self,
|
||||||
|
user_id: str,
|
||||||
|
tool_parameters: dict[str, Any]
|
||||||
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
||||||
|
|
||||||
|
# Get parameters
|
||||||
|
send_user_id = tool_parameters.get('user_id', '')
|
||||||
|
|
||||||
|
message = tool_parameters.get('message', '')
|
||||||
|
if not message:
|
||||||
|
return self.create_json_message(
|
||||||
|
{
|
||||||
|
'error': 'Message is empty.'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
auto_escape = tool_parameters.get('auto_escape', False)
|
||||||
|
|
||||||
|
try:
|
||||||
|
resp = requests.post(
|
||||||
|
f'{self.runtime.credentials['ob11_http_url']}/send_private_msg',
|
||||||
|
json={
|
||||||
|
'user_id': send_user_id,
|
||||||
|
'message': message,
|
||||||
|
'auto_escape': auto_escape
|
||||||
|
},
|
||||||
|
headers={
|
||||||
|
'Authorization': 'Bearer ' + self.runtime.credentials['access_token']
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if resp.status_code != 200:
|
||||||
|
return self.create_json_message(
|
||||||
|
{
|
||||||
|
'error': f'Failed to send private message: {resp.text}'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
return self.create_json_message(
|
||||||
|
{
|
||||||
|
'response': resp.json()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
return self.create_json_message(
|
||||||
|
{
|
||||||
|
'error': f'Failed to send private message: {e}'
|
||||||
|
}
|
||||||
|
)
|
@ -0,0 +1,46 @@
|
|||||||
|
identity:
|
||||||
|
name: send_private_msg
|
||||||
|
author: RockChinQ
|
||||||
|
label:
|
||||||
|
en_US: Send Private Message
|
||||||
|
zh_Hans: 发送私聊消息
|
||||||
|
description:
|
||||||
|
human:
|
||||||
|
en_US: Send a private message to a user
|
||||||
|
zh_Hans: 发送私聊消息给用户
|
||||||
|
llm: A tool for sending a message segment to a user in private chat
|
||||||
|
parameters:
|
||||||
|
- name: user_id
|
||||||
|
type: number
|
||||||
|
required: true
|
||||||
|
label:
|
||||||
|
en_US: Target User ID
|
||||||
|
zh_Hans: 目标用户 ID
|
||||||
|
human_description:
|
||||||
|
en_US: The user ID of the target user
|
||||||
|
zh_Hans: 目标用户的用户 ID
|
||||||
|
llm_description: The user ID of the target user
|
||||||
|
form: llm
|
||||||
|
- name: message
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
label:
|
||||||
|
en_US: Message
|
||||||
|
zh_Hans: 消息
|
||||||
|
human_description:
|
||||||
|
en_US: The message to send
|
||||||
|
zh_Hans: 要发送的消息。支持 CQ码(需要同时设置 auto_escape 为 true)
|
||||||
|
llm_description: The message to send
|
||||||
|
form: llm
|
||||||
|
- name: auto_escape
|
||||||
|
type: boolean
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
label:
|
||||||
|
en_US: Auto Escape
|
||||||
|
zh_Hans: 自动转义
|
||||||
|
human_description:
|
||||||
|
en_US: If true, the message will be treated as a CQ code for parsing, otherwise it will be treated as plain text for direct sending. Since Dify currently does not support passing Object-format message chains, developers can send complex message components through CQ codes.
|
||||||
|
zh_Hans: 若为 true 则会把 message 视为 CQ 码解析,否则视为 纯文本 直接发送。由于 Dify 目前不支持传入 Object格式 的消息,故开发者可以通过 CQ 码来发送复杂消息组件。
|
||||||
|
llm_description: If true, the message will be treated as a CQ code for parsing, otherwise it will be treated as plain text for direct sending.
|
||||||
|
form: form
|
Loading…
x
Reference in New Issue
Block a user