Repository Public Research preview
1#!/usr/bin/env python32"""Poll the Anthropic Message Batches of a job until every batch has ended (or a time limit), printing one status3line per poll. Exit code 0 = all ended, 2 = time limit reached."""4from __future__ import annotations56import argparse7import sys8import time9from pathlib import Path1011ROOT = Path(__file__).resolve().parents[1]12sys.path.insert(0, str(ROOT / "src"))13from htr.utils.io import read_json # noqa: E402141516def main() -> None:17 ap = argparse.ArgumentParser()18 ap.add_argument("--job", required=True)19 ap.add_argument("--interval", type=int, default=300)20 ap.add_argument("--max-minutes", type=int, default=600)21 a = ap.parse_args()22 import anthropic2324 client = anthropic.Anthropic()25 led = read_json(ROOT / "data/pairs" / a.job / "ledger.json")26 t0 = time.time()27 while True:28 ended = succ = err = proc = 029 for b in led["batches"]:30 r = client.messages.batches.retrieve(b)31 rc = r.request_counts32 ended += r.processing_status == "ended"33 succ += rc.succeeded34 err += rc.errored + rc.canceled + rc.expired35 proc += rc.processing36 print(f"{time.strftime('%H:%M:%S')} batches ended {ended}/{len(led['batches'])} succeeded {succ} errored {err} processing {proc}", flush=True)37 if ended == len(led["batches"]):38 sys.exit(0)39 if (time.time() - t0) / 60 > a.max_minutes:40 sys.exit(2)41 time.sleep(a.interval)424344if __name__ == "__main__":45 main()46