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
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import traceback
|
|
2
1
|
import json
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import traceback
|
|
3
|
+
|
|
5
4
|
from quart import request
|
|
6
|
-
|
|
5
|
+
|
|
6
|
+
from astrbot.core import logger
|
|
7
7
|
from astrbot.core.core_lifecycle import AstrBotCoreLifecycle
|
|
8
|
+
from astrbot.core.db import BaseDatabase
|
|
9
|
+
|
|
10
|
+
from .route import Response, Route, RouteContext
|
|
8
11
|
|
|
9
12
|
|
|
10
13
|
class ConversationRoute(Route):
|
|
@@ -29,6 +32,8 @@ class ConversationRoute(Route):
|
|
|
29
32
|
),
|
|
30
33
|
}
|
|
31
34
|
self.db_helper = db_helper
|
|
35
|
+
self.conv_mgr = core_lifecycle.conversation_manager
|
|
36
|
+
self.core_lifecycle = core_lifecycle
|
|
32
37
|
self.register_routes()
|
|
33
38
|
|
|
34
39
|
async def list_conversations(self):
|
|
@@ -53,17 +58,16 @@ class ConversationRoute(Route):
|
|
|
53
58
|
exclude_platforms.split(",") if exclude_platforms else []
|
|
54
59
|
)
|
|
55
60
|
|
|
56
|
-
|
|
57
|
-
if page < 1:
|
|
58
|
-
page = 1
|
|
61
|
+
page = max(page, 1)
|
|
59
62
|
if page_size < 1:
|
|
60
63
|
page_size = 20
|
|
61
|
-
|
|
62
|
-
page_size = 100
|
|
64
|
+
page_size = min(page_size, 100)
|
|
63
65
|
|
|
64
|
-
# 使用数据库的分页方法获取会话列表和总数,传入筛选条件
|
|
65
66
|
try:
|
|
66
|
-
|
|
67
|
+
(
|
|
68
|
+
conversations,
|
|
69
|
+
total_count,
|
|
70
|
+
) = await self.conv_mgr.get_filtered_conversations(
|
|
67
71
|
page=page,
|
|
68
72
|
page_size=page_size,
|
|
69
73
|
platforms=platform_list,
|
|
@@ -73,8 +77,8 @@ class ConversationRoute(Route):
|
|
|
73
77
|
exclude_platforms=exclude_platform_list,
|
|
74
78
|
)
|
|
75
79
|
except Exception as e:
|
|
76
|
-
logger.error(f"数据库查询出错: {
|
|
77
|
-
return Response().error(f"数据库查询出错: {
|
|
80
|
+
logger.error(f"数据库查询出错: {e!s}\n{traceback.format_exc()}")
|
|
81
|
+
return Response().error(f"数据库查询出错: {e!s}").__dict__
|
|
78
82
|
|
|
79
83
|
# 计算总页数
|
|
80
84
|
total_pages = (
|
|
@@ -93,9 +97,9 @@ class ConversationRoute(Route):
|
|
|
93
97
|
return Response().ok(result).__dict__
|
|
94
98
|
|
|
95
99
|
except Exception as e:
|
|
96
|
-
error_msg = f"获取对话列表失败: {
|
|
100
|
+
error_msg = f"获取对话列表失败: {e!s}\n{traceback.format_exc()}"
|
|
97
101
|
logger.error(error_msg)
|
|
98
|
-
return Response().error(f"获取对话列表失败: {
|
|
102
|
+
return Response().error(f"获取对话列表失败: {e!s}").__dict__
|
|
99
103
|
|
|
100
104
|
async def get_conv_detail(self):
|
|
101
105
|
"""获取指定对话详情(通过POST请求)"""
|
|
@@ -107,7 +111,10 @@ class ConversationRoute(Route):
|
|
|
107
111
|
if not user_id or not cid:
|
|
108
112
|
return Response().error("缺少必要参数: user_id 和 cid").__dict__
|
|
109
113
|
|
|
110
|
-
conversation = self.
|
|
114
|
+
conversation = await self.conv_mgr.get_conversation(
|
|
115
|
+
unified_msg_origin=user_id,
|
|
116
|
+
conversation_id=cid,
|
|
117
|
+
)
|
|
111
118
|
if not conversation:
|
|
112
119
|
return Response().error("对话不存在").__dict__
|
|
113
120
|
|
|
@@ -122,14 +129,14 @@ class ConversationRoute(Route):
|
|
|
122
129
|
"history": conversation.history,
|
|
123
130
|
"created_at": conversation.created_at,
|
|
124
131
|
"updated_at": conversation.updated_at,
|
|
125
|
-
}
|
|
132
|
+
},
|
|
126
133
|
)
|
|
127
134
|
.__dict__
|
|
128
135
|
)
|
|
129
136
|
|
|
130
137
|
except Exception as e:
|
|
131
|
-
logger.error(f"获取对话详情失败: {
|
|
132
|
-
return Response().error(f"获取对话详情失败: {
|
|
138
|
+
logger.error(f"获取对话详情失败: {e!s}\n{traceback.format_exc()}")
|
|
139
|
+
return Response().error(f"获取对话详情失败: {e!s}").__dict__
|
|
133
140
|
|
|
134
141
|
async def upd_conv(self):
|
|
135
142
|
"""更新对话信息(标题和角色ID)"""
|
|
@@ -142,39 +149,93 @@ class ConversationRoute(Route):
|
|
|
142
149
|
|
|
143
150
|
if not user_id or not cid:
|
|
144
151
|
return Response().error("缺少必要参数: user_id 和 cid").__dict__
|
|
145
|
-
conversation = self.
|
|
152
|
+
conversation = await self.conv_mgr.get_conversation(
|
|
153
|
+
unified_msg_origin=user_id,
|
|
154
|
+
conversation_id=cid,
|
|
155
|
+
)
|
|
146
156
|
if not conversation:
|
|
147
157
|
return Response().error("对话不存在").__dict__
|
|
148
|
-
if title is not None:
|
|
149
|
-
self.
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
158
|
+
if title is not None or persona_id is not None:
|
|
159
|
+
await self.conv_mgr.update_conversation(
|
|
160
|
+
unified_msg_origin=user_id,
|
|
161
|
+
conversation_id=cid,
|
|
162
|
+
title=title,
|
|
163
|
+
persona_id=persona_id,
|
|
164
|
+
)
|
|
153
165
|
return Response().ok({"message": "对话信息更新成功"}).__dict__
|
|
154
166
|
|
|
155
167
|
except Exception as e:
|
|
156
|
-
logger.error(f"更新对话信息失败: {
|
|
157
|
-
return Response().error(f"更新对话信息失败: {
|
|
168
|
+
logger.error(f"更新对话信息失败: {e!s}\n{traceback.format_exc()}")
|
|
169
|
+
return Response().error(f"更新对话信息失败: {e!s}").__dict__
|
|
158
170
|
|
|
159
171
|
async def del_conv(self):
|
|
160
172
|
"""删除对话"""
|
|
161
173
|
try:
|
|
162
174
|
data = await request.get_json()
|
|
175
|
+
|
|
176
|
+
# 检查是否是批量删除
|
|
177
|
+
if "conversations" in data:
|
|
178
|
+
# 批量删除
|
|
179
|
+
conversations = data.get("conversations", [])
|
|
180
|
+
if not conversations:
|
|
181
|
+
return (
|
|
182
|
+
Response().error("批量删除时conversations参数不能为空").__dict__
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
deleted_count = 0
|
|
186
|
+
failed_items = []
|
|
187
|
+
|
|
188
|
+
for conv in conversations:
|
|
189
|
+
user_id = conv.get("user_id")
|
|
190
|
+
cid = conv.get("cid")
|
|
191
|
+
|
|
192
|
+
if not user_id or not cid:
|
|
193
|
+
failed_items.append(
|
|
194
|
+
f"user_id:{user_id}, cid:{cid} - 缺少必要参数",
|
|
195
|
+
)
|
|
196
|
+
continue
|
|
197
|
+
|
|
198
|
+
try:
|
|
199
|
+
await self.core_lifecycle.conversation_manager.delete_conversation(
|
|
200
|
+
unified_msg_origin=user_id,
|
|
201
|
+
conversation_id=cid,
|
|
202
|
+
)
|
|
203
|
+
deleted_count += 1
|
|
204
|
+
except Exception as e:
|
|
205
|
+
failed_items.append(f"user_id:{user_id}, cid:{cid} - {e!s}")
|
|
206
|
+
|
|
207
|
+
message = f"成功删除 {deleted_count} 个对话"
|
|
208
|
+
if failed_items:
|
|
209
|
+
message += f",失败 {len(failed_items)} 个"
|
|
210
|
+
|
|
211
|
+
return (
|
|
212
|
+
Response()
|
|
213
|
+
.ok(
|
|
214
|
+
{
|
|
215
|
+
"message": message,
|
|
216
|
+
"deleted_count": deleted_count,
|
|
217
|
+
"failed_count": len(failed_items),
|
|
218
|
+
"failed_items": failed_items,
|
|
219
|
+
},
|
|
220
|
+
)
|
|
221
|
+
.__dict__
|
|
222
|
+
)
|
|
223
|
+
# 单个删除
|
|
163
224
|
user_id = data.get("user_id")
|
|
164
225
|
cid = data.get("cid")
|
|
165
226
|
|
|
166
227
|
if not user_id or not cid:
|
|
167
228
|
return Response().error("缺少必要参数: user_id 和 cid").__dict__
|
|
168
|
-
conversation = self.db_helper.get_conversation_by_user_id(user_id, cid)
|
|
169
|
-
if not conversation:
|
|
170
|
-
return Response().error("对话不存在").__dict__
|
|
171
|
-
self.db_helper.delete_conversation(user_id, cid)
|
|
172
229
|
|
|
230
|
+
await self.core_lifecycle.conversation_manager.delete_conversation(
|
|
231
|
+
unified_msg_origin=user_id,
|
|
232
|
+
conversation_id=cid,
|
|
233
|
+
)
|
|
173
234
|
return Response().ok({"message": "对话删除成功"}).__dict__
|
|
174
235
|
|
|
175
236
|
except Exception as e:
|
|
176
|
-
logger.error(f"删除对话失败: {
|
|
177
|
-
return Response().error(f"删除对话失败: {
|
|
237
|
+
logger.error(f"删除对话失败: {e!s}\n{traceback.format_exc()}")
|
|
238
|
+
return Response().error(f"删除对话失败: {e!s}").__dict__
|
|
178
239
|
|
|
179
240
|
async def update_history(self):
|
|
180
241
|
"""更新对话历史内容"""
|
|
@@ -202,14 +263,23 @@ class ConversationRoute(Route):
|
|
|
202
263
|
Response().error("history 必须是有效的 JSON 字符串或数组").__dict__
|
|
203
264
|
)
|
|
204
265
|
|
|
205
|
-
conversation = self.
|
|
266
|
+
conversation = await self.conv_mgr.get_conversation(
|
|
267
|
+
unified_msg_origin=user_id,
|
|
268
|
+
conversation_id=cid,
|
|
269
|
+
)
|
|
206
270
|
if not conversation:
|
|
207
271
|
return Response().error("对话不存在").__dict__
|
|
208
272
|
|
|
209
|
-
|
|
273
|
+
history = json.loads(history) if isinstance(history, str) else history
|
|
274
|
+
|
|
275
|
+
await self.conv_mgr.update_conversation(
|
|
276
|
+
unified_msg_origin=user_id,
|
|
277
|
+
conversation_id=cid,
|
|
278
|
+
history=history,
|
|
279
|
+
)
|
|
210
280
|
|
|
211
281
|
return Response().ok({"message": "对话历史更新成功"}).__dict__
|
|
212
282
|
|
|
213
283
|
except Exception as e:
|
|
214
|
-
logger.error(f"更新对话历史失败: {
|
|
215
|
-
return Response().error(f"更新对话历史失败: {
|
|
284
|
+
logger.error(f"更新对话历史失败: {e!s}\n{traceback.format_exc()}")
|
|
285
|
+
return Response().error(f"更新对话历史失败: {e!s}").__dict__
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from quart import abort, send_file
|
|
2
|
+
|
|
3
|
+
from astrbot import logger
|
|
4
|
+
from astrbot.core import file_token_service
|
|
5
|
+
|
|
6
|
+
from .route import Route, RouteContext
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class FileRoute(Route):
|
|
10
|
+
def __init__(
|
|
11
|
+
self,
|
|
12
|
+
context: RouteContext,
|
|
13
|
+
) -> None:
|
|
14
|
+
super().__init__(context)
|
|
15
|
+
self.routes = {
|
|
16
|
+
"/file/<file_token>": ("GET", self.serve_file),
|
|
17
|
+
}
|
|
18
|
+
self.register_routes()
|
|
19
|
+
|
|
20
|
+
async def serve_file(self, file_token: str):
|
|
21
|
+
try:
|
|
22
|
+
file_path = await file_token_service.handle_file(file_token)
|
|
23
|
+
return await send_file(file_path)
|
|
24
|
+
except (FileNotFoundError, KeyError) as e:
|
|
25
|
+
logger.warning(str(e))
|
|
26
|
+
return abort(404)
|