AstrBot 4.1.1__py3-none-any.whl → 4.1.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.
Files changed (44) hide show
  1. astrbot/cli/utils/plugin.py +22 -18
  2. astrbot/core/agent/response.py +1 -0
  3. astrbot/core/agent/run_context.py +1 -0
  4. astrbot/core/config/default.py +11 -11
  5. astrbot/core/db/migration/helper.py +1 -1
  6. astrbot/core/db/migration/shared_preferences_v3.py +2 -0
  7. astrbot/core/db/migration/sqlite_v3.py +2 -1
  8. astrbot/core/db/vec_db/faiss_impl/__init__.py +1 -1
  9. astrbot/core/db/vec_db/faiss_impl/vec_db.py +2 -1
  10. astrbot/core/pipeline/context_utils.py +1 -1
  11. astrbot/core/platform/astr_message_event.py +1 -1
  12. astrbot/core/platform/manager.py +9 -9
  13. astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py +3 -1
  14. astrbot/core/platform/sources/dingtalk/dingtalk_event.py +2 -2
  15. astrbot/core/platform/sources/discord/client.py +2 -2
  16. astrbot/core/platform/sources/discord/components.py +3 -1
  17. astrbot/core/platform/sources/discord/discord_platform_event.py +8 -3
  18. astrbot/core/platform/sources/qqofficial/qqofficial_message_event.py +36 -30
  19. astrbot/core/platform/sources/slack/slack_adapter.py +3 -1
  20. astrbot/core/platform/sources/slack/slack_event.py +7 -1
  21. astrbot/core/platform/sources/telegram/tg_event.py +3 -1
  22. astrbot/core/platform/sources/webchat/webchat_queue_mgr.py +2 -0
  23. astrbot/core/platform/sources/wechatpadpro/wechatpadpro_adapter.py +8 -4
  24. astrbot/core/platform/sources/wecom/wecom_kf.py +15 -4
  25. astrbot/core/platform/sources/wecom/wecom_kf_message.py +27 -6
  26. astrbot/core/platform/sources/weixin_official_account/weixin_offacc_adapter.py +3 -1
  27. astrbot/core/platform/sources/weixin_official_account/weixin_offacc_event.py +0 -1
  28. astrbot/core/provider/entities.py +1 -0
  29. astrbot/core/provider/manager.py +5 -1
  30. astrbot/core/provider/sources/fishaudio_tts_api_source.py +1 -1
  31. astrbot/core/star/filter/command.py +3 -9
  32. astrbot/core/star/filter/command_group.py +1 -2
  33. astrbot/core/star/session_plugin_manager.py +4 -1
  34. astrbot/core/star/star_manager.py +2 -2
  35. astrbot/core/star/star_tools.py +22 -8
  36. astrbot/dashboard/routes/config.py +0 -1
  37. astrbot/dashboard/routes/log.py +12 -4
  38. astrbot/dashboard/routes/route.py +0 -1
  39. astrbot/dashboard/routes/tools.py +0 -1
  40. {astrbot-4.1.1.dist-info → astrbot-4.1.2.dist-info}/METADATA +1 -1
  41. {astrbot-4.1.1.dist-info → astrbot-4.1.2.dist-info}/RECORD +44 -44
  42. {astrbot-4.1.1.dist-info → astrbot-4.1.2.dist-info}/WHEEL +0 -0
  43. {astrbot-4.1.1.dist-info → astrbot-4.1.2.dist-info}/entry_points.txt +0 -0
  44. {astrbot-4.1.1.dist-info → astrbot-4.1.2.dist-info}/licenses/LICENSE +0 -0
@@ -124,15 +124,17 @@ def build_plug_list(plugins_dir: Path) -> list:
124
124
  if metadata and all(
125
125
  k in metadata for k in ["name", "desc", "version", "author", "repo"]
126
126
  ):
127
- result.append({
128
- "name": str(metadata.get("name", "")),
129
- "desc": str(metadata.get("desc", "")),
130
- "version": str(metadata.get("version", "")),
131
- "author": str(metadata.get("author", "")),
132
- "repo": str(metadata.get("repo", "")),
133
- "status": PluginStatus.INSTALLED,
134
- "local_path": str(plugin_dir),
135
- })
127
+ result.append(
128
+ {
129
+ "name": str(metadata.get("name", "")),
130
+ "desc": str(metadata.get("desc", "")),
131
+ "version": str(metadata.get("version", "")),
132
+ "author": str(metadata.get("author", "")),
133
+ "repo": str(metadata.get("repo", "")),
134
+ "status": PluginStatus.INSTALLED,
135
+ "local_path": str(plugin_dir),
136
+ }
137
+ )
136
138
 
137
139
  # 获取在线插件列表
138
140
  online_plugins = []
@@ -142,15 +144,17 @@ def build_plug_list(plugins_dir: Path) -> list:
142
144
  resp.raise_for_status()
143
145
  data = resp.json()
144
146
  for plugin_id, plugin_info in data.items():
145
- online_plugins.append({
146
- "name": str(plugin_id),
147
- "desc": str(plugin_info.get("desc", "")),
148
- "version": str(plugin_info.get("version", "")),
149
- "author": str(plugin_info.get("author", "")),
150
- "repo": str(plugin_info.get("repo", "")),
151
- "status": PluginStatus.NOT_INSTALLED,
152
- "local_path": None,
153
- })
147
+ online_plugins.append(
148
+ {
149
+ "name": str(plugin_id),
150
+ "desc": str(plugin_info.get("desc", "")),
151
+ "version": str(plugin_info.get("version", "")),
152
+ "author": str(plugin_info.get("author", "")),
153
+ "repo": str(plugin_info.get("repo", "")),
154
+ "status": PluginStatus.NOT_INSTALLED,
155
+ "local_path": None,
156
+ }
157
+ )
154
158
  except Exception as e:
155
159
  click.echo(f"获取在线插件列表失败: {e}", err=True)
156
160
 
@@ -2,6 +2,7 @@ from dataclasses import dataclass
2
2
  import typing as T
3
3
  from astrbot.core.message.message_event_result import MessageChain
4
4
 
5
+
5
6
  class AgentResponseData(T.TypedDict):
6
7
  chain: MessageChain
7
8
 
@@ -14,4 +14,5 @@ class ContextWrapper(Generic[TContext]):
14
14
  context: TContext
15
15
  event: AstrMessageEvent
16
16
 
17
+
17
18
  NoContext = ContextWrapper[None]
@@ -6,7 +6,7 @@ import os
6
6
 
7
7
  from astrbot.core.utils.astrbot_path import get_astrbot_data_path
8
8
 
9
- VERSION = "4.1.1"
9
+ VERSION = "4.1.2"
10
10
  DB_PATH = os.path.join(get_astrbot_data_path(), "data_v4.db")
11
11
 
12
12
  # 默认配置
