AstrBot 4.7.0__py3-none-any.whl → 4.7.1__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.
@@ -4,7 +4,7 @@ import os
4
4
 
5
5
  from astrbot.core.utils.astrbot_path import get_astrbot_data_path
6
6
 
7
- VERSION = "4.7.0"
7
+ VERSION = "4.7.1"
8
8
  DB_PATH = os.path.join(get_astrbot_data_path(), "data_v4.db")
9
9
 
10
10
  # 默认配置
@@ -171,110 +171,3 @@ class SessionServiceManager:
171
171
 
172
172
  # 如果没有配置,默认为启用(兼容性考虑)
173
173
  return True
174
-
175
- @staticmethod
176
- def set_session_status(session_id: str, enabled: bool) -> None:
177
- """设置会话的整体启停状态
178
-
179
- Args:
180
- session_id: 会话ID (unified_msg_origin)
181
- enabled: True表示启用,False表示禁用
182
-
183
- """
184
- session_config = (
185
- sp.get("session_service_config", {}, scope="umo", scope_id=session_id) or {}
186
- )
187
- session_config["session_enabled"] = enabled
188
- sp.put(
189
- "session_service_config",
190
- session_config,
191
- scope="umo",
192
- scope_id=session_id,
193
- )
194
-
195
- logger.info(
196
- f"会话 {session_id} 的整体状态已更新为: {'启用' if enabled else '禁用'}",
197
- )
198
-
199
- @staticmethod
200
- def should_process_session_request(event: AstrMessageEvent) -> bool:
201
- """检查是否应该处理会话请求(会话整体启停检查)
202
-
203
- Args:
204
- event: 消息事件
205
-
206
- Returns:
207
- bool: True表示应该处理,False表示跳过
208
-
209
- """
210
- session_id = event.unified_msg_origin
211
- return SessionServiceManager.is_session_enabled(session_id)
212
-
213
- # =============================================================================
214
- # 会话命名相关方法
215
- # =============================================================================
216
-
217
- @staticmethod
218
- def get_session_custom_name(session_id: str) -> str | None:
219
- """获取会话的自定义名称
220
-
221
- Args:
222
- session_id: 会话ID (unified_msg_origin)
223
-
224
- Returns:
225
- str: 自定义名称,如果没有设置则返回None
226
-
227
- """
228
- session_services = sp.get(
229
- "session_service_config",
230
- {},
231
- scope="umo",
232
- scope_id=session_id,
233
- )
234
- return session_services.get("custom_name")
235
-
236
- @staticmethod
237
- def set_session_custom_name(session_id: str, custom_name: str) -> None:
238
- """设置会话的自定义名称
239
-
240
- Args:
241
- session_id: 会话ID (unified_msg_origin)
242
- custom_name: 自定义名称,可以为空字符串来清除名称
243
-
244
- """
245
- session_config = (
246
- sp.get("session_service_config", {}, scope="umo", scope_id=session_id) or {}
247
- )
248
- if custom_name and custom_name.strip():
249
- session_config["custom_name"] = custom_name.strip()
250
- else:
251
- # 如果传入空名称,则删除自定义名称
252
- session_config.pop("custom_name", None)
253
- sp.put(
254
- "session_service_config",
255
- session_config,
256
- scope="umo",
257
- scope_id=session_id,
258
- )
259
-
260
- logger.info(
261
- f"会话 {session_id} 的自定义名称已更新为: {custom_name.strip() if custom_name and custom_name.strip() else '已清除'}",
262
- )
263
-
264
- @staticmethod
265
- def get_session_display_name(session_id: str) -> str:
266
- """获取会话的显示名称(优先显示自定义名称,否则显示原始session_id的最后一段)
267
-
268
- Args:
269
- session_id: 会话ID (unified_msg_origin)
270
-
271
- Returns:
272
- str: 显示名称
273
-
274
- """
275
- custom_name = SessionServiceManager.get_session_custom_name(session_id)
276
- if custom_name:
277
- return custom_name
278
-
279
- # 如果没有自定义名称,返回session_id的最后一段
280
- return session_id.split(":")[2] if session_id.count(":") >= 2 else session_id
@@ -42,87 +42,6 @@ class SessionPluginManager:
42
42
  # 如果都没有配置,默认为启用(兼容性考虑)
