diff --git a/.claude/skills/review-cards/scripts/review_cards.py b/.claude/skills/review-cards/scripts/review_cards.py index 6da0dac..4f85acc 100644 --- a/.claude/skills/review-cards/scripts/review_cards.py +++ b/.claude/skills/review-cards/scripts/review_cards.py @@ -88,17 +88,22 @@ def review(work_id, batch, model, dry_run): if not rows: click.echo("无待审卡") return - cards_json = json.dumps([{"idx": i + 1, **r[1]} for i, r in enumerate(rows)], - ensure_ascii=False, indent=1) - all_reviews = {} - for role, desc in ROLES.items(): - content, usage = chat( - REVIEW_PROMPT.format(criteria=CRITERIA, n=len(rows), cards=cards_json), - model=model, system=SYSTEM_TMPL.format(role_desc=desc)) - data = extract_json(content) - all_reviews[role] = {int(r["idx"]): r for r in data.get("reviews", []) if r.get("idx")} - click.echo(f"[{role}] 评 {len(data.get('reviews', []))} 卡 " - f"(in={usage.get('prompt_tokens')}) 总评: {data.get('overall', '')[:80]}") + # 分页 ≤30 卡/批:放量后单调用塞全库必爆;同批互见保 family 检出 + PAGE = 30 + all_reviews = {role: {} for role in ROLES} + for p0 in range(0, len(rows), PAGE): + page = rows[p0:p0 + PAGE] + cards_json = json.dumps([{"idx": p0 + i + 1, **r[1]} for i, r in enumerate(page)], + ensure_ascii=False, indent=1) + for role, desc in ROLES.items(): + content, usage = chat( + REVIEW_PROMPT.format(criteria=CRITERIA, n=len(page), cards=cards_json), + model=model, system=SYSTEM_TMPL.format(role_desc=desc)) + data = extract_json(content) + all_reviews[role].update( + {int(r["idx"]): r for r in data.get("reviews", []) if r.get("idx")}) + click.echo(f"[{role}] 批{p0 // PAGE + 1} 评 {len(data.get('reviews', []))} 卡 " + f"(in={usage.get('prompt_tokens')}) 总评: {data.get('overall', '')[:80]}") # 汇总判定并写库(按序号匹配) stats = {"pass": 0, "revise": 0, "reject": 0} for i, (cid, payload) in enumerate(rows):