AstrBot 3.5.6__py3-none-any.whl → 4.7.0__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.
Files changed (288) hide show
  1. astrbot/api/__init__.py +16 -4
  2. astrbot/api/all.py +2 -1
  3. astrbot/api/event/__init__.py +5 -6
  4. astrbot/api/event/filter/__init__.py +37 -34
  5. astrbot/api/platform/__init__.py +7 -8
  6. astrbot/api/provider/__init__.py +8 -7
  7. astrbot/api/star/__init__.py +3 -4
  8. astrbot/api/util/__init__.py +2 -2
  9. astrbot/cli/__init__.py +1 -0
  10. astrbot/cli/__main__.py +18 -197
  11. astrbot/cli/commands/__init__.py +6 -0
  12. astrbot/cli/commands/cmd_conf.py +209 -0
  13. astrbot/cli/commands/cmd_init.py +56 -0
  14. astrbot/cli/commands/cmd_plug.py +245 -0
  15. astrbot/cli/commands/cmd_run.py +62 -0
  16. astrbot/cli/utils/__init__.py +18 -0
  17. astrbot/cli/utils/basic.py +76 -0
  18. astrbot/cli/utils/plugin.py +246 -0
  19. astrbot/cli/utils/version_comparator.py +90 -0
  20. astrbot/core/__init__.py +17 -19
  21. astrbot/core/agent/agent.py +14 -0
  22. astrbot/core/agent/handoff.py +38 -0
  23. astrbot/core/agent/hooks.py +30 -0
  24. astrbot/core/agent/mcp_client.py +385 -0
  25. astrbot/core/agent/message.py +175 -0
  26. astrbot/core/agent/response.py +14 -0
  27. astrbot/core/agent/run_context.py +22 -0
  28. astrbot/core/agent/runners/__init__.py +3 -0
  29. astrbot/core/agent/runners/base.py +65 -0
  30. astrbot/core/agent/runners/coze/coze_agent_runner.py +367 -0
  31. astrbot/core/agent/runners/coze/coze_api_client.py +324 -0
  32. astrbot/core/agent/runners/dashscope/dashscope_agent_runner.py +403 -0
  33. astrbot/core/agent/runners/dify/dify_agent_runner.py +336 -0
  34. astrbot/core/agent/runners/dify/dify_api_client.py +195 -0
  35. astrbot/core/agent/runners/tool_loop_agent_runner.py +400 -0
  36. astrbot/core/agent/tool.py +285 -0
  37. astrbot/core/agent/tool_executor.py +17 -0
  38. astrbot/core/astr_agent_context.py +19 -0
  39. astrbot/core/astr_agent_hooks.py +36 -0
  40. astrbot/core/astr_agent_run_util.py +80 -0
  41. astrbot/core/astr_agent_tool_exec.py +246 -0
  42. astrbot/core/astrbot_config_mgr.py +275 -0
  43. astrbot/core/config/__init__.py +2 -2
  44. astrbot/core/config/astrbot_config.py +60 -20
  45. astrbot/core/config/default.py +1972 -453
  46. astrbot/core/config/i18n_utils.py +110 -0
  47. astrbot/core/conversation_mgr.py +285 -75
  48. astrbot/core/core_lifecycle.py +167 -62
  49. astrbot/core/db/__init__.py +305 -102
  50. astrbot/core/db/migration/helper.py +69 -0
  51. astrbot/core/db/migration/migra_3_to_4.py +357 -0
  52. astrbot/core/db/migration/migra_45_to_46.py +44 -0
  53. astrbot/core/db/migration/migra_webchat_session.py +131 -0
  54. astrbot/core/db/migration/shared_preferences_v3.py +48 -0
  55. astrbot/core/db/migration/sqlite_v3.py +497 -0
  56. astrbot/core/db/po.py +259 -55
  57. astrbot/core/db/sqlite.py +773 -528
  58. astrbot/core/db/vec_db/base.py +73 -0
  59. astrbot/core/db/vec_db/faiss_impl/__init__.py +3 -0
  60. astrbot/core/db/vec_db/faiss_impl/document_storage.py +392 -0
  61. astrbot/core/db/vec_db/faiss_impl/embedding_storage.py +93 -0
  62. astrbot/core/db/vec_db/faiss_impl/sqlite_init.sql +17 -0
  63. astrbot/core/db/vec_db/faiss_impl/vec_db.py +204 -0
  64. astrbot/core/event_bus.py +26 -22
  65. astrbot/core/exceptions.py +9 -0
  66. astrbot/core/file_token_service.py +98 -0
  67. astrbot/core/initial_loader.py +19 -10
  68. astrbot/core/knowledge_base/chunking/__init__.py +9 -0
  69. astrbot/core/knowledge_base/chunking/base.py +25 -0
  70. astrbot/core/knowledge_base/chunking/fixed_size.py +59 -0
  71. astrbot/core/knowledge_base/chunking/recursive.py +161 -0
  72. astrbot/core/knowledge_base/kb_db_sqlite.py +301 -0
  73. astrbot/core/knowledge_base/kb_helper.py +642 -0
  74. astrbot/core/knowledge_base/kb_mgr.py +330 -0
  75. astrbot/core/knowledge_base/models.py +120 -0
  76. astrbot/core/knowledge_base/parsers/__init__.py +13 -0
  77. astrbot/core/knowledge_base/parsers/base.py +51 -0
  78. astrbot/core/knowledge_base/parsers/markitdown_parser.py +26 -0
  79. astrbot/core/knowledge_base/parsers/pdf_parser.py +101 -0
  80. astrbot/core/knowledge_base/parsers/text_parser.py +42 -0
  81. astrbot/core/knowledge_base/parsers/url_parser.py +103 -0
  82. astrbot/core/knowledge_base/parsers/util.py +13 -0
  83. astrbot/core/knowledge_base/prompts.py +65 -0
  84. astrbot/core/knowledge_base/retrieval/__init__.py +14 -0
  85. astrbot/core/knowledge_base/retrieval/hit_stopwords.txt +767 -0
  86. astrbot/core/knowledge_base/retrieval/manager.py +276 -0
  87. astrbot/core/knowledge_base/retrieval/rank_fusion.py +142 -0
  88. astrbot/core/knowledge_base/retrieval/sparse_retriever.py +136 -0
  89. astrbot/core/log.py +21 -15
  90. astrbot/core/message/components.py +413 -287
  91. astrbot/core/message/message_event_result.py +35 -24
  92. astrbot/core/persona_mgr.py +192 -0
  93. astrbot/core/pipeline/__init__.py +14 -14
  94. astrbot/core/pipeline/content_safety_check/stage.py +13 -9
  95. astrbot/core/pipeline/content_safety_check/strategies/__init__.py +1 -2
  96. astrbot/core/pipeline/content_safety_check/strategies/baidu_aip.py +13 -14
  97. astrbot/core/pipeline/content_safety_check/strategies/keywords.py +2 -1
  98. astrbot/core/pipeline/content_safety_check/strategies/strategy.py +6 -6
  99. astrbot/core/pipeline/context.py +7 -1
  100. astrbot/core/pipeline/context_utils.py +107 -0
  101. astrbot/core/pipeline/preprocess_stage/stage.py +63 -36
  102. astrbot/core/pipeline/process_stage/method/agent_request.py +48 -0
  103. astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py +464 -0
  104. astrbot/core/pipeline/process_stage/method/agent_sub_stages/third_party.py +202 -0
  105. astrbot/core/pipeline/process_stage/method/star_request.py +26 -32
  106. astrbot/core/pipeline/process_stage/stage.py +21 -15
  107. astrbot/core/pipeline/process_stage/utils.py +125 -0
  108. astrbot/core/pipeline/rate_limit_check/stage.py +34 -36
  109. astrbot/core/pipeline/respond/stage.py +142 -101
  110. astrbot/core/pipeline/result_decorate/stage.py +124 -57
  111. astrbot/core/pipeline/scheduler.py +21 -16
  112. astrbot/core/pipeline/session_status_check/stage.py +37 -0
  113. astrbot/core/pipeline/stage.py +11 -76
  114. astrbot/core/pipeline/waking_check/stage.py +69 -33
  115. astrbot/core/pipeline/whitelist_check/stage.py +10 -7
  116. astrbot/core/platform/__init__.py +6 -6
  117. astrbot/core/platform/astr_message_event.py +107 -129
  118. astrbot/core/platform/astrbot_message.py +32 -12
  119. astrbot/core/platform/manager.py +62 -18
  120. astrbot/core/platform/message_session.py +30 -0
  121. astrbot/core/platform/platform.py +16 -24
  122. astrbot/core/platform/platform_metadata.py +9 -4
  123. astrbot/core/platform/register.py +12 -7
  124. astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py +136 -60
  125. astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py +126 -46
  126. astrbot/core/platform/sources/dingtalk/dingtalk_adapter.py +63 -31
  127. astrbot/core/platform/sources/dingtalk/dingtalk_event.py +30 -26
  128. astrbot/core/platform/sources/discord/client.py +129 -0
  129. astrbot/core/platform/sources/discord/components.py +139 -0
  130. astrbot/core/platform/sources/discord/discord_platform_adapter.py +473 -0
  131. astrbot/core/platform/sources/discord/discord_platform_event.py +313 -0
  132. astrbot/core/platform/sources/lark/lark_adapter.py +27 -18
  133. astrbot/core/platform/sources/lark/lark_event.py +39 -13
  134. astrbot/core/platform/sources/misskey/misskey_adapter.py +770 -0
  135. astrbot/core/platform/sources/misskey/misskey_api.py +964 -0
  136. astrbot/core/platform/sources/misskey/misskey_event.py +163 -0
  137. astrbot/core/platform/sources/misskey/misskey_utils.py +550 -0
  138. astrbot/core/platform/sources/qqofficial/qqofficial_message_event.py +149 -33
  139. astrbot/core/platform/sources/qqofficial/qqofficial_platform_adapter.py +41 -26
  140. astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_adapter.py +36 -17
  141. astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_event.py +3 -1
  142. astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_server.py +14 -8
  143. astrbot/core/platform/sources/satori/satori_adapter.py +792 -0
  144. astrbot/core/platform/sources/satori/satori_event.py +432 -0
  145. astrbot/core/platform/sources/slack/client.py +164 -0
  146. astrbot/core/platform/sources/slack/slack_adapter.py +416 -0
  147. astrbot/core/platform/sources/slack/slack_event.py +253 -0
  148. astrbot/core/platform/sources/telegram/tg_adapter.py +100 -43
  149. astrbot/core/platform/sources/telegram/tg_event.py +136 -36
  150. astrbot/core/platform/sources/webchat/webchat_adapter.py +72 -22
  151. astrbot/core/platform/sources/webchat/webchat_event.py +46 -22
  152. astrbot/core/platform/sources/webchat/webchat_queue_mgr.py +35 -0
  153. astrbot/core/platform/sources/wechatpadpro/wechatpadpro_adapter.py +926 -0
  154. astrbot/core/platform/sources/wechatpadpro/wechatpadpro_message_event.py +178 -0
  155. astrbot/core/platform/sources/wechatpadpro/xml_data_parser.py +159 -0
  156. astrbot/core/platform/sources/wecom/wecom_adapter.py +169 -27
  157. astrbot/core/platform/sources/wecom/wecom_event.py +162 -77
  158. astrbot/core/platform/sources/wecom/wecom_kf.py +279 -0
  159. astrbot/core/platform/sources/wecom/wecom_kf_message.py +196 -0
  160. astrbot/core/platform/sources/wecom_ai_bot/WXBizJsonMsgCrypt.py +297 -0
  161. astrbot/core/platform/sources/wecom_ai_bot/__init__.py +15 -0
  162. astrbot/core/platform/sources/wecom_ai_bot/ierror.py +19 -0
  163. astrbot/core/platform/sources/wecom_ai_bot/wecomai_adapter.py +472 -0
  164. astrbot/core/platform/sources/wecom_ai_bot/wecomai_api.py +417 -0
  165. astrbot/core/platform/sources/wecom_ai_bot/wecomai_event.py +152 -0
  166. astrbot/core/platform/sources/wecom_ai_bot/wecomai_queue_mgr.py +153 -0
  167. astrbot/core/platform/sources/wecom_ai_bot/wecomai_server.py +168 -0
  168. astrbot/core/platform/sources/wecom_ai_bot/wecomai_utils.py +209 -0
  169. astrbot/core/platform/sources/weixin_official_account/weixin_offacc_adapter.py +306 -0
  170. astrbot/core/platform/sources/weixin_official_account/weixin_offacc_event.py +186 -0
  171. astrbot/core/platform_message_history_mgr.py +49 -0
  172. astrbot/core/provider/__init__.py +2 -3
  173. astrbot/core/provider/entites.py +8 -8
  174. astrbot/core/provider/entities.py +154 -98
  175. astrbot/core/provider/func_tool_manager.py +446 -458
  176. astrbot/core/provider/manager.py +345 -207
  177. astrbot/core/provider/provider.py +188 -73
  178. astrbot/core/provider/register.py +9 -7
  179. astrbot/core/provider/sources/anthropic_source.py +295 -115
  180. astrbot/core/provider/sources/azure_tts_source.py +224 -0
  181. astrbot/core/provider/sources/bailian_rerank_source.py +236 -0
  182. astrbot/core/provider/sources/dashscope_tts.py +138 -14
  183. astrbot/core/provider/sources/edge_tts_source.py +24 -19
  184. astrbot/core/provider/sources/fishaudio_tts_api_source.py +58 -13
  185. astrbot/core/provider/sources/gemini_embedding_source.py +61 -0
  186. astrbot/core/provider/sources/gemini_source.py +310 -132
  187. astrbot/core/provider/sources/gemini_tts_source.py +81 -0
  188. astrbot/core/provider/sources/groq_source.py +15 -0
  189. astrbot/core/provider/sources/gsv_selfhosted_source.py +151 -0
  190. astrbot/core/provider/sources/gsvi_tts_source.py +14 -7
  191. astrbot/core/provider/sources/minimax_tts_api_source.py +159 -0
  192. astrbot/core/provider/sources/openai_embedding_source.py +40 -0
  193. astrbot/core/provider/sources/openai_source.py +241 -145
  194. astrbot/core/provider/sources/openai_tts_api_source.py +18 -7
  195. astrbot/core/provider/sources/sensevoice_selfhosted_source.py +13 -11
  196. astrbot/core/provider/sources/vllm_rerank_source.py +71 -0
  197. astrbot/core/provider/sources/volcengine_tts.py +115 -0
  198. astrbot/core/provider/sources/whisper_api_source.py +18 -13
  199. astrbot/core/provider/sources/whisper_selfhosted_source.py +19 -12
  200. astrbot/core/provider/sources/xinference_rerank_source.py +116 -0
  201. astrbot/core/provider/sources/xinference_stt_provider.py +197 -0
  202. astrbot/core/provider/sources/zhipu_source.py +6 -73
  203. astrbot/core/star/__init__.py +43 -11
  204. astrbot/core/star/config.py +17 -18
  205. astrbot/core/star/context.py +362 -138
  206. astrbot/core/star/filter/__init__.py +4 -3
  207. astrbot/core/star/filter/command.py +111 -35
  208. astrbot/core/star/filter/command_group.py +46 -34
  209. astrbot/core/star/filter/custom_filter.py +6 -5
  210. astrbot/core/star/filter/event_message_type.py +4 -2
  211. astrbot/core/star/filter/permission.py +4 -2
  212. astrbot/core/star/filter/platform_adapter_type.py +45 -12
  213. astrbot/core/star/filter/regex.py +4 -2
  214. astrbot/core/star/register/__init__.py +19 -15
  215. astrbot/core/star/register/star.py +41 -13
  216. astrbot/core/star/register/star_handler.py +236 -86
  217. astrbot/core/star/session_llm_manager.py +280 -0
  218. astrbot/core/star/session_plugin_manager.py +170 -0
  219. astrbot/core/star/star.py +36 -43
  220. astrbot/core/star/star_handler.py +47 -85
  221. astrbot/core/star/star_manager.py +442 -260
  222. astrbot/core/star/star_tools.py +167 -45
  223. astrbot/core/star/updator.py +17 -20
  224. astrbot/core/umop_config_router.py +106 -0
  225. astrbot/core/updator.py +38 -13
  226. astrbot/core/utils/astrbot_path.py +39 -0
  227. astrbot/core/utils/command_parser.py +1 -1
  228. astrbot/core/utils/io.py +119 -60
  229. astrbot/core/utils/log_pipe.py +1 -1
  230. astrbot/core/utils/metrics.py +11 -10
  231. astrbot/core/utils/migra_helper.py +73 -0
  232. astrbot/core/utils/path_util.py +63 -62
  233. astrbot/core/utils/pip_installer.py +37 -15
  234. astrbot/core/utils/session_lock.py +29 -0
  235. astrbot/core/utils/session_waiter.py +19 -20
  236. astrbot/core/utils/shared_preferences.py +174 -34
  237. astrbot/core/utils/t2i/__init__.py +4 -1
  238. astrbot/core/utils/t2i/local_strategy.py +386 -238
  239. astrbot/core/utils/t2i/network_strategy.py +109 -49
  240. astrbot/core/utils/t2i/renderer.py +29 -14
  241. astrbot/core/utils/t2i/template/astrbot_powershell.html +184 -0
  242. astrbot/core/utils/t2i/template_manager.py +111 -0
  243. astrbot/core/utils/tencent_record_helper.py +115 -1
  244. astrbot/core/utils/version_comparator.py +10 -13
  245. astrbot/core/zip_updator.py +112 -65
  246. astrbot/dashboard/routes/__init__.py +20 -13
  247. astrbot/dashboard/routes/auth.py +20 -9
  248. astrbot/dashboard/routes/chat.py +297 -141
  249. astrbot/dashboard/routes/config.py +652 -55
  250. astrbot/dashboard/routes/conversation.py +107 -37
  251. astrbot/dashboard/routes/file.py +26 -0
  252. astrbot/dashboard/routes/knowledge_base.py +1244 -0
  253. astrbot/dashboard/routes/log.py +27 -2
  254. astrbot/dashboard/routes/persona.py +202 -0
  255. astrbot/dashboard/routes/plugin.py +197 -139
  256. astrbot/dashboard/routes/route.py +27 -7
  257. astrbot/dashboard/routes/session_management.py +354 -0
  258. astrbot/dashboard/routes/stat.py +85 -18
  259. astrbot/dashboard/routes/static_file.py +5 -2
  260. astrbot/dashboard/routes/t2i.py +233 -0
  261. astrbot/dashboard/routes/tools.py +184 -120
  262. astrbot/dashboard/routes/update.py +59 -36
  263. astrbot/dashboard/server.py +96 -36
  264. astrbot/dashboard/utils.py +165 -0
  265. astrbot-4.7.0.dist-info/METADATA +294 -0
  266. astrbot-4.7.0.dist-info/RECORD +274 -0
  267. {astrbot-3.5.6.dist-info → astrbot-4.7.0.dist-info}/WHEEL +1 -1
  268. astrbot/core/db/plugin/sqlite_impl.py +0 -112
  269. astrbot/core/db/sqlite_init.sql +0 -50
  270. astrbot/core/pipeline/platform_compatibility/stage.py +0 -56
  271. astrbot/core/pipeline/process_stage/method/llm_request.py +0 -606
  272. astrbot/core/platform/sources/gewechat/client.py +0 -806
  273. astrbot/core/platform/sources/gewechat/downloader.py +0 -55
  274. astrbot/core/platform/sources/gewechat/gewechat_event.py +0 -255
  275. astrbot/core/platform/sources/gewechat/gewechat_platform_adapter.py +0 -103
  276. astrbot/core/platform/sources/gewechat/xml_data_parser.py +0 -110
  277. astrbot/core/provider/sources/dashscope_source.py +0 -203
  278. astrbot/core/provider/sources/dify_source.py +0 -281
  279. astrbot/core/provider/sources/llmtuner_source.py +0 -132
  280. astrbot/core/rag/embedding/openai_source.py +0 -20
  281. astrbot/core/rag/knowledge_db_mgr.py +0 -94
  282. astrbot/core/rag/store/__init__.py +0 -9
  283. astrbot/core/rag/store/chroma_db.py +0 -42
  284. astrbot/core/utils/dify_api_client.py +0 -152
  285. astrbot-3.5.6.dist-info/METADATA +0 -249
  286. astrbot-3.5.6.dist-info/RECORD +0 -158
  287. {astrbot-3.5.6.dist-info → astrbot-4.7.0.dist-info}/entry_points.txt +0 -0
  288. {astrbot-3.5.6.dist-info → astrbot-4.7.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,107 @@
1
+ import inspect
2
+ import traceback
3
+ import typing as T
4
+
5
+ from astrbot import logger
6
+ from astrbot.core.message.message_event_result import CommandResult, MessageEventResult
7
+ from astrbot.core.platform.astr_message_event import AstrMessageEvent
8
+ from astrbot.core.star.star import star_map
9
+ from astrbot.core.star.star_handler import EventType, star_handlers_registry
10
+
11
+
12
+ async def call_handler(
13
+ event: AstrMessageEvent,
14
+ handler: T.Callable[..., T.Awaitable[T.Any]],
15
+ *args,
16
+ **kwargs,
17
+ ) -> T.AsyncGenerator[T.Any, None]:
18
+ """执行事件处理函数并处理其返回结果
19
+
20
+ 该方法负责调用处理函数并处理不同类型的返回值。它支持两种类型的处理函数:
21
+ 1. 异步生成器: 实现洋葱模型,每次 yield 都会将控制权交回上层
22
+ 2. 协程: 执行一次并处理返回值
23
+
24
+ Args:
25
+ event (AstrMessageEvent): 事件对象
26
+ handler (Awaitable): 事件处理函数
27
+
28
+ Returns:
29
+ AsyncGenerator[None, None]: 异步生成器,用于在管道中传递控制流
30
+
31
+ """
32
+ ready_to_call = None # 一个协程或者异步生成器
33
+
34
+ trace_ = None
35
+
36
+ try:
37
+ ready_to_call = handler(event, *args, **kwargs)
38
+ except TypeError:
39
+ logger.error("处理函数参数不匹配,请检查 handler 的定义。", exc_info=True)
40
+
41
+ if not ready_to_call:
42
+ return
43
+
44
+ if inspect.isasyncgen(ready_to_call):
45
+ _has_yielded = False
46
+ try:
47
+ async for ret in ready_to_call:
48
+ # 这里逐步执行异步生成器, 对于每个 yield 返回的 ret, 执行下面的代码
49
+ # 返回值只能是 MessageEventResult 或者 None(无返回值)
50
+ _has_yielded = True
51
+ if isinstance(ret, (MessageEventResult, CommandResult)):
52
+ # 如果返回值是 MessageEventResult, 设置结果并继续
53
+ event.set_result(ret)
54
+ yield
55
+ else:
56
+ # 如果返回值是 None, 则不设置结果并继续
57
+ # 继续执行后续阶段
58
+ yield ret
59
+ if not _has_yielded:
60
+ # 如果这个异步生成器没有执行到 yield 分支
61
+ yield
62
+ except Exception as e:
63
+ logger.error(f"Previous Error: {trace_}")
64
+ raise e
65
+ elif inspect.iscoroutine(ready_to_call):
66
+ # 如果只是一个协程, 直接执行
67
+ ret = await ready_to_call
68
+ if isinstance(ret, (MessageEventResult, CommandResult)):
69
+ event.set_result(ret)
70
+ yield
71
+ else:
72
+ yield ret
73
+
74
+
75
+ async def call_event_hook(
76
+ event: AstrMessageEvent,
77
+ hook_type: EventType,
78
+ *args,
79
+ **kwargs,
80
+ ) -> bool:
81
+ """调用事件钩子函数
82
+
83
+ Returns:
84
+ bool: 如果事件被终止,返回 True
85
+ #
86
+
87
+ """
88
+ handlers = star_handlers_registry.get_handlers_by_event_type(
89
+ hook_type,
90
+ plugins_name=event.plugins_name,
91
+ )
92
+ for handler in handlers:
93
+ try:
94
+ logger.debug(
95
+ f"hook({hook_type.name}) -> {star_map[handler.handler_module_path].name} - {handler.handler_name}",
96
+ )
97
+ await handler.handler(event, *args, **kwargs)
98
+ except BaseException:
99
+ logger.error(traceback.format_exc())
100
+
101
+ if event.is_stopped():
102
+ logger.info(
103
+ f"{star_map[handler.handler_module_path].name} - {handler.handler_name} 终止了事件传播。",
104
+ )
105
+ return True
106
+
107
+ return event.is_stopped()
@@ -1,11 +1,14 @@
1
- import traceback
2
1
  import asyncio
3
- from typing import Union, AsyncGenerator
4
- from ..stage import Stage, register_stage
5
- from ..context import PipelineContext
6
- from astrbot.core.platform.astr_message_event import AstrMessageEvent
2
+ import random
3
+ import traceback
4
+ from collections.abc import AsyncGenerator
5
+
7
6
  from astrbot.core import logger
8
- from astrbot.core.message.components import Plain, Record, Image
7
+ from astrbot.core.message.components import Image, Plain, Record
8
+ from astrbot.core.platform.astr_message_event import AstrMessageEvent
9
+
10
+ from ..context import PipelineContext
11
+ from ..stage import Stage, register_stage
9
12
 
10
13
 
11
14
  @register_stage
@@ -19,9 +22,30 @@ class PreProcessStage(Stage):
19
22
  self.platform_settings: dict = self.config.get("platform_settings", {})
20
23
 
21
24
  async def process(
22
- self, event: AstrMessageEvent
23
- ) -> Union[None, AsyncGenerator[None, None]]:
25
+ self,
26
+ event: AstrMessageEvent,
27
+ ) -> None | AsyncGenerator[None, None]:
24
28
  """在处理事件之前的预处理"""
