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,280 @@
1
+ """会话服务管理器 - 负责管理每个会话的LLM、TTS等服务的启停状态"""
2
+
3
+ from astrbot.core import logger, sp
4
+ from astrbot.core.platform.astr_message_event import AstrMessageEvent
5
+
6
+
7
+ class SessionServiceManager:
8
+ """管理会话级别的服务启停状态,包括LLM和TTS"""
9
+
10
+ # =============================================================================
11
+ # LLM 相关方法
12
+ # =============================================================================
13
+
14
+ @staticmethod
15
+ def is_llm_enabled_for_session(session_id: str) -> bool:
16
+ """检查LLM是否在指定会话中启用
17
+
18
+ Args:
19
+ session_id: 会话ID (unified_msg_origin)
20
+
21
+ Returns:
22
+ bool: True表示启用,False表示禁用
23
+
24
+ """
25
+ # 获取会话服务配置
26
+ session_services = sp.get(
27
+ "session_service_config",
28
+ {},
29
+ scope="umo",
30
+ scope_id=session_id,
31
+ )
32
+
33
+ # 如果配置了该会话的LLM状态,返回该状态
34
+ llm_enabled = session_services.get("llm_enabled")
35
+ if llm_enabled is not None:
36
+ return llm_enabled
37
+
38
+ # 如果没有配置,默认为启用(兼容性考虑)
39
+ return True
40
+
41
+ @staticmethod
42
+ def set_llm_status_for_session(session_id: str, enabled: bool) -> None:
43
+ """设置LLM在指定会话中的启停状态
44
+
45
+ Args:
46
+ session_id: 会话ID (unified_msg_origin)
47
+ enabled: True表示启用,False表示禁用
48
+
49
+ """
50
+ session_config = (
51
+ sp.get("session_service_config", {}, scope="umo", scope_id=session_id) or {}
52
+ )
53
+ session_config["llm_enabled"] = enabled
54
+ sp.put(
55
+ "session_service_config",
56
+ session_config,
57
+ scope="umo",
58
+ scope_id=session_id,
59
+ )
60
+
61
+ @staticmethod
62
+ def should_process_llm_request(event: AstrMessageEvent) -> bool:
63
+ """检查是否应该处理LLM请求
64
+
65
+ Args:
66
+ event: 消息事件
67
+
68
+ Returns:
69
+ bool: True表示应该处理,False表示跳过
70
+
71
+ """
72
+ session_id = event.unified_msg_origin
73
+ return SessionServiceManager.is_llm_enabled_for_session(session_id)
74
+
75
+ # =============================================================================
76
+ # TTS 相关方法
77
+ # =============================================================================
78
+
79
+ @staticmethod
80
+ def is_tts_enabled_for_session(session_id: str) -> bool:
81
+ """检查TTS是否在指定会话中启用
82
+
83
+ Args:
84
+ session_id: 会话ID (unified_msg_origin)
85
+
86
+ Returns:
87
+ bool: True表示启用,False表示禁用
88
+
89
+ """
90
+ # 获取会话服务配置
91
+ session_services = sp.get(
92
+ "session_service_config",
93
+ {},
94
+ scope="umo",
95
+ scope_id=session_id,
96
+ )
97
+
98
+ # 如果配置了该会话的TTS状态,返回该状态
99
+ tts_enabled = session_services.get("tts_enabled")
100
+ if tts_enabled is not None:
101
+ return tts_enabled
102
+
103
+ # 如果没有配置,默认为启用(兼容性考虑)
104
+ return True
105
+
106
+ @staticmethod
107
+ def set_tts_status_for_session(session_id: str, enabled: bool) -> None:
108
+ """设置TTS在指定会话中的启停状态
109
+
110
+ Args:
111
+ session_id: 会话ID (unified_msg_origin)
112
+ enabled: True表示启用,False表示禁用
113
+
114
+ """
115
+ session_config = (
116
+ sp.get("session_service_config", {}, scope="umo", scope_id=session_id) or {}
117
+ )
118
+ session_config["tts_enabled"] = enabled
119
+ sp.put(
120
+ "session_service_config",
121
+ session_config,
122
+ scope="umo",
123
+ scope_id=session_id,
124
+ )
125
+
126
+ logger.info(
127
+ f"会话 {session_id} 的TTS状态已更新为: {'启用' if enabled else '禁用'}",
128
+ )
129
+
130
+ @staticmethod
131
+ def should_process_tts_request(event: AstrMessageEvent) -> bool:
132
+ """检查是否应该处理TTS请求
133
+
134
+ Args:
135
+ event: 消息事件
136
+
137
+ Returns:
138
+ bool: True表示应该处理,False表示跳过
139
+
140
+ """
141
+ session_id = event.unified_msg_origin
142
+ return SessionServiceManager.is_tts_enabled_for_session(session_id)
143
+
144
+ # =============================================================================
145
+ # 会话整体启停相关方法
146
+ # =============================================================================
147
+
148
+ @staticmethod
149
+ def is_session_enabled(session_id: str) -> bool:
150
+ """检查会话是否整体启用
151
+
152
+ Args:
153
+ session_id: 会话ID (unified_msg_origin)
154
+
155
+ Returns:
156
+ bool: True表示启用,False表示禁用
157
+
158
+ """
159
+ # 获取会话服务配置
160
+ session_services = sp.get(
161
+ "session_service_config",
162
+ {},
163
+ scope="umo",
164
+ scope_id=session_id,
165
+ )
166
+
167
+ # 如果配置了该会话的整体状态,返回该状态
168
+ session_enabled = session_services.get("session_enabled")
169
+ if session_enabled is not None:
170
+ return session_enabled
171
+
172
+ # 如果没有配置,默认为启用(兼容性考虑)
173
+ return True
174
+
175
+ @staticmethod
176
+ def set_session_status(session_id: str, enabled: bool) -> None:
177
+ """设置会话的整体启停状态
178
+
179
+ Args:
180
+ session_id: 会话ID (unified_msg_origin)
181
+ enabled: True表示启用,False表示禁用
182
+
183
+ """
184
+ session_config = (
185
+ sp.get("session_service_config", {}, scope="umo", scope_id=session_id) or {}
186
+ )
187
+ session_config["session_enabled"] = enabled
188
+ sp.put(
189
+ "session_service_config",
190
+ session_config,
191
+ scope="umo",
192
+ scope_id=session_id,
193
+ )
194
+
195
+ logger.info(
196
+ f"会话 {session_id} 的整体状态已更新为: {'启用' if enabled else '禁用'}",
197
+ )
198
+
199
+ @staticmethod
200
+ def should_process_session_request(event: AstrMessageEvent) -> bool:
201
+ """检查是否应该处理会话请求(会话整体启停检查)
202
+
203
+ Args:
204
+ event: 消息事件
205
+
206
+ Returns:
207
+ bool: True表示应该处理,False表示跳过
208
+
209
+ """
210
+ session_id = event.unified_msg_origin
211
+ return SessionServiceManager.is_session_enabled(session_id)
212
+
213
+ # =============================================================================
214
+ # 会话命名相关方法
215
+ # =============================================================================
216
+
217
+ @staticmethod
218
+ def get_session_custom_name(session_id: str) -> str | None:
219
+ """获取会话的自定义名称
220
+
221
+ Args:
222
+ session_id: 会话ID (unified_msg_origin)
223
+
224
+ Returns:
225
+ str: 自定义名称,如果没有设置则返回None
226
+
227
+ """
228
+ session_services = sp.get(
229
+ "session_service_config",
230
+ {},
231
+ scope="umo",
232
+ scope_id=session_id,
233
+ )
234
+ return session_services.get("custom_name")
235
+
236
+ @staticmethod
237
+ def set_session_custom_name(session_id: str, custom_name: str) -> None:
238
+ """设置会话的自定义名称
239
+
240
+ Args:
241
+ session_id: 会话ID (unified_msg_origin)
242
+ custom_name: 自定义名称,可以为空字符串来清除名称
243
+
244
+ """
245
+ session_config = (
246
+ sp.get("session_service_config", {}, scope="umo", scope_id=session_id) or {}
247
+ )
248
+ if custom_name and custom_name.strip():
249
+ session_config["custom_name"] = custom_name.strip()
250
+ else:
251
+ # 如果传入空名称,则删除自定义名称
252
+ session_config.pop("custom_name", None)
253
+ sp.put(
254
+ "session_service_config",
255
+ session_config,
256
+ scope="umo",
257
+ scope_id=session_id,
258
+ )
259
+
260
+ logger.info(
261
+ f"会话 {session_id} 的自定义名称已更新为: {custom_name.strip() if custom_name and custom_name.strip() else '已清除'}",
262
+ )
263
+
264
+ @staticmethod
265
+ def get_session_display_name(session_id: str) -> str:
266
+ """获取会话的显示名称(优先显示自定义名称,否则显示原始session_id的最后一段)
267
+
268
+ Args:
269
+ session_id: 会话ID (unified_msg_origin)
270
+
271
+ Returns:
272
+ str: 显示名称
273
+
274
+ """
275
+ custom_name = SessionServiceManager.get_session_custom_name(session_id)
276
+ if custom_name:
277
+ return custom_name
278
+
279
+ # 如果没有自定义名称,返回session_id的最后一段
280
+ return session_id.split(":")[2] if session_id.count(":") >= 2 else session_id
@@ -0,0 +1,170 @@
1
+ """会话插件管理器 - 负责管理每个会话的插件启停状态"""
2
+
3
+ from astrbot.core import logger, sp
4
+ from astrbot.core.platform.astr_message_event import AstrMessageEvent
5
+
6
+
7
+ class SessionPluginManager:
8
+ """管理会话级别的插件启停状态"""
9
+
10
+ @staticmethod
11
+ def is_plugin_enabled_for_session(session_id: str, plugin_name: str) -> bool:
12
+ """检查插件是否在指定会话中启用
13
+
14
+ Args:
15
+ session_id: 会话ID (unified_msg_origin)
16
+ plugin_name: 插件名称
17
+
18
+ Returns:
19
+ bool: True表示启用,False表示禁用
20
+
21
+ """
22
+ # 获取会话插件配置
23
+ session_plugin_config = sp.get(
24
+ "session_plugin_config",
25
+ {},
26
+ scope="umo",
27
+ scope_id=session_id,
28
+ )
29
+ session_config = session_plugin_config.get(session_id, {})
30
+
31
+ enabled_plugins = session_config.get("enabled_plugins", [])
32
+ disabled_plugins = session_config.get("disabled_plugins", [])
33
+
34
+ # 如果插件在禁用列表中,返回False
35
+ if plugin_name in disabled_plugins:
36
+ return False
37
+
38
+ # 如果插件在启用列表中,返回True
39
+ if plugin_name in enabled_plugins:
40
+ return True
41
+
42
+ # 如果都没有配置,默认为启用(兼容性考虑)
43
+ return True
44
+
45
+ @staticmethod
46
+ def set_plugin_status_for_session(
47
+ session_id: str,
48
+ plugin_name: str,
49
+ enabled: bool,
50
+ ) -> None:
51
+ """设置插件在指定会话中的启停状态
52
+
53
+ Args:
54
+ session_id: 会话ID (unified_msg_origin)
55
+ plugin_name: 插件名称
56
+ enabled: True表示启用,False表示禁用
57
+
58
+ """
59
+ # 获取当前配置
60
+ session_plugin_config = sp.get(
61
+ "session_plugin_config",
62
+ {},
63
+ scope="umo",
64
+ scope_id=session_id,
65
+ )
66
+ if session_id not in session_plugin_config:
67
+ session_plugin_config[session_id] = {
68
+ "enabled_plugins": [],
69
+ "disabled_plugins": [],
70
+ }
71
+
72
+ session_config = session_plugin_config[session_id]
73
+ enabled_plugins = session_config.get("enabled_plugins", [])
74
+ disabled_plugins = session_config.get("disabled_plugins", [])
75
+
76
+ if enabled:
77
+ # 启用插件
78
+ if plugin_name in disabled_plugins:
79
+ disabled_plugins.remove(plugin_name)
80
+ if plugin_name not in enabled_plugins:
81
+ enabled_plugins.append(plugin_name)
82
+ else:
83
+ # 禁用插件
84
+ if plugin_name in enabled_plugins:
85
+ enabled_plugins.remove(plugin_name)
86
+ if plugin_name not in disabled_plugins:
87
+ disabled_plugins.append(plugin_name)
88
+
89
+ # 保存配置
90
+ session_config["enabled_plugins"] = enabled_plugins
91
+ session_config["disabled_plugins"] = disabled_plugins
92
+ session_plugin_config[session_id] = session_config
93
+ sp.put(
94
+ "session_plugin_config",
95
+ session_plugin_config,
96
+ scope="umo",
97
+ scope_id=session_id,
98
+ )
99
+
100
+ logger.info(
101
+ f"会话 {session_id} 的插件 {plugin_name} 状态已更新为: {'启用' if enabled else '禁用'}",
102
+ )
103
+
104
+ @staticmethod
105
+ def get_session_plugin_config(session_id: str) -> dict[str, list[str]]:
106
+ """获取指定会话的插件配置
107
+
108
+ Args:
109
+ session_id: 会话ID (unified_msg_origin)
110
+
111
+ Returns:
112
+ Dict[str, List[str]]: 包含enabled_plugins和disabled_plugins的字典
113
+
114
+ """
115
+ session_plugin_config = sp.get(
116
+ "session_plugin_config",
117
+ {},
118
+ scope="umo",
119
+ scope_id=session_id,
120
+ )
121
+ return session_plugin_config.get(
122
+ session_id,
123
+ {"enabled_plugins": [], "disabled_plugins": []},
124
+ )
125
+
126
+ @staticmethod
127
+ def filter_handlers_by_session(event: AstrMessageEvent, handlers: list) -> list:
128
+ """根据会话配置过滤处理器列表
129
+
130
+ Args:
131
+ event: 消息事件
132
+ handlers: 原始处理器列表
133
+
134
+ Returns:
135
+ List: 过滤后的处理器列表
136
+
137
+ """
138
+ from astrbot.core.star.star import star_map
139
+
140
+ session_id = event.unified_msg_origin
141
+ filtered_handlers = []
142
+
143
+ for handler in handlers:
144
+ # 获取处理器对应的插件
145
+ plugin = star_map.get(handler.handler_module_path)
146
+ if not plugin:
147
+ # 如果找不到插件元数据,允许执行(可能是系统插件)
148
+ filtered_handlers.append(handler)
149
+ continue
150
+
151
+ # 跳过保留插件(系统插件)
152
+ if plugin.reserved:
153
+ filtered_handlers.append(handler)
154
+ continue
155
+
156
+ if plugin.name is None:
157
+ continue
158
+
159
+ # 检查插件是否在当前会话中启用
160
+ if SessionPluginManager.is_plugin_enabled_for_session(
161
+ session_id,
162
+ plugin.name,
163
+ ):
164
+ filtered_handlers.append(handler)
165
+ else:
166
+ logger.debug(
167
+ f"插件 {plugin.name} 在会话 {session_id} 中被禁用,跳过处理器 {handler.handler_name}",
168
+ )
169
+
170
+ return filtered_handlers
astrbot/core/star/star.py CHANGED
@@ -1,39 +1,47 @@
1
1
  from __future__ import annotations
