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,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
|
-
|
|
4
|
-
|
|
5
|
-
from
|
|
6
|
-
|
|
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
|
|
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,
|
|
23
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|