From 74989afb9730a49fab6befede122fe8b131e7461 Mon Sep 17 00:00:00 2001 From: zizi Date: Thu, 16 Jul 2026 09:22:05 +0800 Subject: [PATCH] =?UTF-8?q?fix(parse-book):=20check=E7=BB=88=E6=A3=80?= =?UTF-8?q?=E6=8E=A5=E6=95=8F=E6=84=9F=E9=99=8D=E7=BA=A7=E9=93=BE+?= =?UTF-8?q?=E6=96=AD=E7=82=B9=E7=BB=AD=E8=B7=91+=E5=8D=95=E7=AA=97?= =?UTF-8?q?=E6=8B=A6=E6=88=AA=E8=B7=B3=E7=AA=97=E2=80=94=E2=80=94=E6=89=B9?= =?UTF-8?q?9=E5=AE=9E=E6=B5=8B=E8=B6=85=E7=A5=9E=E7=AA=9720=E6=95=8F?= =?UTF-8?q?=E6=84=9F=E5=B4=A9=E5=85=A8=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parse-book/scripts/parse_outline.py | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/.claude/skills/parse-book/scripts/parse_outline.py b/.claude/skills/parse-book/scripts/parse_outline.py index 591e3ad..a323e97 100644 --- a/.claude/skills/parse-book/scripts/parse_outline.py +++ b/.claude/skills/parse-book/scripts/parse_outline.py @@ -183,15 +183,28 @@ def check(work_id, model): with psycopg.connect(DSN) as conn: title = conn.execute("SELECT title FROM muse_content_work WHERE id=%s", (work_id,)).fetchone()[0] wins = conn.execute( - """SELECT id, window_no, from_order, to_order, outline_text FROM example_parse_outline + """SELECT id, window_no, from_order, to_order, outline_text, check_status + FROM example_parse_outline WHERE tenant_id=%s AND work_id=%s AND deleted=FALSE ORDER BY window_no""", (TENANT, work_id)).fetchall() chs = load_chapters(conn, work_id) n_issue = 0 - for oid, wno, a, b, ol in wins: + for oid, wno, a, b, ol, st in wins: + # 断点续跑:已检窗(checked/revised)不重刷,敏感崩溃后重启只补 pending + if st and st != "pending": + continue outlines = "\n".join(f"第{no}章《{ct}》:{o}" for no, ct, _, o in chs if a <= no <= b and o) - content, _ = chat(CHECK_PROMPT.format(title=title, a=a, b=b, outline=ol, outlines=outlines), - model=model) + try: + content, _ = chat_degrade(CHECK_PROMPT.format( + title=title, a=a, b=b, outline=ol, outlines=outlines), model) + except SensitiveError as e: + # 全降级链被拦:标记跳窗继续,不让单窗炸掉整书终检(批9实测超神窗20崩全程) + conn.execute( + "UPDATE example_parse_outline SET check_status='blocked', check_note=%s, updater=%s WHERE id=%s", + (f"敏感拦截: {str(e)[:180]}", ACTOR, oid)) + conn.commit() + click.echo(f"win-{wno:02d} 对账✗ 全链敏感拦截,跳过") + continue data = extract_json(content) issues = data.get("issues") or [] n_issue += len(issues) @@ -205,10 +218,13 @@ def check(work_id, model): # 全书连贯性纵览(一次调用,只给大纲串) if len(wins) > 1: allo = "\n\n".join(f"【阶段{w[1]}(第{w[2]}–{w[3]}章)】\n{w[4]}" for w in wins) - content, _ = chat(COHERENCE_PROMPT.format(title=title, n=len(wins), outlines=allo), model=model) - data = extract_json(content) - for i in (data.get("issues") or []): - click.echo(f" [跨段] {i}") + try: + content, _ = chat_degrade(COHERENCE_PROMPT.format(title=title, n=len(wins), outlines=allo), model) + data = extract_json(content) + for i in (data.get("issues") or []): + click.echo(f" [跨段] {i}") + except SensitiveError: + click.echo(" [跨段] 全链敏感拦截,纵览跳过") click.echo(f"终检完成:{len(wins)} 窗,细纲对账发现 {n_issue} 处")