AstrBot 4.9.0__py3-none-any.whl → 4.9.2__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/cli/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "4.9.0"
1
+ __version__ = "4.9.2"
@@ -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.9.0"
7
+ VERSION = "4.9.2"
8
8
  DB_PATH = os.path.join(get_astrbot_data_path(), "data_v4.db")
9
9
 
10
10
  WEBHOOK_SUPPORTED_PLATFORMS = [
@@ -108,6 +108,7 @@ DEFAULT_CONFIG = {
108
108
  "provider_id": "",
109
109
  "dual_output": False,
110
110
  "use_file_service": False,
111
+ "trigger_probability": 1.0,
111
112
  },
112
113
  "provider_ltm_settings": {
113
114
  "group_icl_enable": False,
@@ -2209,6 +2210,9 @@ CONFIG_METADATA_2 = {
2209
2210
  "use_file_service": {
2210
2211
  "type": "bool",
2211
2212
  },
2213
+ "trigger_probability": {
2214
+ "type": "float",
2215
+ },
2212
2216
  },
2213
2217
  },
2214
2218
  "provider_ltm_settings": {
@@ -2419,6 +2423,14 @@ CONFIG_METADATA_3 = {
2419
2423
  "provider_tts_settings.enable": True,
2420
2424
  },
2421
2425
  },
2426
+ "provider_tts_settings.trigger_probability": {
2427
+ "description": "TTS 触发概率",
2428
+ "type": "float",
2429
+ "slider": {"min": 0, "max": 1, "step": 0.05},
2430
+ "condition": {
2431
+ "provider_tts_settings.enable": True,
2432
+ },
2433
+ },
2422
2434
  "provider_settings.image_caption_prompt": {
2423
2435
  "description": "图片转述提示词",
2424
2436
  "type": "text",
@@ -2986,6 +2998,7 @@ CONFIG_METADATA_3 = {
2986
2998
  "description": "回复概率",
2987
2999
  "type": "float",
2988
3000
  "hint": "0.0-1.0 之间的数值",
3001
+ "slider": {"min": 0, "max": 1, "step": 0.05},
2989
3002
  "condition": {
2990
3003
  "provider_ltm_settings.active_reply.enable": True,
2991
3004
  },
@@ -79,6 +79,7 @@ class ConfigMetadataI18n:
79
79
  "_special",
80
80
  "invisible",
81
81
  "options",
82
+ "slider",
82
83
  ]:
83
84
  if attr in field_data:
84
85
  field_result[attr] = field_data[attr]
@@ -158,7 +158,11 @@ class RespondStage(Stage):
158
158
  result = event.get_result()
159
159
  if result is None:
160
160
  return
161
+ if event.get_extra("_streaming_finished", False):
162
+ # prevent some plugin make result content type to LLM_RESULT after streaming finished, lead to send again
163
+ return
161
164
  if result.result_content_type == ResultContentType.STREAMING_FINISH:
165
+ event.set_extra("_streaming_finished", True)
162
166
  return
163
167
 
164
168
  logger.info(
@@ -1,3 +1,4 @@
1
+ import random
1
2
  import re
2
3
  import time
3
4
  import traceback
@@ -42,6 +43,18 @@ class ResultDecorateStage(Stage):
42
43
  "forward_threshold"
43
44
  ]
44
45
 
46
+ trigger_probability = ctx.astrbot_config["provider_tts_settings"].get(
47
+ "trigger_probability",
48
+ 1,
49
+ )
50
+ try:
51
+ self.tts_trigger_probability = max(
52
+ 0.0,
53
+ min(float(trigger_probability), 1.0),
54
+ )
55
+ except (TypeError, ValueError):
56
+ self.tts_trigger_probability = 1.0
57
+
45
58
  # 分段回复
46
59
  self.words_count_threshold = int(
47
60
  ctx.astrbot_config["platform_settings"]["segmented_reply"][
@@ -246,7 +259,14 @@ class ResultDecorateStage(Stage):
246
259
  and result.is_llm_result()
247
260
  and SessionServiceManager.should_process_tts_request(event)
248
261
  ):
249
- if not tts_provider:
262
+ should_tts = self.tts_trigger_probability >= 1.0 or (
263
+ self.tts_trigger_probability > 0.0
264
+ and random.random() <= self.tts_trigger_probability
265
+ )
266
+
267
+ if not should_tts:
268
+ logger.debug("跳过 TTS:触发概率未命中。")
269
+ elif not tts_provider:
250
270
  logger.warning(
251
271
  f"会话 {event.unified_msg_origin} 未配置文本转语音模型。",
252
272
  )
@@ -81,7 +81,12 @@ class LarkPlatformAdapter(Platform):
81
81
  )
82
82
 
83
83
  self.lark_api = (
84
- lark.Client.builder().app_id(self.appid).app_secret(self.appsecret).build()
84
+ lark.Client.builder()
85
+ .app_id(self.appid)
86
+ .app_secret(self.appsecret)
87
+ .log_level(lark.LogLevel.ERROR)
88
+ .domain(self.domain)
89
+ .build()
85
90
  )
86
91
 
87
92
  self.webhook_server = None
@@ -2,15 +2,19 @@ from astrbot.core import html_renderer
2
2
  from astrbot.core.provider import Provider
3
3
  from astrbot.core.star.star_tools import StarTools
4
4
  from astrbot.core.utils.command_parser import CommandParserMixin
5
+ from astrbot.core.utils.plugin_kv_store import PluginKVStoreMixin
5
6
 
6
7
  from .context import Context
7
8
  from .star import StarMetadata, star_map, star_registry
8
9
  from .star_manager import PluginManager
9
10
 
10
11
 
11
- class Star(CommandParserMixin):
12
+ class Star(CommandParserMixin, PluginKVStoreMixin):
12
13
  """所有插件(Star)的父类,所有插件都应该继承于这个类"""
13
14
 
15
+ author: str
16
+ name: str
17
+
14
18
  def __init__(self, context: Context, config: dict | None = None):
15
19
  StarTools.initialize(context)
16
20
  self.context = context
@@ -467,6 +467,18 @@ class PluginManager:
467
467
  metadata.star_cls = metadata.star_cls_type(
468
468
  context=self.context,
469
469
  )
470
+
471
+ p_name = (metadata.name or "unknown").lower().replace("/", "_")
472
+ p_author = (
473
+ (metadata.author or "unknown").lower().replace("/", "_")
474
+ )
475
+ setattr(metadata.star_cls, "name", p_name)
476
+ setattr(metadata.star_cls, "author", p_author)
477
+ setattr(
478
+ metadata.star_cls,
479
+ "plugin_id",
480
+ f"{p_author}/{p_name}",
481
+ )
470
482
  else:
471
483
  logger.info(f"插件 {metadata.name} 已被禁用。")
472
484
 
@@ -0,0 +1,28 @@
1
+ from typing import TypeVar
2
+
3
+ from astrbot.core import sp
4
+
5
+ SUPPORTED_VALUE_TYPES = int | float | str | bytes | bool | dict | list | None
6
+ _VT = TypeVar("_VT")
7
+
8
+
9
+ class PluginKVStoreMixin:
10
+ """为插件提供键值存储功能的 Mixin 类"""
11
+
12
+ plugin_id: str
13
+
14
+ async def put_kv_data(
15
+ self,
16
+ key: str,
17
+ value: SUPPORTED_VALUE_TYPES,
18
+ ) -> None:
19
+ """为指定插件存储一个键值对"""
20
+ await sp.put_async("plugin", self.plugin_id, key, value)
21
+
22
+ async def get_kv_data(self, key: str, default: _VT) -> _VT | None:
23
+ """获取指定插件存储的键值对"""
24
+ return await sp.get_async("plugin", self.plugin_id, key, default)
25
+
26
+ async def delete_kv_data(self, key: str) -> None:
27
+ """删除指定插件存储的键值对"""
28
+ await sp.remove_async("plugin", self.plugin_id, key)
@@ -1,7 +1,9 @@
1
1
  import json
2
2
  import traceback
3
+ from datetime import datetime
4
+ from io import BytesIO
3
5
 
4
- from quart import request
6
+ from quart import request, send_file
5
7
 
6
8
  from astrbot.core import logger
7
9
  from astrbot.core.core_lifecycle import AstrBotCoreLifecycle
@@ -30,6 +32,7 @@ class ConversationRoute(Route):
30
32
  "POST",
31
33
  self.update_history,
32
34
  ),
35
+ "/conversation/export": ("POST", self.export_conversations),
33
36
  }