43
43
  return True
44
44
 
45
- @staticmethod
46
- def set_plugin_status_for_session(
47
- session_id: str,
48
- plugin_name: str,
49
- enabled: bool,
50
- ) -> None:
51
- """设置插件在指定会话中的启停状态
52
-
53
- Args:
54
- session_id: 会话ID (unified_msg_origin)
55
- plugin_name: 插件名称
56
- enabled: True表示启用,False表示禁用
57
-
58
- """
59
- # 获取当前配置
60
- session_plugin_config = sp.get(
61
- "session_plugin_config",
62
- {},
63
- scope="umo",
64
- scope_id=session_id,
65
- )
66
- if session_id not in session_plugin_config:
67
- session_plugin_config[session_id] = {
68
- "enabled_plugins": [],
69
- "disabled_plugins": [],
70
- }
71
-
72
- session_config = session_plugin_config[session_id]
73
- enabled_plugins = session_config.get("enabled_plugins", [])
74
- disabled_plugins = session_config.get("disabled_plugins", [])
75
-
76
- if enabled:
77
- # 启用插件
78
- if plugin_name in disabled_plugins:
79
- disabled_plugins.remove(plugin_name)
80
- if plugin_name not in enabled_plugins:
81
- enabled_plugins.append(plugin_name)
82
- else:
83
- # 禁用插件
84
- if plugin_name in enabled_plugins:
85
- enabled_plugins.remove(plugin_name)
86
- if plugin_name not in disabled_plugins:
87
- disabled_plugins.append(plugin_name)
88
-
89
- # 保存配置
90
- session_config["enabled_plugins"] = enabled_plugins
91
- session_config["disabled_plugins"] = disabled_plugins
92
- session_plugin_config[session_id] = session_config
93
- sp.put(
94
- "session_plugin_config",
95
- session_plugin_config,
96
- scope="umo",
97
- scope_id=session_id,
98
- )
99
-
100
- logger.info(
101
- f"会话 {session_id} 的插件 {plugin_name} 状态已更新为: {'启用' if enabled else '禁用'}",
102
- )
103
-
104
- @staticmethod
105
- def get_session_plugin_config(session_id: str) -> dict[str, list[str]]:
106
- """获取指定会话的插件配置
107
-
108
- Args:
109
- session_id: 会话ID (unified_msg_origin)
110
-
111
- Returns:
112
- Dict[str, List[str]]: 包含enabled_plugins和disabled_plugins的字典
113
-
114
- """
115
- session_plugin_config = sp.get(
116
- "session_plugin_config",
117
- {},
118
- scope="umo",
119
- scope_id=session_id,
120
- )
121
- return session_plugin_config.get(
122
- session_id,
123
- {"enabled_plugins": [], "disabled_plugins": []},
124
- )
125
-
126
45
  @staticmethod
127
46
  def filter_handlers_by_session(event: AstrMessageEvent, handlers: list) -> list:
