fix(bid_flow): failed任务视为阻塞并抛人工介入,不再每轮重复造任务(实测角色agent失败后对账器15秒重造的根源)

This commit is contained in:
yumoqing 2026-08-27 00:30:39 +08:00
parent a5dd0a4079
commit e134ecde4a
2 changed files with 26 additions and 1 deletions

View File

@ -47,6 +47,7 @@ BLOCKING_HT_TYPES = (HT_TENDER_FILE, HT_HUMAN_DOCS)
# 任务未终结状态(判断「是否已有在办任务」用)
OPEN_TASK_STATES = ("submitted", "running", "review", "qc_review")
# failed 任务单独处理:角色 agent 执行失败(如机构未配 LLM→ 对账器不重复造任务,抛人工介入
# ── 门限默认值(可用 appbase params 表覆盖)──
DEFAULT_PARAMS = {

View File

@ -80,7 +80,31 @@ async def reconcile_project(sor, project_id, project_name=""):
acts = []
pname = project_name or project_id
# ── 0. 招标文件到位则自动关闭上传任务,再判阻塞门禁 ──
# ── 0a. 失败任务优先处理:角色 agent 执行失败(如机构未配置 LLM
# 抛人工介入,且不再造新任务(防每轮对账重复造)。
n_failed = await _count(
sor, "SELECT COUNT(*) AS c FROM pipeline_tasks WHERE tenant_id=${p}$ "
"AND pipeline_id='role_task' AND state='failed'", {"p": project_id})
if n_failed > 0:
ht = await find_human_task(sor, project_id, "general", status="pending")
if not ht:
tasks = await sor.sqlExe(
"SELECT role, title FROM pipeline_tasks WHERE tenant_id=${p}$ "
"AND pipeline_id='role_task' AND state='failed' LIMIT 5", {"p": project_id})
await sor.sqlExe("COMMIT", {})
tlist = "\n".join("- %s: %s" % (getattr(r, "role", ""), getattr(r, "title", ""))
for r in (tasks or []))
await create_human_task(
sor, project_id, "general",
"投标任务执行失败,需人工处理(%d 个)" % n_failed,
("以下角色任务执行失败,对账器已暂停自动派发:\n" + tlist +
"\n\n常见原因:机构未配置 LLM 模型(项目缺省模型/角色模型未设置)、"
"模型调用超时、任务内容异常。\n请处理后用 reset_task_retry 恢复,或取消任务。"),
assignee_role="owner.superuser")
await sor.sqlExe("COMMIT", {})
return ["blocked: %d 个任务执行失败,已抛人工介入,暂停派发" % n_failed]
# ── 0b. 招标文件到位则自动关闭上传任务,再判阻塞门禁 ──
await _auto_close_file_upload_task(sor, project_id)
if await has_pending_blocking_human_task(sor, project_id):
return ["blocked: 有待办人类任务(等招标文件/等人类资料/等审批),本轮不派发"]