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
astrbot/core/db/po.py CHANGED
@@ -1,89 +1,293 @@
1
- """指标数据"""
2
-
1
+ import uuid
3
2
  from dataclasses import dataclass, field
4
- from typing import List
3
+ from datetime import datetime, timezone
4
+ from typing import TypedDict
5
5
 
6
+ from sqlmodel import JSON, Field, SQLModel, Text, UniqueConstraint
6
7
 
7
- @dataclass
8
- class Platform:
9
- """平台使用统计数据"""
10
8
 
11
- name: str
12
- count: int
13
- timestamp: int
9
+ class PlatformStat(SQLModel, table=True):
10
+ """This class represents the statistics of bot usage across different platforms.
14
11
 
12
+ Note: In astrbot v4, we moved `platform` table to here.
13
+ """
15
14
 
16
- @dataclass
17
- class Provider:
18
- """供应商使用统计数据"""
15
+ __tablename__ = "platform_stats" # type: ignore
19
16
 
20
- name: str
21
- count: int
22
- timestamp: int
17
+ id: int = Field(primary_key=True, sa_column_kwargs={"autoincrement": True})
18
+ timestamp: datetime = Field(nullable=False)
19
+ platform_id: str = Field(nullable=False)
20
+ platform_type: str = Field(nullable=False) # such as "aiocqhttp", "slack", etc.
21
+ count: int = Field(default=0, nullable=False)
23
22
 
23
+ __table_args__ = (
24
+ UniqueConstraint(
25
+ "timestamp",
26
+ "platform_id",
27
+ "platform_type",
28
+ name="uix_platform_stats",
29
+ ),
30
+ )
24
31
 
25
- @dataclass
26
- class Plugin:
27
- """插件使用统计数据"""
28
32
 
29
- name: str
30
- count: int
31
- timestamp: int
33
+ class ConversationV2(SQLModel, table=True):
34
+ __tablename__ = "conversations" # type: ignore
32
35
 
36
+ inner_conversation_id: int = Field(
37
+ primary_key=True,
38
+ sa_column_kwargs={"autoincrement": True},
39
+ )
40
+ conversation_id: str = Field(
41
+ max_length=36,
42
+ nullable=False,
43
+ unique=True,
44
+ default_factory=lambda: str(uuid.uuid4()),
45
+ )
46
+ platform_id: str = Field(nullable=False)
47
+ user_id: str = Field(nullable=False)
48
+ content: list | None = Field(default=None, sa_type=JSON)
49
+ created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
50
+ updated_at: datetime = Field(
51
+ default_factory=lambda: datetime.now(timezone.utc),
52
+ sa_column_kwargs={"onupdate": datetime.now(timezone.utc)},
53
+ )
54
+ title: str | None = Field(default=None, max_length=255)
55
+ persona_id: str | None = Field(default=None)
33
56
 
34
- @dataclass
35
- class Command:
36
- """命令使用统计数据"""
57
+ __table_args__ = (
58
+ UniqueConstraint(
59
+ "conversation_id",
60
+ name="uix_conversation_id",
61
+ ),
62
+ )
37
63
 
38
- name: str
39
- count: int
40
- timestamp: int
41
64
 
65
+ class Persona(SQLModel, table=True):
66
+ """Persona is a set of instructions for LLMs to follow.
42
67
 
43
- @dataclass
44
- class Stats:
45
- platform: List[Platform] = field(default_factory=list)
46
- command: List[Command] = field(default_factory=list)
47
- llm: List[Provider] = field(default_factory=list)
68
+ It can be used to customize the behavior of LLMs.
69
+ """
48
70
 
71
+ __tablename__ = "personas" # type: ignore
49
72
 
50
- @dataclass
51
- class LLMHistory:
52
- """LLM 聊天时持久化的信息"""
73
+ id: int | None = Field(
74
+ primary_key=True,
75
+ sa_column_kwargs={"autoincrement": True},
76
+ default=None,
77
+ )
78
+ persona_id: str = Field(max_length=255, nullable=False)
79
+ system_prompt: str = Field(sa_type=Text, nullable=False)
80
+ begin_dialogs: list | None = Field(default=None, sa_type=JSON)
81
+ """a list of strings, each representing a dialog to start with"""
82
+ tools: list | None = Field(default=None, sa_type=JSON)
83
+ """None means use ALL tools for default, empty list means no tools, otherwise a list of tool names."""
84
+ created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
85
+ updated_at: datetime = Field(
86
+ default_factory=lambda: datetime.now(timezone.utc),
87
+ sa_column_kwargs={"onupdate": datetime.now(timezone.utc)},
88
+ )
53
89
 