128
47
  """根据会话配置过滤处理器列表
@@ -60,10 +60,6 @@ class KnowledgeBaseRoute(Route):
60
60
  # "/kb/media/delete": ("POST", self.delete_media),
61
61
  # 检索
62
62
  "/kb/retrieve": ("POST", self.retrieve),
63
- # 会话知识库配置
64
- "/kb/session/config/get": ("GET", self.get_session_kb_config),
65
- "/kb/session/config/set": ("POST", self.set_session_kb_config),
66
- "/kb/session/config/delete": ("POST", self.delete_session_kb_config),
67
63
  }
68
64
  self.register_routes()
69
65
 
@@ -920,158 +916,6 @@ class KnowledgeBaseRoute(Route):
920
916
  logger.error(traceback.format_exc())
921
917
  return Response().error(f"检索失败: {e!s}").__dict__
922
918
 
923
- # ===== 会话知识库配置 API =====
924
-
925
- async def get_session_kb_config(self):
926
- """获取会话的知识库配置
927
-
928
- Query 参数:
929
- - session_id: 会话 ID (必填)
930
-
931
- 返回:
932
- - kb_ids: 知识库 ID 列表
933
- - top_k: 返回结果数量
934
- - enable_rerank: 是否启用重排序
935
- """
936
- try:
937
- from astrbot.core import sp
938
-
939
- session_id = request.args.get("session_id")
940
-
941
- if not session_id:
942
- return Response().error("缺少参数 session_id").__dict__
943
-
944
- # 从 SharedPreferences 获取配置
945
- config = await sp.session_get(session_id, "kb_config", default={})
946
-
947
- logger.debug(f"[KB配置] 读取到配置: session_id={session_id}")
948
-
949
- # 如果没有配置,返回默认值
950
- if not config:
951
- config = {"kb_ids": [], "top_k": 5, "enable_rerank": True}
952
-
953
- return Response().ok(config).__dict__
954
-
955
- except Exception as e:
956
- logger.error(f"[KB配置] 获取配置时出错: {e}", exc_info=True)
957
- return Response().error(f"获取会话知识库配置失败: {e!s}").__dict__
958
-
959
- async def set_session_kb_config(self):
960
- """设置会话的知识库配置
961
-
962
- Body:
963
- - scope: 配置范围 (目前只支持 "session")
964
- - scope_id: 会话 ID (必填)
965
- - kb_ids: 知识库 ID 列表 (必填)
966
- - top_k: 返回结果数量 (可选, 默认 5)
967
- - enable_rerank: 是否启用重排序 (可选, 默认 true)
968
- """
969
- try:
970
- from astrbot.core import sp
971
-
972
- data = await request.json
973
-
974
- scope = data.get("scope")
975
- scope_id = data.get("scope_id")
976
- kb_ids = data.get("kb_ids", [])
977
- top_k = data.get("top_k", 5)
978
- enable_rerank = data.get("enable_rerank", True)
979
-
980
- # 验证参数
981
- if scope != "session":
982
- return Response().error("目前仅支持 session 范围的配置").__dict__
983
-
984
- if not scope_id:
985
- return Response().error("缺少参数 scope_id").__dict__
986
-
987
- if not isinstance(kb_ids, list):
988
- return Response().error("kb_ids 必须是列表").__dict__
989
-
990
- # 验证知识库是否存在
991
- kb_mgr = self._get_kb_manager()
992
- invalid_ids = []
993
- valid_ids = []
994
- for kb_id in kb_ids:
995
- kb_helper = await kb_mgr.get_kb(kb_id)
996
- if kb_helper:
997
- valid_ids.append(kb_id)
998
- else:
999
- invalid_ids.append(kb_id)
1000
- logger.warning(f"[KB配置] 知识库不存在: {kb_id}")
1001
-
1002
- if invalid_ids:
1003
- logger.warning(f"[KB配置] 以下知识库ID无效: {invalid_ids}")
1004
-
1005
- # 允许保存空列表,表示明确不使用任何知识库
1006
- if kb_ids and not valid_ids:
1007
- # 只有当用户提供了 kb_ids 但全部无效时才报错
1008
- return Response().error(f"所有提供的知识库ID都无效: {kb_ids}").__dict__
1009
-
1010
- # 如果 kb_ids 为空列表,表示用户想清空配置
1011
- if not kb_ids:
1012
- valid_ids = []
1013
-
1014
- # 构建配置对象(只保存有效的ID)
1015
- config = {
1016
- "kb_ids": valid_ids,
1017
- "top_k": top_k,
1018
- "enable_rerank": enable_rerank,
1019
- }
1020
-
1021
- # 保存到 SharedPreferences
1022
- await sp.session_put(scope_id, "kb_config", config)
1023
-
1024
- # 立即验证是否保存成功
1025
- verify_config = await sp.session_get(scope_id, "kb_config", default={})
1026
-
1027
- if verify_config == config:
1028
- return (
1029
- Response()
1030
- .ok(
1031
- {"valid_ids": valid_ids, "invalid_ids": invalid_ids},
1032
- "保存知识库配置成功",
1033
- )
1034
- .__dict__
1035
- )
1036
- logger.error("[KB配置] 配置保存失败,验证不匹配")
1037
- return Response().error("配置保存失败").__dict__
1038
-
1039
- except Exception as e:
1040
- logger.error(f"[KB配置] 设置配置时出错: {e}", exc_info=True)
1041
- return Response().error(f"设置会话知识库配置失败: {e!s}").__dict__
1042
-
1043
- async def delete_session_kb_config(self):
1044
- """删除会话的知识库配置
1045
-
1046
- Body:
1047
- - scope: 配置范围 (目前只支持 "session")
1048
- - scope_id: 会话 ID (必填)
1049
- """
1050
- try:
1051
- from astrbot.core import sp
1052
-
1053
- data = await request.json
1054
-
1055
- scope = data.get("scope")
1056
- scope_id = data.get("scope_id")
1057
-
1058
- # 验证参数
1059
- if scope != "session":
1060
- return Response().error("目前仅支持 session 范围的配置").__dict__
1061
-
1062
- if not scope_id:
1063
- return Response().error("缺少参数 scope_id").__dict__
1064
-
1065
- # 从 SharedPreferences 删除配置
1066
- await sp.session_remove(scope_id, "kb_config")
1067
-
1068
- return Response().ok(message="删除知识库配置成功").__dict__
1069
-
1070
- except Exception as e:
1071
- logger.error(f"删除会话知识库配置失败: {e}")
1072
- logger.error(traceback.format_exc())
1073
- return Response().error(f"删除会话知识库配置失败: {e!s}").__dict__
1074
-
1075
919
  async def upload_document_from_url(self):
1076
920
  """从 URL 上传文档
