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.
@@ -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
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
  ![AstrBot-Logo-Simplified](https://github.com/user-attachments/assets/ffd99b6b-3272-4682-beaa-6fe74250f7d9)
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
- [![wakatime](https://wakatime.com/badge/user/915e5316-99c6-4563-a483-ef186cf000c9/project/018e705a-a1a7-409a-a849-3013485e6c8e.svg?style=for-the-badge&color=76bad9)](https://wakatime.com/badge/user/915e5316-99c6-4563-a483-ef186cf000c9/project/018e705a-a1a7-409a-a849-3013485e6c8e)
71
68
  ![Dynamic JSON Badge](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fapi.soulter.top%2Fastrbot%2Fplugin-num&query=%24.result&suffix=%E4%B8%AA&style=for-the-badge&label=%E6%8F%92%E4%BB%B6%E5%B8%82%E5%9C%BA&cacheSeconds=3600)
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 是一个开源的一站式 Agentic 聊天机器人平台及开发框架。
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
- | OpenAI | ✔ | 文本生成 | 支持任何兼容 OpenAI API 的服务 |
192
- | Anthropic | | 文本生成 | |
193
- | Google Gemini | ✔ | 文本生成 | |
194
- | Dify | ✔ | LLMOps | |
195
- | 阿里云百炼应用 | ✔ | LLMOps | |
196
- | Ollama | ✔ | 模型加载器 | 本地部署 DeepSeek、Llama 等开源语言模型 |
197
- | LM Studio | ✔ | 模型加载器 | 本地部署 DeepSeek、Llama 等开源语言模型 |
198
- | [优云智算](https://www.compshare.cn/?ytag=GPU_YY-gh_astrbot&referral_code=FV7DcGowN4hB5UuXKgpE74) | ✔ | 模型 API 及算力服务平台 | |
199
- | [302.AI](https://share.302.ai/rr1M3l) | ✔ | 模型 API 服务平台 | |
200
- | 硅基流动 | ✔ | 模型 API 服务平台 | |
201
- | PPIO 派欧云 | ✔ | 模型 API 服务平台 | |
202
- | OneAPI | ✔ | LLM 分发系统 | |
203
- | Whisper | ✔ | 语音转文本 | 支持 API、本地部署 |
204
- | SenseVoice | ✔ | 语音转文本 | 本地部署 |
205
- | OpenAI TTS API | ✔ | 文本转语音 | |
206
- | GSVI | ✔ | 文本转语音 | GPT-Sovits-Inference |
207
- | GPT-SoVITs | ✔ | 文本转语音 | GPT-Sovits-Inference |
208
- | FishAudio | ✔ | 文本转语音 | GPT-Sovits 作者参与的项目 |
209
- | Edge TTS | ✔ | 文本转语音 | Edge 浏览器的免费 TTS |
210
- | 阿里云百炼 TTS | ✔ | 文本转语音 | |
211
- | Azure TTS | ✔ | 文本转语音 | Microsoft Azure TTS |
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,这是我维护这个开源项目的动力 <3
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=4byUrIifQZFZwrDh0AtRLLBUvYX14tXhwiplShUNTt4,303
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=I417lU4JKKKyM5BkpY40ehhQRoxtddLkMbq-H1LX9wI,7999
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=PVNeFncOfO1yksdRDUl2_LJWpAQRaxYYuikZnR9lSco,124015
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=8N6QuLV55gR1jQZDEOUDrvcf42ify8EDmw1aDU3Y4nE,3270
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=NaWr0eRhuxqb4ZIscVNce_f_kP7GL12ME4Ph-WF4dog,25370
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=bJoNhJpLB_sXdC80kqQNB8OhBbAl_340HaOPnOmreug,8076
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=CAeFJHZWvT28YzHn01VP7ugVIfyJibkMdqO2JWww9vA,9553
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=X4FAaV2uFjU65Amc3kse9WJNCqsGpE7xYQjnF99HcW8,5992
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=FvWgjzImgeIGFWJM_r2tku3UTj0J5LwZXfmZJxfJWHM,13975
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.3.dist-info/METADATA,sha256=7SX8mVXZ5Mok98mqaH7vN0LYZlO4di7RSHnsyiLfgZE,11095
222
- astrbot-4.3.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
223
- astrbot-4.3.3.dist-info/entry_points.txt,sha256=OEF09YmhBWYuViXrvTLLpstF4ccmNwDL8r7nnFD0pfI,53
224
- astrbot-4.3.3.dist-info/licenses/LICENSE,sha256=zPfQj5Mq8-gThIiBcxETr7t8gND9bZWOjTGQAr80TQI,34500
225
- astrbot-4.3.3.dist-info/RECORD,,
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,,