34
37
  self.db_helper = db_helper
35
38
  self.conv_mgr = core_lifecycle.conversation_manager
@@ -283,3 +286,90 @@ class ConversationRoute(Route):
283
286
  except Exception as e:
284
287
  logger.error(f"更新对话历史失败: {e!s}\n{traceback.format_exc()}")
285
288
  return Response().error(f"更新对话历史失败: {e!s}").__dict__
289
+
290
+ async def export_conversations(self):
291
+ """批量导出对话为 JSONL 格式"""
292
+ try:
293
+ data = await request.get_json()
294
+ conversations_to_export = data.get("conversations", [])
295
+
296
+ if not conversations_to_export:
297
+ return Response().error("导出列表不能为空").__dict__
298
+
299
+ # 收集所有对话的内容
300
+ jsonl_lines = []
301
+ exported_count = 0
302
+ failed_items = []
303
+
304
+ for conv_info in conversations_to_export:
305
+ user_id = conv_info.get("user_id")
306
+ cid = conv_info.get("cid")
307
+
308
+ if not user_id or not cid:
309
+ failed_items.append(
310
+ f"user_id:{user_id}, cid:{cid} - 缺少必要参数",
311
+ )
312
+ continue
313
+
314
+ try:
315
+ conversation = await self.conv_mgr.get_conversation(
316
+ unified_msg_origin=user_id,
317
+ conversation_id=cid,
318
+ )
319
+
320
+ if not conversation:
321
+ failed_items.append(
322
+ f"user_id:{user_id}, cid:{cid} - 对话不存在"
323
+ )
324
+ continue
325
+
326
+ # 解析对话内容 (history is always a JSON string from _convert_conv_from_v2_to_v1)
327
+ content = json.loads(conversation.history)
328
+
329
+ # 创建导出记录
330
+ export_record = {
331
+ "cid": cid,
332
+ "user_id": user_id,
333
+ "platform_id": conversation.platform_id,
334
+ "title": conversation.title,
335
+ "persona_id": conversation.persona_id,
336
+ "created_at": conversation.created_at,
337
+ "updated_at": conversation.updated_at,
338
+ "content": content,
339
+ }
340
+
341
+ # 将记录转换为 JSON 字符串并添加到 JSONL
342
+ jsonl_lines.append(json.dumps(export_record, ensure_ascii=False))
343
+ exported_count += 1
344
+
345
+ except Exception as e:
346
+ failed_items.append(f"user_id:{user_id}, cid:{cid} - {e!s}")
347
+ logger.error(
348
+ f"导出对话失败: user_id={user_id}, cid={cid}, error={e!s}"
349
+ )
350
+
351
+ if exported_count == 0:
352
+ return Response().error("没有成功导出任何对话").__dict__
353
+
354
+ # 创建 JSONL 内容
355
+ jsonl_content = "\n".join(jsonl_lines)
356
+
357
+ # 创建一个内存文件对象
358
+ file_obj = BytesIO(jsonl_content.encode("utf-8"))
359
+ file_obj.seek(0)
360
+
361
+ # 生成文件名
362
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
363
+ filename = f"astrbot_conversations_export_{timestamp}.jsonl"
364
+
365
+ # 返回文件流
366
+ return await send_file(
367
+ file_obj,
368
+ mimetype="application/jsonl",
369
+ as_attachment=True,
370
+ attachment_filename=filename,
371
+ )
372
+
373
+ except Exception as e:
374
+ logger.error(f"批量导出对话失败: {e!s}\n{traceback.format_exc()}")
375
+ return Response().error(f"批量导出对话失败: {e!s}").__dict__
@@ -124,7 +124,11 @@ class PluginRoute(Route):
124
124
  session.get(url) as response,
