myagent-ai 1.23.65 → 1.23.67

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.
@@ -46,7 +46,8 @@ class MainAgent(BaseAgent):
46
46
  严格以XML格式化输出以下内容,否则解析器无法解析:"""
47
47
 
48
48
  # XML 输出格式规范(头部嵌入 SYSTEM_PROMPT,尾部在 _process_v2_inner 中再次追加,一头一尾确保格式正确)
49
- xml_prompt = """<output>
49
+ xml_prompt = """
50
+ <output>
50
51
  <mainsubject>当前对话的6字以内标题(每轮都需输出,系统会每3轮自动更新会话名称)</mainsubject>
51
52
  <usersays_correct>通过修正识别错误、调整标点,结合上下文,将用户语音转写文本"usersays"修正为更准确的文本,但尽量少改动。如"usersays"为空,则此处为空。</usersays_correct>
52
53
  <response><reply>展示给用户的文本,格式上尽量使用md格式,直观形象展示,甚至可以包括超链接、表格等。内容上,针对用户问题,直接回应问题;针对任务,开始的时候,告诉用户,为完成任务,准备如何开展工作;执行过程中,根据工具调用结果,简单展示任务进展;任务完成后的详细最终总结。注意:这是给用户展示信息的最重要标签,尽量不要跟上次回复重复,执行过程展示内容尽量简洁,执行总结可以丰富一点。</reply><toolstocal>
@@ -62,7 +63,8 @@ class MainAgent(BaseAgent):
62
63
  <finish>true/false,是否结束循环调用llm。如"askuser"为非空,则"finish"为true。否则,根据"context"判断任务是否已完成,是否结束llm回调</finish>
63
64
  <finish_reason>当"finish"为true 时必填,详细说明为什么现在结束任务(如:任务已完成/需要用户补充信息/信息不足无法继续等)。finish若为false ,此处为空。</finish_reason>
64
65
  <next_step>当 finish=false 时必填,描述下一步计划做什么(简洁明了,1-2句话)。finish=true 时为空。</next_step>
65
- </output>"""
66
+ </output>
67
+ """
66
68
 
67
69
  SYSTEM_PROMPT = SYSTEM_PROMPT + xml_prompt + """
68
70
  注意事项:
@@ -7,6 +7,7 @@ chatbot/manager.py - 聊天平台管理器
7
7
  from __future__ import annotations
8
8
 
9
9
  import asyncio
10
+ import time
10
11
  from typing import Any, Callable, Dict, List, Optional
11
12
 
12
13
  from core.logger import get_logger
@@ -33,11 +34,15 @@ class ChatBotManager:
33
34
  await manager.start_all()
34
35
  """
35
36
 
37
+ # bot 异常后冷却时间(秒),防止 Telegram polling 冲突
38
+ _RESTART_COOLDOWN = 5
39
+
36
40
  def __init__(self):
37
41
  self._bots: Dict[str, BaseChatBot] = {}
38
42
  self._bot_tasks: Dict[str, asyncio.Task] = {} # key -> asyncio.Task
39
43
  self._session_map: Dict[str, str] = {} # session_id -> last_message
40
44
  self._message_handler: Optional[Callable] = None
45
+ self._last_crash: Dict[str, float] = {} # key -> 上次异常时间戳
41
46
 
42
47
  def get_bot(self, key: str):
43
48
  """根据 key (id 或 platform 名) 获取 bot 实例"""
@@ -96,6 +101,9 @@ class ChatBotManager:
96
101
  # 如果已经存在且配置没变,跳过重建
97
102
  if key in self._bots:
98
103
  continue
104
+ # 冷却期检查:刚崩溃的 bot 不要立即重建启动,防止 Telegram polling 冲突
105
+ if key in self._last_crash and time.time() - self._last_crash[key] < self._RESTART_COOLDOWN:
106
+ continue
99
107
  try:
100
108
  bot = self._create_bot(cfg, message_handler)
101
109
  if bot:
@@ -207,7 +215,9 @@ class ChatBotManager:
207
215
  await bot.stop()
208
216
  except Exception:
209
217
  pass
210
- # 移除 bot 实例,下次热更新会重新创建全新的 bot
218
+ # 记录崩溃时间,防止冷却期内立即重启导致 Telegram Conflict
219
+ self._last_crash[name] = time.time()
220
+ # 移除 bot 实例和 task,下次热更新(冷却后)会重新创建全新的 bot
211
221
  self._bots.pop(name, None)
212
222
  self._bot_tasks.pop(name, None)
213
223
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "myagent-ai",
3
- "version": "1.23.65",
3
+ "version": "1.23.67",
4
4
  "description": "本地桌面端执行型AI助手 - Open Interpreter 风格 | Local Desktop Execution-Oriented AI Assistant",
5
5
  "main": "main.py",
6
6
  "bin": {
package/web/api_server.py CHANGED
@@ -301,9 +301,15 @@ class ApiServer:
301
301
  logger.warning("聊天平台消息处理器为 None,平台可能无法处理消息")
302
302
  mgr.setup_platforms(platform_configs, handler)
303
303
  # [v1.20.12] 补启未运行的 bot
304
+ import time as _time
304
305
  enabled_keys = [cfg.id or cfg.platform for cfg in platform_configs if cfg.enabled]
305
306
  for key in enabled_keys:
306
307
  if key in mgr._bots and key not in mgr._bot_tasks:
308
+ # 冷却期检查:刚崩溃的 bot 不要立即重启,防止 Telegram polling 冲突
309
+ last_crash = getattr(mgr, '_last_crash', {}).get(key, 0)
310
+ if _time.time() - last_crash < mgr._RESTART_COOLDOWN:
311
+ logger.info(f"聊天平台 {key} 在冷却期内,跳过重启")
312
+ continue
307
313
  bot = mgr._bots.get(key)
308
314
  if bot:
309
315
  logger.info(f"补启动聊天平台: {key}")