AstrBot 4.3.3__py3-none-any.whl → 4.3.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- astrbot/core/agent/mcp_client.py +18 -4
- astrbot/core/astr_agent_context.py +1 -0
- astrbot/core/config/default.py +48 -3
- astrbot/core/pipeline/process_stage/method/llm_request.py +32 -14
- astrbot/core/pipeline/scheduler.py +1 -1
- astrbot/core/platform/manager.py +4 -0
- astrbot/core/platform/sources/satori/satori_event.py +23 -1
- astrbot/core/platform/sources/webchat/webchat_adapter.py +0 -1
- astrbot/core/platform/sources/wecom_ai_bot/WXBizJsonMsgCrypt.py +289 -0
- astrbot/core/platform/sources/wecom_ai_bot/__init__.py +17 -0
- astrbot/core/platform/sources/wecom_ai_bot/ierror.py +20 -0
- astrbot/core/platform/sources/wecom_ai_bot/wecomai_adapter.py +445 -0
- astrbot/core/platform/sources/wecom_ai_bot/wecomai_api.py +378 -0
- astrbot/core/platform/sources/wecom_ai_bot/wecomai_event.py +149 -0
- astrbot/core/platform/sources/wecom_ai_bot/wecomai_queue_mgr.py +148 -0
- astrbot/core/platform/sources/wecom_ai_bot/wecomai_server.py +166 -0
- astrbot/core/platform/sources/wecom_ai_bot/wecomai_utils.py +199 -0
- astrbot/dashboard/routes/tools.py +14 -0
- {astrbot-4.3.3.dist-info → astrbot-4.3.5.dist-info}/METADATA +64 -44
- {astrbot-4.3.3.dist-info → astrbot-4.3.5.dist-info}/RECORD +23 -14
- {astrbot-4.3.3.dist-info → astrbot-4.3.5.dist-info}/WHEEL +0 -0
- {astrbot-4.3.3.dist-info → astrbot-4.3.5.dist-info}/entry_points.txt +0 -0
- {astrbot-4.3.3.dist-info → astrbot-4.3.5.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"""
|
|
2
|
+
企业微信智能机器人 HTTP 服务器
|
|
3
|
+
处理企业微信智能机器人的 HTTP 回调请求
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import asyncio
|
|
7
|
+
from typing import Dict, Any, Optional, Callable
|
|
8
|
+
|
|
9
|
+
import quart
|
|
10
|
+
from astrbot.api import logger
|
|
11
|
+
|
|
12
|
+
from .wecomai_api import WecomAIBotAPIClient
|
|
13
|
+
from .wecomai_utils import WecomAIBotConstants
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class WecomAIBotServer:
|
|
17
|
+
"""企业微信智能机器人 HTTP 服务器"""
|
|
18
|
+
|
|
19
|
+
def __init__(
|
|
20
|
+
self,
|
|
21
|
+
host: str,
|
|
22
|
+
port: int,
|
|
23
|
+
api_client: WecomAIBotAPIClient,
|
|
24
|
+
message_handler: Optional[
|
|
25
|
+
Callable[[Dict[str, Any], Dict[str, str]], Any]
|
|
26
|
+
] = None,
|
|
27
|
+
):
|
|
28
|
+
"""初始化服务器
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
host: 监听地址
|
|
32
|
+
port: 监听端口
|
|
33
|
+
api_client: API客户端实例
|
|
34
|
+
message_handler: 消息处理回调函数
|
|
35
|
+
"""
|
|
36
|
+
self.host = host
|
|
37
|
+
self.port = port
|
|
38
|
+
self.api_client = api_client
|
|
39
|
+
self.message_handler = message_handler
|
|
40
|
+
|
|
41
|
+
self.app = quart.Quart(__name__)
|
|
42
|
+
self._setup_routes()
|
|
43
|
+
|
|
44
|
+
self.shutdown_event = asyncio.Event()
|
|
45
|
+
|
|
46
|
+
def _setup_routes(self):
|
|
47
|
+
"""设置 Quart 路由"""
|
|
48
|
+
|
|
49
|
+
# 使用 Quart 的 add_url_rule 方法添加路由
|
|
50
|
+
self.app.add_url_rule(
|
|
51
|
+
"/webhook/wecom-ai-bot",
|
|
52
|
+
view_func=self.verify_url,
|
|
53
|
+
methods=["GET"],
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
self.app.add_url_rule(
|
|
57
|
+
"/webhook/wecom-ai-bot",
|
|
58
|
+
view_func=self.handle_message,
|
|
59
|
+
methods=["POST"],
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
async def verify_url(self):
|
|
63
|
+
"""验证回调 URL"""
|
|
64
|
+
args = quart.request.args
|
|
65
|
+
msg_signature = args.get("msg_signature")
|
|
66
|
+
timestamp = args.get("timestamp")
|
|
67
|
+
nonce = args.get("nonce")
|
|
68
|
+
echostr = args.get("echostr")
|
|
69
|
+
|
|
70
|
+
if not all([msg_signature, timestamp, nonce, echostr]):
|
|
71
|
+
logger.error("URL 验证参数缺失")
|
|
72
|
+
return "verify fail", 400
|
|
73
|
+
|
|
74
|
+
# 类型检查确保不为 None
|
|
75
|
+
assert msg_signature is not None
|
|
76
|
+
assert timestamp is not None
|
|
77
|
+
assert nonce is not None
|
|
78
|
+
assert echostr is not None
|
|
79
|
+
|
|
80
|
+
logger.info("收到企业微信智能机器人 WebHook URL 验证请求。")
|
|
81
|
+
result = self.api_client.verify_url(msg_signature, timestamp, nonce, echostr)
|
|
82
|
+
return result, 200, {"Content-Type": "text/plain"}
|
|
83
|
+
|
|
84
|
+
async def handle_message(self):
|
|
85
|
+
"""处理消息回调"""
|
|
86
|
+
args = quart.request.args
|
|
87
|
+
msg_signature = args.get("msg_signature")
|
|
88
|
+
timestamp = args.get("timestamp")
|
|
89
|
+
nonce = args.get("nonce")
|
|
90
|
+
|
|
91
|
+
if not all([msg_signature, timestamp, nonce]):
|
|
92
|
+
logger.error("消息回调参数缺失")
|
|
93
|
+
return "缺少必要参数", 400
|
|
94
|
+
|
|
95
|
+
# 类型检查确保不为 None
|
|
96
|
+
assert msg_signature is not None
|
|
97
|
+
assert timestamp is not None
|
|
98
|
+
assert nonce is not None
|
|
99
|
+
|
|
100
|
+
logger.debug(
|
|
101
|
+
f"收到消息回调,msg_signature={msg_signature}, timestamp={timestamp}, nonce={nonce}"
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
try:
|
|
105
|
+
# 获取请求体
|
|
106
|
+
post_data = await quart.request.get_data()
|
|
107
|
+
|
|
108
|
+
# 确保 post_data 是 bytes 类型
|
|
109
|
+
if isinstance(post_data, str):
|
|
110
|
+
post_data = post_data.encode("utf-8")
|
|
111
|
+
|
|
112
|
+
# 解密消息
|
|
113
|
+
ret_code, message_data = await self.api_client.decrypt_message(
|
|
114
|
+
post_data, msg_signature, timestamp, nonce
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
if ret_code != WecomAIBotConstants.SUCCESS or not message_data:
|
|
118
|
+
logger.error("消息解密失败,错误码: %d", ret_code)
|
|
119
|
+
return "消息解密失败", 400
|
|
120
|
+
|
|
121
|
+
# 调用消息处理器
|
|
122
|
+
response = None
|
|
123
|
+
if self.message_handler:
|
|
124
|
+
try:
|
|
125
|
+
response = await self.message_handler(
|
|
126
|
+
message_data, {"nonce": nonce, "timestamp": timestamp}
|
|
127
|
+
)
|
|
128
|
+
except Exception as e:
|
|
129
|
+
logger.error("消息处理器执行异常: %s", e)
|
|
130
|
+
return "消息处理异常", 500
|
|
131
|
+
|
|
132
|
+
if response:
|
|
133
|
+
return response, 200, {"Content-Type": "text/plain"}
|
|
134
|
+
else:
|
|
135
|
+
return "success", 200, {"Content-Type": "text/plain"}
|
|
136
|
+
|
|
137
|
+
except Exception as e:
|
|
138
|
+
logger.error("处理消息时发生异常: %s", e)
|
|
139
|
+
return "内部服务器错误", 500
|
|
140
|
+
|
|
141
|
+
async def start_server(self):
|
|
142
|
+
"""启动服务器"""
|
|
143
|
+
logger.info("启动企业微信智能机器人服务器,监听 %s:%d", self.host, self.port)
|
|
144
|
+
|
|
145
|
+
try:
|
|
146
|
+
await self.app.run_task(
|
|
147
|
+
host=self.host,
|
|
148
|
+
port=self.port,
|
|
149
|
+
shutdown_trigger=self.shutdown_trigger,
|
|
150
|
+
)
|
|
151
|
+
except Exception as e:
|
|
152
|
+
logger.error("服务器运行异常: %s", e)
|
|
153
|
+
raise
|
|
154
|
+
|
|
155
|
+
async def shutdown_trigger(self):
|
|
156
|
+
"""关闭触发器"""
|
|
157
|
+
await self.shutdown_event.wait()
|
|
158
|
+
|
|
159
|
+
async def shutdown(self):
|
|
160
|
+
"""关闭服务器"""
|
|
161
|
+
logger.info("企业微信智能机器人服务器正在关闭...")
|
|
162
|
+
self.shutdown_event.set()
|
|
163
|
+
|
|
164
|
+
def get_app(self):
|
|
165
|
+
"""获取 Quart 应用实例"""
|
|
166
|
+
return self.app
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"""
|
|
2
|
+
企业微信智能机器人工具模块
|
|
3
|
+
提供常量定义、工具函数和辅助方法
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import string
|
|
7
|
+
import random
|
|
8
|
+
import hashlib
|
|
9
|
+
import base64
|
|
10
|
+
import aiohttp
|
|
11
|
+
import asyncio
|
|
12
|
+
from Crypto.Cipher import AES
|
|
13
|
+
from typing import Any, Tuple
|
|
14
|
+
from astrbot.api import logger
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# 常量定义
|
|
18
|
+
class WecomAIBotConstants:
|
|
19
|
+
"""企业微信智能机器人常量"""
|
|
20
|
+
|
|
21
|
+
# 消息类型
|
|
22
|
+
MSG_TYPE_TEXT = "text"
|
|
23
|
+
MSG_TYPE_IMAGE = "image"
|
|
24
|
+
MSG_TYPE_MIXED = "mixed"
|
|
25
|
+
MSG_TYPE_STREAM = "stream"
|
|
26
|
+
MSG_TYPE_EVENT = "event"
|
|
27
|
+
|
|
28
|
+
# 流消息状态
|
|
29
|
+
STREAM_CONTINUE = False
|
|
30
|
+
STREAM_FINISH = True
|
|
31
|
+
|
|
32
|
+
# 错误码
|
|
33
|
+
SUCCESS = 0
|
|
34
|
+
DECRYPT_ERROR = -40001
|
|
35
|
+
VALIDATE_SIGNATURE_ERROR = -40002
|
|
36
|
+
PARSE_XML_ERROR = -40003
|
|
37
|
+
COMPUTE_SIGNATURE_ERROR = -40004
|
|
38
|
+
ILLEGAL_AES_KEY = -40005
|
|
39
|
+
VALIDATE_APPID_ERROR = -40006
|
|
40
|
+
ENCRYPT_AES_ERROR = -40007
|
|
41
|
+
ILLEGAL_BUFFER = -40008
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def generate_random_string(length: int = 10) -> str:
|
|
45
|
+
"""生成随机字符串
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
length: 字符串长度,默认为 10
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
随机字符串
|
|
52
|
+
"""
|
|
53
|
+
letters = string.ascii_letters + string.digits
|
|
54
|
+
return "".join(random.choice(letters) for _ in range(length))
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def calculate_image_md5(image_data: bytes) -> str:
|
|
58
|
+
"""计算图片数据的 MD5 值
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
image_data: 图片二进制数据
|
|
62
|
+
|
|
63
|
+
Returns:
|
|
64
|
+
MD5 哈希值(十六进制字符串)
|
|
65
|
+
"""
|
|
66
|
+
return hashlib.md5(image_data).hexdigest()
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def encode_image_base64(image_data: bytes) -> str:
|
|
70
|
+
"""将图片数据编码为 Base64
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
image_data: 图片二进制数据
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
Base64 编码的字符串
|
|
77
|
+
"""
|
|
78
|
+
return base64.b64encode(image_data).decode("utf-8")
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def format_session_id(session_type: str, session_id: str) -> str:
|
|
82
|
+
"""格式化会话 ID
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
session_type: 会话类型 ("user", "group")
|
|
86
|
+
session_id: 原始会话 ID
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
格式化后的会话 ID
|
|
90
|
+
"""
|
|
91
|
+
return f"wecom_ai_bot_{session_type}_{session_id}"
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def parse_session_id(formatted_session_id: str) -> Tuple[str, str]:
|
|
95
|
+
"""解析格式化的会话 ID
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
formatted_session_id: 格式化的会话 ID
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
(会话类型, 原始会话ID)
|
|
102
|
+
"""
|
|
103
|
+
parts = formatted_session_id.split("_", 3)
|
|
104
|
+
if (
|
|
105
|
+
len(parts) >= 4
|
|
106
|
+
and parts[0] == "wecom"
|
|
107
|
+
and parts[1] == "ai"
|
|
108
|
+
and parts[2] == "bot"
|
|
109
|
+
):
|
|
110
|
+
return parts[3], "_".join(parts[4:]) if len(parts) > 4 else ""
|
|
111
|
+
return "user", formatted_session_id
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def safe_json_loads(json_str: str, default: Any = None) -> Any:
|
|
115
|
+
"""安全地解析 JSON 字符串
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
json_str: JSON 字符串
|
|
119
|
+
default: 解析失败时的默认值
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
解析结果或默认值
|
|
123
|
+
"""
|
|
124
|
+
import json
|
|
125
|
+
|
|
126
|
+
try:
|
|
127
|
+
return json.loads(json_str)
|
|
128
|
+
except (json.JSONDecodeError, TypeError) as e:
|
|
129
|
+
logger.warning(f"JSON 解析失败: {e}, 原始字符串: {json_str}")
|
|
130
|
+
return default
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def format_error_response(error_code: int, error_msg: str) -> str:
|
|
134
|
+
"""格式化错误响应
|
|
135
|
+
|
|
136
|
+
Args:
|
|
137
|
+
error_code: 错误码
|
|
138
|
+
error_msg: 错误信息
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
格式化的错误响应字符串
|
|
142
|
+
"""
|
|
143
|
+
return f"Error {error_code}: {error_msg}"
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
async def process_encrypted_image(
|
|
147
|
+
image_url: str, aes_key_base64: str
|
|
148
|
+
) -> Tuple[bool, str]:
|
|
149
|
+
"""下载并解密加密图片
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
image_url: 加密图片的URL
|
|
153
|
+
aes_key_base64: Base64编码的AES密钥(与回调加解密相同)
|
|
154
|
+
|
|
155
|
+
Returns:
|
|
156
|
+
Tuple[bool, str]: status 为 True 时 data 是解密后的图片数据的 base64 编码,
|
|
157
|
+
status 为 False 时 data 是错误信息
|
|
158
|
+
"""
|
|
159
|
+
# 1. 下载加密图片
|
|
160
|
+
logger.info("开始下载加密图片: %s", image_url)
|
|
161
|
+
try:
|
|
162
|
+
async with aiohttp.ClientSession() as session:
|
|
163
|
+
async with session.get(image_url, timeout=15) as response:
|
|
164
|
+
response.raise_for_status()
|
|
165
|
+
encrypted_data = await response.read()
|
|
166
|
+
logger.info("图片下载成功,大小: %d 字节", len(encrypted_data))
|
|
167
|
+
except (aiohttp.ClientError, asyncio.TimeoutError) as e:
|
|
168
|
+
error_msg = f"下载图片失败: {str(e)}"
|
|
169
|
+
logger.error(error_msg)
|
|
170
|
+
return False, error_msg
|
|
171
|
+
|
|
172
|
+
# 2. 准备AES密钥和IV
|
|
173
|
+
if not aes_key_base64:
|
|
174
|
+
raise ValueError("AES密钥不能为空")
|
|
175
|
+
|
|
176
|
+
# Base64解码密钥 (自动处理填充)
|
|
177
|
+
aes_key = base64.b64decode(aes_key_base64 + "=" * (-len(aes_key_base64) % 4))
|
|
178
|
+
if len(aes_key) != 32:
|
|
179
|
+
raise ValueError("无效的AES密钥长度: 应为32字节")
|
|
180
|
+
|
|
181
|
+
iv = aes_key[:16] # 初始向量为密钥前16字节
|
|
182
|
+
|
|
183
|
+
# 3. 解密图片数据
|
|
184
|
+
cipher = AES.new(aes_key, AES.MODE_CBC, iv)
|
|
185
|
+
decrypted_data = cipher.decrypt(encrypted_data)
|
|
186
|
+
|
|
187
|
+
# 4. 去除PKCS#7填充 (Python 3兼容写法)
|
|
188
|
+
pad_len = decrypted_data[-1] # 直接获取最后一个字节的整数值
|
|
189
|
+
if pad_len > 32: # AES-256块大小为32字节
|
|
190
|
+
raise ValueError("无效的填充长度 (大于32字节)")
|
|
191
|
+
|
|
192
|
+
decrypted_data = decrypted_data[:-pad_len]
|
|
193
|
+
logger.info("图片解密成功,解密后大小: %d 字节", len(decrypted_data))
|
|
194
|
+
|
|
195
|
+
# 5. 转换为base64编码
|
|
196
|
+
base64_data = base64.b64encode(decrypted_data).decode("utf-8")
|
|
197
|
+
logger.info("图片已转换为base64编码,编码后长度: %d", len(base64_data))
|
|
198
|
+
|
|
199
|
+
return True, base64_data
|
|
@@ -273,6 +273,20 @@ class ToolsRoute(Route):
|
|
|
273
273
|
server_data = await request.json
|
|
274
274
|
config = server_data.get("mcp_server_config", None)
|
|
275
275
|
|
|
276
|
+
if not isinstance(config, dict) or not config:
|
|
277
|
+
return Response().error("无效的 MCP 服务器配置").__dict__
|
|
278
|
+
|
|
279
|
+
if "mcpServers" in config:
|
|
280
|
+
keys = list(config["mcpServers"].keys())
|
|
281
|
+
if not keys:
|
|
282
|
+
return Response().error("MCP 服务器配置不能为空").__dict__
|
|
283
|
+
if len(keys) > 1:
|
|
284
|
+
return Response().error("一次只能配置一个 MCP 服务器配置").__dict__
|
|
285
|
+
config = config["mcpServers"][keys[0]]
|
|
286
|
+
else:
|
|
287
|
+
if not config:
|
|
288
|
+
return Response().error("MCP 服务器配置不能为空").__dict__
|
|
289
|
+
|
|
276
290
|
tools_name = await self.tool_mgr.test_mcp_server_connection(config)
|
|
277
291
|
return (
|
|
278
292
|
Response().ok(data=tools_name, message="🎉 MCP 服务器可用!").__dict__
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: AstrBot
|
|
3
|
-
Version: 4.3.
|
|
3
|
+
Version: 4.3.5
|
|
4
4
|
Summary: 易上手的多平台 LLM 聊天机器人及开发框架
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Requires-Python: >=3.10
|
|
@@ -52,8 +52,6 @@ Requires-Dist: websockets>=15.0.1
|
|
|
52
52
|
Requires-Dist: wechatpy>=1.8.18
|
|
53
53
|
Description-Content-Type: text/markdown
|
|
54
54
|
|
|
55
|
-
<img width="430" height="31" alt="image" src="https://github.com/user-attachments/assets/474c822c-fab7-41be-8c23-6dae252823ed" /><p align="center">
|
|
56
|
-
|
|
57
55
|

|
|
58
56
|
|
|
59
57
|
</p>
|
|
@@ -67,17 +65,17 @@ Description-Content-Type: text/markdown
|
|
|
67
65
|
<a href="https://hub.docker.com/r/soulter/astrbot"><img alt="Docker pull" src="https://img.shields.io/docker/pulls/soulter/astrbot.svg?style=for-the-badge&color=76bad9"/></a>
|
|
68
66
|
<a href="https://qm.qq.com/cgi-bin/qm/qr?k=wtbaNx7EioxeaqS9z7RQWVXPIxg2zYr7&jump_from=webapi&authKey=vlqnv/AV2DbJEvGIcxdlNSpfxVy+8vVqijgreRdnVKOaydpc+YSw4MctmEbr0k5"><img alt="QQ_community" src="https://img.shields.io/badge/QQ群-775869627-purple?style=for-the-badge&color=76bad9"></a>
|
|
69
67
|
<a href="https://t.me/+hAsD2Ebl5as3NmY1"><img alt="Telegram_community" src="https://img.shields.io/badge/Telegram-AstrBot-purple?style=for-the-badge&color=76bad9"></a>
|
|
70
|
-
[](https://wakatime.com/badge/user/915e5316-99c6-4563-a483-ef186cf000c9/project/018e705a-a1a7-409a-a849-3013485e6c8e)
|
|
71
68
|

|
|
72
69
|
|
|
73
70
|
<a href="https://github.com/Soulter/AstrBot/blob/master/README_en.md">English</a> |
|
|
74
71
|
<a href="https://github.com/Soulter/AstrBot/blob/master/README_ja.md">日本語</a> |
|
|
75
72
|
<a href="https://astrbot.app/">文档</a> |
|
|
76
73
|
<a href="https://blog.astrbot.app/">Blog</a> |
|
|
74
|
+
<a href="https://astrbot.featurebase.app/roadmap">路线图</a> |
|
|
77
75
|
<a href="https://github.com/Soulter/AstrBot/issues">问题提交</a>
|
|
78
76
|
</div>
|
|
79
77
|
|
|
80
|
-
AstrBot 是一个开源的一站式
|
|
78
|
+
AstrBot 是一个开源的一站式 Agent 聊天机器人平台及开发框架。
|
|
81
79
|
|
|
82
80
|
## 主要功能
|
|
83
81
|
|
|
@@ -89,7 +87,7 @@ AstrBot 是一个开源的一站式 Agentic 聊天机器人平台及开发框架
|
|
|
89
87
|
|
|
90
88
|
## 部署方式
|
|
91
89
|
|
|
92
|
-
#### Docker 部署
|
|
90
|
+
#### Docker 部署(推荐 🥳)
|
|
93
91
|
|
|
94
92
|
推荐使用 Docker / Docker Compose 方式部署 AstrBot。
|
|
95
93
|
|
|
@@ -155,7 +153,6 @@ uv run main.py
|
|
|
155
153
|
- 5 群:822130018
|
|
156
154
|
- 6 群:753075035
|
|
157
155
|
- 开发者群:975206796
|
|
158
|
-
- 开发者群(备份):295657329
|
|
159
156
|
|
|
160
157
|
### Telegram 群组
|
|
161
158
|
|
|
@@ -167,48 +164,80 @@ uv run main.py
|
|
|
167
164
|
|
|
168
165
|
## ⚡ 消息平台支持情况
|
|
169
166
|
|
|
167
|
+
**官方维护**
|
|
168
|
+
|
|
170
169
|
| 平台 | 支持性 |
|
|
171
170
|
| -------- | ------- |
|
|
172
|
-
| QQ(
|
|
171
|
+
| QQ(官方平台) | ✔ |
|
|
173
172
|
| QQ(OneBot) | ✔ |
|
|
174
173
|
| Telegram | ✔ |
|
|
175
|
-
|
|
|
174
|
+
| 企微应用 | ✔ |
|
|
176
175
|
| 微信客服 | ✔ |
|
|
177
176
|
| 微信公众号 | ✔ |
|
|
178
177
|
| 飞书 | ✔ |
|
|
179
178
|
| 钉钉 | ✔ |
|
|
180
179
|
| Slack | ✔ |
|
|
181
180
|
| Discord | ✔ |
|
|
182
|
-
| [KOOK](https://github.com/wuyan1003/astrbot_plugin_kook_adapter) | ✔ |
|
|
183
|
-
| [VoceChat](https://github.com/HikariFroya/astrbot_plugin_vocechat) | ✔ |
|
|
184
181
|
| Satori | ✔ |
|
|
185
182
|
| Misskey | ✔ |
|
|
183
|
+
| 企微智能机器人 | 将支持 |
|
|
184
|
+
| Whatsapp | 将支持 |
|
|
185
|
+
| LINE | 将支持 |
|
|
186
|
+
|
|
187
|
+
**社区维护**
|
|
188
|
+
|
|
189
|
+
| 平台 | 支持性 |
|
|
190
|
+
| -------- | ------- |
|
|
191
|
+
| [KOOK](https://github.com/wuyan1003/astrbot_plugin_kook_adapter) | ✔ |
|
|
192
|
+
| [VoceChat](https://github.com/HikariFroya/astrbot_plugin_vocechat) | ✔ |
|
|
193
|
+
| [Bilibili 私信](https://github.com/Hina-Chat/astrbot_plugin_bilibili_adapter) | ✔ |
|
|
186
194
|
|
|
187
195
|
## ⚡ 提供商支持情况
|
|
188
196
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
|
192
|
-
|
|
|
193
|
-
|
|
|
194
|
-
|
|
|
195
|
-
|
|
|
196
|
-
|
|
|
197
|
-
|
|
|
198
|
-
|
|
|
199
|
-
|
|
|
200
|
-
|
|
|
201
|
-
|
|
|
202
|
-
|
|
|
203
|
-
|
|
|
204
|
-
|
|
|
205
|
-
|
|
|
206
|
-
|
|
|
207
|
-
|
|
|
208
|
-
|
|
|
209
|
-
|
|
|
210
|
-
|
|
|
211
|
-
|
|
197
|
+
**大模型服务**
|
|
198
|
+
|
|
199
|
+
| 名称 | 支持性 | 备注 |
|
|
200
|
+
| -------- | ------- | ------- |
|
|
201
|
+
| OpenAI | ✔ | 支持任何兼容 OpenAI API 的服务 |
|
|
202
|
+
| Anthropic | ✔ | |
|
|
203
|
+
| Google Gemini | ✔ | |
|
|
204
|
+
| Moonshot AI | ✔ | |
|
|
205
|
+
| 智谱 AI | ✔ | |
|
|
206
|
+
| DeepSeek | ✔ | |
|
|
207
|
+
| Ollama | ✔ | 本地部署 DeepSeek 等开源语言模型 |
|
|
208
|
+
| LM Studio | ✔ | 本地部署 DeepSeek 等开源语言模型 |
|
|
209
|
+
| [优云智算](https://www.compshare.cn/?ytag=GPU_YY-gh_astrbot&referral_code=FV7DcGowN4hB5UuXKgpE74) | ✔ | |
|
|
210
|
+
| [302.AI](https://share.302.ai/rr1M3l) | ✔ | |
|
|
211
|
+
| [小马算力](https://www.tokenpony.cn/3YPyf) | ✔ | |
|
|
212
|
+
| 硅基流动 | ✔ | |
|
|
213
|
+
| PPIO 派欧云 | ✔ | |
|
|
214
|
+
| ModelScope | ✔ | |
|
|
215
|
+
| OneAPI | ✔ | |
|
|
216
|
+
| Dify | ✔ | |
|
|
217
|
+
| 阿里云百炼应用 | ✔ | |
|
|
218
|
+
| Coze | ✔ | |
|
|
219
|
+
|
|
220
|
+
**语音转文本服务**
|
|
221
|
+
|
|
222
|
+
| 名称 | 支持性 | 备注 |
|
|
223
|
+
| -------- | ------- | ------- |
|
|
224
|
+
| Whisper | ✔ | 支持 API、本地部署 |
|
|
225
|
+
| SenseVoice | ✔ | 本地部署 |
|
|
226
|
+
|
|
227
|
+
**文本转语音服务**
|
|
228
|
+
|
|
229
|
+
| 名称 | 支持性 | 备注 |
|
|
230
|
+
| -------- | ------- | ------- |
|
|
231
|
+
| OpenAI TTS | ✔ | |
|
|
232
|
+
| Gemini TTS | ✔ | |
|
|
233
|
+
| GSVI | ✔ | GPT-Sovits-Inference |
|
|
234
|
+
| GPT-SoVITs | ✔ | GPT-Sovits |
|
|
235
|
+
| FishAudio | ✔ | |
|
|
236
|
+
| Edge TTS | ✔ | Edge 浏览器的免费 TTS |
|
|
237
|
+
| 阿里云百炼 TTS | ✔ | |
|
|
238
|
+
| Azure TTS | ✔ | |
|
|
239
|
+
| Minimax TTS | ✔ | |
|
|
240
|
+
| 火山引擎 TTS | ✔ | |
|
|
212
241
|
|
|
213
242
|
## ❤️ 贡献
|
|
214
243
|
|
|
@@ -240,19 +269,10 @@ pre-commit install
|
|
|
240
269
|
|
|
241
270
|
- [NapNeko/NapCatQQ](https://github.com/NapNeko/NapCatQQ) - 伟大的猫猫框架
|
|
242
271
|
|
|
243
|
-
另外,一些同类型其他的活跃开源 Bot 项目:
|
|
244
|
-
|
|
245
|
-
- [nonebot/nonebot2](https://github.com/nonebot/nonebot2) - 扩展性极强的 Bot 框架
|
|
246
|
-
- [koishijs/koishi](https://github.com/koishijs/koishi) - 扩展性极强的 Bot 框架
|
|
247
|
-
- [MaiM-with-u/MaiBot](https://github.com/MaiM-with-u/MaiBot) - 注重拟人功能的 ChatBot
|
|
248
|
-
- [langbot-app/LangBot](https://github.com/langbot-app/LangBot) - 功能丰富的 Bot 平台
|
|
249
|
-
- [KroMiose/nekro-agent](https://github.com/KroMiose/nekro-agent) - 注重 Agent 的 ChatBot
|
|
250
|
-
- [zhenxun-org/zhenxun_bot](https://github.com/zhenxun-org/zhenxun_bot) - 功能完善的 ChatBot
|
|
251
|
-
|
|
252
272
|
## ⭐ Star History
|
|
253
273
|
|
|
254
274
|
> [!TIP]
|
|
255
|
-
> 如果本项目对您的生活 / 工作产生了帮助,或者您关注本项目的未来发展,请给项目 Star
|
|
275
|
+
> 如果本项目对您的生活 / 工作产生了帮助,或者您关注本项目的未来发展,请给项目 Star,这是我们维护这个开源项目的动力 <3
|
|
256
276
|
|
|
257
277
|
<div align="center">
|
|
258
278
|
|
|
@@ -20,7 +20,7 @@ astrbot/cli/utils/basic.py,sha256=Rxg0LdluIdwPIEbhk_1H6MzzEz2JbhP3d73SWcLfJqA,27
|
|
|
20
20
|
astrbot/cli/utils/plugin.py,sha256=kS37S3bAK3q43mL2wvQM8FuqaSkgLQU_Yt2XqxjnxNo,8483
|
|
21
21
|
astrbot/cli/utils/version_comparator.py,sha256=3gLFA94eswvFsBVDSJmOTLJKxTdCD9kkQFy2Lu7vcTc,3482
|
|
22
22
|
astrbot/core/__init__.py,sha256=-1atHjMqQyequsw6A1heEr4LldE0JVII9MXcuQFSAQM,1218
|
|
23
|
-
astrbot/core/astr_agent_context.py,sha256=
|
|
23
|
+
astrbot/core/astr_agent_context.py,sha256=emypZloG0UWATEKUobDH8yLYcqmaVj9N3HwMQmvY3sc,375
|
|
24
24
|
astrbot/core/astrbot_config_mgr.py,sha256=Z1OwN1DKoZFdul9S8wWeRTiPjKnp0OiYQlmSloVw5nI,10024
|
|
25
25
|
astrbot/core/conversation_mgr.py,sha256=DCnFXhdB0vf94vclX8l-JbLRcSny3cwxhwecAV4jbW0,12217
|
|
26
26
|
astrbot/core/core_lifecycle.py,sha256=z8ivxD4OY5iBK8XO078OlmvSwnCtpTKtiuMF_AF1Adk,11588
|
|
@@ -35,7 +35,7 @@ astrbot/core/zip_updator.py,sha256=iSwa3S2fHXGqYA3ie4SEMrWNy6fSDpW5toCygQFdKSQ,8
|
|
|
35
35
|
astrbot/core/agent/agent.py,sha256=ruwCYv7ySS5zxmhD_49ABKJ8CZSS4lY2fQ2rTlitP-k,365
|
|
36
36
|
astrbot/core/agent/handoff.py,sha256=_046TjTUda3CxtXR0ngb_z3f1XGTqx9pfhh28_Dl3Ts,1168
|
|
37
37
|
astrbot/core/agent/hooks.py,sha256=AWCxG4pvq9uZ9D3yixhtsaqkIGTkYLAY7BsMxdfYC2Q,855
|
|
38
|
-
astrbot/core/agent/mcp_client.py,sha256=
|
|
38
|
+
astrbot/core/agent/mcp_client.py,sha256=74LKME_Mh4kPbZRG0NgcuIRsFaYMnUyH7OGiIWJS2ak,8493
|
|
39
39
|
astrbot/core/agent/response.py,sha256=xLgAJc-_FpvA7J9ROaMUHuSZZ-NGI1LBkaR0qnwrp7I,260
|
|
40
40
|
astrbot/core/agent/run_context.py,sha256=MDvJBvKXq17R0f4-vetJbwS0DhHG2dFqDJ6YmUXik4A,454
|
|
41
41
|
astrbot/core/agent/tool.py,sha256=fXFkQGFIIoX9Y1GYj_LIGyrybOeEKSqOo7-3F10zf58,8920
|
|
@@ -45,7 +45,7 @@ astrbot/core/agent/runners/base.py,sha256=exZS_d2BsrLz-xgeY9ZUPuXikBDUnKxO-dU3ZF
|
|
|
45
45
|
astrbot/core/agent/runners/tool_loop_agent_runner.py,sha256=O4sYg1V3dbUcZFLek5Izi-aEJb983tk9DJOCBQvQjro,13558
|
|
46
46
|
astrbot/core/config/__init__.py,sha256=0CO_3sKtI3WOwWT0k4i6TleWq1SAWJFfB8KjnYB8Zig,172
|
|
47
47
|
astrbot/core/config/astrbot_config.py,sha256=X-b3c5m4msgJrdYFH2LXic5XKY0ViuUMdNZ335zqSBw,6335
|
|
48
|
-
astrbot/core/config/default.py,sha256=
|
|
48
|
+
astrbot/core/config/default.py,sha256=vbUAFpfz7ckiih9Hi3rXKq-WsTK3Ut0rs1RyPW90ZHY,126511
|
|
49
49
|
astrbot/core/db/__init__.py,sha256=JOAMt7_j0y96CuArXJ-YY_qXisSartOZwyDTKf9ZDn8,8844
|
|
50
50
|
astrbot/core/db/po.py,sha256=NDOJpUXI1i4BF1uymCj07opwXM0gdHBtwCoL16Xj4jc,7798
|
|
51
51
|
astrbot/core/db/sqlite.py,sha256=_5-B2Jlare4twLG0TlO95bVTaLu0HAXsfpX5LOcoVWA,26082
|
|
@@ -64,7 +64,7 @@ astrbot/core/message/message_event_result.py,sha256=dooPyzDVV4danPNQBvZsSXemGsih
|
|
|
64
64
|
astrbot/core/pipeline/__init__.py,sha256=-jo6a9lKmwY8oPoifJi0IMLPOVdknQKG30ppIyCs5Bg,1461
|
|
65
65
|
astrbot/core/pipeline/context.py,sha256=3ySHVzhjdT54kTDMMKPse1EFdvb7XfmscNEp3YCJLVM,503
|
|
66
66
|
astrbot/core/pipeline/context_utils.py,sha256=CmR45Er5yFpI-IPwDfbJA1rOhzgNybkZg149dpgtl6w,3548
|
|
67
|
-
astrbot/core/pipeline/scheduler.py,sha256=
|
|
67
|
+
astrbot/core/pipeline/scheduler.py,sha256=HwFQnQ5LCh66qKXGTOP4arONbpVeM4qMQ8a-t_4DNCg,3288
|
|
68
68
|
astrbot/core/pipeline/stage.py,sha256=dqEhUuQIhAZpPV4dULmVN39R0pIPjyw8Ftvs4Y1C4lY,1352
|
|
69
69
|
astrbot/core/pipeline/content_safety_check/stage.py,sha256=yUF2h_E41VZQt70pCtIqr1-pgobbJ49omSnKUgg_G-M,1379
|
|
70
70
|
astrbot/core/pipeline/content_safety_check/strategies/__init__.py,sha256=woX7d9yN3Fcp3VEC42qLOHL8rf3V3rVbM9dB_6EmWog,189
|
|
@@ -73,7 +73,7 @@ astrbot/core/pipeline/content_safety_check/strategies/keywords.py,sha256=j3Ns_IH
|
|
|
73
73
|
astrbot/core/pipeline/content_safety_check/strategies/strategy.py,sha256=G32Xf42EgeyEnhyPLVYlUMiSnDNHUUnnz_MG0PXqfV4,1234
|
|
74
74
|
astrbot/core/pipeline/preprocess_stage/stage.py,sha256=QSgOswf8FHy1j4QozRxJv4qVd-RynG8eriHufian60U,4194
|
|
75
75
|
astrbot/core/pipeline/process_stage/stage.py,sha256=2hCX5LdUCzX2RbleMLF_Yqiot9YDyutF3ePPOZsWeA0,2677
|
|
76
|
-
astrbot/core/pipeline/process_stage/method/llm_request.py,sha256=
|
|
76
|
+
astrbot/core/pipeline/process_stage/method/llm_request.py,sha256=vfOv3NgsjbbwnbhhjFuj3wPd12TyFZTvpaY1O8VkwXc,26181
|
|
77
77
|
astrbot/core/pipeline/process_stage/method/star_request.py,sha256=IuPP7qnxvBgKV6a9D3wLU4_KU3Ec3Ml7IOADQCXDgqk,2501
|
|
78
78
|
astrbot/core/pipeline/rate_limit_check/stage.py,sha256=I_GkpSgioN0-T_catMwpRKtxx-TiMmvu8vV_FE5ORIA,4072
|
|
79
79
|
astrbot/core/pipeline/respond/stage.py,sha256=XE5yGsHGxESP0zAGmx3qHovP1wGaJDXUgfLb5Z4wasE,10837
|
|
@@ -84,7 +84,7 @@ astrbot/core/pipeline/whitelist_check/stage.py,sha256=VcmLs0VfmspNTsitL_WrZXfv2l
|
|
|
84
84
|
astrbot/core/platform/__init__.py,sha256=jQ4UiThp7cDHfmIXAgBDodET87onl7mjii0CAD3RXTY,361
|
|
85
85
|
astrbot/core/platform/astr_message_event.py,sha256=pDZO52rLdPcPc-3c3VhK8SuUKmmxJimhaOh7W6BU19M,14657
|
|
86
86
|
astrbot/core/platform/astrbot_message.py,sha256=r7jlUPfaOEh0yCSHaS1KQtYarZ9B4ikqMZwDj-wLv_k,2655
|
|
87
|
-
astrbot/core/platform/manager.py,sha256=
|
|
87
|
+
astrbot/core/platform/manager.py,sha256=UTA6Y4DE5gpkJtV_oEeKG1EH0KoaWHFT3RkjJ7HEwzM,8264
|
|
88
88
|
astrbot/core/platform/message_session.py,sha256=Hitdfb7IK4SohaMFld0s0UlwLDpVw5UPTToh05bvH60,1076
|
|
89
89
|
astrbot/core/platform/message_type.py,sha256=uGn5KN8B_7b9F5nFTpvLAXRlXx2VFHP3JmJjN8cC7fg,261
|
|
90
90
|
astrbot/core/platform/platform.py,sha256=170_1Y1T5R-3nsu06y3i8Ote7zs8JASnskImp-IP04Q,1772
|
|
@@ -110,13 +110,13 @@ astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_adapter.py,sha256=PT
|
|
|
110
110
|
astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_event.py,sha256=BrxaNhG3sy5QAKf8DlZlum6R7m9X5Fm0SxBrKIC_1hg,499
|
|
111
111
|
astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_server.py,sha256=5A8EVmdx0j1lrd4lmJhM3S_tJJYsdMrEcR93X-lYT4Y,3726
|
|
112
112
|
astrbot/core/platform/sources/satori/satori_adapter.py,sha256=1CJOMXraR1uXCZc8-oHQF0sdqIM_xmQBFjZarhNGlEQ,26827
|
|
113
|
-
astrbot/core/platform/sources/satori/satori_event.py,sha256=
|
|
113
|
+
astrbot/core/platform/sources/satori/satori_event.py,sha256=itSbWfA7Ym2qUWNreoWHLdg7xlFdfdNi6Jd3CM9Bjtw,10617
|
|
114
114
|
astrbot/core/platform/sources/slack/client.py,sha256=p0gCh9gj_VR8IacGg09-BXp2IM8C0oTnodrvEVmShMA,5637
|
|
115
115
|
astrbot/core/platform/sources/slack/slack_adapter.py,sha256=BdZTCNXsO5nUKY2HrZD5tpxMzpnvL7n3_vr2JgJfDS0,15812
|
|
116
116
|
astrbot/core/platform/sources/slack/slack_event.py,sha256=RYTJBqk5-CYQKgk-ejPuMKJyfaxSTqPjvfqKvPNg5Yw,8791
|
|
117
117
|
astrbot/core/platform/sources/telegram/tg_adapter.py,sha256=c4B1MaPiXhzHI4rOxFLMuRY8VloCFmAwPcHSztlEKNQ,15838
|
|
118
118
|
astrbot/core/platform/sources/telegram/tg_event.py,sha256=L66nk47Tn2gdeOTK5wPdz5fkVBH-Gdb_I5mQir7DwP8,11353
|
|
119
|
-
astrbot/core/platform/sources/webchat/webchat_adapter.py,sha256=
|
|
119
|
+
astrbot/core/platform/sources/webchat/webchat_adapter.py,sha256=bHzmEg1AMTBMQuZ5fp_B0L5RZ4HMaGEaYQi9N7BBskw,5964
|
|
120
120
|
astrbot/core/platform/sources/webchat/webchat_event.py,sha256=qeKBQtUZVwknsFQQvwASs5Hybs-L3Rn-bjIUaji6n9o,5457
|
|
121
121
|
astrbot/core/platform/sources/webchat/webchat_queue_mgr.py,sha256=2P0hQRNn7tMs9O6MLQ1GkJSSKz7R5Q8k_0JxEltSKLM,1364
|
|
122
122
|
astrbot/core/platform/sources/wechatpadpro/wechatpadpro_adapter.py,sha256=oXxy6ZJ-42_7yKZko9oepN0vBvVbLJRNjLbaxVr6ehk,40791
|
|
@@ -126,6 +126,15 @@ astrbot/core/platform/sources/wecom/wecom_adapter.py,sha256=iDTE-CRCaER4zzo_1XbG
|
|
|
126
126
|
astrbot/core/platform/sources/wecom/wecom_event.py,sha256=WkP7EP7k4AS5KUrxF7ouByyR3qS-GMZODv3yORQb0kI,9181
|
|
127
127
|
astrbot/core/platform/sources/wecom/wecom_kf.py,sha256=xPPt3P3tqB6d0gzPT0-0YfTkYfzlMki1PNUMGWMkH74,10891
|
|
128
128
|
astrbot/core/platform/sources/wecom/wecom_kf_message.py,sha256=nHPOnrOEnEx2uawL1_6Ht0QB7k7G1Nbt3BLpPQekfZA,5787
|
|
129
|
+
astrbot/core/platform/sources/wecom_ai_bot/WXBizJsonMsgCrypt.py,sha256=KlsziA-PImEQEChuxV4PHPpKH8oVZkPnsLdCeGBlRsw,10962
|
|
130
|
+
astrbot/core/platform/sources/wecom_ai_bot/__init__.py,sha256=iVFuTOcEyTaEfOvrxjjUHiXkgZ2EL2lrsewyy_inwDk,437
|
|
131
|
+
astrbot/core/platform/sources/wecom_ai_bot/ierror.py,sha256=mIcT8B5xY07RQ1Vd4QHMDsnehQDFz5fHgJDWSVRdWCE,817
|
|
132
|
+
astrbot/core/platform/sources/wecom_ai_bot/wecomai_adapter.py,sha256=SYWarSySXLl_eb6rc4msTressPEQH1pWi4BDEnJOkDA,17083
|
|
133
|
+
astrbot/core/platform/sources/wecom_ai_bot/wecomai_api.py,sha256=84I3GqIGO8ISEDbkKZ9Aw4_8G50sRTl93ACE5aKOnYc,11812
|
|
134
|
+
astrbot/core/platform/sources/wecom_ai_bot/wecomai_event.py,sha256=9uN_pMJJOcjNXw3kSlFP46PR6M8ba6L-cCe0pKm1uaw,5072
|
|
135
|
+
astrbot/core/platform/sources/wecom_ai_bot/wecomai_queue_mgr.py,sha256=6RCBipqWKRvN6o8xzdoMChgnA5eDWYUUEHg6rPng-OI,4668
|
|
136
|
+
astrbot/core/platform/sources/wecom_ai_bot/wecomai_server.py,sha256=S4GWt10se99K0BlVkw9wFPYT5g3lGY4qUHlCD8oLQxo,5241
|
|
137
|
+
astrbot/core/platform/sources/wecom_ai_bot/wecomai_utils.py,sha256=L5MrXro7swHK9w4C0Qh_FSCQv1xY4YpIfyQHn6be818,5421
|
|
129
138
|
astrbot/core/platform/sources/weixin_official_account/weixin_offacc_adapter.py,sha256=oWZSYSjlE-cGyXVq1aDlACnMGB4Q40rmD3EYRTQo8fg,10475
|
|
130
139
|
astrbot/core/platform/sources/weixin_official_account/weixin_offacc_event.py,sha256=JpyQYaivJTUkPOMDz5ZXp4CLOQ6ek76eNLmrJXTXEEU,7196
|
|
131
140
|
astrbot/core/provider/__init__.py,sha256=fhD_KB1-KpqJ7woaXDXc7kdlmL3XPQz3xlc5IkFDJJ4,171
|
|
@@ -216,10 +225,10 @@ astrbot/dashboard/routes/session_management.py,sha256=yYcaXDwOiNYoLrseCxazLoFpxj
|
|
|
216
225
|
astrbot/dashboard/routes/stat.py,sha256=KCtP0-f9g664gM2SOBgnU8uKx6zt93-5Kut-d7wd7zk,6910
|
|
217
226
|
astrbot/dashboard/routes/static_file.py,sha256=7KnNcOb1BVqSTft114LhGsDkfg69X2jHEm0tOK0kW0Y,1169
|
|
218
227
|
astrbot/dashboard/routes/t2i.py,sha256=scp05AxoJM9cubrkSMBu1BbIWP1BMS50eFEPZ9S6WKM,8893
|
|
219
|
-
astrbot/dashboard/routes/tools.py,sha256=
|
|
228
|
+
astrbot/dashboard/routes/tools.py,sha256=xVw6sG6xnANZm-M2JXT75ftH_I58MMJ0FqejODnP4Xw,14658
|
|
220
229
|
astrbot/dashboard/routes/update.py,sha256=cFeb0EGA69afhSB4o1HJYsvlBQGQotQXQJsp_juJ6ck,6707
|
|
221
|
-
astrbot-4.3.
|
|
222
|
-
astrbot-4.3.
|
|
223
|
-
astrbot-4.3.
|
|
224
|
-
astrbot-4.3.
|
|
225
|
-
astrbot-4.3.
|
|
230
|
+
astrbot-4.3.5.dist-info/METADATA,sha256=DRMmyvO3PH-HQaBFmW2PU58Z2G2ov77ITzwNzpHl0Ng,10323
|
|
231
|
+
astrbot-4.3.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
232
|
+
astrbot-4.3.5.dist-info/entry_points.txt,sha256=OEF09YmhBWYuViXrvTLLpstF4ccmNwDL8r7nnFD0pfI,53
|
|
233
|
+
astrbot-4.3.5.dist-info/licenses/LICENSE,sha256=zPfQj5Mq8-gThIiBcxETr7t8gND9bZWOjTGQAr80TQI,34500
|
|
234
|
+
astrbot-4.3.5.dist-info/RECORD,,
|