1077
921
 
@@ -74,7 +74,10 @@ class SessionManagementRoute(Route):
74
74
  umo_id = pref.scope_id
75
75
  if umo_id not in umo_rules:
76
76
  umo_rules[umo_id] = {}
77
- umo_rules[umo_id][pref.key] = pref.value["val"]
77
+ if pref.key == "session_plugin_config" and umo_id in pref.value["val"]:
78
+ umo_rules[umo_id][pref.key] = pref.value["val"][umo_id]
79
+ else:
80
+ umo_rules[umo_id][pref.key] = pref.value["val"]
78
81
 
79
82
  # 搜索过滤
80
83
  if search:
@@ -185,6 +188,35 @@ class SessionManagementRoute(Route):
185
188
  for p in provider_manager.tts_provider_insts
186
189
  ]
187
190
 
191
+ # 获取可用的插件列表(排除 reserved 的系统插件)
192
+ plugin_manager = self.core_lifecycle.plugin_manager
193
+ available_plugins = [
194
+ {
195
+ "name": p.name,
196
+ "display_name": p.display_name or p.name,
197
+ "desc": p.desc,
198
+ }
199
+ for p in plugin_manager.context.get_all_stars()
200
+ if not p.reserved and p.name
201
+ ]
202
+
203
+ # 获取可用的知识库列表
204
+ available_kbs = []
205
+ kb_manager = self.core_lifecycle.kb_manager
206
+ if kb_manager:
207
+ try:
208
+ kbs = await kb_manager.list_kbs()
209
+ available_kbs = [
210
+ {
211
+ "kb_id": kb.kb_id,
212
+ "kb_name": kb.kb_name,
213
+ "emoji": kb.emoji,
214
+ }
215
+ for kb in kbs
216
+ ]
217
+ except Exception as e:
218
+ logger.warning(f"获取知识库列表失败: {e!s}")
219
+
188
220
  return (
189
221
  Response()
190
222
  .ok(
@@ -197,6 +229,8 @@ class SessionManagementRoute(Route):
197
229
  "available_chat_providers": available_chat_providers,
198
230
  "available_stt_providers": available_stt_providers,
199
231
  "available_tts_providers": available_tts_providers,
232
+ "available_plugins": available_plugins,
233
+ "available_kbs": available_kbs,
200
234
  "available_rule_keys": AVAILABLE_SESSION_RULE_KEYS,
201
235
  }
202
236
  )
@@ -229,6 +263,11 @@ class SessionManagementRoute(Route):
229
263
  if rule_key not in AVAILABLE_SESSION_RULE_KEYS:
230
264
  return Response().error(f"不支持的规则键: {rule_key}").__dict__
231
265
 
266
+ if rule_key == "session_plugin_config":
267
+ rule_value = {
268
+ umo: rule_value,
269
+ }
270
+
232
271
  # 使用 shared preferences 更新规则