2
2
 
3
- from types import ModuleType
4
- from typing import List, Dict
5
3
  from dataclasses import dataclass, field
4
+ from types import ModuleType
5
+ from typing import TYPE_CHECKING
6
+
6
7
  from astrbot.core.config import AstrBotConfig
7
8
 
8
- star_registry: List[StarMetadata] = []
9
- star_map: Dict[str, StarMetadata] = {}
9
+ star_registry: list[StarMetadata] = []
10
+ star_map: dict[str, StarMetadata] = {}
10
11
  """key 是模块路径,__module__"""
11
12
 
13
+ if TYPE_CHECKING:
14
+ from . import Star
15
+
12
16
 
13
17
  @dataclass
14
18
  class StarMetadata:
15
- """
16
- 插件的元数据。
19
+ """插件的元数据。
17
20
 
18
21
  当 activated 为 False 时,star_cls 可能为 None,请不要在插件未激活时调用 star_cls 的方法。
19
22
  """
20
23
 
21
- name: str
22
- author: str # 插件作者
23
- desc: str # 插件简介
24
- version: str # 插件版本
25
- repo: str = None # 插件仓库地址
26
-
27
- star_cls_type: type = None
24
+ name: str | None = None
25
+ """插件名"""
26
+ author: str | None = None
27
+ """插件作者"""
28
+ desc: str | None = None
29
+ """插件简介"""
30
+ version: str | None = None
31
+ """插件版本"""
32
+ repo: str | None = None
33
+ """插件仓库地址"""
34
+
35
+ star_cls_type: type[Star] | None = None
28
36
  """插件的类对象的类型"""
29
- module_path: str = None
37
+ module_path: str | None = None
30
38
  """插件的模块路径"""
31
39
 
32
- star_cls: object = None
40
+ star_cls: Star | None = None
33
41
  """插件的类对象"""
34
- module: ModuleType = None
42
+ module: ModuleType | None = None
35
43
  """插件的模块对象"""
36
- root_dir_name: str = None
44
+ root_dir_name: str | None = None
37
45
  """插件的目录名称"""
38
46
  reserved: bool = False
39
47
  """是否是 AstrBot 的保留插件"""
@@ -41,35 +49,20 @@ class StarMetadata:
41
49
  activated: bool = True
42
50
  """是否被激活"""
43
51
 
44
- config: AstrBotConfig = None
52
+ config: AstrBotConfig | None = None
45
53
  """插件配置"""
46
54
 
47
- star_handler_full_names: List[str] = field(default_factory=list)
55
+ star_handler_full_names: list[str] = field(default_factory=list)
48
56
  """注册的 Handler 的全名列表"""
49
57
 
50
- supported_platforms: Dict[str, bool] = field(default_factory=dict)
51
- """插件支持的平台ID字典,key为平台ID,value为是否支持"""
58
+ display_name: str | None = None
59
+ """用于展示的插件名称"""
60
+
61
+ logo_path: str | None = None
62
+ """插件 Logo 的路径"""
52
63
 
53
64
  def __str__(self) -> str:
54
- return f"StarMetadata({self.name}, {self.desc}, {self.version}, {self.repo})"
55
-
56
- def update_platform_compatibility(self, plugin_enable_config: dict) -> None:
57
- """更新插件支持的平台列表
58
-
59
- Args:
60
- plugin_enable_config: 平台插件启用配置,即platform_settings.plugin_enable配置项
61
- """
62
- if not plugin_enable_config:
63
- return
64
-
65
- # 清空之前的配置
66
- self.supported_platforms.clear()
67
-
68
- # 遍历所有平台配置
69
- for platform_id, plugins in plugin_enable_config.items():
70
- # 检查该插件在当前平台的配置
71
- if self.name in plugins:
72
- self.supported_platforms[platform_id] = plugins[self.name]
73
- else:
74
- # 如果没有明确配置,默认为启用
75
- self.supported_platforms[platform_id] = True
65
+ return f"Plugin {self.name} ({self.version}) by {self.author}: {self.desc}"
66
+
67
+ def __repr__(self) -> str:
68
+ return f"Plugin {self.name} ({self.version}) by {self.author}: {self.desc}"