54
- provider_type: str
55
- session_id: str
56
- content: str
90
+ __table_args__ = (
91
+ UniqueConstraint(
92
+ "persona_id",
93
+ name="uix_persona_id",
94
+ ),
95
+ )
57
96
 
58
97
 
59
- @dataclass
60
- class ATRIVision:
61
- """Deprecated"""
98
+ class Preference(SQLModel, table=True):
99
+ """This class represents preferences for bots."""
100
+
101
+ __tablename__ = "preferences" # type: ignore
102
+
103
+ id: int | None = Field(
104
+ default=None,
105
+ primary_key=True,
106
+ sa_column_kwargs={"autoincrement": True},
107
+ )
108
+ scope: str = Field(nullable=False)
109
+ """Scope of the preference, such as 'global', 'umo', 'plugin'."""
110
+ scope_id: str = Field(nullable=False)
111
+ """ID of the scope, such as 'global', 'umo', 'plugin_name'."""
112
+ key: str = Field(nullable=False)
113
+ value: dict = Field(sa_type=JSON, nullable=False)
114
+ created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
115
+ updated_at: datetime = Field(
116
+ default_factory=lambda: datetime.now(timezone.utc),
117
+ sa_column_kwargs={"onupdate": datetime.now(timezone.utc)},
118
+ )
62
119
 
63
- id: str
64
- url_or_path: str
65
- caption: str
66
- is_meme: bool
67
- keywords: List[str]
68
- platform_name: str
69
- session_id: str
70
- sender_nickname: str
71
- timestamp: int = -1
120
+ __table_args__ = (
121
+ UniqueConstraint(
122
+ "scope",
123
+ "scope_id",
124
+ "key",
125
+ name="uix_preference_scope_scope_id_key",
126
+ ),
127
+ )
128
+
129
+
130
+ class PlatformMessageHistory(SQLModel, table=True):
131
+ """This class represents the message history for a specific platform.
132
+
133
+ It is used to store messages that are not LLM-generated, such as user messages
134
+ or platform-specific messages.
135
+ """
136
+
137
+ __tablename__ = "platform_message_history" # type: ignore
138
+
139
+ id: int | None = Field(
140
+ primary_key=True,
141
+ sa_column_kwargs={"autoincrement": True},
142
+ default=None,
143
+ )
144
+ platform_id: str = Field(nullable=False)
145
+ user_id: str = Field(nullable=False) # An id of group, user in platform
146
+ sender_id: str | None = Field(default=None) # ID of the sender in the platform
147
+ sender_name: str | None = Field(
148
+ default=None,
149
+ ) # Name of the sender in the platform
150
+ content: dict = Field(sa_type=JSON, nullable=False) # a message chain list
151
+ created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
152
+ updated_at: datetime = Field(
153
+ default_factory=lambda: datetime.now(timezone.utc),
154
+ sa_column_kwargs={"onupdate": datetime.now(timezone.utc)},
155
+ )
156
+
157
+
158
+ class PlatformSession(SQLModel, table=True):
159
+ """Platform session table for managing user sessions across different platforms.
160
+
161
+ A session represents a chat window for a specific user on a specific platform.
162
+ Each session can have multiple conversations (对话) associated with it.
163
+ """
164
+
165
+ __tablename__ = "platform_sessions" # type: ignore
166
+
167
+ inner_id: int | None = Field(
168
+ primary_key=True,
169
+ sa_column_kwargs={"autoincrement": True},
170
+ default=None,
171
+ )
172
+ session_id: str = Field(
173
+ max_length=100,
174
+ nullable=False,
175
+ unique=True,
176
+ default_factory=lambda: str(uuid.uuid4()),
177
+ )
178
+ platform_id: str = Field(default="webchat", nullable=False)
179
+ """Platform identifier (e.g., 'webchat', 'qq', 'discord')"""
180
+ creator: str = Field(nullable=False)
181
+ """Username of the session creator"""
182
+ display_name: str | None = Field(default=None, max_length=255)
183
+ """Display name for the session"""
184
+ is_group: int = Field(default=0, nullable=False)
185
+ """0 for private chat, 1 for group chat (not implemented yet)"""
186
+ created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
187
+ updated_at: datetime = Field(
188
+ default_factory=lambda: datetime.now(timezone.utc),
189
+ sa_column_kwargs={"onupdate": datetime.now(timezone.utc)},
190
+ )
191
+
192
+ __table_args__ = (
193
+ UniqueConstraint(
194
+ "session_id",
195
+ name="uix_platform_session_id",
196
+ ),
197
+ )
198
+
199
+
200
+ class Attachment(SQLModel, table=True):
201
+ """This class represents attachments for messages in AstrBot.
202
+
203
+ Attachments can be images, files, or other media types.
204
+ """
205
+
206
+ __tablename__ = "attachments" # type: ignore
207
+
208
+ inner_attachment_id: int | None = Field(
209
+ primary_key=True,
210
+ sa_column_kwargs={"autoincrement": True},
211
+ default=None,
212
+ )
213
+ attachment_id: str = Field(
214
+ max_length=36,
215
+ nullable=False,
216
+ unique=True,
217
+ default_factory=lambda: str(uuid.uuid4()),
218
+ )
219
+ path: str = Field(nullable=False) # Path to the file on disk
220
+ type: str = Field(nullable=False) # Type of the file (e.g., 'image', 'file')
221
+ mime_type: str = Field(nullable=False) # MIME type of the file
222
+ created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
223
+ updated_at: datetime = Field(
224
+ default_factory=lambda: datetime.now(timezone.utc),
225
+ sa_column_kwargs={"onupdate": datetime.now(timezone.utc)},
226
+ )
227
+
228
+ __table_args__ = (
229
+ UniqueConstraint(
230
+ "attachment_id",
231
+ name="uix_attachment_id",
232
+ ),
233
+ )
72
234
 
