AstrBot 4.10.0__py3-none-any.whl → 4.10.0a1__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.10.0"
1
+ __version__ = "4.10.0-alpha.1"
@@ -76,19 +76,12 @@ class ToolLoopAgentRunner(BaseAgentRunner[TContext]):
76
76
 
77
77
  async def _iter_llm_responses(self) -> T.AsyncGenerator[LLMResponse, None]:
78
78
  """Yields chunks *and* a final LLMResponse."""
79
- payload = {
80
- "contexts": self.run_context.messages,
81
- "func_tool": self.req.func_tool,
82
- "model": self.req.model, # NOTE: in fact, this arg is None in most cases
83
- "session_id": self.req.session_id,
84
- }
85
-
86
79
  if self.streaming:
87
- stream = self.provider.text_chat_stream(**payload)
80
+ stream = self.provider.text_chat_stream(**self.req.__dict__)
88
81
  async for resp in stream: # type: ignore
89
82
  yield resp
90
83
  else:
91
- yield await self.provider.text_chat(**payload)
84
+ yield await self.provider.text_chat(**self.req.__dict__)
92
85
 
93
86
  @override
94
87
  async def step(self):
@@ -172,7 +165,7 @@ class ToolLoopAgentRunner(BaseAgentRunner[TContext]):
172
165
  self.run_context.messages.append(
173
166
  Message(
174
167
  role="assistant",
175
- content=llm_resp.completion_text or "*No response*",
168
+ content=llm_resp.completion_text or "",
176
169
  ),
177
170
  )
178
171
  try:
@@ -237,25 +230,6 @@ class ToolLoopAgentRunner(BaseAgentRunner[TContext]):
237
230
  async for resp in self.step():
238
231
  yield resp
239
232
 
240
- # 如果循环结束了但是 agent 还没有完成,说明是达到了 max_step
241
- if not self.done():
242
- logger.warning(
243
- f"Agent reached max steps ({max_step}), forcing a final response."
244
- )
245
- # 拔掉所有工具
246
- if self.req:
247
- self.req.func_tool = None
248
- # 注入提示词
249
- self.run_context.messages.append(
250
- Message(
251
- role="user",
252
- content="工具调用次数已达到上限,请停止使用工具,并根据已经收集到的信息,对你的任务和发现进行总结,然后直接回复用户。",
253
- )
254
- )
255
- # 再执行最后一步
256
- async for resp in self.step():
257
- yield resp
258
-
259
233
  async def _handle_function_tools(
260
234
  self,
261
235
  req: ProviderRequest,
@@ -402,33 +376,35 @@ class ToolLoopAgentRunner(BaseAgentRunner[TContext]):
402
376
  ),
403
377
  )
404
378
 
379
+ # yield the last tool call result
380
+ if tool_call_result_blocks:
381
+ last_tcr_content = str(tool_call_result_blocks[-1].content)
382
+ yield MessageChain(
383
+ type="tool_call_result",
384
+ chain=[
385
+ Json(
386
+ data={
387
+ "id": func_tool_id,
388
+ "ts": time.time(),
389
+ "result": last_tcr_content,
390
+ }
391
+ )
392
+ ],
393
+ )
394
+
405
395
  elif resp is None:
406
396
  # Tool 直接请求发送消息给用户
407
397
  # 这里我们将直接结束 Agent Loop。
408
398
  # 发送消息逻辑在 ToolExecutor 中处理了。
409
399
  logger.warning(
410
- f"{func_tool_name} 没有没有返回值或者将结果直接发送给用户。"
400
+ f"{func_tool_name} 没有没有返回值或者将结果直接发送给用户,此工具调用不会被记录到历史中。"
411
401
  )
412
402
  self._transition_state(AgentState.DONE)
413
403
  self.stats.end_time = time.time()
414
- tool_call_result_blocks.append(
415
- ToolCallMessageSegment(
416
- role="tool",
417
- tool_call_id=func_tool_id,
418
- content="*工具没有返回值或者将结果直接发送给了用户*",
419
- ),
420
- )
421
404
  else:
422
405
  # 不应该出现其他类型
