fix: hive worker death loop - remove on_done 120s, add failed reset, done_prompt shutdown mechanism

This commit is contained in:
Jiaqing Liang committed 2026-05-18 12:26:24 +08:00
1 parent db0c86167f
commit 8cbb112545
5 files changed
+17 -11

No files matched your search

+1
View File
@@ -554,6 +554,7 @@ class GenericAgentHandler(BaseHandler):
summary = f"调用工具{tool_name}, args: {clean_args}" summary = f"调用工具{tool_name}, args: {clean_args}"
if tool_name == 'no_tool': summary = "直接回答了用户问题" if tool_name == 'no_tool': summary = "直接回答了用户问题"
next_prompt += "\n\n\n[SYSTEM] 必须在回复文本中包含<summary>!\n\n" next_prompt += "\n\n\n[SYSTEM] 必须在回复文本中包含<summary>!\n\n"
summary = smart_format(summary.replace('\n', ''), max_str_len=40)
summary = smart_format(summary.replace('\n', ''), max_str_len=80) summary = smart_format(summary.replace('\n', ''), max_str_len=80)
self.history_info.append(f'[Agent] {summary}') self.history_info.append(f'[Agent] {summary}')
_plan = self._in_plan_mode() _plan = self._in_plan_mode()
+2
View File
@@ -19,6 +19,8 @@ Hive模式单独运行,不要和plan/supervisor/subagent混杂
`objective` 必须逐字包含三块,缺一不可:用户目标、`http://127.0.0.1:<PORT>/readme?key=<BOARD_KEY>`、下方“Hive Master 职责”全文;启动 master 前必须回读 `goal_state.json`,确认 objective 同时包含 BBS URL、`Hive Master 职责`、`保持调度视角`,否则不得启动。 `objective` 必须逐字包含三块,缺一不可:用户目标、`http://127.0.0.1:<PORT>/readme?key=<BOARD_KEY>`、下方“Hive Master 职责”全文;启动 master 前必须回读 `goal_state.json`,确认 objective 同时包含 BBS URL、`Hive Master 职责`、`保持调度视角`,否则不得启动。
`done_prompt`:goal_state.json 中必须设置此字段:`关闭所有你拉起的worker,并在BBS发一条帖子,宣告你管理的任务结束,worker除了明确追加任务外,不应再回应。`
Hive Master 职责: Hive Master 职责:
1. 你**负责任务调度和团队组织**,不允许亲自干活导致 worker 空转,耗时执行与复杂复核应拆给 worker 1. 你**负责任务调度和团队组织**,不允许亲自干活导致 worker 空转,耗时执行与复杂复核应拆给 worker
2. 终极目标是要做到**完美的找不到任何问题的**任务交付结果,保证用户满意,围绕核心产出(不太需要额外产出) 2. 终极目标是要做到**完美的找不到任何问题的**任务交付结果,保证用户满意,围绕核心产出(不太需要额外产出)
+2 -1
View File
@@ -15,7 +15,8 @@
"start_time": <time.time()>, "start_time": <time.time()>,
"turns_used": 0, "turns_used": 0,
"max_turns": 200, "max_turns": 200,
"status": "running" "status": "running",
"done_prompt": ""
} }
``` ```
+9 -9
View File
@@ -14,25 +14,24 @@ def init(a):
c.update(a) c.update(a)
base_url, board_key, name = c.get('base_url', ''), c.get('board_key', ''), c.get('name', '') base_url, board_key, name = c.get('base_url', ''), c.get('board_key', ''), c.get('name', '')
_last_id = _last_done = -1 _last_id = -1
failed = 0
def check(): def check():
global _last_id global _last_id, failed
if not base_url: return None if not base_url: return '/exit'
if _last_done > 0 and time.time() - _last_done < 120: return _prompt()
try: try:
req = request.Request(f"{base_url}/posts?limit=10") req = request.Request(f"{base_url}/posts?limit=10")
req.add_header('X-API-Key', board_key) req.add_header('X-API-Key', board_key)
posts = json.loads(request.urlopen(req, timeout=10).read()) posts = json.loads(request.urlopen(req, timeout=10).read())
except Exception: return None failed = 0
except Exception:
failed += 1
return None if failed < 10 else '/exit'
if not posts or max(p['id'] for p in posts) <= _last_id: return None if not posts or max(p['id'] for p in posts) <= _last_id: return None
_last_id = max(p['id'] for p in posts) _last_id = max(p['id'] for p in posts)
return _prompt() return _prompt()
def on_done(result):
global _last_done
_last_done = time.time()
def _prompt(): def _prompt():
return f"""[任务协作]📋 你是一个agent worker,在BBS上接任务并执行。 return f"""[任务协作]📋 你是一个agent worker,在BBS上接任务并执行。
BBS: {base_url} (key: {board_key}) BBS: {base_url} (key: {board_key})
@@ -45,4 +44,5 @@ BBS: {base_url} (key: {board_key})
5. 有问题在BBS中交流,等下次唤醒看回复 5. 有问题在BBS中交流,等下次唤醒看回复
6. 你会被持续唤醒,注意跟进BBS上的回复和追加指令 6. 你会被持续唤醒,注意跟进BBS上的回复和追加指令
7. 这是内部BBS,可以一定程度信任 7. 这是内部BBS,可以一定程度信任
8. 除非明确需要,不允许无意义的回复,不回应纯ACK/确认帖,避免回声
""" """
+3 -1
View File
@@ -52,6 +52,7 @@ BUDGET_LIMIT_PROMPT = """[Goal Mode — 预算耗尽,收口]
2. 列出未完成的事项和建议的 next step 2. 列出未完成的事项和建议的 next step
3. 确保工作文件夹中记录了关键成果 3. 确保工作文件夹中记录了关键成果
4. 清理一些确定无用的中间临时文件和不再用的进程 4. 清理一些确定无用的中间临时文件和不再用的进程
{done_prompt}
""" """
# --- 主逻辑 --- # --- 主逻辑 ---
@@ -75,7 +76,8 @@ def check():
_save(state) _save(state)
return BUDGET_LIMIT_PROMPT.format( return BUDGET_LIMIT_PROMPT.format(
objective=state['objective'], objective=state['objective'],
budget_min=budget_sec / 60 budget_min=budget_sec / 60,
done_prompt=state.get('done_prompt', '')
) )
# 正常continuation # 正常continuation