233
272
  await sp.session_put(umo, rule_key, rule_value)
234
273
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AstrBot
3
- Version: 4.7.0
3
+ Version: 4.7.1
4
4
  Summary: Easy-to-use multi-platform LLM chatbot and development framework
5
5
  License-File: LICENSE
6
6
  Keywords: Astrbot,Astrbot Module,Astrbot Plugin
@@ -56,7 +56,7 @@ astrbot/core/agent/runners/dify/dify_agent_runner.py,sha256=LYwpjOcBWf3XlwNVzrDv
56
56
  astrbot/core/agent/runners/dify/dify_api_client.py,sha256=OXukDVgNx3VmYw6OCzjXyP8JmDWEFuy81sD9XnC4VRo,6530
57
57
  astrbot/core/config/__init__.py,sha256=vZjtpC7vr-IvBgSUtbS04C0wpulmCG5tPmcEP1WYE_4,172
58
58
  astrbot/core/config/astrbot_config.py,sha256=nGyvHyR9VJH9Pk0XKYyeDFVxjwbyVb9u0lIsuvpe3fg,6276
59
- astrbot/core/config/default.py,sha256=vvT8t_SvUYgHWyGfv167BDB_DNeCvnQ9fn2jh9KmCqU,142988
59
+ astrbot/core/config/default.py,sha256=3tipwUYSFBELGH2iXQRk3-SNjhCWrR-n_yVcnhIntJw,142988
60
60
  astrbot/core/config/i18n_utils.py,sha256=T2uLmhx1nohJIou14QQBjb2TSvdxDxtfUjVHpwy13z0,3841
61
61
  astrbot/core/db/__init__.py,sha256=s4oIWazGk2U1-9dkr3bvq8M4g9nwOXy4e3f53zlvAJk,10326
62
62
  astrbot/core/db/po.py,sha256=zFv5eU4tuM6E4ehGzugHnszWl6VBpS_rcD9IjjjkhXE,9398
@@ -210,8 +210,8 @@ astrbot/core/star/README.md,sha256=LXxqxp3xv_oejO8ocBPOrbmLe0WB4feu43fYDNddHTQ,1
210
210
  astrbot/core/star/__init__.py,sha256=ccAN4tGmHjKmMIuL4L0KTFpPz6_uf26yhCj0XQBf2do,2112
211
211
  astrbot/core/star/config.py,sha256=FgrBz_fUrBU0-9BxD8enX-xGNGVbFxst3UT10sboYNA,3531
212
212
  astrbot/core/star/context.py,sha256=a4jeHhQSx5NpzOmO1kPR5QxeOJEoivx9bsncou_-Wn4,21036
213
- astrbot/core/star/session_llm_manager.py,sha256=S6vYYgW8Y3igIvrqYJZhFlzFcsFKXMehSmwEmgLG9mk,8776
214
- astrbot/core/star/session_plugin_manager.py,sha256=bu_YeO-YldfribTz987ZBR-0NAhVT1nqlQE1ExX5vwg,5423
213
+ astrbot/core/star/session_llm_manager.py,sha256=W_ZgNDyUPjMQGccqnK83hFjZvSCv5BLQeyv5fHvRLUw,5307
214
+ astrbot/core/star/session_plugin_manager.py,sha256=8sEzOxf_Gq-dwK_S-4rwocAFsYzx7Yi4FJuMRttPTac,2830
215
215
  astrbot/core/star/star.py,sha256=Wkf81teNZ27JE_JrENuP0SrpFc2uFYRxHQsWo8R9-No,1826
216
216
  astrbot/core/star/star_handler.py,sha256=Vv8GW70AUrezB0bjj8AzzdlnqOsX27LTypTlhiYbB-A,4927
217
217
  astrbot/core/star/star_manager.py,sha256=_oFOYaf8IFhWy2KwRJ6TVVbjoywYLt2imuv5yTAqP4o,40343
@@ -256,19 +256,19 @@ astrbot/dashboard/routes/chat.py,sha256=v1nfoq3jSqiUnVZd9DilvPDgKz6_kIo8WdUG_dwZ
256
256
  astrbot/dashboard/routes/config.py,sha256=IsSEl8flf1M79LTgUgMweewYaHQrr5Fxze335EkTXro,40535