423
406
  logger.warning(
424
- f"Tool 返回了不支持的类型: {type(resp)}",
425
- )
426
- tool_call_result_blocks.append(
427
- ToolCallMessageSegment(
428
- role="tool",
429
- tool_call_id=func_tool_id,
430
- content="*工具返回了不支持的类型,请告诉用户检查这个工具的定义和实现。*",
431
- ),
407
+ f"Tool 返回了不支持的类型: {type(resp)},将忽略。",
432
408
  )
433
409
 
434
410
  try:
@@ -450,22 +426,6 @@ class ToolLoopAgentRunner(BaseAgentRunner[TContext]):
450
426
  ),
451
427
  )
452
428
 
453
- # yield the last tool call result
454
- if tool_call_result_blocks:
455
- last_tcr_content = str(tool_call_result_blocks[-1].content)
456
- yield MessageChain(
457
- type="tool_call_result",
458
- chain=[
459
- Json(
460
- data={
461
- "id": func_tool_id,
462
- "ts": time.time(),
463
- "result": last_tcr_content,
464
- }
465
- )
466
- ],
467
- )
468
-
469
429
  # 处理函数调用响应
470
430
  if tool_call_result_blocks:
471
431
  yield tool_call_result_blocks
@@ -2,7 +2,6 @@ import traceback
2
2
  from collections.abc import AsyncGenerator
3
3
 
4
4
  from astrbot.core import logger
5
- from astrbot.core.agent.message import Message
6
5
  from astrbot.core.agent.runners.tool_loop_agent_runner import ToolLoopAgentRunner
7
6
  from astrbot.core.astr_agent_context import AstrAgentContext
8
7
  from astrbot.core.message.components import Json
@@ -25,25 +24,8 @@ async def run_agent(
25
24
  ) -> AsyncGenerator[MessageChain | None, None]:
26
25
  step_idx = 0
27
26
  astr_event = agent_runner.run_context.context.event
28
- while step_idx < max_step + 1:
27
+ while step_idx < max_step:
29
28
  step_idx += 1
30
-
31
- if step_idx == max_step + 1:
32
- logger.warning(
33
- f"Agent reached max steps ({max_step}), forcing a final response."
34
- )
35
- if not agent_runner.done():
36
- # 拔掉所有工具
37
- if agent_runner.req:
38
- agent_runner.req.func_tool = None
39
- # 注入提示词
40
- agent_runner.run_context.messages.append(
41
- Message(
42
- role="user",
43
- content="工具调用次数已达到上限,请停止使用工具,并根据已经收集到的信息,对你的任务和发现进行总结,然后直接回复用户。",
44
- )
45
- )
46
-
47
29
  try:
48
30
  async for resp in agent_runner.step():
49
31
  if astr_event.is_stopped():
