diff --git a/src/daemon/spawner.py b/src/daemon/spawner.py index 524d87e..9eeb8dd 100644 --- a/src/daemon/spawner.py +++ b/src/daemon/spawner.py @@ -698,20 +698,38 @@ curl -X POST http://{api_host}:{api_port}/api/projects/{project_id}/tasks/{task_ logger.info("Agent %s retry %s=%d/%d (session=%s)", agent_id, retry_field, count, self.max_retries, session_id) - # 构建续杯 message + # 构建续杯 message(Mail 用专用模板,Task 用标准模板) task_info = self._get_task_info(db_path, task_id) or {} - fallback_hint = "\n⚠️ 之前有 fallback 执行,请调 API 检查任务当前状态和已有产出,确认是否已完成。" if retry_field == "retry_count" else "" - message = self.RETRY_PROMPT.format( - project_id=task_info.get("project_id", ""), - task_id=task_id or "", - title=task_info.get("title", ""), - retry_count=count, - max_retries=self.max_retries, - api_host=self.api_host, - api_port=self.api_port, - agent_id=agent_id, - fallback_hint=fallback_hint, - ) + project_id = task_info.get("project_id", "") + is_mail = project_id == "_mail" + + if is_mail: + # Mail 续杯:精简模板,不含状态转换指令 + must_haves = task_info.get("must_haves", "{}") + try: + meta = json.loads(must_haves) if must_haves else {} + except Exception: + meta = {} + message = MAIL_RETRY_PROMPT.format( + from_agent=meta.get("from", "unknown"), + title=task_info.get("title", ""), + retry_count=count, + max_retries=self.max_retries, + ) + else: + # Task 续杯:标准模板 + fallback_hint = "\n⚠️ 之前有 fallback 执行,请调 API 检查任务当前状态和已有产出,确认是否已完成。" if retry_field == "retry_count" else "" + message = self.RETRY_PROMPT.format( + project_id=project_id, + task_id=task_id or "", + title=task_info.get("title", ""), + retry_count=count, + max_retries=self.max_retries, + api_host=self.api_host, + api_port=self.api_port, + agent_id=agent_id, + fallback_hint=fallback_hint, + ) # 续杯 spawn(counter 保持占用,直到 max_retries 或最终完成时 release) # session 策略:原始是 main session (session_id=None) 时,retry 也用 main session