73
235
 
74
236
  @dataclass
75
237
  class Conversation:
76
- """LLM 对话存储
238
+ """LLM 对话类
77
239
 
78
- 对于网页聊天,history 存储了包括指令、回复、图片等在内的所有消息。
240
+ 对于 WebChat,history 存储了包括指令、回复、图片等在内的所有消息。
79
241
  对于其他平台的聊天,不存储非 LLM 的回复(因为考虑到已经存储在各自的平台上)。
242
+
243
+ 在 v4.0.0 版本及之后,WebChat 的历史记录被迁移至 `PlatformMessageHistory` 表中,
80
244
  """
81
245
 
246
+ platform_id: str
82
247
  user_id: str
83
248
  cid: str
249
+ """对话 ID, 是 uuid 格式的字符串"""
84
250
  history: str = ""
85
- """字符串格式的列表。"""
251
+ """字符串格式的对话列表。"""
252
+ title: str | None = ""
253
+ persona_id: str | None = ""
86
254
  created_at: int = 0
87
255
  updated_at: int = 0
88
- title: str = ""
89
- persona_id: str = ""
256
+
257
+
258
+ class Personality(TypedDict):
259
+ """LLM 人格类。
260
+
261
+ 在 v4.0.0 版本及之后,推荐使用上面的 Persona 类。并且, mood_imitation_dialogs 字段已被废弃。
262
+ """
263
+
264
+ prompt: str = ""
265
+ name: str = ""
266
+ begin_dialogs: list[str] = []
267
+ mood_imitation_dialogs: list[str] = []
268
+ """情感模拟对话预设。在 v4.0.0 版本及之后,已被废弃。"""
269
+ tools: list[str] | None = None
270
+ """工具列表。None 表示使用所有工具,空列表表示不使用任何工具"""
271
+
272
+ # cache
273
+ _begin_dialogs_processed: list[dict] = []
274
+ _mood_imitation_dialogs_processed: str = ""
275
+
276
+
277
+ # ====
278
+ # Deprecated, and will be removed in future versions.
279
+ # ====
280
+
281
+
282
+ @dataclass
283
+ class Platform:
284
+ """平台使用统计数据"""
285
+
286
+ name: str
287
+ count: int
288
+ timestamp: int
289
+
290
+
291
+ @dataclass
292
+ class Stats:
293
+ platform: list[Platform] = field(default_factory=list)