Commit 0aed7fc0 authored by 郭阔's avatar 郭阔

fix(harvest): 业务自报失败也触发重试链(昨夜四源重试未触发根因)

昨夜 nikkei-markets(GLM 无工具会话)与 reuters×3(DataDome 墙)失败时,
模型都通过 structured_output 如实上报 status=FAILED/0交付——但 attempt_needs_retry
只认运行错误(is_error/结构化缺失),业务失败被当'质量失败'直接放弃,attempt2/3 一次没跑。

- attempt_needs_retry 新增 business 判据:status=FAILED 或 0 交付;
  取尽豁免优先(all_seen/全非文章页虽自报 FAILED 但业务上是成功,不重跑)
- business 失败不走 --resume 续会话(会话确实没干成活,续接只会复述失败),
  attempt2 同 provider 整场重跑,attempt3 仍切备用 provider
- 实测矩阵:四失败信封→重试;成功交付→不重试;取尽→不重试
parent ef14fb44
......@@ -177,19 +177,32 @@ ${RESULT_REQUIREMENTS}"
kill "$_watchdog_pid" 2>/dev/null
}
attempt_needs_retry() { # 运行错误/输出无效/API 报错 → 重试;内容质量类失败不触发
_RETRY_KIND="" # runtime=会话坏(structured交付失败,可resume补交) / business=活没干成(必须整场重跑)
attempt_needs_retry() { # 运行错误/输出无效/API 报错/业务自报失败 → 重试
# 注意:信封的 .result 字段正常时就是文本消息;结构化结果在 .structured_output。
# 判定成败必须看 structured_output 是否为对象(实测:成功轮 result=str+structured_output=dict;
# GLM 结构化失败轮 structured_output 缺失)。
_RETRY_KIND="runtime"
if [ "$RC" -ne 0 ]; then return 0; fi
if [ ! -s "$JSON_OUT" ]; then return 0; fi
command -v jq >/dev/null 2>&1 || return 1
jq empty "$JSON_OUT" 2>/dev/null || return 0
if jq -e '(.structured_output | type) == "object"' "$JSON_OUT" >/dev/null 2>&1; then
if jq -e '.is_error == true' "$JSON_OUT" >/dev/null 2>&1; then return 0; fi
if ! jq -e '(.structured_output | type) == "object"' "$JSON_OUT" >/dev/null 2>&1; then
return 0
fi
if jq -e '.is_error == true' "$JSON_OUT" >/dev/null 2>&1; then return 0; fi
# 业务自报失败:模型明确 status=FAILED(如会话无工具如实拒做、候选全被反爬墙拦),
# 或 0 交付且未确认取尽。取尽豁免优先(all_seen/非文章页拒绝虽自报 FAILED 但业务上是成功,
# 不会再有新文章,重跑纯浪费);部分交付 SUCCESS 也不重试
_RETRY_KIND="business"
if jq -e '.structured_output.source_exhausted == true' "$JSON_OUT" >/dev/null 2>&1; then
_RETRY_KIND=""
return 1
fi
return 0
if jq -e '.structured_output.status == "FAILED"' "$JSON_OUT" >/dev/null 2>&1; then return 0; fi
if jq -e '(.structured_output.succeeded_count // 1) == 0' "$JSON_OUT" >/dev/null 2>&1; then return 0; fi
_RETRY_KIND=""
return 1
}
# 失败自动恢复:①失败(运行错误/输出无效/API 错)→ ②同 provider 重试 →
......@@ -200,8 +213,12 @@ for ATTEMPT in 1 2 3; do
if [ "$ATTEMPT" = "2" ]; then
cp -f "$JSON_OUT" "${JSON_OUT}.attempt1" 2>/dev/null || true
cp -f "$RAW_OUT" "${RAW_OUT}.attempt1" 2>/dev/null || true
# 优先续接上一会话补交结果(秒级、零重采);拿不到 session_id 才整场重跑
# 优先续接上一会话补交结果(秒级、零重采);拿不到 session_id 才整场重跑。
# 业务失败(_RETRY_KIND=business)例外:会话确实没干成活,续接只会复述失败,必须整场重跑
RESUME_SESSION="$(jq -r '.session_id // empty' "$JSON_OUT" 2>/dev/null || true)"
if [ "${_RETRY_KIND:-}" = "business" ]; then
RESUME_SESSION=""
fi
if [ -n "$RESUME_SESSION" ]; then
echo "[attempt 2/3] 续接会话 ${RESUME_SESSION} 补交结构化结果(${USED_PROVIDER:-default})…"
else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment