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.
- astrbot/api/__init__.py +16 -4
- astrbot/api/all.py +2 -1
- astrbot/api/event/__init__.py +5 -6
- astrbot/api/event/filter/__init__.py +37 -34
- astrbot/api/platform/__init__.py +7 -8
- astrbot/api/provider/__init__.py +8 -7
- astrbot/api/star/__init__.py +3 -4
- astrbot/api/util/__init__.py +2 -2
- astrbot/cli/__init__.py +1 -0
- astrbot/cli/__main__.py +18 -197
- astrbot/cli/commands/__init__.py +6 -0
- astrbot/cli/commands/cmd_conf.py +209 -0
- astrbot/cli/commands/cmd_init.py +56 -0
- astrbot/cli/commands/cmd_plug.py +245 -0
- astrbot/cli/commands/cmd_run.py +62 -0
- astrbot/cli/utils/__init__.py +18 -0
- astrbot/cli/utils/basic.py +76 -0
- astrbot/cli/utils/plugin.py +246 -0
- astrbot/cli/utils/version_comparator.py +90 -0
- astrbot/core/__init__.py +17 -19
- astrbot/core/agent/agent.py +14 -0
- astrbot/core/agent/handoff.py +38 -0
- astrbot/core/agent/hooks.py +30 -0
- astrbot/core/agent/mcp_client.py +385 -0
- astrbot/core/agent/message.py +175 -0
- astrbot/core/agent/response.py +14 -0
- astrbot/core/agent/run_context.py +22 -0
- astrbot/core/agent/runners/__init__.py +3 -0
- astrbot/core/agent/runners/base.py +65 -0
- astrbot/core/agent/runners/coze/coze_agent_runner.py +367 -0
- astrbot/core/agent/runners/coze/coze_api_client.py +324 -0
- astrbot/core/agent/runners/dashscope/dashscope_agent_runner.py +403 -0
- astrbot/core/agent/runners/dify/dify_agent_runner.py +336 -0
- astrbot/core/agent/runners/dify/dify_api_client.py +195 -0
- astrbot/core/agent/runners/tool_loop_agent_runner.py +400 -0
- astrbot/core/agent/tool.py +285 -0
- astrbot/core/agent/tool_executor.py +17 -0
- astrbot/core/astr_agent_context.py +19 -0
- astrbot/core/astr_agent_hooks.py +36 -0
- astrbot/core/astr_agent_run_util.py +80 -0
- astrbot/core/astr_agent_tool_exec.py +246 -0
- astrbot/core/astrbot_config_mgr.py +275 -0
- astrbot/core/config/__init__.py +2 -2
- astrbot/core/config/astrbot_config.py +60 -20
- astrbot/core/config/default.py +1972 -453
- astrbot/core/config/i18n_utils.py +110 -0
- astrbot/core/conversation_mgr.py +285 -75
- astrbot/core/core_lifecycle.py +167 -62
- astrbot/core/db/__init__.py +305 -102
- astrbot/core/db/migration/helper.py +69 -0
- astrbot/core/db/migration/migra_3_to_4.py +357 -0
- astrbot/core/db/migration/migra_45_to_46.py +44 -0
- astrbot/core/db/migration/migra_webchat_session.py +131 -0
- astrbot/core/db/migration/shared_preferences_v3.py +48 -0
- astrbot/core/db/migration/sqlite_v3.py +497 -0
- astrbot/core/db/po.py +259 -55
- astrbot/core/db/sqlite.py +773 -528
- astrbot/core/db/vec_db/base.py +73 -0
- astrbot/core/db/vec_db/faiss_impl/__init__.py +3 -0
- astrbot/core/db/vec_db/faiss_impl/document_storage.py +392 -0
- astrbot/core/db/vec_db/faiss_impl/embedding_storage.py +93 -0
- astrbot/core/db/vec_db/faiss_impl/sqlite_init.sql +17 -0
- astrbot/core/db/vec_db/faiss_impl/vec_db.py +204 -0
- astrbot/core/event_bus.py +26 -22
- astrbot/core/exceptions.py +9 -0
- astrbot/core/file_token_service.py +98 -0
- astrbot/core/initial_loader.py +19 -10
- astrbot/core/knowledge_base/chunking/__init__.py +9 -0
- astrbot/core/knowledge_base/chunking/base.py +25 -0
- astrbot/core/knowledge_base/chunking/fixed_size.py +59 -0
- astrbot/core/knowledge_base/chunking/recursive.py +161 -0
- astrbot/core/knowledge_base/kb_db_sqlite.py +301 -0
- astrbot/core/knowledge_base/kb_helper.py +642 -0
- astrbot/core/knowledge_base/kb_mgr.py +330 -0
- astrbot/core/knowledge_base/models.py +120 -0
- astrbot/core/knowledge_base/parsers/__init__.py +13 -0
- astrbot/core/knowledge_base/parsers/base.py +51 -0
- astrbot/core/knowledge_base/parsers/markitdown_parser.py +26 -0
- astrbot/core/knowledge_base/parsers/pdf_parser.py +101 -0
- astrbot/core/knowledge_base/parsers/text_parser.py +42 -0
- astrbot/core/knowledge_base/parsers/url_parser.py +103 -0
- astrbot/core/knowledge_base/parsers/util.py +13 -0
- astrbot/core/knowledge_base/prompts.py +65 -0
- astrbot/core/knowledge_base/retrieval/__init__.py +14 -0
- astrbot/core/knowledge_base/retrieval/hit_stopwords.txt +767 -0
- astrbot/core/knowledge_base/retrieval/manager.py +276 -0
- astrbot/core/knowledge_base/retrieval/rank_fusion.py +142 -0
- astrbot/core/knowledge_base/retrieval/sparse_retriever.py +136 -0
- astrbot/core/log.py +21 -15
- astrbot/core/message/components.py +413 -287
- astrbot/core/message/message_event_result.py +35 -24
- astrbot/core/persona_mgr.py +192 -0
- astrbot/core/pipeline/__init__.py +14 -14
- astrbot/core/pipeline/content_safety_check/stage.py +13 -9
- astrbot/core/pipeline/content_safety_check/strategies/__init__.py +1 -2
- astrbot/core/pipeline/content_safety_check/strategies/baidu_aip.py +13 -14
- astrbot/core/pipeline/content_safety_check/strategies/keywords.py +2 -1
- astrbot/core/pipeline/content_safety_check/strategies/strategy.py +6 -6
- astrbot/core/pipeline/context.py +7 -1
- astrbot/core/pipeline/context_utils.py +107 -0
- astrbot/core/pipeline/preprocess_stage/stage.py +63 -36
- astrbot/core/pipeline/process_stage/method/agent_request.py +48 -0
- astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py +464 -0
- astrbot/core/pipeline/process_stage/method/agent_sub_stages/third_party.py +202 -0
- astrbot/core/pipeline/process_stage/method/star_request.py +26 -32
- astrbot/core/pipeline/process_stage/stage.py +21 -15
- astrbot/core/pipeline/process_stage/utils.py +125 -0
- astrbot/core/pipeline/rate_limit_check/stage.py +34 -36
- astrbot/core/pipeline/respond/stage.py +142 -101
- astrbot/core/pipeline/result_decorate/stage.py +124 -57
- astrbot/core/pipeline/scheduler.py +21 -16
- astrbot/core/pipeline/session_status_check/stage.py +37 -0
- astrbot/core/pipeline/stage.py +11 -76
- astrbot/core/pipeline/waking_check/stage.py +69 -33
- astrbot/core/pipeline/whitelist_check/stage.py +10 -7
- astrbot/core/platform/__init__.py +6 -6
- astrbot/core/platform/astr_message_event.py +107 -129
- astrbot/core/platform/astrbot_message.py +32 -12
- astrbot/core/platform/manager.py +62 -18
- astrbot/core/platform/message_session.py +30 -0
- astrbot/core/platform/platform.py +16 -24
- astrbot/core/platform/platform_metadata.py +9 -4
- astrbot/core/platform/register.py +12 -7
- astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py +136 -60
- astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py +126 -46
- astrbot/core/platform/sources/dingtalk/dingtalk_adapter.py +63 -31
- astrbot/core/platform/sources/dingtalk/dingtalk_event.py +30 -26
- astrbot/core/platform/sources/discord/client.py +129 -0
- astrbot/core/platform/sources/discord/components.py +139 -0
- astrbot/core/platform/sources/discord/discord_platform_adapter.py +473 -0
- astrbot/core/platform/sources/discord/discord_platform_event.py +313 -0
- astrbot/core/platform/sources/lark/lark_adapter.py +27 -18
- astrbot/core/platform/sources/lark/lark_event.py +39 -13
- astrbot/core/platform/sources/misskey/misskey_adapter.py +770 -0
- astrbot/core/platform/sources/misskey/misskey_api.py +964 -0
- astrbot/core/platform/sources/misskey/misskey_event.py +163 -0
- astrbot/core/platform/sources/misskey/misskey_utils.py +550 -0
- astrbot/core/platform/sources/qqofficial/qqofficial_message_event.py +149 -33
- astrbot/core/platform/sources/qqofficial/qqofficial_platform_adapter.py +41 -26
- astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_adapter.py +36 -17
- astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_event.py +3 -1
- astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_server.py +14 -8
- astrbot/core/platform/sources/satori/satori_adapter.py +792 -0
- astrbot/core/platform/sources/satori/satori_event.py +432 -0
- astrbot/core/platform/sources/slack/client.py +164 -0
- astrbot/core/platform/sources/slack/slack_adapter.py +416 -0
- astrbot/core/platform/sources/slack/slack_event.py +253 -0
- astrbot/core/platform/sources/telegram/tg_adapter.py +100 -43
- astrbot/core/platform/sources/telegram/tg_event.py +136 -36
- astrbot/core/platform/sources/webchat/webchat_adapter.py +72 -22
- astrbot/core/platform/sources/webchat/webchat_event.py +46 -22
- astrbot/core/platform/sources/webchat/webchat_queue_mgr.py +35 -0
- astrbot/core/platform/sources/wechatpadpro/wechatpadpro_adapter.py +926 -0
- astrbot/core/platform/sources/wechatpadpro/wechatpadpro_message_event.py +178 -0
- astrbot/core/platform/sources/wechatpadpro/xml_data_parser.py +159 -0
- astrbot/core/platform/sources/wecom/wecom_adapter.py +169 -27
- astrbot/core/platform/sources/wecom/wecom_event.py +162 -77
- astrbot/core/platform/sources/wecom/wecom_kf.py +279 -0
- astrbot/core/platform/sources/wecom/wecom_kf_message.py +196 -0
- astrbot/core/platform/sources/wecom_ai_bot/WXBizJsonMsgCrypt.py +297 -0
- astrbot/core/platform/sources/wecom_ai_bot/__init__.py +15 -0
- astrbot/core/platform/sources/wecom_ai_bot/ierror.py +19 -0
- astrbot/core/platform/sources/wecom_ai_bot/wecomai_adapter.py +472 -0
- astrbot/core/platform/sources/wecom_ai_bot/wecomai_api.py +417 -0
- astrbot/core/platform/sources/wecom_ai_bot/wecomai_event.py +152 -0
- astrbot/core/platform/sources/wecom_ai_bot/wecomai_queue_mgr.py +153 -0
- astrbot/core/platform/sources/wecom_ai_bot/wecomai_server.py +168 -0
- astrbot/core/platform/sources/wecom_ai_bot/wecomai_utils.py +209 -0
- astrbot/core/platform/sources/weixin_official_account/weixin_offacc_adapter.py +306 -0
- astrbot/core/platform/sources/weixin_official_account/weixin_offacc_event.py +186 -0
- astrbot/core/platform_message_history_mgr.py +49 -0
- astrbot/core/provider/__init__.py +2 -3
- astrbot/core/provider/entites.py +8 -8
- astrbot/core/provider/entities.py +154 -98
- astrbot/core/provider/func_tool_manager.py +446 -458
- astrbot/core/provider/manager.py +345 -207
- astrbot/core/provider/provider.py +188 -73
- astrbot/core/provider/register.py +9 -7
- astrbot/core/provider/sources/anthropic_source.py +295 -115
- astrbot/core/provider/sources/azure_tts_source.py +224 -0
- astrbot/core/provider/sources/bailian_rerank_source.py +236 -0
- astrbot/core/provider/sources/dashscope_tts.py +138 -14
- astrbot/core/provider/sources/edge_tts_source.py +24 -19
- astrbot/core/provider/sources/fishaudio_tts_api_source.py +58 -13
- astrbot/core/provider/sources/gemini_embedding_source.py +61 -0
- astrbot/core/provider/sources/gemini_source.py +310 -132
- astrbot/core/provider/sources/gemini_tts_source.py +81 -0
- astrbot/core/provider/sources/groq_source.py +15 -0
- astrbot/core/provider/sources/gsv_selfhosted_source.py +151 -0
- astrbot/core/provider/sources/gsvi_tts_source.py +14 -7
- astrbot/core/provider/sources/minimax_tts_api_source.py +159 -0
- astrbot/core/provider/sources/openai_embedding_source.py +40 -0
- astrbot/core/provider/sources/openai_source.py +241 -145
- astrbot/core/provider/sources/openai_tts_api_source.py +18 -7
- astrbot/core/provider/sources/sensevoice_selfhosted_source.py +13 -11
- astrbot/core/provider/sources/vllm_rerank_source.py +71 -0
- astrbot/core/provider/sources/volcengine_tts.py +115 -0
- astrbot/core/provider/sources/whisper_api_source.py +18 -13
- astrbot/core/provider/sources/whisper_selfhosted_source.py +19 -12
- astrbot/core/provider/sources/xinference_rerank_source.py +116 -0
- astrbot/core/provider/sources/xinference_stt_provider.py +197 -0
- astrbot/core/provider/sources/zhipu_source.py +6 -73
- astrbot/core/star/__init__.py +43 -11
- astrbot/core/star/config.py +17 -18
- astrbot/core/star/context.py +362 -138
- astrbot/core/star/filter/__init__.py +4 -3
- astrbot/core/star/filter/command.py +111 -35
- astrbot/core/star/filter/command_group.py +46 -34
- astrbot/core/star/filter/custom_filter.py +6 -5
- astrbot/core/star/filter/event_message_type.py +4 -2
- astrbot/core/star/filter/permission.py +4 -2
- astrbot/core/star/filter/platform_adapter_type.py +45 -12
- astrbot/core/star/filter/regex.py +4 -2
- astrbot/core/star/register/__init__.py +19 -15
- astrbot/core/star/register/star.py +41 -13
- astrbot/core/star/register/star_handler.py +236 -86
- astrbot/core/star/session_llm_manager.py +280 -0
- astrbot/core/star/session_plugin_manager.py +170 -0
- astrbot/core/star/star.py +36 -43
- astrbot/core/star/star_handler.py +47 -85
- astrbot/core/star/star_manager.py +442 -260
- astrbot/core/star/star_tools.py +167 -45
- astrbot/core/star/updator.py +17 -20
- astrbot/core/umop_config_router.py +106 -0
- astrbot/core/updator.py +38 -13
- astrbot/core/utils/astrbot_path.py +39 -0
- astrbot/core/utils/command_parser.py +1 -1
- astrbot/core/utils/io.py +119 -60
- astrbot/core/utils/log_pipe.py +1 -1
- astrbot/core/utils/metrics.py +11 -10
- astrbot/core/utils/migra_helper.py +73 -0
- astrbot/core/utils/path_util.py +63 -62
- astrbot/core/utils/pip_installer.py +37 -15
- astrbot/core/utils/session_lock.py +29 -0
- astrbot/core/utils/session_waiter.py +19 -20
- astrbot/core/utils/shared_preferences.py +174 -34
- astrbot/core/utils/t2i/__init__.py +4 -1
- astrbot/core/utils/t2i/local_strategy.py +386 -238
- astrbot/core/utils/t2i/network_strategy.py +109 -49
- astrbot/core/utils/t2i/renderer.py +29 -14
- astrbot/core/utils/t2i/template/astrbot_powershell.html +184 -0
- astrbot/core/utils/t2i/template_manager.py +111 -0
- astrbot/core/utils/tencent_record_helper.py +115 -1
- astrbot/core/utils/version_comparator.py +10 -13
- astrbot/core/zip_updator.py +112 -65
- astrbot/dashboard/routes/__init__.py +20 -13
- astrbot/dashboard/routes/auth.py +20 -9
- astrbot/dashboard/routes/chat.py +297 -141
- astrbot/dashboard/routes/config.py +652 -55
- astrbot/dashboard/routes/conversation.py +107 -37
- astrbot/dashboard/routes/file.py +26 -0
- astrbot/dashboard/routes/knowledge_base.py +1244 -0
- astrbot/dashboard/routes/log.py +27 -2
- astrbot/dashboard/routes/persona.py +202 -0
- astrbot/dashboard/routes/plugin.py +197 -139
- astrbot/dashboard/routes/route.py +27 -7
- astrbot/dashboard/routes/session_management.py +354 -0
- astrbot/dashboard/routes/stat.py +85 -18
- astrbot/dashboard/routes/static_file.py +5 -2
- astrbot/dashboard/routes/t2i.py +233 -0
- astrbot/dashboard/routes/tools.py +184 -120
- astrbot/dashboard/routes/update.py +59 -36
- astrbot/dashboard/server.py +96 -36
- astrbot/dashboard/utils.py +165 -0
- astrbot-4.7.0.dist-info/METADATA +294 -0
- astrbot-4.7.0.dist-info/RECORD +274 -0
- {astrbot-3.5.6.dist-info → astrbot-4.7.0.dist-info}/WHEEL +1 -1
- astrbot/core/db/plugin/sqlite_impl.py +0 -112
- astrbot/core/db/sqlite_init.sql +0 -50
- astrbot/core/pipeline/platform_compatibility/stage.py +0 -56
- astrbot/core/pipeline/process_stage/method/llm_request.py +0 -606
- astrbot/core/platform/sources/gewechat/client.py +0 -806
- astrbot/core/platform/sources/gewechat/downloader.py +0 -55
- astrbot/core/platform/sources/gewechat/gewechat_event.py +0 -255
- astrbot/core/platform/sources/gewechat/gewechat_platform_adapter.py +0 -103
- astrbot/core/platform/sources/gewechat/xml_data_parser.py +0 -110
- astrbot/core/provider/sources/dashscope_source.py +0 -203
- astrbot/core/provider/sources/dify_source.py +0 -281
- astrbot/core/provider/sources/llmtuner_source.py +0 -132
- astrbot/core/rag/embedding/openai_source.py +0 -20
- astrbot/core/rag/knowledge_db_mgr.py +0 -94
- astrbot/core/rag/store/__init__.py +0 -9
- astrbot/core/rag/store/chroma_db.py +0 -42
- astrbot/core/utils/dify_api_client.py +0 -152
- astrbot-3.5.6.dist-info/METADATA +0 -249
- astrbot-3.5.6.dist-info/RECORD +0 -158
- {astrbot-3.5.6.dist-info → astrbot-4.7.0.dist-info}/entry_points.txt +0 -0
- {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:
|
|
9
|
-
star_map:
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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:
|
|
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:
|
|
55
|
+
star_handler_full_names: list[str] = field(default_factory=list)
|
|
48
56
|
"""注册的 Handler 的全名列表"""
|
|
49
57
|
|
|
50
|
-
|
|
51
|
-
"""
|
|
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"
|
|
55
|
-
|
|
56
|
-
def
|
|
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}"
|