29
+ # 平台特异配置:platform_specific.<platform>.pre_ack_emoji
30
+ supported = {"telegram", "lark"}
31
+ platform = event.get_platform_name()
32
+ cfg = (
33
+ self.config.get("platform_specific", {})
34
+ .get(platform, {})
35
+ .get("pre_ack_emoji", {})
36
+ ) or {}
37
+ emojis = cfg.get("emojis") or []
38
+ if (
39
+ cfg.get("enable", False)
40
+ and platform in supported
41
+ and emojis
42
+ and event.is_at_or_wake_command
43
+ ):
44
+ try:
45
+ await event.react(random.choice(emojis))
46
+ except Exception as e:
47
+ logger.warning(f"{platform} 预回应表情发送失败: {e}")
48
+
25
49
  # 路径映射
26
50
  if mappings := self.platform_settings.get("path_mapping", []):
27
51
  # 支持 Record,Image 消息段的路径映射。
@@ -43,31 +67,34 @@ class PreProcessStage(Stage):
43
67
  # STT
44
68
  if self.stt_settings.get("enable", False):
45
69
  # TODO: 独立
46
- stt_provider = (
47
- self.plugin_manager.context.provider_manager.curr_stt_provider_inst
48
- )
49
- if stt_provider:
50
- message_chain = event.get_messages()
51
- for idx, component in enumerate(message_chain):
52
- if isinstance(component, Record) and component.url:
53
- path = component.url.removeprefix("file://")
54
- retry = 5
55
- for i in range(retry):
56
- try:
57
- result = await stt_provider.get_text(audio_url=path)
58
- if result:
59
- logger.info("语音转文本结果: " + result)
60
- message_chain[idx] = Plain(result)
61
- event.message_str += result
62
- event.message_obj.message_str += result
63
- break
64
- except FileNotFoundError as e:
65
- # napcat workaround
66
- logger.warning(e)
67
- logger.warning(f"重试中: {i + 1}/{retry}")
68
- await asyncio.sleep(0.5)
69
- continue
70
- except BaseException as e:
71
- logger.error(traceback.format_exc())
72
- logger.error(f"语音转文本失败: {e}")
73
- break
70
+ ctx = self.plugin_manager.context
71
+ stt_provider = ctx.get_using_stt_provider(event.unified_msg_origin)
72
+ if not stt_provider:
73
+ logger.warning(
74
+ f"会话 {event.unified_msg_origin} 未配置语音转文本模型。",
75
+ )
76
+ return
77
+ message_chain = event.get_messages()
78
+ for idx, component in enumerate(message_chain):
79
+ if isinstance(component, Record) and component.url:
80
+ path = component.url.removeprefix("file://")
81
+ retry = 5
82
+ for i in range(retry):
83
+ try:
84
+ result = await stt_provider.get_text(audio_url=path)
85
+ if result:
86
+ logger.info("语音转文本结果: " + result)
87
+ message_chain[idx] = Plain(result)
88
+ event.message_str += result
89
+ event.message_obj.message_str += result
90
+ break
91
+ except FileNotFoundError as e:
92
+ # napcat workaround
93
+ logger.warning(e)
94
+ logger.warning(f"重试中: {i + 1}/{retry}")
95
+ await asyncio.sleep(0.5)
96
+ continue
97
+ except BaseException as e:
98
+ logger.error(traceback.format_exc())
99
+ logger.error(f"语音转文本失败: {e}")
100
+ break
@@ -0,0 +1,48 @@
1
+ from collections.abc import AsyncGenerator
2
+
3
+ from astrbot.core import logger
4
+ from astrbot.core.platform.astr_message_event import AstrMessageEvent
5
+ from astrbot.core.star.session_llm_manager import SessionServiceManager
6
+
7
+ from ...context import PipelineContext
8
+ from ..stage import Stage
9
+ from .agent_sub_stages.internal import InternalAgentSubStage
10
+ from .agent_sub_stages.third_party import ThirdPartyAgentSubStage
11
+
12
+
13
+ class AgentRequestSubStage(Stage):
14
+ async def initialize(self, ctx: PipelineContext) -> None:
15
+ self.ctx = ctx
16
+ self.config = ctx.astrbot_config
17
+
18
+ self.bot_wake_prefixs: list[str] = self.config["wake_prefix"]
19
+ self.prov_wake_prefix: str = self.config["provider_settings"]["wake_prefix"]
20
+ for bwp in self.bot_wake_prefixs:
21
+ if self.prov_wake_prefix.startswith(bwp):
22
+ logger.info(
23
+ f"识别 LLM 聊天额外唤醒前缀 {self.prov_wake_prefix} 以机器人唤醒前缀 {bwp} 开头,已自动去除。",
24
+ )
25
+ self.prov_wake_prefix = self.prov_wake_prefix[len(bwp) :]
26
+
27
+ agent_runner_type = self.config["provider_settings"]["agent_runner_type"]
28
+ if agent_runner_type == "local":
29
+ self.agent_sub_stage = InternalAgentSubStage()
30
+ else:
31
+ self.agent_sub_stage = ThirdPartyAgentSubStage()
32
+ await self.agent_sub_stage.initialize(ctx)
33
+
34
+ async def process(self, event: AstrMessageEvent) -> AsyncGenerator[None, None]:
35
+ if not self.ctx.astrbot_config["provider_settings"]["enable"]:
36
+ logger.debug(
37
+ "This pipeline does not enable AI capability, skip processing."
38
+ )
39
+ return
40
+
41
+ if not SessionServiceManager.should_process_llm_request(event):
42
+ logger.debug(
43
+ f"The session {event.unified_msg_origin} has disabled AI capability, skipping processing."
44
+ )
45
+ return
46
+
47
+ async for resp in self.agent_sub_stage.process(event, self.prov_wake_prefix):
48
+ yield resp