257
257
  astrbot/dashboard/routes/conversation.py,sha256=sFHgkpNDdTR9qkSOC_JfSjzkfTuv63iaMxvh52wQUzM,10773
258
258
  astrbot/dashboard/routes/file.py,sha256=gULvXP9PnVOQlyv_PCEzZQE5ptnGQEjFPvwOLxdVgb4,708
259
- astrbot/dashboard/routes/knowledge_base.py,sha256=Sc03tTpfAhtA5ErofRUwERwx01_vyrWWGlposc8gdvU,45595
259
+ astrbot/dashboard/routes/knowledge_base.py,sha256=_3jjcpBjfErP9NI-h4FYBaw3lm5_eIhmfF-uju94Icg,39873
260
260
  astrbot/dashboard/routes/log.py,sha256=84OFiLM-Cnqf3HxFne-ykUezfnArlwH4HyY8MJxch00,2143
261
261
  astrbot/dashboard/routes/persona.py,sha256=MEcNHMxJmyvZ3ZhytI5IP7L3FSlMr1JDvdd5efN9Q-M,7833
262
262
  astrbot/dashboard/routes/plugin.py,sha256=lc50jRSRcJfpKMrT1OlFDuA7e841SSCEyEhFXiX742c,20508
263
263
  astrbot/dashboard/routes/route.py,sha256=GT5fYW9fxYmdVj5_6-Wob7nw_-JXuUNDMXGPWKZUbd8,1547
264
- astrbot/dashboard/routes/session_management.py,sha256=1S0nOInc9_P5Br1D_uNrugeyVazbg8hIcMPOVtQBKAI,13435
264
+ astrbot/dashboard/routes/session_management.py,sha256=3h-zlkiAN4MQQLETGORNoWDtnGCSbqxnK2mTu6jMeCY,14998
265
265
  astrbot/dashboard/routes/stat.py,sha256=OgNM491WFuDSAQbbJUGl4_UsqrQNefOGMMRIPLLoVBQ,6780
266
266
  astrbot/dashboard/routes/static_file.py,sha256=7KnNcOb1BVqSTft114LhGsDkfg69X2jHEm0tOK0kW0Y,1169
267
267
  astrbot/dashboard/routes/t2i.py,sha256=F6smxdL99MF7cRw3hqS6-2GErw8Zhsv0V0mfBUeEk-c,8931
268
268
  astrbot/dashboard/routes/tools.py,sha256=YsVFrwVIhxAI-Ikme7YPrHVnPVTkJ1IaH7n6ciREjdE,14663
269
269
  astrbot/dashboard/routes/update.py,sha256=qXiqQ_dbqRVftOzGgCQrvK8-qopVK6zKhhVVJ9SK26U,6648
270
- astrbot-4.7.0.dist-info/METADATA,sha256=VeEvpibvGRDg_9R6Ml-UwZ0GPYkyXhKyYqRpym7Tvyw,10370
271
- astrbot-4.7.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
272
- astrbot-4.7.0.dist-info/entry_points.txt,sha256=OEF09YmhBWYuViXrvTLLpstF4ccmNwDL8r7nnFD0pfI,53
273
- astrbot-4.7.0.dist-info/licenses/LICENSE,sha256=zPfQj5Mq8-gThIiBcxETr7t8gND9bZWOjTGQAr80TQI,34500
274
- astrbot-4.7.0.dist-info/RECORD,,
270
+ astrbot-4.7.1.dist-info/METADATA,sha256=7VCintJ9fcOvWXwadmXR1TKiW0AZ0s6ecwmVXPBNvqY,10370
271
+ astrbot-4.7.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
272
+ astrbot-4.7.1.dist-info/entry_points.txt,sha256=OEF09YmhBWYuViXrvTLLpstF4ccmNwDL8r7nnFD0pfI,53
273
+ astrbot-4.7.1.dist-info/licenses/LICENSE,sha256=zPfQj5Mq8-gThIiBcxETr7t8gND9bZWOjTGQAr80TQI,34500
274
+ astrbot-4.7.1.dist-info/RECORD,,