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
@@ -1,10 +1,13 @@
1
- import traceback
2
1
  import json
3
- from .route import Route, Response, RouteContext
4
- from astrbot.core import logger
2
+ import traceback
3
+
5
4
  from quart import request
6
- from astrbot.core.db import BaseDatabase
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
- if page_size > 100:
62
- page_size = 100
64
+ page_size = min(page_size, 100)
63
65
 
64
- # 使用数据库的分页方法获取会话列表和总数,传入筛选条件
65
66
  try:
66
- conversations, total_count = self.db_helper.get_filtered_conversations(
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"数据库查询出错: {str(e)}\n{traceback.format_exc()}")
77
- return Response().error(f"数据库查询出错: {str(e)}").__dict__
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"获取对话列表失败: {str(e)}\n{traceback.format_exc()}"
100
+ error_msg = f"获取对话列表失败: {e!s}\n{traceback.format_exc()}"
97
101
  logger.error(error_msg)
98
- return Response().error(f"获取对话列表失败: {str(e)}").__dict__
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.db_helper.get_conversation_by_user_id(user_id, cid)
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"获取对话详情失败: {str(e)}\n{traceback.format_exc()}")
132
- return Response().error(f"获取对话详情失败: {str(e)}").__dict__
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.db_helper.get_conversation_by_user_id(user_id, cid)
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.db_helper.update_conversation_title(user_id, cid, title)
150
- if persona_id is not None:
151
- self.db_helper.update_conversation_persona_id(user_id, cid, persona_id)
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"更新对话信息失败: {str(e)}\n{traceback.format_exc()}")
157
- return Response().error(f"更新对话信息失败: {str(e)}").__dict__
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"删除对话失败: {str(e)}\n{traceback.format_exc()}")
177
- return Response().error(f"删除对话失败: {str(e)}").__dict__
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.db_helper.get_conversation_by_user_id(user_id, cid)
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
- self.db_helper.update_conversation(user_id, cid, history)
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"更新对话历史失败: {str(e)}\n{traceback.format_exc()}")
215
- return Response().error(f"更新对话历史失败: {str(e)}").__dict__
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)