AstrBot 4.1.2__py3-none-any.whl → 4.1.3__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.
@@ -258,7 +258,7 @@ class ToolLoopAgentRunner(BaseAgentRunner[TContext]):
258
258
  )
259
259
  yield MessageChain(
260
260
  type="tool_direct_result"
261
- ).base64_image(res.content[0].data)
261
+ ).base64_image(resource.blob)
262
262
  else:
263
263
  tool_call_result_blocks.append(
264
264
  ToolCallMessageSegment(
@@ -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.2"
9
+ VERSION = "4.1.3"
10
10
  DB_PATH = os.path.join(get_astrbot_data_path(), "data_v4.db")
11
11
 
12
12
  # 默认配置
@@ -60,6 +60,7 @@ DEFAULT_CONFIG = {
60
60
  "web_search_link": False,
61
61
  "display_reasoning_text": False,
62
62
  "identifier": False,
63
+ "group_name_display": False,
63
64
  "datetime_system_prompt": True,
64
65
  "default_personality": "default",
65
66
  "persona_pool": ["*"],
@@ -1724,6 +1725,9 @@ CONFIG_METADATA_2 = {
1724
1725
  "identifier": {
1725
1726
  "type": "bool",
1726
1727
  },
1728
+ "group_name_display": {
1729
+ "type": "bool",
1730
+ },
1727
1731
  "datetime_system_prompt": {
1728
1732
  "type": "bool",
1729
1733
  },
@@ -1903,17 +1907,31 @@ CONFIG_METADATA_3 = {
1903
1907
  "_special": "select_provider",
1904
1908
  "hint": "留空代表不使用。可用于不支持视觉模态的聊天模型。",
1905
1909
  },
1910
+ "provider_stt_settings.enable": {
1911
+ "description": "默认启用语音转文本",
1912
+ "type": "bool",
1913
+ },
1906
1914
  "provider_stt_settings.provider_id": {
1907
1915
  "description": "语音转文本模型",
1908
1916
  "type": "string",
1909
1917
  "hint": "留空代表不使用。",
1910
1918
  "_special": "select_provider_stt",
1919
+ "condition": {
1920
+ "provider_stt_settings.enable": True,
1921
+ },
1922
+ },
1923
+ "provider_tts_settings.enable": {
1924
+ "description": "默认启用文本转语音",
1925
+ "type": "bool",
1911
1926
  },
1912
1927
  "provider_tts_settings.provider_id": {
1913
1928
  "description": "文本转语音模型",
1914
1929
  "type": "string",
1915
1930
  "hint": "留空代表不使用。",
1916
1931
  "_special": "select_provider_tts",
1932
+ "condition": {
1933
+ "provider_tts_settings.enable": True,
1934
+ },
1917
1935
  },
1918
1936
  "provider_settings.image_caption_prompt": {
1919
1937
  "description": "图片转述提示词",
@@ -1983,6 +2001,11 @@ CONFIG_METADATA_3 = {
1983
2001
  "description": "用户识别",
1984
2002
  "type": "bool",
1985
2003
  },
2004
+ "provider_settings.group_name_display": {
2005
+ "description": "显示群名称",
2006
+ "type": "bool",
2007
+ "hint": "启用后,在支持的平台(aiocqhttp)上会在 prompt 中包含群名称信息。",
2008
+ },
1986
2009
  "provider_settings.datetime_system_prompt": {
1987
2010
  "description": "现实世界时间感知",
1988
2011
  "type": "bool",
@@ -1,17 +1,15 @@
1
1
  import random
2
2
  import asyncio
3
3
  import math
4
- import traceback
5
4
  import astrbot.core.message.components as Comp
6
5
  from typing import Union, AsyncGenerator
7
6
  from ..stage import register_stage, Stage
8
- from ..context import PipelineContext
7
+ from ..context import PipelineContext, call_event_hook
9
8
  from astrbot.core.platform.astr_message_event import AstrMessageEvent
10
9
  from astrbot.core.message.message_event_result import MessageChain, ResultContentType
11
10
  from astrbot.core import logger
12
- from astrbot.core.message.message_event_result import BaseMessageComponent
13
- from astrbot.core.star.star_handler import star_handlers_registry, EventType
14
- from astrbot.core.star.star import star_map
11
+ from astrbot.core.message.components import BaseMessageComponent, ComponentType
12
+ from astrbot.core.star.star_handler import EventType
15
13
  from astrbot.core.utils.path_util import path_Mapping
16
14
  from astrbot.core.utils.session_lock import session_lock_manager
17
15
 
@@ -114,6 +112,43 @@ class RespondStage(Stage):
114
112
  # 如果所有组件都为空
115
113
  return True
116
114
 
115
+ def is_seg_reply_required(self, event: AstrMessageEvent) -> bool:
116
+ """检查是否需要分段回复"""
117
+ if not self.enable_seg:
118
+ return False
119
+
120
+ if self.only_llm_result and not event.get_result().is_llm_result():
121
+ return False
122
+
123
+ if event.get_platform_name() in [
124
+ "qq_official",
125
+ "weixin_official_account",
126
+ "dingtalk",
127
+ ]:
128
+ return False
129
+
130
+ return True
131
+
132
+ def _extract_comp(
133
+ self,
134
+ raw_chain: list[BaseMessageComponent],
135
+ extract_types: set[ComponentType],
136
+ modify_raw_chain: bool = True,
137
+ ):
138
+ extracted = []
139
+ if modify_raw_chain:
140
+ remaining = []
141
+ for comp in raw_chain:
142
+ if comp.type in extract_types:
143
+ extracted.append(comp)
144
+ else:
145
+ remaining.append(comp)
146
+ raw_chain[:] = remaining
147
+ else:
148
+ extracted = [comp for comp in raw_chain if comp.type in extract_types]
149
+
150
+ return extracted
151
+
117
152
  async def process(
118
153
  self, event: AstrMessageEvent
119
154
  ) -> Union[None, AsyncGenerator[None, None]]:
@@ -123,7 +158,14 @@ class RespondStage(Stage):
123
158
  if result.result_content_type == ResultContentType.STREAMING_FINISH:
124
159
  return
125
160
 
161
+ logger.info(
162
+ f"Prepare to send - {event.get_sender_name()}/{event.get_sender_id()}: {event._outline_chain(result.chain)}"
163
+ )
164
+
126
165
  if result.result_content_type == ResultContentType.STREAMING_RESULT:
166
+ if result.async_stream is None:
167
+ logger.warning("async_stream 为空,跳过发送。")
168
+ return
127
169
  # 流式结果直接交付平台适配器处理
128
170
  use_fallback = self.config.get("provider_settings", {}).get(
129
171
  "streaming_segmented", False
@@ -148,87 +190,71 @@ class RespondStage(Stage):
148
190
  except Exception as e:
149
191
  logger.warning(f"空内容检查异常: {e}")
150
192
 
151
- record_comps = [c for c in result.chain if isinstance(c, Comp.Record)]
152
- non_record_comps = [
153
- c for c in result.chain if not isinstance(c, Comp.Record)
154
- ]
155
-
156
- if (
157
- self.enable_seg
158
- and (
159
- (self.only_llm_result and result.is_llm_result())
160
- or not self.only_llm_result
193
+ # 发送消息链
194
+ # Record 需要强制单独发送
195
+ need_separately = {ComponentType.Record}
196
+ if self.is_seg_reply_required(event):
197
+ header_comps = self._extract_comp(
198
+ result.chain,
199
+ {ComponentType.Reply, ComponentType.At},
200
+ modify_raw_chain=True,
161
201
  )
162
- and event.get_platform_name()
163
- not in ["qq_official", "weixin_official_account", "dingtalk"]
164
- ):
165
- decorated_comps = []
166
- if self.reply_with_mention:
167
- for comp in result.chain:
168
- if isinstance(comp, Comp.At):
169
- decorated_comps.append(comp)
170
- result.chain.remove(comp)
171
- break
172
- if self.reply_with_quote:
173
- for comp in result.chain:
174
- if isinstance(comp, Comp.Reply):
175
- decorated_comps.append(comp)
176
- result.chain.remove(comp)
177
- break
178
-
179
- # leverage lock to guarentee the order of message sending among different events
202
+ if not result.chain or len(result.chain) == 0:
203
+ # may fix #2670
204
+ logger.warning(
205
+ f"实际消息链为空, 跳过发送阶段。header_chain: {header_comps}, actual_chain: {result.chain}"
206
+ )
207
+ return
180
208
  async with session_lock_manager.acquire_lock(event.unified_msg_origin):
181
- for rcomp in record_comps:
182
- i = await self._calc_comp_interval(rcomp)
183
- await asyncio.sleep(i)
184
- try:
185
- await event.send(MessageChain([rcomp]))
186
- except Exception as e:
187
- logger.error(f"发送消息失败: {e} chain: {result.chain}")
188
- break
189
- # 分段回复
190
- for comp in non_record_comps:
209
+ for comp in result.chain:
191
210
  i = await self._calc_comp_interval(comp)
192
211
  await asyncio.sleep(i)
193
212
  try:
194
- await event.send(MessageChain([*decorated_comps, comp]))
195
- decorated_comps = [] # 清空已发送的装饰组件
213
+ if comp.type in need_separately:
214
+ await event.send(MessageChain([comp]))
215
+ else:
216
+ await event.send(MessageChain([*header_comps, comp]))
217
+ header_comps.clear()
196
218
  except Exception as e:
197
- logger.error(f"发送消息失败: {e} chain: {result.chain}")
198
- break
219
+ logger.error(
220
+ f"发送消息链失败: chain = {MessageChain([comp])}, error = {e}",
221
+ exc_info=True,
222
+ )
199
223
  else:
200
- for rcomp in record_comps:
224
+ if all(
225
+ comp.type in {ComponentType.Reply, ComponentType.At}
226
+ for comp in result.chain
227
+ ):
228
+ # may fix #2670
229
+ logger.warning(
230
+ f"消息链全为 Reply 和 At 消息段, 跳过发送阶段。chain: {result.chain}"
231
+ )
232
+ return
233
+ sep_comps = self._extract_comp(
234
+ result.chain,
235
+ need_separately,
236
+ modify_raw_chain=True,
237
+ )
238
+ for comp in sep_comps:
239
+ chain = MessageChain([comp])
201
240
  try:
202
- await event.send(MessageChain([rcomp]))
241
+ await event.send(chain)
203
242
  except Exception as e:
204
- logger.error(f"发送消息失败: {e} chain: {result.chain}")
205
-
206
- try:
207
- await event.send(MessageChain(non_record_comps))
208
- except Exception as e:
209
- logger.error(traceback.format_exc())
210
- logger.error(f"发送消息失败: {e} chain: {result.chain}")
211
-
212
- logger.info(
213
- f"AstrBot -> {event.get_sender_name()}/{event.get_sender_id()}: {event._outline_chain(result.chain)}"
214
- )
215
-
216
- handlers = star_handlers_registry.get_handlers_by_event_type(
217
- EventType.OnAfterMessageSentEvent, plugins_name=event.plugins_name
218
- )
219
- for handler in handlers:
220
- try:
221
- logger.debug(
222
- f"hook(on_after_message_sent) -> {star_map[handler.handler_module_path].name} - {handler.handler_name}"
223
- )
224
- await handler.handler(event)
225
- except BaseException:
226
- logger.error(traceback.format_exc())
243
+ logger.error(
244
+ f"发送消息链失败: chain = {chain}, error = {e}",
245
+ exc_info=True,
246
+ )
247
+ chain = MessageChain(result.chain)
248
+ if result.chain and len(result.chain) > 0:
249
+ try:
250
+ await event.send(chain)
251
+ except Exception as e:
252
+ logger.error(
253
+ f"发送消息链失败: chain = {chain}, error = {e}",
254
+ exc_info=True,
255
+ )
227
256
 
228
- if event.is_stopped():
229
- logger.info(
230
- f"{star_map[handler.handler_module_path].name} - {handler.handler_name} 终止了事件传播。"
231
- )
232
- return
257
+ if await call_event_hook(event, EventType.OnAfterMessageSentEvent):
258
+ return
233
259
 
234
260
  event.clear_result()
@@ -55,7 +55,7 @@ class AstrBotMessage:
55
55
  self_id: str # 机器人的识别id
56
56
  session_id: str # 会话id。取决于 unique_session 的设置。
57
57
  message_id: str # 消息id
58
- group_id: str = "" # 群组id,如果为私聊,则为空
58
+ group: Group # 群组
59
59
  sender: MessageMember # 发送者
60
60
  message: List[BaseMessageComponent] # 消息链使用 Nakuru 的消息链格式
61
61
  message_str: str # 最直观的纯文本消息字符串
@@ -64,6 +64,28 @@ class AstrBotMessage:
64
64
 
65
65
  def __init__(self) -> None:
66
66
  self.timestamp = int(time.time())
67
+ self.group = None
67
68
 
68
69
  def __str__(self) -> str:
69
70
  return str(self.__dict__)
71
+
72
+ @property
73
+ def group_id(self) -> str:
74
+ """
75
+ 向后兼容的 group_id 属性
76
+ 群组id,如果为私聊,则为空
77
+ """
78
+ if self.group:
79
+ return self.group.group_id
80
+ return ""
81
+
82
+ @group_id.setter
83
+ def group_id(self, value: str):
84
+ """设置 group_id"""
85
+ if value:
86
+ if self.group:
87
+ self.group.group_id = value
88
+ else:
89
+ self.group = Group(group_id=value)
90
+ else:
91
+ self.group = None
@@ -187,6 +187,7 @@ class AiocqhttpAdapter(Platform):
187
187
  if event["message_type"] == "group":
188
188
  abm.type = MessageType.GROUP_MESSAGE
189
189
  abm.group_id = str(event.group_id)
190
+ abm.group.group_name = event.get("group_name", "N/A")
190
191
  elif event["message_type"] == "private":
191
192
  abm.type = MessageType.FRIEND_MESSAGE
192
193
  if self.unique_session and abm.type == MessageType.GROUP_MESSAGE:
@@ -52,10 +52,11 @@ class CommandFilter(HandlerFilter):
52
52
  # 忽略前两个参数,即 self 和 event
53
53
  idx += 1
54
54
  continue
55
- if v.default == inspect.Parameter.empty:
56
- self.handler_params[k] = v.annotation
57
- else:
55
+ # 优先类型注解 其次默认值
56
+ if v.annotation == inspect.Parameter.empty:
58
57
  self.handler_params[k] = v.default
58
+ else:
59
+ self.handler_params[k] = v.annotation
59
60
 
60
61
  def get_handler_md(self) -> StarHandlerMetadata:
61
62
  return self.handler_md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AstrBot
3
- Version: 4.1.2
3
+ Version: 4.1.3
4
4
  Summary: 易上手的多平台 LLM 聊天机器人及开发框架
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.10
@@ -42,10 +42,10 @@ astrbot/core/agent/tool.py,sha256=ZkiyZUP2SdQSncjDCiNMYYi_rYhwtyQYxbiEgeIjvvw,86
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
44
44
  astrbot/core/agent/runners/base.py,sha256=exZS_d2BsrLz-xgeY9ZUPuXikBDUnKxO-dU3ZFQMhRs,1625
45
- astrbot/core/agent/runners/tool_loop_agent_runner.py,sha256=cuGBkpyyUEZaI4eo-UxAf199kEupicAo3IZMUwm6874,13976
45
+ astrbot/core/agent/runners/tool_loop_agent_runner.py,sha256=n_Mm4D289UKHPXVjb6gCq58i0eBsoe81lcTX8G30kkM,13970
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=lYCZF1eqtSFVcOMycxDvtBotX7NJRuABOnXRDAIV44k,116180
48
+ astrbot/core/config/default.py,sha256=DlbgtiuIMKkjMwlcJ67Do9EUKlONjKMJ0xzJpMDwXtI,117266
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
@@ -76,14 +76,14 @@ astrbot/core/pipeline/process_stage/stage.py,sha256=2hCX5LdUCzX2RbleMLF_Yqiot9YD
76
76
  astrbot/core/pipeline/process_stage/method/llm_request.py,sha256=CYDjQtTTDI05O06NPW-_TgD4mW4r1zKm4GwqH-EE49Y,23882
77
77
  astrbot/core/pipeline/process_stage/method/star_request.py,sha256=0KWbR0bnVXhMm0CgXnYD_OH3qjbUUvax1UmBWuGiLYU,2454
78
78
  astrbot/core/pipeline/rate_limit_check/stage.py,sha256=I_GkpSgioN0-T_catMwpRKtxx-TiMmvu8vV_FE5ORIA,4072
79
- astrbot/core/pipeline/respond/stage.py,sha256=uebafXVRXBr7dVwrREprNTGDxMMj8Rjo9-hPqc79WYQ,9975
79
+ astrbot/core/pipeline/respond/stage.py,sha256=K_CrogwVS1EYNv9oAe3We95QwahPef1S9oBMwd5wdsw,10525
80
80
  astrbot/core/pipeline/result_decorate/stage.py,sha256=jGXXtAYyQeo6EHsvrJ56x4rpDBgntXyG5k3kAIt8-Hk,13497
81
81
  astrbot/core/pipeline/session_status_check/stage.py,sha256=4STRhoiq4AE544_MVscGHA2FIKUia1CPHV1TKFKTs9U,838
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
85
  astrbot/core/platform/astr_message_event.py,sha256=q1bf4g7BnZKWF36Htik3lO8ZPMU-ptWbGnI5s4X6LEQ,14103
86
- astrbot/core/platform/astrbot_message.py,sha256=9Oy2HGfjD8mRTiUIVZEggwwqjCXOpr97QhHjxvBIzhM,2140
86
+ astrbot/core/platform/astrbot_message.py,sha256=r7jlUPfaOEh0yCSHaS1KQtYarZ9B4ikqMZwDj-wLv_k,2655
87
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
@@ -91,7 +91,7 @@ astrbot/core/platform/platform.py,sha256=170_1Y1T5R-3nsu06y3i8Ote7zs8JASnskImp-I
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=r7vgL47mfBmaaoFI9hRTwSnSPETppb_KEfUBI0aoNz4,16650
94
+ astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py,sha256=ke52xqAr5JzjfGr0X3thL5Ed9VqfShMxeBRJp1KbRRs,16716
95
95
  astrbot/core/platform/sources/dingtalk/dingtalk_adapter.py,sha256=unEkE_KBwCLn9mOBs49WMUKqk8ddpaKN8MMyYep6rhg,8514
96
96
  astrbot/core/platform/sources/dingtalk/dingtalk_event.py,sha256=CYTVhpiIedNdLQxjKJlK26GxSWZGlUFNbxZZ5i3tM4o,2672
97
97
  astrbot/core/platform/sources/discord/client.py,sha256=mNAE81bYJSvdhbSXrR7MDZIqtGEqDYynpRCGZNf9-ag,4592
@@ -165,7 +165,7 @@ astrbot/core/star/star_manager.py,sha256=QkMnNhchj2-5bYT_TLeHt3It4UCV6wJvf8svubr
165
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=vHsrKT8prA3JO1tf29Qte_t6RMIZTeEGq5SwSF4YY0k,6911
168
+ astrbot/core/star/filter/command.py,sha256=lWcZPnmyWKFtflMe8JjPZbvImfqGMLwuUukdPEcrSU8,6963
169
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
@@ -212,8 +212,8 @@ astrbot/dashboard/routes/static_file.py,sha256=7KnNcOb1BVqSTft114LhGsDkfg69X2jHE
212
212
  astrbot/dashboard/routes/t2i.py,sha256=scp05AxoJM9cubrkSMBu1BbIWP1BMS50eFEPZ9S6WKM,8893
213
213
  astrbot/dashboard/routes/tools.py,sha256=FvWgjzImgeIGFWJM_r2tku3UTj0J5LwZXfmZJxfJWHM,13975
214
214
  astrbot/dashboard/routes/update.py,sha256=vhG6ET0GJNLTpfkKABYf3Aq5ChUCID1BvoZissWRBZg,6517
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,,
215
+ astrbot-4.1.3.dist-info/METADATA,sha256=MId2DI3KOUAukQo1NT32r3JxhAeHt7ATzfzvyL4JA-w,10921
216
+ astrbot-4.1.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
217
+ astrbot-4.1.3.dist-info/entry_points.txt,sha256=OEF09YmhBWYuViXrvTLLpstF4ccmNwDL8r7nnFD0pfI,53
218
+ astrbot-4.1.3.dist-info/licenses/LICENSE,sha256=zPfQj5Mq8-gThIiBcxETr7t8gND9bZWOjTGQAr80TQI,34500
219
+ astrbot-4.1.3.dist-info/RECORD,,