125
125
  ):
126
126
  if response.status == 200:
127
- remote_data = await response.json()
127
+ try:
128
+ remote_data = await response.json()
129
+ except aiohttp.ContentTypeError:
130
+ remote_text = await response.text()
131
+ remote_data = json.loads(remote_text)
128
132
 
129
133
  # 检查远程数据是否为空
130
134
  if not remote_data or (
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AstrBot
3
- Version: 4.9.0
3
+ Version: 4.9.2
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
@@ -304,4 +304,10 @@ pre-commit install
304
304
 
305
305
  </details>
306
306
 
307
+ <div align="center">
308
+
307
309
  _私は、高性能ですから!_
310
+
311
+ <img src="https://files.astrbot.app/watashiwa-koseino-desukara.gif" width="100"/>
312
+ </div
313
+
@@ -8,7 +8,7 @@ astrbot/api/platform/__init__.py,sha256=HXvAy_KLtOJspoGVgDtLa7VjIZoF6WK3Puww55yy
8
8
  astrbot/api/provider/__init__.py,sha256=mJVcon0snjn_xYirk2hntwba6ymIYYC-ZKKmxvx-jok,379
9
9
  astrbot/api/star/__init__.py,sha256=OxgHGtWn3lEQGjb4twbpbWnRepUevPu7gxtDAkAsfhQ,250
10
10
  astrbot/api/util/__init__.py,sha256=L1O_mFEUDk8V4lEPsT5iiNbIiOVh7HbrNmitqzUWMZg,180
11
- astrbot/cli/__init__.py,sha256=E0Y9rD8RWyBe6e34I0525HrRS_vGhPvve493oPOdtXw,22
11
+ astrbot/cli/__init__.py,sha256=9IzaVQP787fNLdw2IGD5hgGMK5Qp0cYcqMPlh3LI8Jk,22
12
12
  astrbot/cli/__main__.py,sha256=QobgMyFoLNTgI_OYddhGOZ9ZvQeBVjjz79mA2cC2OEU,1758
13
13
  astrbot/cli/commands/__init__.py,sha256=eAgppZQIqFO1ylQJFABeYrzQ0oZqPWjtE80aKIPB3ks,149
14
14
  astrbot/cli/commands/cmd_conf.py,sha256=6-YLicBt_zjWTzaVLUJ1VQLQPbDEPYACB9IVnN8Zvng,6330
@@ -56,8 +56,8 @@ 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=6bUTnMCOyaS8s6ELsWctDfUFTB53fKJQNu272dZXkdU,6347
59
- astrbot/core/config/default.py,sha256=Gmc7B9udiQ0YcU6bib9gpVoBeZgPbYkz2vM-hAXjjOc,151590
60
- astrbot/core/config/i18n_utils.py,sha256=T2uLmhx1nohJIou14QQBjb2TSvdxDxtfUjVHpwy13z0,3841
59
+ astrbot/core/config/default.py,sha256=NQMP2wFXyfRxyN_1JO5CQGPMQmywrX3SbSg_p1wso4k,152197
60
+ astrbot/core/config/i18n_utils.py,sha256=HJn_0XeeVS9ryCBelYfnc0nEn10LlX702fcSSFrF1J8,3879
61
61
  astrbot/core/db/__init__.py,sha256=Z3NMgMbxvxZyf5hroO9Kvn2TPKEoL2X21CTW96gzGLE,11200
62
62
  astrbot/core/db/po.py,sha256=KIvtPCjf1i9IGOWXyhNKvxzEXmsfopfa7G0UaG98Ams,9313
63
63
  astrbot/core/db/sqlite.py,sha256=bXXyA0RwgZTlwEZ6Uh4KSGMUyA3jamvkLVVcbF5K_ow,32274
@@ -114,8 +114,8 @@ astrbot/core/pipeline/process_stage/method/star_request.py,sha256=C-PTq_Wpq4QMS2
114
114
  astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py,sha256=sDU4b85nV7LswGngFeYOG9VUv-BRR7gufy00ptU_Utg,21175
115
115
  astrbot/core/pipeline/process_stage/method/agent_sub_stages/third_party.py,sha256=LNBRItSpZn0MLP4fyHQ_3gUJ8lnmCwuPlqnZDVFLI6Q,7332
116
116
  astrbot/core/pipeline/rate_limit_check/stage.py,sha256=9EVJ0zYtxATFsj7ADyWDYcSGBRqmrMiKWp1kkD9LONI,3962
117
- astrbot/core/pipeline/respond/stage.py,sha256=bn7-O5BWDdNYgnKQmxQpZEI7o-esAZqDgFFRpoFuUcM,10786
118
- astrbot/core/pipeline/result_decorate/stage.py,sha256=76cE3gnCCEuCn51CxlhzSspqqmdALTUzXdsonLNueaw,16600
117
+ astrbot/core/pipeline/respond/stage.py,sha256=G3GgABvDmN-ClrDbFVOFsaeENWnptOr0xzX0NxmXbjY,11038
118
+ astrbot/core/pipeline/result_decorate/stage.py,sha256=Ml7_E5P2YpGLHRc9aIBbL2gylLNsRuQqwxejEgPaIoo,17318
119
119
  astrbot/core/pipeline/session_status_check/stage.py,sha256=cFp6MMdFzeURjmW5LCrzsTGD_hnJN5jhDh_zoPbnFAw,1291
120
120
  astrbot/core/pipeline/waking_check/stage.py,sha256=u4s-UACcyFhydAbFKutvh1T4Aw6wdUyI_OU2hgCLiao,8650
121
121
  astrbot/core/pipeline/whitelist_check/stage.py,sha256=x6o4oswIvVtHFRbuKuLFoyFEgx-gSo3IMGYvopu8d9A,2411
@@ -136,7 +136,7 @@ astrbot/core/platform/sources/discord/client.py,sha256=YGrUSopQKDRFfzjCdcBQm-EcN
136
136
  astrbot/core/platform/sources/discord/components.py,sha256=qKcGssKA3vBLHpad0g96KMD722Ng5jYKgpQBGQFOPX8,3971
137
137
  astrbot/core/platform/sources/discord/discord_platform_adapter.py,sha256=rnHqOrCGCeZ0JzCKj335zjuWMqDNAJ0k8jnpjWqWmoo,19554
138
138
  astrbot/core/platform/sources/discord/discord_platform_event.py,sha256=nVuqZtoF2Vl3Bo5-rik1YFJZz892qkj30T0qCdVSB9c,13332
139
- astrbot/core/platform/sources/lark/lark_adapter.py,sha256=h4XtDgBsKCBNEI7a6DYfPprYxq8mlA_NoJeEM2Hk0jo,13963
139
+ astrbot/core/platform/sources/lark/lark_adapter.py,sha256=9rDfS_zcsdCODa43WJNiHByPYC_SoVBOjKxhV-viY3Q,14079
140
140
  astrbot/core/platform/sources/lark/lark_event.py,sha256=0H1TR-ajktyRhjLxY6-Xf8x7Zkc-2wfz4c-EeBEEOrc,6422
141
141
  astrbot/core/platform/sources/lark/server.py,sha256=athZuUArNqlpCV6_KDkv7AQrYbh7Z99gThN1ZsCvMeg,6385
142
142
  astrbot/core/platform/sources/misskey/misskey_adapter.py,sha256=JTPcBhCtray4rCk924X8ruy6mL7jPzUsVX0f3vzoO0E,29614
@@ -208,14 +208,14 @@ astrbot/core/provider/sources/xinference_rerank_source.py,sha256=DsF4JVlXGeeqqyc
208
208
  astrbot/core/provider/sources/xinference_stt_provider.py,sha256=DPEc7cVo2KXKGIgb8IXKagPH9qpNAdp5gx5PAink0j4,7731
209
209
  astrbot/core/provider/sources/zhipu_source.py,sha256=oOCPXGsR9PLWOuu3h8RSVNRw1Qy2Se6dwmeFR3zk3GM,612
210
210
  astrbot/core/star/README.md,sha256=LXxqxp3xv_oejO8ocBPOrbmLe0WB4feu43fYDNddHTQ,161
211
- astrbot/core/star/__init__.py,sha256=ccAN4tGmHjKmMIuL4L0KTFpPz6_uf26yhCj0XQBf2do,2112
211
+ astrbot/core/star/__init__.py,sha256=iTlnjfEGJGy--78PhG7F1cKj9VwJVcDNFtGomX8hRO0,2229
212
212
  astrbot/core/star/config.py,sha256=FgrBz_fUrBU0-9BxD8enX-xGNGVbFxst3UT10sboYNA,3531
213
213
  astrbot/core/star/context.py,sha256=voL-U8XAm-yfQWW_62L5BE1wOn3qaCDstGqvpnWTk9g,21020
214
214
  astrbot/core/star/session_llm_manager.py,sha256=W_ZgNDyUPjMQGccqnK83hFjZvSCv5BLQeyv5fHvRLUw,5307
215
215
  astrbot/core/star/session_plugin_manager.py,sha256=8sEzOxf_Gq-dwK_S-4rwocAFsYzx7Yi4FJuMRttPTac,2830
216
216
  astrbot/core/star/star.py,sha256=Wkf81teNZ27JE_JrENuP0SrpFc2uFYRxHQsWo8R9-No,1826
217
217
  astrbot/core/star/star_handler.py,sha256=LQqM6szmedro_TtAMJRFt3vn8uQtiOM25Af5PmlOHKs,7529
218
- astrbot/core/star/star_manager.py,sha256=_oFOYaf8IFhWy2KwRJ6TVVbjoywYLt2imuv5yTAqP4o,40343
218
+ astrbot/core/star/star_manager.py,sha256=kOxdlxRoMtQRSL_tTtiViOdLYFbKc92UAUWRQtFh-qI,40917
219
219
  astrbot/core/star/star_tools.py,sha256=4q8emjyTbyIsVXHmzT88kX9uK28rIhlHc0re40Xm6m0,10847
220
220
  astrbot/core/star/updator.py,sha256=4pl42Ks_yjJ3kydx3BwOqocAczhhFBrRnxhBKh4_0Eo,3106
221
221
  astrbot/core/star/filter/__init__.py,sha256=bC6eHXh0CjzHmn-LTvsanWReoGIPhhMnBSrMLh97hZQ,470
@@ -238,6 +238,7 @@ astrbot/core/utils/metrics.py,sha256=CxEkdV2gJai0mw1IbL4DJ81WiQ5mY7v9M_-T6UtRJDs
238
238
  astrbot/core/utils/migra_helper.py,sha256=pnv3VvDD_9gj1nKjroVQYUeePpvyd0DXJz9CoJvG_Og,2763
239
239
  astrbot/core/utils/path_util.py,sha256=FXx9oBrsL-dcq-6OlmiSwk2ygqJ9vMmkCBEi2sL50f8,3050
240
240
  astrbot/core/utils/pip_installer.py,sha256=H8Bk5QKh-GBBRvGp7sDKDkh6A1UDy4xU9AtUL10B6Jg,1969
241
+ astrbot/core/utils/plugin_kv_store.py,sha256=L_XGux1K2a3fSxqukTg1XN0pq7AosZNeXPpXlAk5eWE,854
241
242
  astrbot/core/utils/session_lock.py,sha256=fZDIbyy1nYfgsQSGUc_pWHZp4Kv6inXjENP8ay2bKGI,913
242
243
  astrbot/core/utils/session_waiter.py,sha256=Q4zdrvxs-cLLopLCQES6bYZ6MQrajl4fzqZjmmXX170,7073
243
244
  astrbot/core/utils/shared_preferences.py,sha256=1dod97F8dT3itDi_APZXqWNdiB57FRhbWlMyyYTbogA,6755
@@ -257,13 +258,13 @@ astrbot/dashboard/routes/__init__.py,sha256=MAQlYoPi-AwUftdp1Ixg9E6im6Af5eruuZ52
257
258
  astrbot/dashboard/routes/auth.py,sha256=rYkvt3MpCY9BhWjG0DUoX3YaBkJT1Id7M2pKqTmXbvo,2946
258
259
  astrbot/dashboard/routes/chat.py,sha256=XcXuGfLZvjUeYCFPosoMpIAaecuvq48s8aFHrT9P2qc,24822
259
260
  astrbot/dashboard/routes/config.py,sha256=jwrlP23zbTpnrMhQKrTfBjb1NLEln4tDYNExRP0BQeM,33438
260
- astrbot/dashboard/routes/conversation.py,sha256=sFHgkpNDdTR9qkSOC_JfSjzkfTuv63iaMxvh52wQUzM,10773
261
+ astrbot/dashboard/routes/conversation.py,sha256=TWGY7BJ9QfmbxurAieBrbMmCi4_Ua2klxsAUlSRXbng,14302
261
262
  astrbot/dashboard/routes/file.py,sha256=gULvXP9PnVOQlyv_PCEzZQE5ptnGQEjFPvwOLxdVgb4,708
262
263
  astrbot/dashboard/routes/knowledge_base.py,sha256=GZ_iDYV2uXXzvGMF-4VJ8hZxLdHIWSSfg_3wlWwsizA,46081
263
264
  astrbot/dashboard/routes/log.py,sha256=YJWj1982YUSzja_MZQS5UoKf6pImQoeP0zaS0AGp0nY,2299
264
265
  astrbot/dashboard/routes/persona.py,sha256=MEcNHMxJmyvZ3ZhytI5IP7L3FSlMr1JDvdd5efN9Q-M,7833
265
266
  astrbot/dashboard/routes/platform.py,sha256=JfQzzmWSnahKjke3lBUeXo7Auzz_nTB0mUv0fIf_Nag,3392
266
- astrbot/dashboard/routes/plugin.py,sha256=WdOwayDtTcVMKvSe8j6c3UK2b3BqUEgkSdl54JyrJp4,25216
267
+ astrbot/dashboard/routes/plugin.py,sha256=CvTUNOaBBjgk7q58bJ4El7BxkUopzPEdqxFnE2LC2UY,25436
267
268
  astrbot/dashboard/routes/route.py,sha256=vhNIWFhic1eVHRx7ej8OUmmcNDA3FPaRPdXO_-SS4K4,1572
268
269
  astrbot/dashboard/routes/session_management.py,sha256=3h-zlkiAN4MQQLETGORNoWDtnGCSbqxnK2mTu6jMeCY,14998
269
270
  astrbot/dashboard/routes/stat.py,sha256=OgNM491WFuDSAQbbJUGl4_UsqrQNefOGMMRIPLLoVBQ,6780
@@ -271,8 +272,8 @@ astrbot/dashboard/routes/static_file.py,sha256=7KnNcOb1BVqSTft114LhGsDkfg69X2jHE
271
272
  astrbot/dashboard/routes/t2i.py,sha256=F6smxdL99MF7cRw3hqS6-2GErw8Zhsv0V0mfBUeEk-c,8931
272
273
  astrbot/dashboard/routes/tools.py,sha256=YsVFrwVIhxAI-Ikme7YPrHVnPVTkJ1IaH7n6ciREjdE,14663
273
274
  astrbot/dashboard/routes/update.py,sha256=qXiqQ_dbqRVftOzGgCQrvK8-qopVK6zKhhVVJ9SK26U,6648
274
- astrbot-4.9.0.dist-info/METADATA,sha256=QlWtlZR3KRC0kdCKcPYfHKRK_dt-CVCNkaZRAFWTtuo,11820
275
- astrbot-4.9.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
276
- astrbot-4.9.0.dist-info/entry_points.txt,sha256=OEF09YmhBWYuViXrvTLLpstF4ccmNwDL8r7nnFD0pfI,53
277
- astrbot-4.9.0.dist-info/licenses/LICENSE,sha256=zPfQj5Mq8-gThIiBcxETr7t8gND9bZWOjTGQAr80TQI,34500
278
- astrbot-4.9.0.dist-info/RECORD,,
275
+ astrbot-4.9.2.dist-info/METADATA,sha256=ak-jLSJ2et3ozqBoBddq815p72DS512c83VQHSmR94E,11932
276
+ astrbot-4.9.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
277
+ astrbot-4.9.2.dist-info/entry_points.txt,sha256=OEF09YmhBWYuViXrvTLLpstF4ccmNwDL8r7nnFD0pfI,53
278
+ astrbot-4.9.2.dist-info/licenses/LICENSE,sha256=zPfQj5Mq8-gThIiBcxETr7t8gND9bZWOjTGQAr80TQI,34500
279
+ astrbot-4.9.2.dist-info/RECORD,,