@@ -209,42 +209,12 @@ async def call_local_llm_tool(
209
209
  else:
210
210
  raise ValueError(f"未知的方法名: {method_name}")
211
211
  except ValueError as e:
212
- raise Exception(f"Tool execution ValueError: {e}") from e
213
- except TypeError as e:
214
- # 获取函数的签名(包括类型),除了第一个 event/context 参数。
215
- try:
216
- sig = inspect.signature(handler)
217
- params = list(sig.parameters.values())
218
- # 跳过第一个参数(event 或 context)
219
- if params:
220
- params = params[1:]
221
-
222
- param_strs = []
223
- for param in params:
224
- param_str = param.name
225
- if param.annotation != inspect.Parameter.empty:
226
- # 获取类型注解的字符串表示
227
- if isinstance(param.annotation, type):
228
- type_str = param.annotation.__name__
229
- else:
230
- type_str = str(param.annotation)
231
- param_str += f": {type_str}"
232
- if param.default != inspect.Parameter.empty:
233
- param_str += f" = {param.default!r}"
234
- param_strs.append(param_str)
235
-
236
- handler_param_str = (
237
- ", ".join(param_strs) if param_strs else "(no additional parameters)"
238
- )
239
- except Exception:
240
- handler_param_str = "(unable to inspect signature)"
241
-
242
- raise Exception(
243
- f"Tool handler parameter mismatch, please check the handler definition. Handler parameters: {handler_param_str}"
244
- ) from e
212
+ logger.error(f"调用本地 LLM 工具时出错: {e}", exc_info=True)
213
+ except TypeError:
214
+ logger.error("处理函数参数不匹配,请检查 handler 的定义。", exc_info=True)
245
215
  except Exception as e:
246
216
  trace_ = traceback.format_exc()
247
- raise Exception(f"Tool execution error: {e}. Traceback: {trace_}") from e
217
+ logger.error(f"调用本地 LLM 工具时出错: {e}\n{trace_}")
248
218
 
249
219
  if not ready_to_call:
250
220
  return
@@ -5,7 +5,7 @@ from typing import Any, TypedDict
5
5
 
6
6
  from astrbot.core.utils.astrbot_path import get_astrbot_data_path
7
7
 
8
- VERSION = "4.10.0"
8
+ VERSION = "4.10.0-alpha.1"
9
9
  DB_PATH = os.path.join(get_astrbot_data_path(), "data_v4.db")
10
10
 
11
11
  WEBHOOK_SUPPORTED_PLATFORMS = [
@@ -321,12 +321,7 @@ class InternalAgentSubStage(Stage):
321
321
  elif isinstance(req.tool_calls_result, list):
322
322
  for tcr in req.tool_calls_result:
323
323
  messages.extend(tcr.to_openai_messages())
324
- messages.append(
325
- {
326
- "role": "assistant",
327
- "content": llm_response.completion_text or "*No response*",
328
- }
329
- )
324
+ messages.append({"role": "assistant", "content": llm_response.completion_text})
330
325
  messages = list(filter(lambda item: "_no_save" not in item, messages))
331
326
  await self.conv_manager.update_conversation(
332
327
  event.unified_msg_origin,
@@ -138,7 +138,7 @@ class ProviderGoogleGenAI(Provider):
138
138
  modalities = ["TEXT"]
139
139
 
140
140
  tool_list: list[types.Tool] | None = []
141
- model_name = cast(str, payloads.get("model", self.get_model()))
141
+ model_name = payloads.get("model", self.get_model())
142
142
  native_coderunner = self.provider_config.get("gm_native_coderunner", False)
143
143
  native_search = self.provider_config.get("gm_native_search", False)
144
144
  url_context = self.provider_config.get("gm_url_context", False)
@@ -199,16 +199,7 @@ class ProviderGoogleGenAI(Provider):
199
199
 
200
200
  # oper thinking config
201
201
  thinking_config = None
202
- if model_name in [
203
- "gemini-2.5-pro",
204
- "gemini-2.5-pro-preview",
205
- "gemini-2.5-flash",
206
- "gemini-2.5-flash-preview",
207
- "gemini-2.5-flash-lite",
208
- "gemini-2.5-flash-lite-preview",
209
- "gemini-robotics-er-1.5-preview",
210
- "gemini-live-2.5-flash-preview-native-audio-09-2025",
211
- ]:
202
+ if model_name.startswith("gemini-2.5"):
212
203
  # The thinkingBudget parameter, introduced with the Gemini 2.5 series
213
204
  thinking_budget = self.provider_config.get("gm_thinking_config", {}).get(
214
205
  "budget", 0
@@ -217,14 +208,7 @@ class ProviderGoogleGenAI(Provider):
217
208
  thinking_config = types.ThinkingConfig(
218
209
  thinking_budget=thinking_budget,
219
210
  )
220
- elif model_name in [
221
- "gemini-3-pro",
222
- "gemini-3-pro-preview",
223
- "gemini-3-flash",
224
- "gemini-3-flash-preview",
225
- "gemini-3-flash-lite",
226
- "gemini-3-flash-lite-preview",
227
- ]:
211
+ elif model_name.startswith("gemini-3"):
228
212
  # The thinkingLevel parameter, recommended for Gemini 3 models and onwards
229
213
  # Gemini 2.5 series models don't support thinkingLevel; use thinkingBudget instead.
230
214
  thinking_level = self.provider_config.get("gm_thinking_config", {}).get(
@@ -436,7 +436,7 @@ class ChatRoute(Route):
436
436
  accumulated_parts = []
437
437
  accumulated_text = ""
438
438
  accumulated_reasoning = ""
439
- # tool_calls = {}
439
+ tool_calls = {}
440
440
  agent_stats = {}
441
441
  except BaseException as e:
442
442
  logger.exception(f"WebChat stream unexpected error: {e}", exc_info=True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AstrBot
3
- Version: 4.10.0
3
+ Version: 4.10.0a1
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
@@ -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=eiNxh0tSyv9nut-H3lBLi2t5qqpCFRgVfedLjanNppI,23
11
+ astrbot/cli/__init__.py,sha256=7tPyHq9-ywFKjFXC8MGPLhb0SShJyNZOIKFI-DEVAqQ,31
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
@@ -22,8 +22,8 @@ astrbot/cli/utils/version_comparator.py,sha256=NVUmshfb5LU4a-S453rI7opqo0QtIHvlT
22
22
  astrbot/core/__init__.py,sha256=zsaF9IeON4NaHk_Ktr0eB7xQEFC5tUZ4UJCesC3-KHM,1220
23
23
  astrbot/core/astr_agent_context.py,sha256=bJnAm_CGzkhMnC99GA_j0Xwmi-OYoBPmgGanuS36DF4,637
24
24
  astrbot/core/astr_agent_hooks.py,sha256=QOMtBaamDRiylGIby5D5ApThk94Y_Dcy4gDnhPBHXKo,1073
25
- astrbot/core/astr_agent_run_util.py,sha256=D_K2MOhAp0O8tQpAkrciiUhjbgDOo7zewMrXpzjdgsM,5534
26
- astrbot/core/astr_agent_tool_exec.py,sha256=DpGqVhQzSwL2EN6wfBJrlcwH7b1jLkX5b_1eI5xqUB8,10258
25
+ astrbot/core/astr_agent_run_util.py,sha256=woTtR-6Z6EQh0Yj2cBx8LBSgqaOj_zCau8KefeXE_Gc,4755
26
+ astrbot/core/astr_agent_tool_exec.py,sha256=KnUP1q0k_pOWT3krw8leH53G7QTnapDjMlXH-LnI-xA,9005
27
27
  astrbot/core/astrbot_config_mgr.py,sha256=SUvusfo8Qk89eNpEmduWcXuczJ9g5TBH-VOV69ax28g,8950
28
28
  astrbot/core/conversation_mgr.py,sha256=GsirCeMBmgxyaOb3hYNleF_11yyFyAER5PtpM3IUvIQ,15765
29
29
  astrbot/core/core_lifecycle.py,sha256=nFuuNA0SJkCAeyoGZmG0LbBAhoq9j-_ajHq71s5tWAA,12796
@@ -48,7 +48,7 @@ astrbot/core/agent/tool.py,sha256=ITSAmYBp2y-QPWdZkc-KXof3UIHjQ2rmweyUPuYykFA,94
48
48
  astrbot/core/agent/tool_executor.py,sha256=8GGgVB_JaKGVLQUG1epeL-lvKMqgfQ7mJaOPnVytnXo,438
49
49
  astrbot/core/agent/runners/__init__.py,sha256=KwR34OKGVSQpJ_MaGVP_MX5L1SZ4oU-lv4GuMbSF5Ys,65
50
50
  astrbot/core/agent/runners/base.py,sha256=OHMt15x1C3O_F3EJI2Nb_3hwggGUkJHuPWWCa1kHX9o,1885
51
- astrbot/core/agent/runners/tool_loop_agent_runner.py,sha256=ZXSvTb9SoZ98VfVzneL3pDpoRObasGSU8mTCJB9p91I,19520
51
+ astrbot/core/agent/runners/tool_loop_agent_runner.py,sha256=ZGkG0JanhBYaUPqfj5PbCkLeP0lwC5LacCHZfMM6nuU,17973
52
52
  astrbot/core/agent/runners/coze/coze_agent_runner.py,sha256=bc2GImNsBTyXuotl_ohKYiNqws5Dkcms_xmIoUtDJMM,13846
53
53
  astrbot/core/agent/runners/coze/coze_api_client.py,sha256=0k8pQsFsbjKdF-jkY91qZWsC8YSaSmwC98TMTK-zqw0,10853
54
54
  astrbot/core/agent/runners/dashscope/dashscope_agent_runner.py,sha256=xr3otT0o6kHEy_sWjUv4xh-KmES3fjlowIPrtcKYiVI,13339
@@ -56,7 +56,7 @@ astrbot/core/agent/runners/dify/dify_agent_runner.py,sha256=LYwpjOcBWf3XlwNVzrDv
56
56
  astrbot/core/agent/runners/dify/dify_api_client.py,sha256=OXukDVgNx3VmYw6OCzjXyP8JmDWEFuy81sD9XnC4VRo,6530
57
57
  astrbot/core/config/__init__.py,sha256=vZjtpC7vr-IvBgSUtbS04C0wpulmCG5tPmcEP1WYE_4,172
58
58
  astrbot/core/config/astrbot_config.py,sha256=6bUTnMCOyaS8s6ELsWctDfUFTB53fKJQNu272dZXkdU,6347
59
- astrbot/core/config/default.py,sha256=Tp0ZIzd6HwY41CJVRUY2B2Xt6YLlLytC5tu-lAPMvOc,147674
59
+ astrbot/core/config/default.py,sha256=nBcK_RVYg0NiiWfhjLt4iQM4bfHmWkB-kJ3PbmEpZJI,147682
60
60
  astrbot/core/config/i18n_utils.py,sha256=HJn_0XeeVS9ryCBelYfnc0nEn10LlX702fcSSFrF1J8,3879
61
61
  astrbot/core/db/__init__.py,sha256=OnvNaC76hYp28Bq9zkFXMl19zn7w-FC1zxyLgsemGvU,13400
62
62
  astrbot/core/db/po.py,sha256=eoI4sjpFb9CwRy6_Gf6-zHVSka6-oJr0LA4qcepqHzU,11804
@@ -111,7 +111,7 @@ astrbot/core/pipeline/process_stage/stage.py,sha256=tOg6HYGVU1GoY921YBYVO1MTM7a5
111
111
  astrbot/core/pipeline/process_stage/utils.py,sha256=q4V5G0PZD5b5mPh1lM-6w79LKGpp7RR7-PqYFhWpopM,4061
112
112
  astrbot/core/pipeline/process_stage/method/agent_request.py,sha256=GlGrGCsCASC4a3PpG6Oc1907aLdl_PrUMXrFiEiEEzc,2043
113
113
  astrbot/core/pipeline/process_stage/method/star_request.py,sha256=C-PTq_Wpq4QMS2ecfRDCcDSX3rYyldfsAN-jAaEEb-w,2430
114
- astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py,sha256=RSeEqvJEV33RH6OGHEdDaCYyv6zt7RosG4j-hVdbjnc,21263
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
117
  astrbot/core/pipeline/respond/stage.py,sha256=RIYGXTG-XvBhgRqaHyJYWlsZjskS9pgV-2jm5o956ho,11042
@@ -190,7 +190,7 @@ astrbot/core/provider/sources/dashscope_tts.py,sha256=-qBMwbIt_QSmWCT_uPAxrXSYuE
190
190
  astrbot/core/provider/sources/edge_tts_source.py,sha256=dsf6YtSGzCJvas3BqBwHSn8vlMgQ_vgD9NEwngqDlEo,4690
191
191
  astrbot/core/provider/sources/fishaudio_tts_api_source.py,sha256=z5yJuc47iky31N0Za3Li7uwMP15N1gsKJkV9ybIbKew,5556
192
192
  astrbot/core/provider/sources/gemini_embedding_source.py,sha256=bj4iXnMyONTyUBmBFeezPcBpjtfX_UBjMrbwMFyCis8,2607
193
- astrbot/core/provider/sources/gemini_source.py,sha256=o4vrlq6Pp7hcPJpVq4ppx1IOmG_1JPJNrwqt923QlMw,33916
193
+ astrbot/core/provider/sources/gemini_source.py,sha256=7CoVxKvC4mPU4pnVbjplvl2AMHwcNpq4UAQR-nIJrN4,33379
194
194
  astrbot/core/provider/sources/gemini_tts_source.py,sha256=6LJIT2aTjoZaMszjYRzDu38prsO9G5Xg7SzJmQb2TzE,2880
195
195
  astrbot/core/provider/sources/groq_source.py,sha256=NqmiQn37mrMsaTyGX25eNzMpIgkCifY-5TJO8DFzHaA,456
196
196
  astrbot/core/provider/sources/gsv_selfhosted_source.py,sha256=RYQgwCc67N7RWPaODN4sSLJZn6o5gpgk_jF_KaRnD0M,5942
@@ -258,7 +258,7 @@ astrbot/dashboard/server.py,sha256=HfmWHj4aqYcTT1re0vD4Fw6BHedg4bcfqpnWiisFWko,9
258
258
  astrbot/dashboard/utils.py,sha256=KrAv0lnPaVR0bx8yevT1CLGbSNsJizlfkKkPEtVVANI,5355
259
259
  astrbot/dashboard/routes/__init__.py,sha256=57ZYHYQfNI-YAiA8K9m2tRJcHzMKcZ02Vu-A_eD0HUE,894
260
260
  astrbot/dashboard/routes/auth.py,sha256=rYkvt3MpCY9BhWjG0DUoX3YaBkJT1Id7M2pKqTmXbvo,2946
261
- astrbot/dashboard/routes/chat.py,sha256=ntQrgrnOTIep_9Ycb1DCZjZBJPtlIJUO2YnTvC1GXFQ,27120
261
+ astrbot/dashboard/routes/chat.py,sha256=Bs9RUj0WFeyiXJgJTu3i19tPocRvpm87W3IYqIiMSH8,27118
262
262
  astrbot/dashboard/routes/command.py,sha256=OLrDDUAE5zpxZMRJ3_IGe-6xFEpPwcXcd-EJ60e9OHI,2862
263
263
  astrbot/dashboard/routes/config.py,sha256=v2CQ6rPb1VAyrj9bJNr8g0GoFlzm3qeEuXs2P6kIwQw,42903
264
264
  astrbot/dashboard/routes/conversation.py,sha256=TWGY7BJ9QfmbxurAieBrbMmCi4_Ua2klxsAUlSRXbng,14302
@@ -275,8 +275,8 @@ astrbot/dashboard/routes/static_file.py,sha256=7KnNcOb1BVqSTft114LhGsDkfg69X2jHE
275
275
  astrbot/dashboard/routes/t2i.py,sha256=F6smxdL99MF7cRw3hqS6-2GErw8Zhsv0V0mfBUeEk-c,8931
276
276
  astrbot/dashboard/routes/tools.py,sha256=mMwVFw_VOlpqy_WZg1A-ddGtYa5L5QLWYawl37PT0-c,15354
277
277
  astrbot/dashboard/routes/update.py,sha256=qXiqQ_dbqRVftOzGgCQrvK8-qopVK6zKhhVVJ9SK26U,6648
278
- astrbot-4.10.0.dist-info/METADATA,sha256=ddedpSBaSPHDpZ79M_9z5uLh9BZIVrKMT0AOQZ7xZOE,11925
279
- astrbot-4.10.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
280
- astrbot-4.10.0.dist-info/entry_points.txt,sha256=OEF09YmhBWYuViXrvTLLpstF4ccmNwDL8r7nnFD0pfI,53
281
- astrbot-4.10.0.dist-info/licenses/LICENSE,sha256=zPfQj5Mq8-gThIiBcxETr7t8gND9bZWOjTGQAr80TQI,34500
282
- astrbot-4.10.0.dist-info/RECORD,,
278
+ astrbot-4.10.0a1.dist-info/METADATA,sha256=c4FiZcy2QW4xkZJRjNzKeRC8VaKHUmYOLo_6mcCnvUc,11927
279
+ astrbot-4.10.0a1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
280
+ astrbot-4.10.0a1.dist-info/entry_points.txt,sha256=OEF09YmhBWYuViXrvTLLpstF4ccmNwDL8r7nnFD0pfI,53
281
+ astrbot-4.10.0a1.dist-info/licenses/LICENSE,sha256=zPfQj5Mq8-gThIiBcxETr7t8gND9bZWOjTGQAr80TQI,34500
282
+ astrbot-4.10.0a1.dist-info/RECORD,,