@@ -2130,41 +2130,41 @@ CONFIG_METADATA_3 = {
2130
2130
  "description": "内容安全",
2131
2131
  "type": "object",
2132
2132
  "items": {
2133
- "platform_settings.content_safety.also_use_in_response": {
2133
+ "content_safety.also_use_in_response": {
2134
2134
  "description": "同时检查模型的响应内容",
2135
2135
  "type": "bool",
2136
2136
  },
2137
- "platform_settings.content_safety.baidu_aip.enable": {
2137
+ "content_safety.baidu_aip.enable": {
2138
2138
  "description": "使用百度内容安全审核",
2139
2139
  "type": "bool",
2140
2140
  "hint": "您需要手动安装 baidu-aip 库。",
2141
2141
  },
2142
- "platform_settings.content_safety.baidu_aip.app_id": {
2142
+ "content_safety.baidu_aip.app_id": {
2143
2143
  "description": "App ID",
2144
2144
  "type": "string",
2145
2145
  "condition": {
2146
- "platform_settings.content_safety.baidu_aip.enable": True,
2146
+ "content_safety.baidu_aip.enable": True,
2147
2147
  },
2148
2148
  },
2149
- "platform_settings.content_safety.baidu_aip.api_key": {
2149
+ "content_safety.baidu_aip.api_key": {
2150
2150
  "description": "API Key",
2151
2151
  "type": "string",
2152
2152
  "condition": {
2153
- "platform_settings.content_safety.baidu_aip.enable": True,
2153
+ "content_safety.baidu_aip.enable": True,
2154
2154
  },
2155
2155
  },
2156
- "platform_settings.content_safety.baidu_aip.secret_key": {
2156
+ "content_safety.baidu_aip.secret_key": {
2157
2157
  "description": "Secret Key",
2158
2158
  "type": "string",
2159
2159
  "condition": {
2160
- "platform_settings.content_safety.baidu_aip.enable": True,
2160
+ "content_safety.baidu_aip.enable": True,
2161
2161
  },
2162
2162
  },
2163
- "platform_settings.content_safety.internal_keywords.enable": {
2163
+ "content_safety.internal_keywords.enable": {
2164
2164
  "description": "关键词检查",
2165
2165
  "type": "bool",
2166
2166
  },
2167
- "platform_settings.content_safety.internal_keywords.extra_keywords": {
2167
+ "content_safety.internal_keywords.extra_keywords": {
2168
2168
  "description": "额外关键词",
2169
2169
  "type": "list",
2170
2170
  "items": {"type": "string"},
@@ -53,7 +53,7 @@ async def do_migration_v4(
53
53
  await migration_webchat_data(db_helper, platform_id_map)
54
54
 
55
55
  # 执行偏好设置迁移
56
- await migration_preferences(db_helper,platform_id_map)
56
+ await migration_preferences(db_helper, platform_id_map)
57
57
 
58
58
  # 执行平台统计表迁移
59
59
  await migration_platform_table(db_helper, platform_id_map)
@@ -5,6 +5,7 @@ from astrbot.core.utils.astrbot_path import get_astrbot_data_path
5
5
 
6
6
  _VT = TypeVar("_VT")
7
7
 
8
+
8
9
  class SharedPreferences:
9
10
  def __init__(self, path=None):
10
11
  if path is None:
@@ -42,4 +43,5 @@ class SharedPreferences:
42
43
  self._data.clear()
43
44
  self._save_preferences()
44
45
 
46
+
45
47
  sp = SharedPreferences()
@@ -4,6 +4,7 @@ from astrbot.core.db.po import Platform, Stats
4
4
  from typing import Tuple, List, Dict, Any
5
5
  from dataclasses import dataclass
6
6
 
7
+
7
8
  @dataclass
8
9
  class Conversation:
9
10
  """LLM 对话存储
@@ -76,7 +77,7 @@ PRAGMA encoding = 'UTF-8';
76
77
  """
77
78
 
78
79
 
79
- class SQLiteDatabase():
80
+ class SQLiteDatabase:
80
81
  def __init__(self, db_path: str) -> None:
81
82
  super().__init__()
82
83
  self.db_path = db_path
@@ -1,3 +1,3 @@
1
1
  from .vec_db import FaissVecDB
2
2
 
3
- __all__ = ["FaissVecDB"]
3
+ __all__ = ["FaissVecDB"]
@@ -113,7 +113,8 @@ class FaissVecDB(BaseVecDB):
113
113
  reranked_results, key=lambda x: x.relevance_score, reverse=True
114
114
  )
115
115
  top_k_results = [
116
- top_k_results[reranked_result.index] for reranked_result in reranked_results
116
+ top_k_results[reranked_result.index]
117
+ for reranked_result in reranked_results
117
118
  ]
118
119
 
119
120
  return top_k_results
@@ -77,7 +77,7 @@ async def call_event_hook(
77
77
 
78
78
  Returns:
79
79
  bool: 如果事件被终止,返回 True
80
- # """
80
+ #"""
81
81
  handlers = star_handlers_registry.get_handlers_by_event_type(
82
82
  hook_type, plugins_name=event.plugins_name
83
83
  )
@@ -24,7 +24,7 @@ from astrbot.core.provider.entities import ProviderRequest
24
24
  from astrbot.core.utils.metrics import Metric
25
25
  from .astrbot_message import AstrBotMessage, Group
26
26
  from .platform_metadata import PlatformMetadata
27
- from .message_session import MessageSession, MessageSesion # noqa
27
+ from .message_session import MessageSession, MessageSesion # noqa
28
28
 
29
29
 
30
30
  class AstrMessageEvent(abc.ABC):
@@ -68,23 +68,23 @@ class PlatformManager:
68
68
  )
69
69
  case "lark":
70
70
  from .sources.lark.lark_adapter import (
71
- LarkPlatformAdapter,
72
- ) # noqa: F401
71
+ LarkPlatformAdapter, # noqa: F401
72
+ )
73
73
  case "dingtalk":
74
74
  from .sources.dingtalk.dingtalk_adapter import (
75
75
  DingtalkPlatformAdapter, # noqa: F401
76
76
  )
77
77
  case "telegram":
78
78
  from .sources.telegram.tg_adapter import (
79
- TelegramPlatformAdapter,
80
- ) # noqa: F401
79
+ TelegramPlatformAdapter, # noqa: F401
80
+ )
81
81
  case "wecom":
82
82
  from .sources.wecom.wecom_adapter import (
83
- WecomPlatformAdapter,
84
- ) # noqa: F401
83
+ WecomPlatformAdapter, # noqa: F401
84
+ )
85
85
  case "weixin_official_account":
86
86
  from .sources.weixin_official_account.weixin_offacc_adapter import (
87
- WeixinOfficialAccountPlatformAdapter, # noqa
87
+ WeixinOfficialAccountPlatformAdapter, # noqa: F401
88
88
  )
89
89
  case "discord":
90
90
  from .sources.discord.discord_platform_adapter import (
@@ -94,8 +94,8 @@ class PlatformManager:
94
94
  from .sources.slack.slack_adapter import SlackAdapter # noqa: F401
95
95
  case "satori":
96
96
  from .sources.satori.satori_adapter import (
97
- SatoriPlatformAdapter,
98
- ) # noqa: F401
97
+ SatoriPlatformAdapter, # noqa: F401
98
+ )
99
99
  except (ImportError, ModuleNotFoundError) as e:
100
100
  logger.error(
101
101
  f"加载平台适配器 {platform_config['type']} 失败,原因:{e}。请检查依赖库是否安装。提示:可以在 管理面板->控制台->安装Pip库 中安装依赖库。"
@@ -321,7 +321,9 @@ class AiocqhttpAdapter(Platform):
321
321
  user_id=int(m["data"]["qq"]),
322
322
  no_cache=False,
323
323
  )
324
- nickname = at_info.get("nick", "") or at_info.get("nickname", "")
324
+ nickname = at_info.get("nick", "") or at_info.get(
325
+ "nickname", ""
326
+ )
325
327
  is_at_self = str(m["data"]["qq"]) in {abm.self_id, "all"}
326
328
 
327
329
  abm.message.append(
@@ -54,9 +54,9 @@ class DingtalkMessageEvent(AstrMessageEvent):
54
54
  logger.debug(f"send image: {ret}")
55
55
 
56
56
  except Exception as e:
57
- logger.error(f"钉钉图片处理失败: {e}")
58
- logger.warning(f"跳过图片发送: {image_path}")
57
+ logger.warning(f"钉钉图片处理失败: {e}, 跳过图片发送")
59
58
  continue
59
+
60
60
  async def send(self, message: MessageChain):
61
61
  await self.send_with_client(self.client, message)
62
62
  await super().send(message)
@@ -41,7 +41,8 @@ class DiscordBotClient(discord.Bot):
41
41
  await self.on_ready_once_callback()
42
42
  except Exception as e:
43
43
  logger.error(
44
- f"[Discord] on_ready_once_callback 执行失败: {e}", exc_info=True)
44
+ f"[Discord] on_ready_once_callback 执行失败: {e}", exc_info=True
45
+ )
45
46
 
46
47
  def _create_message_data(self, message: discord.Message) -> dict:
47
48
  """从 discord.Message 创建数据字典"""
@@ -90,7 +91,6 @@ class DiscordBotClient(discord.Bot):
90
91
  message_data = self._create_message_data(message)
91
92
  await self.on_message_received(message_data)
92
93
 
93
-
94
94
  def _extract_interaction_content(self, interaction: discord.Interaction) -> str:
95
95
  """从交互中提取内容"""
96
96
  interaction_type = interaction.type
@@ -79,9 +79,12 @@ class DiscordButton(BaseMessageComponent):
79
79
  self.url = url
80
80
  self.disabled = disabled
81
81
 
82
+
82
83
  class DiscordReference(BaseMessageComponent):
83
84
  """Discord引用组件"""
85
+
84
86
  type: str = "discord_reference"
87
+
85
88
  def __init__(self, message_id: str, channel_id: str):
86
89
  self.message_id = message_id
87
90
  self.channel_id = channel_id
@@ -98,7 +101,6 @@ class DiscordView(BaseMessageComponent):
98
101
  self.components = components or []
99
102
  self.timeout = timeout
100
103
 
101
-
102
104
  def to_discord_view(self) -> discord.ui.View:
103
105
  """转换为Discord View对象"""
104
106
  view = discord.ui.View(timeout=self.timeout)
@@ -53,7 +53,13 @@ class DiscordPlatformEvent(AstrMessageEvent):
53
53
 
54
54
  # 解析消息链为 Discord 所需的对象
55
55
  try:
56
- content, files, view, embeds, reference_message_id = await self._parse_to_discord(message)
56
+ (
57
+ content,
58
+ files,
59
+ view,
60
+ embeds,
61
+ reference_message_id,
62
+ ) = await self._parse_to_discord(message)
57
63
  except Exception as e:
58
64
  logger.error(f"[Discord] 解析消息链时失败: {e}", exc_info=True)
59
65
  return
@@ -206,8 +212,7 @@ class DiscordPlatformEvent(AstrMessageEvent):
206
212
  if await asyncio.to_thread(path.exists):
207
213
  file_bytes = await asyncio.to_thread(path.read_bytes)
208
214
  files.append(
209
- discord.File(BytesIO(file_bytes),
210
- filename=i.name)
215
+ discord.File(BytesIO(file_bytes), filename=i.name)
211
216
  )
212
217
  else:
213
218
  logger.warning(
@@ -94,10 +94,15 @@ class QQOfficialMessageEvent(AstrMessageEvent):
94
94
  plain_text,
95
95
  image_base64,
96
96
  image_path,
97
- record_file_path
97
+ record_file_path,
98
98
  ) = await QQOfficialMessageEvent._parse_to_qqofficial(self.send_buffer)
99
99
 
100
- if not plain_text and not image_base64 and not image_path and not record_file_path:
100
+ if (
101
+ not plain_text
102
+ and not image_base64
103
+ and not image_path
104
+ and not record_file_path
105
+ ):
101
106
  return
102
107
 
103
108
  payload = {
@@ -118,7 +123,7 @@ class QQOfficialMessageEvent(AstrMessageEvent):
118
123
  )
119
124
  payload["media"] = media
120
125
  payload["msg_type"] = 7
121
- if record_file_path: # group record msg
126
+ if record_file_path: # group record msg
122
127
  media = await self.upload_group_and_c2c_record(
123
128
  record_file_path, 3, group_openid=source.group_openid
124
129
  )
@@ -134,9 +139,9 @@ class QQOfficialMessageEvent(AstrMessageEvent):
134
139
  )
135
140
  payload["media"] = media
136
141
  payload["msg_type"] = 7
137
- if record_file_path: # c2c record
142
+ if record_file_path: # c2c record
138
143
  media = await self.upload_group_and_c2c_record(
139
- record_file_path, 3, openid = source.author.user_openid
144
+ record_file_path, 3, openid=source.author.user_openid
140
145
  )
141
146
  payload["media"] = media
142
147
  payload["msg_type"] = 7
@@ -190,58 +195,55 @@ class QQOfficialMessageEvent(AstrMessageEvent):
190
195
  return await self.bot.api._http.request(route, json=payload)
191
196
 
192
197
  async def upload_group_and_c2c_record(
193
- self,
194
- file_source: str,
195
- file_type: int,
196
- srv_send_msg: bool = False,
197
- **kwargs
198
+ self, file_source: str, file_type: int, srv_send_msg: bool = False, **kwargs
198
199
  ) -> Optional[Media]:
199
200
  """
200
201
  上传媒体文件
201
202
  """
202
203
  # 构建基础payload
203
- payload = {
204
- "file_type": file_type,
205
- "srv_send_msg": srv_send_msg
206
- }
207
-
204
+ payload = {"file_type": file_type, "srv_send_msg": srv_send_msg}
205
+
208
206
  # 处理文件数据
209
207
  if os.path.exists(file_source):
210
208
  # 读取本地文件
211
- async with aiofiles.open(file_source, 'rb') as f:
209
+ async with aiofiles.open(file_source, "rb") as f:
212
210
  file_content = await f.read()
213
211
  # use base64 encode
214
- payload["file_data"] = base64.b64encode(file_content).decode('utf-8')
212
+ payload["file_data"] = base64.b64encode(file_content).decode("utf-8")
215
213
  else:
216
214
  # 使用URL
217
215
  payload["url"] = file_source
218
-
216
+
219
217
  # 添加接收者信息和确定路由
220
218
  if "openid" in kwargs:
221
219
  payload["openid"] = kwargs["openid"]
222
220
  route = Route("POST", "/v2/users/{openid}/files", openid=kwargs["openid"])
223
221
  elif "group_openid" in kwargs:
224
- payload["group_openid"] =kwargs["group_openid"]
225
- route = Route("POST", "/v2/groups/{group_openid}/files", group_openid=kwargs["group_openid"])
222
+ payload["group_openid"] = kwargs["group_openid"]
223
+ route = Route(
224
+ "POST",
225
+ "/v2/groups/{group_openid}/files",
226
+ group_openid=kwargs["group_openid"],
227
+ )
226
228
  else:
227
229
  return None
228
-
230
+
229
231
  try:
230
232
  # 使用底层HTTP请求
231
233
  result = await self.bot.api._http.request(route, json=payload)
232
-
234
+
233
235
  if result:
234
236
  return Media(
235
237
  file_uuid=result.get("file_uuid"),
236
238
  file_info=result.get("file_info"),
237
239
  ttl=result.get("ttl", 0),
238
- file_id=result.get("id", "")
240
+ file_id=result.get("id", ""),
239
241
  )
240
242
  except Exception as e:
241
243
  logger.error(f"上传请求错误: {e}")
242
-
244
+
243
245
  return None
244
-
246
+
245
247
  async def post_c2c_message(
246
248
  self,
247
249
  openid: str,
@@ -286,19 +288,23 @@ class QQOfficialMessageEvent(AstrMessageEvent):
286
288
  image_base64 = image_base64.removeprefix("base64://")
287
289
  elif isinstance(i, Record):
288
290
  if i.file:
289
- record_wav_path = await i.convert_to_file_path() # wav 路径
291
+ record_wav_path = await i.convert_to_file_path() # wav 路径
290
292
  temp_dir = os.path.join(get_astrbot_data_path(), "temp")
291
- record_tecent_silk_path = os.path.join(temp_dir, f"{uuid.uuid4()}.silk")
293
+ record_tecent_silk_path = os.path.join(
294
+ temp_dir, f"{uuid.uuid4()}.silk"
295
+ )
292
296
  try:
293
- duration = await wav_to_tencent_silk(record_wav_path, record_tecent_silk_path)
297
+ duration = await wav_to_tencent_silk(
298
+ record_wav_path, record_tecent_silk_path
299
+ )
294
300
  if duration > 0:
295
301
  record_file_path = record_tecent_silk_path
296
302
  else:
297
- record_file_path = None
303
+ record_file_path = None
298
304
  logger.error("转换音频格式时出错:音频时长不大于0")
299
305
  except Exception as e:
300
306
  logger.error(f"处理语音时出错: {e}")
301
- record_file_path = None
307
+ record_file_path = None
302
308
  else:
303
309
  logger.debug(f"qq_official 忽略 {i.type}")
304
310
  return plain_text, image_base64, image_file_path, record_file_path
@@ -308,7 +308,9 @@ class SlackAdapter(Platform):
308
308
  base64_content = base64.b64encode(content).decode("utf-8")
309
309
  return base64_content
310
310
  else:
311
- logger.error(f"Failed to download slack file: {resp.status} {await resp.text()}")
311
+ logger.error(
312
+ f"Failed to download slack file: {resp.status} {await resp.text()}"
313
+ )
312
314
  raise Exception(f"下载文件失败: {resp.status}")
313
315
 
314
316
  async def run(self) -> Awaitable[Any]:
@@ -75,7 +75,13 @@ class SlackMessageEvent(AstrMessageEvent):
75
75
  "text": {"type": "mrkdwn", "text": "文件上传失败"},
76
76
  }
77
77
  file_url = response["files"][0]["permalink"]
78
- return {"type": "section", "text": {"type": "mrkdwn", "text": f"文件: <{file_url}|{segment.name or '文件'}>"}}
78
+ return {
79
+ "type": "section",
80
+ "text": {
81
+ "type": "mrkdwn",
82
+ "text": f"文件: <{file_url}|{segment.name or '文件'}>",
83
+ },
84
+ }
79
85
  else:
80
86
  return {"type": "section", "text": {"type": "mrkdwn", "text": str(segment)}}
81
87
 
@@ -66,7 +66,9 @@ class TelegramPlatformEvent(AstrMessageEvent):
66
66
  return chunks
67
67
 
68
68
  @classmethod
69
- async def send_with_client(cls, client: ExtBot, message: MessageChain, user_name: str):
69
+ async def send_with_client(
70
+ cls, client: ExtBot, message: MessageChain, user_name: str
71
+ ):
70
72
  image_path = None
71
73
 
72
74
  has_reply = False
@@ -1,5 +1,6 @@
1
1
  import asyncio
2
2
 
3
+
3
4
  class WebChatQueueMgr:
4
5
  def __init__(self) -> None:
5
6
  self.queues = {}
@@ -30,4 +31,5 @@ class WebChatQueueMgr:
30
31
  """Check if a queue exists for the given conversation ID"""
31
32
  return conversation_id in self.queues
32
33
 
34
+
33
35
  webchat_queue_mgr = WebChatQueueMgr()
@@ -213,10 +213,10 @@ class WeChatPadProAdapter(Platform):
213
213
  def _extract_auth_key(self, data):
214
214
  """Helper method to extract auth_key from response data."""
215
215
  if isinstance(data, dict):
216
- auth_keys = data.get("authKeys") # 新接口
216
+ auth_keys = data.get("authKeys") # 新接口
217
217
  if isinstance(auth_keys, list) and auth_keys:
218
218
  return auth_keys[0]
219
- elif isinstance(data, list) and data: # 旧接口
219
+ elif isinstance(data, list) and data: # 旧接口
220
220
  return data[0]
221
221
  return None
222
222
 
@@ -234,7 +234,9 @@ class WeChatPadProAdapter(Platform):
234
234
  try:
235
235
  async with session.post(url, params=params, json=payload) as response:
236
236
  if response.status != 200:
237
- logger.error(f"生成授权码失败: {response.status}, {await response.text()}")
237
+ logger.error(
238
+ f"生成授权码失败: {response.status}, {await response.text()}"
239
+ )
238
240
  return
239
241
 
240
242
  response_data = await response.json()
@@ -245,7 +247,9 @@ class WeChatPadProAdapter(Platform):
245
247
  if self.auth_key:
246
248
  logger.info("成功获取授权码")
247
249
  else:
248
- logger.error(f"生成授权码成功但未找到授权码: {response_data}")
250
+ logger.error(
251
+ f"生成授权码成功但未找到授权码: {response_data}"
252
+ )
249
253
  else:
250
254
  logger.error(f"生成授权码失败: {response_data}")
251
255
  except aiohttp.ClientConnectorError as e:
@@ -48,7 +48,12 @@ class WeChatKF(BaseWeChatAPI):
48
48
  注意:可能会出现返回条数少于limit的情况,需结合返回的has_more字段判断是否继续请求。
49
49
  :return: 接口调用结果
50
50
  """
51
- data = {"token": token, "cursor": cursor, "limit": limit, "open_kfid": open_kfid}
51
+ data = {
52
+ "token": token,
53
+ "cursor": cursor,
54
+ "limit": limit,
55
+ "open_kfid": open_kfid,
56
+ }
52
57
  return self._post("kf/sync_msg", data=data)
53
58
 
54
59
  def get_service_state(self, open_kfid, external_userid):
@@ -72,7 +77,9 @@ class WeChatKF(BaseWeChatAPI):
72
77
  }
73
78
  return self._post("kf/service_state/get", data=data)
74
79
 
75
- def trans_service_state(self, open_kfid, external_userid, service_state, servicer_userid=""):
80
+ def trans_service_state(
81
+ self, open_kfid, external_userid, service_state, servicer_userid=""
82
+ ):
76
83
  """
77
84
  变更会话状态
78
85
 
@@ -180,7 +187,9 @@ class WeChatKF(BaseWeChatAPI):
180
187
  """
181
188
  return self._get("kf/customer/get_upgrade_service_config")
182
189
 
183
- def upgrade_service(self, open_kfid, external_userid, service_type, member=None, groupchat=None):
190
+ def upgrade_service(
191
+ self, open_kfid, external_userid, service_type, member=None, groupchat=None
192
+ ):
184
193
  """
185
194
  为客户升级为专员或客户群服务
186
195
 
@@ -246,7 +255,9 @@ class WeChatKF(BaseWeChatAPI):
246
255
  data = {"open_kfid": open_kfid, "start_time": start_time, "end_time": end_time}
247
256
  return self._post("kf/get_corp_statistic", data=data)
248
257
 
249
- def get_servicer_statistic(self, start_time, end_time, open_kfid=None, servicer_userid=None):
258
+ def get_servicer_statistic(
259
+ self, start_time, end_time, open_kfid=None, servicer_userid=None
260
+ ):
250
261
  """
251
262
  获取「客户数据统计」接待人员明细数据
252
263
 
@@ -26,6 +26,7 @@ from optionaldict import optionaldict
26
26
 
27
27
  from wechatpy.client.api.base import BaseWeChatAPI
28
28
 
29
+
29
30
  class WeChatKFMessage(BaseWeChatAPI):
30
31
  """
31
32
  发送微信客服消息
@@ -125,35 +126,55 @@ class WeChatKFMessage(BaseWeChatAPI):
125
126
  msg={"msgtype": "news", "link": {"link": articles_data}},
126
127
  )
127
128
 
128
- def send_msgmenu(self, user_id, open_kfid, head_content, menu_list, tail_content, msgid=""):
129
+ def send_msgmenu(
130
+ self, user_id, open_kfid, head_content, menu_list, tail_content, msgid=""
131
+ ):
129
132
  return self.send(
130
133
  user_id,
131
134
  open_kfid,
132
135
  msgid,
133
136
  msg={
134
137
  "msgtype": "msgmenu",
135
- "msgmenu": {"head_content": head_content, "list": menu_list, "tail_content": tail_content},
138
+ "msgmenu": {
139
+ "head_content": head_content,
140
+ "list": menu_list,
141
+ "tail_content": tail_content,
142
+ },
136
143
  },
137
144
  )
138
145
 
139
- def send_location(self, user_id, open_kfid, name, address, latitude, longitude, msgid=""):
146
+ def send_location(
147
+ self, user_id, open_kfid, name, address, latitude, longitude, msgid=""
148
+ ):
140
149
  return self.send(
141
150
  user_id,
142
151
  open_kfid,
143
152
  msgid,
144
153
  msg={
145
154
  "msgtype": "location",
146
- "msgmenu": {"name": name, "address": address, "latitude": latitude, "longitude": longitude},
155
+ "msgmenu": {
156
+ "name": name,
157
+ "address": address,
158
+ "latitude": latitude,
159
+ "longitude": longitude,
160
+ },
147
161
  },
148
162
  )
149
163
 
150
- def send_miniprogram(self, user_id, open_kfid, appid, title, thumb_media_id, pagepath, msgid=""):
164
+ def send_miniprogram(
165
+ self, user_id, open_kfid, appid, title, thumb_media_id, pagepath, msgid=""
166
+ ):
151
167
  return self.send(
152
168
  user_id,
153
169
  open_kfid,
154
170
  msgid,
155
171
  msg={
156
172
  "msgtype": "miniprogram",
157
- "msgmenu": {"appid": appid, "title": title, "thumb_media_id": thumb_media_id, "pagepath": pagepath},
173
+ "msgmenu": {
174
+ "appid": appid,
175
+ "title": title,
176
+ "thumb_media_id": thumb_media_id,
177
+ "pagepath": pagepath,
178
+ },
158
179
  },
159
180
  )
@@ -160,7 +160,9 @@ class WeixinOfficialAccountPlatformAdapter(Platform):
160
160
  self.wexin_event_workers[msg.id] = future
161
161
  await self.convert_message(msg, future)
162
162
  # I love shield so much!
163
- result = await asyncio.wait_for(asyncio.shield(future), 60) # wait for 60s
163
+ result = await asyncio.wait_for(
164
+ asyncio.shield(future), 60
165
+ ) # wait for 60s
164
166
  logger.debug(f"Got future result: {result}")
165
167
  self.wexin_event_workers.pop(msg.id, None)
166
168
  return result # xml. see weixin_offacc_event.py
@@ -150,7 +150,6 @@ class WeixinOfficialAccountPlatformEvent(AstrMessageEvent):
150
150
  return
151
151
  logger.info(f"微信公众平台上传语音返回: {response}")
152
152
 
153
-
154
153
  if active_send_mode:
155
154
  self.client.message.send_voice(
156
155
  message_obj.sender.user_id,
@@ -297,6 +297,7 @@ class LLMResponse:
297
297
  )
298
298
  return ret
299
299
 
300
+
300
301
  @dataclass
301
302
  class RerankResult:
302
303
  index: int
@@ -366,7 +366,10 @@ class ProviderManager:
366
366
  if not self.curr_provider_inst:
367
367
  self.curr_provider_inst = inst
368
368
 
369
- elif provider_metadata.provider_type in [ProviderType.EMBEDDING, ProviderType.RERANK]:
369
+ elif provider_metadata.provider_type in [
370
+ ProviderType.EMBEDDING,
371
+ ProviderType.RERANK,
372
+ ]:
370
373
  inst = provider_metadata.cls_type(
371
374
  provider_config, self.provider_settings
372
375
  )
@@ -388,6 +391,7 @@ class ProviderManager:
388
391
 
389
392
  # 和配置文件保持同步
390
393
  config_ids = [provider["id"] for provider in self.providers_config]
394
+ logger.debug(f"providers in user's config: {config_ids}")
391
395
  for key in list(self.inst_map.keys()):
392
396
  if key not in config_ids:
393
397
  await self.terminate_provider(key)
@@ -98,7 +98,7 @@ class ProviderFishAudioTTSAPI(TTSProvider):
98
98
 
99
99
  # FishAudio的reference_id通常是32位十六进制字符串
100
100
  # 例如: 626bb6d3f3364c9cbc3aa6a67300a664
101
- pattern = r'^[a-fA-F0-9]{32}$'
101
+ pattern = r"^[a-fA-F0-9]{32}$"
102
102
  return bool(re.match(pattern, reference_id.strip()))
103
103
 
104
104
  async def _generate_request(self, text: str) -> dict:
@@ -7,6 +7,7 @@ from astrbot.core.config import AstrBotConfig
7
7
  from .custom_filter import CustomFilter
8
8
  from ..star_handler import StarHandlerMetadata
9
9
 
10
+
10
11
  class GreedyStr(str):
11
12
  """标记指令完成其他参数接收后的所有剩余文本。"""
12
13
 
@@ -152,17 +153,10 @@ class CommandFilter(HandlerFilter):
152
153
  _full = f"{parent_command_name} {candidate}"
153
154
  else:
154
155
  _full = candidate
155
- if message_str == _full:
156
- # 完全等于命令名 没参数
157
- message_str = ""
158
- ok = True
159
- break
160
- elif message_str.startswith(_full):
161
- # 命令名后面无论是空格还是直接连参数都可以
162
- message_str = message_str[len(_full):].lstrip()
156
+ if message_str.startswith(f"{_full} ") or message_str == _full:
157
+ message_str = message_str[len(_full) :].strip()
163
158
  ok = True
164
159
  break
165
-
166
160
  if not ok:
167
161
  return False
168
162
 
@@ -113,8 +113,7 @@ class CommandGroupFilter(HandlerFilter):
113
113
  + self.print_cmd_tree(self.sub_command_filters, event=event, cfg=cfg)
114
114
  )
115
115
  raise ValueError(
116
- f"参数不足。{self.group_name} 指令组下有如下指令,请参考:\n"
117
- + tree
116
+ f"参数不足。{self.group_name} 指令组下有如下指令,请参考:\n" + tree
118
117
  )
119
118
 
120
119
  # complete_command_names = [name + " " for name in complete_command_names]
@@ -84,7 +84,10 @@ class SessionPluginManager:
84
84
  session_config["disabled_plugins"] = disabled_plugins
85
85
  session_plugin_config[session_id] = session_config
86
86
  sp.put(
87
- "session_plugin_config", session_plugin_config, scope="umo", scope_id=session_id
87
+ "session_plugin_config",
88
+ session_plugin_config,
89
+ scope="umo",
90
+ scope_id=session_id,
88
91
  )
89
92
 
90
93
  logger.info(
@@ -791,11 +791,11 @@ class PluginManager:
791
791
  if star_metadata.star_cls is None:
792
792
  return
793
793
 
794
- if '__del__' in star_metadata.star_cls_type.__dict__:
794
+ if "__del__" in star_metadata.star_cls_type.__dict__:
795
795
  asyncio.get_event_loop().run_in_executor(
796
796
  None, star_metadata.star_cls.__del__
797
797
  )
798
- elif 'terminate' in star_metadata.star_cls_type.__dict__:
798
+ elif "terminate" in star_metadata.star_cls_type.__dict__:
799
799
  await star_metadata.star_cls.terminate()
800
800
 
801
801
  async def turn_on_plugin(self, plugin_name: str):
@@ -30,8 +30,13 @@ from astrbot.core.platform.astr_message_event import MessageSesion
30
30
  from astrbot.core.star.context import Context
31
31
  from astrbot.core.star.star import star_map
32
32
  from astrbot.core.utils.astrbot_path import get_astrbot_data_path
33
- from astrbot.core.platform.sources.aiocqhttp.aiocqhttp_message_event import AiocqhttpMessageEvent
34
- from astrbot.core.platform.sources.aiocqhttp.aiocqhttp_platform_adapter import AiocqhttpAdapter
33
+ from astrbot.core.platform.sources.aiocqhttp.aiocqhttp_message_event import (
34
+ AiocqhttpMessageEvent,
35
+ )
36
+ from astrbot.core.platform.sources.aiocqhttp.aiocqhttp_platform_adapter import (
37
+ AiocqhttpAdapter,
38
+ )
39
+
35
40
 
36
41
  class StarTools:
37
42
  """
@@ -77,7 +82,11 @@ class StarTools:
77
82
 
78
83
  @classmethod
79
84
  async def send_message_by_id(
80
- cls, type: str, id: str, message_chain: MessageChain, platform: str = "aiocqhttp"
85
+ cls,
86
+ type: str,
87
+ id: str,
88
+ message_chain: MessageChain,
89
+ platform: str = "aiocqhttp",
81
90
  ):
82
91
  """
83
92
  根据 id(例如qq号, 群号等) 直接, 主动地发送消息
@@ -92,7 +101,9 @@ class StarTools:
92
101
  raise ValueError("StarTools not initialized")
93
102
  platforms = cls._context.platform_manager.get_insts()
94
103
  if platform == "aiocqhttp":
95
- adapter = next((p for p in platforms if isinstance(p, AiocqhttpAdapter)), None)
104
+ adapter = next(
105
+ (p for p in platforms if isinstance(p, AiocqhttpAdapter)), None
106
+ )
96
107
  if adapter is None:
97
108
  raise ValueError("未找到适配器: AiocqhttpAdapter")
98
109
  await AiocqhttpMessageEvent.send_message(
@@ -115,7 +126,7 @@ class StarTools:
115
126
  message_str: str,
116
127
  message_id: str = "",
117
128
  raw_message: object = None,
118
- group_id: str = ""
129
+ group_id: str = "",
119
130
  ) -> AstrBotMessage:
120
131
  """
121
132
  创建一个AstrBot消息对象
@@ -152,7 +163,6 @@ class StarTools:
152
163
  @classmethod
153
164
  async def create_event(
154
165
  cls, abm: AstrBotMessage, platform: str = "aiocqhttp", is_wake: bool = True
155
-
156
166
  ) -> None:
157
167
  """
158
168
  创建并提交事件到指定平台
@@ -167,7 +177,9 @@ class StarTools:
167
177
  raise ValueError("StarTools not initialized")
168
178
  platforms = cls._context.platform_manager.get_insts()
169
179
  if platform == "aiocqhttp":
170
- adapter = next((p for p in platforms if isinstance(p, AiocqhttpAdapter)), None)
180
+ adapter = next(
181
+ (p for p in platforms if isinstance(p, AiocqhttpAdapter)), None
182
+ )
171
183
  if adapter is None:
172
184
  raise ValueError("未找到适配器: AiocqhttpAdapter")
173
185
  event = AiocqhttpMessageEvent(
@@ -277,7 +289,9 @@ class StarTools:
277
289
  if not plugin_name:
278
290
  raise ValueError("无法获取插件名称")
279
291
 
280
- data_dir = Path(os.path.join(get_astrbot_data_path(), "plugin_data", plugin_name))
292
+ data_dir = Path(
293
+ os.path.join(get_astrbot_data_path(), "plugin_data", plugin_name)
294
+ )
281
295
 
282
296
  try:
283
297
  data_dir.mkdir(parents=True, exist_ok=True)
@@ -1,7 +1,6 @@
1
1
  import typing
2
2
  import traceback
3
3
  import os
4
- import copy
5
4
  from .route import Route, Response, RouteContext
6
5
  from astrbot.core.provider.entities import ProviderType
7
6
  from quart import request
@@ -10,7 +10,9 @@ class LogRoute(Route):
10
10
  super().__init__(context)
11
11
  self.log_broker = log_broker
12
12
  self.app.add_url_rule("/api/live-log", view_func=self.log, methods=["GET"])
13
- self.app.add_url_rule("/api/log-history", view_func=self.log_history, methods=["GET"])
13
+ self.app.add_url_rule(
14
+ "/api/log-history", view_func=self.log_history, methods=["GET"]
15
+ )
14
16
 
15
17
  async def log(self):
16
18
  async def stream():
@@ -48,9 +50,15 @@ class LogRoute(Route):
48
50
  """获取日志历史"""
49
51
  try:
50
52
  logs = list(self.log_broker.log_cache)
51
- return Response().ok(data={
52
- "logs": logs,
53
- }).__dict__
53
+ return (
54
+ Response()
55
+ .ok(
56
+ data={
57
+ "logs": logs,
58
+ }
59
+ )
60
+ .__dict__
61
+ )
54
62
  except BaseException as e:
55
63
  logger.error(f"获取日志历史失败: {e}")
56
64
  return Response().error(f"获取日志历史失败: {e}").__dict__
@@ -1,4 +1,3 @@
1
- from astrbot.core import logger
2
1
  from astrbot.core.config.astrbot_config import AstrBotConfig
3
2
  from dataclasses import dataclass
4
3
  from quart import Quart
@@ -1,6 +1,5 @@
1
1
  import traceback
2
2
 
3
- import aiohttp
4
3
  from quart import request
5
4
 
6
5
  from astrbot.core import logger
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AstrBot
3
- Version: 4.1.1
3
+ Version: 4.1.2
4
4
  Summary: 易上手的多平台 LLM 聊天机器人及开发框架
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.10
@@ -17,7 +17,7 @@ astrbot/cli/commands/cmd_plug.py,sha256=rs4ahzEeUPhLlggjxvfCXqmDWSYv66bI9bpO0NUu
17
17
  astrbot/cli/commands/cmd_run.py,sha256=myIZ4SSjwEOLNrv0fO2So-a3oe3jNL7T2sI8cZj-pfc,1972
18
18
  astrbot/cli/utils/__init__.py,sha256=EYu82Q-QKNhET-NjgdG0eqh8VY2uCc-EhPIkudhciaY,416
19
19
  astrbot/cli/utils/basic.py,sha256=Rxg0LdluIdwPIEbhk_1H6MzzEz2JbhP3d73SWcLfJqA,2751
20
- astrbot/cli/utils/plugin.py,sha256=Xr0xqEoZnC3zBHW1JDCFdpcFYqUJsqxnNY1ZZ4YbryA,8343
20
+ astrbot/cli/utils/plugin.py,sha256=kS37S3bAK3q43mL2wvQM8FuqaSkgLQU_Yt2XqxjnxNo,8483
21
21
  astrbot/cli/utils/version_comparator.py,sha256=3gLFA94eswvFsBVDSJmOTLJKxTdCD9kkQFy2Lu7vcTc,3482
22
22
  astrbot/core/__init__.py,sha256=-1atHjMqQyequsw6A1heEr4LldE0JVII9MXcuQFSAQM,1218
23
23
  astrbot/core/astr_agent_context.py,sha256=4byUrIifQZFZwrDh0AtRLLBUvYX14tXhwiplShUNTt4,303
@@ -36,8 +36,8 @@ astrbot/core/agent/agent.py,sha256=uOriyVYpg1uDJj1yqcDix7Uj7k8mE5j9WbeX53ADk74,3
36
36
  astrbot/core/agent/handoff.py,sha256=_046TjTUda3CxtXR0ngb_z3f1XGTqx9pfhh28_Dl3Ts,1168
37
37
  astrbot/core/agent/hooks.py,sha256=AWCxG4pvq9uZ9D3yixhtsaqkIGTkYLAY7BsMxdfYC2Q,855
38
38
  astrbot/core/agent/mcp_client.py,sha256=zJgTFpj1X1bRXpbG3rb6jBOWs9RaQI_nTxOByyW-sTk,7897
39
- astrbot/core/agent/response.py,sha256=cQcGWalS95YU0jp_ArcLwf6ASZxiMTGEvBUAa0RlbvU,259
40
- astrbot/core/agent/run_context.py,sha256=1lTB2T422cBlSQToHHdsXTOA8mehHN6CnZNKg6IgFE8,453
39
+ astrbot/core/agent/response.py,sha256=xLgAJc-_FpvA7J9ROaMUHuSZZ-NGI1LBkaR0qnwrp7I,260
40
+ astrbot/core/agent/run_context.py,sha256=MDvJBvKXq17R0f4-vetJbwS0DhHG2dFqDJ6YmUXik4A,454
41
41
  astrbot/core/agent/tool.py,sha256=ZkiyZUP2SdQSncjDCiNMYYi_rYhwtyQYxbiEgeIjvvw,8637
42
42
  astrbot/core/agent/tool_executor.py,sha256=keliOV_lyrI6CALr-MAVCdLE-HjxZh9zygoY61IVkfM,384
43
43
  astrbot/core/agent/runners/__init__.py,sha256=KwR34OKGVSQpJ_MaGVP_MX5L1SZ4oU-lv4GuMbSF5Ys,65
@@ -45,25 +45,25 @@ astrbot/core/agent/runners/base.py,sha256=exZS_d2BsrLz-xgeY9ZUPuXikBDUnKxO-dU3ZF
45
45
  astrbot/core/agent/runners/tool_loop_agent_runner.py,sha256=cuGBkpyyUEZaI4eo-UxAf199kEupicAo3IZMUwm6874,13976
46
46
  astrbot/core/config/__init__.py,sha256=0CO_3sKtI3WOwWT0k4i6TleWq1SAWJFfB8KjnYB8Zig,172
47
47
  astrbot/core/config/astrbot_config.py,sha256=X-b3c5m4msgJrdYFH2LXic5XKY0ViuUMdNZ335zqSBw,6335
48
- astrbot/core/config/default.py,sha256=WNwHKOa5t3Q5-hId3eKtzEALyYjiuXDns38OKCDvh4Q,116360
48
+ astrbot/core/config/default.py,sha256=lYCZF1eqtSFVcOMycxDvtBotX7NJRuABOnXRDAIV44k,116180
49
49
  astrbot/core/db/__init__.py,sha256=CAtPQ7lfNSNE4hUylUBWks_49ah2amgYmw1V1lA9FwQ,8291
50
50
  astrbot/core/db/po.py,sha256=9MfQf4oEOYCUz7qnCjs4isWkGNpQKhaDVYqKIY8W-l0,7707
51
51
  astrbot/core/db/sqlite.py,sha256=F-t2NQr6p63VmuYG6LScFJtnXWNxVT5yWxnbHirJtCw,20138
52
- astrbot/core/db/migration/helper.py,sha256=trbzp8pKjOV10YzQkbDL5SUJ8icodACEiY9UBkBfshA,1934
52
+ astrbot/core/db/migration/helper.py,sha256=FcwpvBANNeyBSrRhXyd3hudHYEyhTyrcRg9mU9lZtqY,1935
53
53
  astrbot/core/db/migration/migra_3_to_4.py,sha256=I1CesaBbf5wj9agtNWxDl1V-qixmwdURbBQf5Vzagrk,15025
54
- astrbot/core/db/migration/shared_preferences_v3.py,sha256=CZVL5wo8PqA4c9QRF9APkiLxr0wsuC6pNsAiU89Bku0,1243
55
- astrbot/core/db/migration/sqlite_v3.py,sha256=vgRX5TlPXMwFdP1ohCNt9gXqxiytssSd9Kjb1in90Vc,15003
54
+ astrbot/core/db/migration/shared_preferences_v3.py,sha256=tE11WIpwT-Q8yVBkw4eveRr1PmFdNRJQSprH4xdO3G4,1245
55
+ astrbot/core/db/migration/sqlite_v3.py,sha256=U3Uysd_IGT4ObqCFE7yQeIo_1kBrAYb_r09Uy_Vvr3A,15002
56
56
  astrbot/core/db/vec_db/base.py,sha256=Oc1mE-ecAaroQBxtVy5aGW9lHIbARRChjvAwaOFIMVE,1058
57
- astrbot/core/db/vec_db/faiss_impl/__init__.py,sha256=DGPCTXm9Mvu4EXXoMKFnOeCwBlPskl32GTgQHwCVYdA,56
57
+ astrbot/core/db/vec_db/faiss_impl/__init__.py,sha256=S3gwB-ZL9aPJwDM5ia8a_t-xsfANKoslpJvtNd5ErcU,57
58
58
  astrbot/core/db/vec_db/faiss_impl/document_storage.py,sha256=6aswY7f6vmpnJ7BXjVUFUI4vA3i83R9FzN35XWrS8yI,4166
59
59
  astrbot/core/db/vec_db/faiss_impl/embedding_storage.py,sha256=pSu-ySlli-wbeVFQ7v-ZWpVn08m3Rr9uld1_692_aZQ,1810
60
60
  astrbot/core/db/vec_db/faiss_impl/sqlite_init.sql,sha256=RiF1mnAFAHtyThOsS0qjvniUF5t9Y8k-gjSlh51p2x8,681
61
- astrbot/core/db/vec_db/faiss_impl/vec_db.py,sha256=kuuEv8yuK0dkL4NVP263bGfYUmUBbaMjiCMxE0hSFK8,5130
61
+ astrbot/core/db/vec_db/faiss_impl/vec_db.py,sha256=Tpp-pNoRWc1MnRRpo6CeM2TbSc9lDwGNwufXspxDlfc,5146
62
62
  astrbot/core/message/components.py,sha256=AzJACQYgw0Yo1iwSIyQWtfE8Xyo-6Q8KcQPE9yT5otQ,28208
63
63
  astrbot/core/message/message_event_result.py,sha256=dooPyzDVV4danPNQBvZsSXemGsihnBjW3qYByYUEa1s,7248
64
64
  astrbot/core/pipeline/__init__.py,sha256=-jo6a9lKmwY8oPoifJi0IMLPOVdknQKG30ppIyCs5Bg,1461
65
65
  astrbot/core/pipeline/context.py,sha256=3ySHVzhjdT54kTDMMKPse1EFdvb7XfmscNEp3YCJLVM,503
66
- astrbot/core/pipeline/context_utils.py,sha256=tqzIur7icEvuZ5tRjH6mDFQdxX8R3ywI08PU8TNQ5YU,3459
66
+ astrbot/core/pipeline/context_utils.py,sha256=BWOF4SM5m4m9el4vsf5Ddw0i4tn1iamzfbSju4XjgKo,3458
67
67
  astrbot/core/pipeline/scheduler.py,sha256=8N6QuLV55gR1jQZDEOUDrvcf42ify8EDmw1aDU3Y4nE,3270
68
68
  astrbot/core/pipeline/stage.py,sha256=dqEhUuQIhAZpPV4dULmVN39R0pIPjyw8Ftvs4Y1C4lY,1352
69
69
  astrbot/core/pipeline/content_safety_check/stage.py,sha256=FsxIRBpoOm2euQSpcts8YTIX7zIwL6a2ntliQcEw2ww,1372
@@ -82,25 +82,25 @@ astrbot/core/pipeline/session_status_check/stage.py,sha256=4STRhoiq4AE544_MVscGH
82
82
  astrbot/core/pipeline/waking_check/stage.py,sha256=yNC726wHhf1zf5WEvWn47hDUjj_U2vsYgcwTYIvRiSo,7946
83
83
  astrbot/core/pipeline/whitelist_check/stage.py,sha256=VcmLs0VfmspNTsitL_WrZXfv2lR2Nktrb5JEWc1VJuw,2403
84
84
  astrbot/core/platform/__init__.py,sha256=jQ4UiThp7cDHfmIXAgBDodET87onl7mjii0CAD3RXTY,361
85
- astrbot/core/platform/astr_message_event.py,sha256=df8fFckPTY0btDcDeb77yTCtfDEPqz-C_2Vubs_3qSA,14102
85
+ astrbot/core/platform/astr_message_event.py,sha256=q1bf4g7BnZKWF36Htik3lO8ZPMU-ptWbGnI5s4X6LEQ,14103
86
86
  astrbot/core/platform/astrbot_message.py,sha256=9Oy2HGfjD8mRTiUIVZEggwwqjCXOpr97QhHjxvBIzhM,2140
87
- astrbot/core/platform/manager.py,sha256=rzaIHyH5Wun9bI3ME0Cjuw4kzolSXpIoIqby49EB4PI,7887
87
+ astrbot/core/platform/manager.py,sha256=-H60fkUtH7uhr4aSm2NJF783o8oeN4HxaiiDxGew4B0,7893
88
88
  astrbot/core/platform/message_session.py,sha256=Hitdfb7IK4SohaMFld0s0UlwLDpVw5UPTToh05bvH60,1076
89
89
  astrbot/core/platform/message_type.py,sha256=uGn5KN8B_7b9F5nFTpvLAXRlXx2VFHP3JmJjN8cC7fg,261
90
90
  astrbot/core/platform/platform.py,sha256=170_1Y1T5R-3nsu06y3i8Ote7zs8JASnskImp-IP04Q,1772
91
91
  astrbot/core/platform/platform_metadata.py,sha256=VRZSkV7u0OUoSxAXDu5EdEggrmcsbhk_7RUduTasoQo,488
92
92
  astrbot/core/platform/register.py,sha256=1cPxysZZ1ggfSPZfsv7Ll6qOVcTmLUw6vgaVRPjpxH8,1701
93
93
  astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py,sha256=PN4h7TjH2UrQZX9bZmI6bGtmXgxHEx5GJREI-Vw0qX4,8036
94
- astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py,sha256=p5uYdQUXYtqUsJIwlsG6msma6af7G6oKlis05bXJTh8,16580
94
+ astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py,sha256=r7vgL47mfBmaaoFI9hRTwSnSPETppb_KEfUBI0aoNz4,16650
95
95
  astrbot/core/platform/sources/dingtalk/dingtalk_adapter.py,sha256=unEkE_KBwCLn9mOBs49WMUKqk8ddpaKN8MMyYep6rhg,8514
96
- astrbot/core/platform/sources/dingtalk/dingtalk_event.py,sha256=QcE0wUaB3hCSv4Cg3kApl5m0dfzkEyZTCjNbuHU52Ek,2721
97
- astrbot/core/platform/sources/discord/client.py,sha256=TQ62b58LVJCPPBNNVxxF2gyiy0k1UqtcSuwcFp0uNS4,4576
98
- astrbot/core/platform/sources/discord/components.py,sha256=FMqdzcGjNxkiYCWsShzDchLsXdy2Un-KJNLFx1PglEk,3843
96
+ astrbot/core/platform/sources/dingtalk/dingtalk_event.py,sha256=CYTVhpiIedNdLQxjKJlK26GxSWZGlUFNbxZZ5i3tM4o,2672
97
+ astrbot/core/platform/sources/discord/client.py,sha256=mNAE81bYJSvdhbSXrR7MDZIqtGEqDYynpRCGZNf9-ag,4592
98
+ astrbot/core/platform/sources/discord/components.py,sha256=QQYKLrdWjvzxMVrNZTxGW-rhdnn4L0CY5wbzxvQ0DY0,3845
99
99
  astrbot/core/platform/sources/discord/discord_platform_adapter.py,sha256=aeR1lv8sY3XNSSnN8q1XJ5N8SuxBPri0sGlQJD3vWlg,18389
100
- astrbot/core/platform/sources/discord/discord_platform_event.py,sha256=X6hbW0bxE287r6T0CpCIWqystiIQpFWpngM_fBRCqBA,11956
100
+ astrbot/core/platform/sources/discord/discord_platform_event.py,sha256=1YjlH3P-jY3tsE2dBFBnX9833_h55lI6A4xmLcOvlac,12008
101
101
  astrbot/core/platform/sources/lark/lark_adapter.py,sha256=JO_gBvAw6e2hTkXWOYeeSPUqdDjnsyVmtXh9SWXZO4A,8233
102
102
  astrbot/core/platform/sources/lark/lark_event.py,sha256=_zISFjMhRaUqSzSOqUVKq-6Q1qAF2SujqMk7rwxCL_U,4513
103
- astrbot/core/platform/sources/qqofficial/qqofficial_message_event.py,sha256=5ALw-nrq9Ef07pzJulymu4GvT56MbqvC2pgGheZ7j_Q,11914
103
+ astrbot/core/platform/sources/qqofficial/qqofficial_message_event.py,sha256=f8PA-kFZPe5iRqZZN4YYKj4wZSfozz8ySskxiE6BgpU,11954
104
104
  astrbot/core/platform/sources/qqofficial/qqofficial_platform_adapter.py,sha256=6zJGUdXc-EkQp8ITPRYr99tVEFIRc20x4Fs-9QVT8Zk,7279
105
105
  astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_adapter.py,sha256=PTW_WpZSzlFuchtpu0uAIMy2KcDMi_BBnr6tUgOJNZk,4295
106
106
  astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_event.py,sha256=BrxaNhG3sy5QAKf8DlZlum6R7m9X5Fm0SxBrKIC_1hg,499
@@ -108,27 +108,27 @@ astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_server.py,sha256=5A8
108
108
  astrbot/core/platform/sources/satori/satori_adapter.py,sha256=1wz4U8r70TcxBo04FT2QhEJpm5ZEyGB1sRXLBTbXBGE,16677
109
109
  astrbot/core/platform/sources/satori/satori_event.py,sha256=0z4Yn2WUn7-M2i2JbBp7VHoggsvk3mNUIRGgSWwsA30,9116
110
110
  astrbot/core/platform/sources/slack/client.py,sha256=p0gCh9gj_VR8IacGg09-BXp2IM8C0oTnodrvEVmShMA,5637
111
- astrbot/core/platform/sources/slack/slack_adapter.py,sha256=0EiEmqGWo-fMuSW4Ptjoej4u4yJW494C1B-itkokFFU,15766
112
- astrbot/core/platform/sources/slack/slack_event.py,sha256=fS8jlH-wiZldMnSclj8islhBSSPG-pQ4fSmIGlxAmjQ,8685
111
+ astrbot/core/platform/sources/slack/slack_adapter.py,sha256=BdZTCNXsO5nUKY2HrZD5tpxMzpnvL7n3_vr2JgJfDS0,15812
112
+ astrbot/core/platform/sources/slack/slack_event.py,sha256=RYTJBqk5-CYQKgk-ejPuMKJyfaxSTqPjvfqKvPNg5Yw,8791
113
113
  astrbot/core/platform/sources/telegram/tg_adapter.py,sha256=jEPkPKAbBgq9q9BZ3kx82RPrbU6LyZ8ugL-MmWiguPw,14145
114
- astrbot/core/platform/sources/telegram/tg_event.py,sha256=5xZyjSySvWiQppAVH6AvzYHVsgU7ny4XixoT8sJRyd0,9835
114
+ astrbot/core/platform/sources/telegram/tg_event.py,sha256=GtLETfmlHPkW-QoqS8Y07SbPspRMLueGHq402gMJ8Sc,9849
115
115
  astrbot/core/platform/sources/webchat/webchat_adapter.py,sha256=X4FAaV2uFjU65Amc3kse9WJNCqsGpE7xYQjnF99HcW8,5992
116
116
  astrbot/core/platform/sources/webchat/webchat_event.py,sha256=qeKBQtUZVwknsFQQvwASs5Hybs-L3Rn-bjIUaji6n9o,5457
117
- astrbot/core/platform/sources/webchat/webchat_queue_mgr.py,sha256=5kVpeN_FUpYLqUXZWmEEP0Ko1w_laP4QqtIp4IOk3KI,1362
118
- astrbot/core/platform/sources/wechatpadpro/wechatpadpro_adapter.py,sha256=Q1Ev5RBfhM5M_8OChh7WaQuz4kutQEnKMquE-bviGik,40673
117
+ astrbot/core/platform/sources/webchat/webchat_queue_mgr.py,sha256=2P0hQRNn7tMs9O6MLQ1GkJSSKz7R5Q8k_0JxEltSKLM,1364
118
+ astrbot/core/platform/sources/wechatpadpro/wechatpadpro_adapter.py,sha256=oXxy6ZJ-42_7yKZko9oepN0vBvVbLJRNjLbaxVr6ehk,40791
119
119
  astrbot/core/platform/sources/wechatpadpro/wechatpadpro_message_event.py,sha256=3K7NKrE46s5jhbxLEzduLPQF4Pt4Rj6IXXdu0TwoZUw,6019
120
120
  astrbot/core/platform/sources/wechatpadpro/xml_data_parser.py,sha256=tfQGwWXEra99hvrYTHI4einQSt7ATcLm57Uq4VTP7d8,6230
121
121
  astrbot/core/platform/sources/wecom/wecom_adapter.py,sha256=iCwW8S_notAkepeT78WkG2ICOMRDDpoy4aKacuflOhU,13574
122
122
  astrbot/core/platform/sources/wecom/wecom_event.py,sha256=WkP7EP7k4AS5KUrxF7ouByyR3qS-GMZODv3yORQb0kI,9181
123
- astrbot/core/platform/sources/wecom/wecom_kf.py,sha256=_Eoe1WuuyakbapKgURgbN7L7WCGJbQs4y8fwyXvuG4c,10790
124
- astrbot/core/platform/sources/wecom/wecom_kf_message.py,sha256=xUP3415BFgtchUEKFrdHIkpcYPAs2Pz7WnG-LfUWjnQ,5467
125
- astrbot/core/platform/sources/weixin_official_account/weixin_offacc_adapter.py,sha256=X3TjXLotz3ZQCZ4ACBhr-_n1yOH9JqptlLUw_d9FcGk,10364
126
- astrbot/core/platform/sources/weixin_official_account/weixin_offacc_event.py,sha256=Mum478n1fELjOnVig-IFZqTb6sF7AUK1fSO2ThxYHrQ,7197
123
+ astrbot/core/platform/sources/wecom/wecom_kf.py,sha256=xPPt3P3tqB6d0gzPT0-0YfTkYfzlMki1PNUMGWMkH74,10891
124
+ astrbot/core/platform/sources/wecom/wecom_kf_message.py,sha256=nHPOnrOEnEx2uawL1_6Ht0QB7k7G1Nbt3BLpPQekfZA,5787
125
+ astrbot/core/platform/sources/weixin_official_account/weixin_offacc_adapter.py,sha256=jKiLSiBW_gjE4yhN5lkfYJV8Gi3wdPkpyXYKAr0VrI0,10410
126
+ astrbot/core/platform/sources/weixin_official_account/weixin_offacc_event.py,sha256=JpyQYaivJTUkPOMDz5ZXp4CLOQ6ek76eNLmrJXTXEEU,7196
127
127
  astrbot/core/provider/__init__.py,sha256=fhD_KB1-KpqJ7woaXDXc7kdlmL3XPQz3xlc5IkFDJJ4,171
128
128
  astrbot/core/provider/entites.py,sha256=-353AdRDA6ST4AS48cQ1RRAXHSy3F7pVS_28hW4cG2U,388
129
- astrbot/core/provider/entities.py,sha256=fTWfSdULPUfjODp1I7yGRHtD_n6ExAh6RXWDjE5ptCI,10937
129
+ astrbot/core/provider/entities.py,sha256=hT3T4hEFwpDscCD1Kt8pfvjdqUh3nZqjyTXmSzmMCIE,10938
130
130
  astrbot/core/provider/func_tool_manager.py,sha256=Qb6UrajD4Hkz5ZLmYCo3RJx8xTW5nFEmG-F_nzm9qXg,20819
131
- astrbot/core/provider/manager.py,sha256=hF6aBylf6TE5qnY4rXOrkviOAlwFpS7i3NjFp6cu6OE,20395
131
+ astrbot/core/provider/manager.py,sha256=hFNFzV8vuHQZnRlIAbMCLn8iTvYAUH3je4VGFxY2Zls,20508
132
132
  astrbot/core/provider/provider.py,sha256=rzzlUTUn3cRCRgfd2PhA5RcboHkEDlk3Dw9Q1P3DoJ8,7203
133
133
  astrbot/core/provider/register.py,sha256=bWAF9zWNnSYQWjmZIXiWgxFaeWIiWjEoEIN_xhmq3mM,1830
134
134
  astrbot/core/provider/sources/anthropic_source.py,sha256=9I6VEZ5ANv-SIx7TaNGr2o_9S1xK0eTMOxt1ZF4XrBM,14974
@@ -137,7 +137,7 @@ astrbot/core/provider/sources/dashscope_source.py,sha256=HPzMCI-x5Ht76KxxvWHSwff
137
137
  astrbot/core/provider/sources/dashscope_tts.py,sha256=qGVGSKoW-yVHlnWl_eONwLtkAGMQX6t81FPkC-dV25U,1532
138
138
  astrbot/core/provider/sources/dify_source.py,sha256=Q0VmnacKwD-fOnvwYqbrRMspDYOlJZAHnjBawRzshw4,11472
139
139
  astrbot/core/provider/sources/edge_tts_source.py,sha256=foO2E0Wdc2wJy8yMbLUyX0cjkP6MD4vPCbc8q3Ckkug,4716
140
- astrbot/core/provider/sources/fishaudio_tts_api_source.py,sha256=1xN--JrZeqb2P7bDVVnGZi3hIQpLimYTkNwT8eCRRUQ,5439
140
+ astrbot/core/provider/sources/fishaudio_tts_api_source.py,sha256=Tu4wHh5txKDWn3_Z57hWgzTU8QUw1oVFBndAqmp4aLY,5439
141
141
  astrbot/core/provider/sources/gemini_embedding_source.py,sha256=FlVlacBLlxo4ZZgrBhurDQRuDYRGtR8Du35XuXEY9nI,2307
142
142
  astrbot/core/provider/sources/gemini_source.py,sha256=Gwn8nzMcsPsIVgDJ9G20tevUlYDyu_3g1_yaXsmvFPU,28649
143
143
  astrbot/core/provider/sources/gemini_tts_source.py,sha256=mNcb9G6Lb58L2zoSYzroQGyASGrv3k4ZjmOIVvhii_o,2886
@@ -158,15 +158,15 @@ astrbot/core/star/__init__.py,sha256=ynSwMrdCLyVMN3Q9flS_mcDDjdIGrkLBpfeDVoFj6PM
158
158
  astrbot/core/star/config.py,sha256=f4h1YFt1Tn6S2D-LvnhM483qaD8JdWjl-TBRV9CeYBo,3593
159
159
  astrbot/core/star/context.py,sha256=jeF6VLUwBm5b2kl0Uy4kz39uQ1C8esaOgeAIJavtTjo,12330
160
160
  astrbot/core/star/session_llm_manager.py,sha256=B2URKTxPW9FXUW1goZ0HkyuqE3PZ2X7o22GSPKnIAj0,8596
161
- astrbot/core/star/session_plugin_manager.py,sha256=h8i3QgymTldLjYtcElvP98OKXOru52pV8ZhiBAEJFTo,5192
161
+ astrbot/core/star/session_plugin_manager.py,sha256=EAN17vxRdpVwIsrqFy4-k0tGl9IpgYvpV42JFGHzXjQ,5229
162
162
  astrbot/core/star/star.py,sha256=fEgg7pxiIsnRg4Xw_KBIyOy3V919MpIgAWQ7FoE7bWc,1690
163
163
  astrbot/core/star/star_handler.py,sha256=njRMNHcbtJg8mIk6jofYggevMOdH7972bwK84jULNiY,4830
164
- astrbot/core/star/star_manager.py,sha256=nB90WWeeg3ZpRfApPJG8mo3FH8HOQevv28JHSKEV8v8,36069
165
- astrbot/core/star/star_tools.py,sha256=8art-1s2TNHVsZ-pOdi8iEUJOozFsTXSdA2Gb7H1MIE,10661
164
+ astrbot/core/star/star_manager.py,sha256=QkMnNhchj2-5bYT_TLeHt3It4UCV6wJvf8svubrVFFs,36069
165
+ astrbot/core/star/star_tools.py,sha256=A16aeLU78_BBOkfPQSOp1PPhg6krnP6ymKLiBUetLnQ,10795
166
166
  astrbot/core/star/updator.py,sha256=lHKLVE1mXBkkH0FpwJ8h23U9xJ9CsB1zo8rgZvADp88,3010
167
167
  astrbot/core/star/filter/__init__.py,sha256=xhdp6MMbBJbCHDDtBcAzWZ86DSFTPKzj8RpE2Cdb8ls,469
168
- astrbot/core/star/filter/command.py,sha256=Mucwervt346dL_wQaaytumTCuVNozwnE4B8kuBM0h0g,7158
169
- astrbot/core/star/filter/command_group.py,sha256=Tv1lFZvL8NGw7pui-r8R4oR0G-uyrdGzUjV1wdEN0Zc,4712
168
+ astrbot/core/star/filter/command.py,sha256=vHsrKT8prA3JO1tf29Qte_t6RMIZTeEGq5SwSF4YY0k,6911
169
+ astrbot/core/star/filter/command_group.py,sha256=XPONNccFEJeiRzryjySY28x3eS9cLzSDjObbQgI_xOI,4696
170
170
  astrbot/core/star/filter/custom_filter.py,sha256=UPEfr-vYJR1NsLOp75A8Oa8RFkluEC3rkzbHM2ct0ek,2238
171
171
  astrbot/core/star/filter/event_message_type.py,sha256=R45Buoy9YALxnY6oanFlZMLfSZex2NAHPsl8DFSI_2Y,1162
172
172
  astrbot/core/star/filter/permission.py,sha256=GmyA2xqPCGVryLMa7OrWiuYRR-9pcQ6PaYOedPySH_0,915
@@ -199,21 +199,21 @@ astrbot/dashboard/server.py,sha256=4d_0xDfMW-qKabVLBEVzOnjxF3qIiNMr3dvaxZO-cEk,9
199
199
  astrbot/dashboard/routes/__init__.py,sha256=Bn6_rbYtujttHKHEn8Smv2RiObhwWyH9TagW4HZSzGw,710
200
200
  astrbot/dashboard/routes/auth.py,sha256=igVjZWluaQpF-lrg-Ueb4IA553dA_Sn6pAxY34-83i8,2964
201
201
  astrbot/dashboard/routes/chat.py,sha256=hfKrxS07qEYA3SxwgPymh08-Doi74hwmaYhwxRcwrkk,11601
202
- astrbot/dashboard/routes/config.py,sha256=glo_68fdaU4awVG8udH43PPvih0HtSeeLTOGLxYMovE,31655
202
+ astrbot/dashboard/routes/config.py,sha256=ZVn5GIoaloIWpjL6Gy1zFtBQuAKC7fYP1RZDsJAGy8Q,31643
203
203
  astrbot/dashboard/routes/conversation.py,sha256=9AopEmbxzRUcJ78fOlp5aFe9-7ptroaE5YrvAEuGBJQ,8886
204
204
  astrbot/dashboard/routes/file.py,sha256=y3yi4ari-ELwiDicuniBlvXhVe8d1JgWRl6FdC42v9k,706
205
- astrbot/dashboard/routes/log.py,sha256=uLQx-TCyg3j3etkEd0hVStFTE4S1C4Y8XEBsk0w7Gc8,1972
205
+ astrbot/dashboard/routes/log.py,sha256=hDl6Niz_Vs4xb64USjCBzdOcm68GDpEsQrNrLr8yKGc,2114
206
206
  astrbot/dashboard/routes/persona.py,sha256=6icnNNE8A0Yy1WI0INWD9ZPKC7VcZG-xHDfYElhaP8M,7857
207
207
  astrbot/dashboard/routes/plugin.py,sha256=cGGJVEM55uRiPo-EeD5apZQISzPw9vux7a-U2dE4fZQ,19429
208
- astrbot/dashboard/routes/route.py,sha256=01N4nUrpyDk71IMbuRxwLXbEugysE_WOZH7VCsXVsws,1577
208
+ astrbot/dashboard/routes/route.py,sha256=V-Wm88D0BmxSYAUbedunykbWy5p7Tggae9nDhxm7LZU,1545
209
209
  astrbot/dashboard/routes/session_management.py,sha256=h3b8DTDV99Dl0Gmbys7I2SlkC7_DTeIQNwoi8HT1zEo,20238
210
210
  astrbot/dashboard/routes/stat.py,sha256=KCtP0-f9g664gM2SOBgnU8uKx6zt93-5Kut-d7wd7zk,6910
211
211
  astrbot/dashboard/routes/static_file.py,sha256=7KnNcOb1BVqSTft114LhGsDkfg69X2jHEm0tOK0kW0Y,1169
212
212
  astrbot/dashboard/routes/t2i.py,sha256=scp05AxoJM9cubrkSMBu1BbIWP1BMS50eFEPZ9S6WKM,8893
213
- astrbot/dashboard/routes/tools.py,sha256=BWN0KYidJdY4zVVbLRaM5cSgDNrdJ7dlgFQI4WTqaUY,13990
213
+ astrbot/dashboard/routes/tools.py,sha256=FvWgjzImgeIGFWJM_r2tku3UTj0J5LwZXfmZJxfJWHM,13975
214
214
  astrbot/dashboard/routes/update.py,sha256=vhG6ET0GJNLTpfkKABYf3Aq5ChUCID1BvoZissWRBZg,6517
215
- astrbot-4.1.1.dist-info/METADATA,sha256=D8o_EdiSUwy1DPF-HMITDlfXAcIsbvlVg9mCA16WcLU,10921
216
- astrbot-4.1.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
217
- astrbot-4.1.1.dist-info/entry_points.txt,sha256=OEF09YmhBWYuViXrvTLLpstF4ccmNwDL8r7nnFD0pfI,53
218
- astrbot-4.1.1.dist-info/licenses/LICENSE,sha256=zPfQj5Mq8-gThIiBcxETr7t8gND9bZWOjTGQAr80TQI,34500
219
- astrbot-4.1.1.dist-info/RECORD,,
215
+ astrbot-4.1.2.dist-info/METADATA,sha256=5KY3hEFXebwM33VBFvpILeAFZLF6kUA9pqcIOiXLblk,10921
216
+ astrbot-4.1.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
217
+ astrbot-4.1.2.dist-info/entry_points.txt,sha256=OEF09YmhBWYuViXrvTLLpstF4ccmNwDL8r7nnFD0pfI,53
218
+ astrbot-4.1.2.dist-info/licenses/LICENSE,sha256=zPfQj5Mq8-gThIiBcxETr7t8gND9bZWOjTGQAr80TQI,34500
219
+ astrbot-4.1.2.dist-info/RECORD,,