Replace live spinner with periodic progress prints
console.status doesn't flush to a redirected log, making long background extract/embed/summarize runs look silent. Print periodic progress lines that flush instead, so background jobs are observable via their output file. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
0bec0efbd2
commit
c1da5ad249
+44
-43
@@ -154,20 +154,20 @@ def cmd_extract(args: argparse.Namespace) -> int:
|
|||||||
vlm = lambda png: oc.caption_image(png, VLM_OCR_PROMPT) # noqa: E731
|
vlm = lambda png: oc.caption_image(png, VLM_OCR_PROMPT) # noqa: E731
|
||||||
|
|
||||||
done = skipped = failed = vlm_pages = 0
|
done = skipped = failed = vlm_pages = 0
|
||||||
with console.status("Extracting text...") as status:
|
total = len(pdfs)
|
||||||
for i, pdf in enumerate(pdfs, 1):
|
for i, pdf in enumerate(pdfs, 1):
|
||||||
if not args.force and already_extracted(pdf):
|
if not args.force and already_extracted(pdf):
|
||||||
skipped += 1
|
skipped += 1
|
||||||
continue
|
continue
|
||||||
try:
|
try:
|
||||||
stats = extract_one(pdf, vlm=vlm)
|
stats = extract_one(pdf, vlm=vlm)
|
||||||
done += 1
|
done += 1
|
||||||
vlm_pages += stats.vlm_pages
|
vlm_pages += stats.vlm_pages
|
||||||
except Exception as e: # noqa: BLE001
|
except Exception as e: # noqa: BLE001
|
||||||
failed += 1
|
failed += 1
|
||||||
console.print(f"[red]✗[/red] {pdf.name}: {e}")
|
console.print(f"[red]✗[/red] {pdf.name}: {e}")
|
||||||
if i % 25 == 0:
|
if i % 100 == 0:
|
||||||
status.update(f"Extracting... {i}/{len(pdfs)} (done {done}, skipped {skipped})")
|
console.print(f" extract {i}/{total} (done {done}, skipped {skipped})")
|
||||||
console.print(
|
console.print(
|
||||||
f"[green]Extract complete[/green] extracted={done} skipped={skipped} "
|
f"[green]Extract complete[/green] extracted={done} skipped={skipped} "
|
||||||
f"failed={failed} vlm_pages={vlm_pages}"
|
f"failed={failed} vlm_pages={vlm_pages}"
|
||||||
@@ -193,17 +193,18 @@ def cmd_summarize(args: argparse.Namespace) -> int:
|
|||||||
pdfs = pdfs[: args.limit]
|
pdfs = pdfs[: args.limit]
|
||||||
|
|
||||||
done = skipped = 0
|
done = skipped = 0
|
||||||
with console.status("Summarizing...") as status:
|
total = len(pdfs)
|
||||||
for i, pdf in enumerate(pdfs, 1):
|
for i, pdf in enumerate(pdfs, 1):
|
||||||
side = pdf.with_suffix(".json")
|
side = pdf.with_suffix(".json")
|
||||||
if not args.force and has_summary(side):
|
if not args.force and has_summary(side):
|
||||||
skipped += 1
|
skipped += 1
|
||||||
continue
|
continue
|
||||||
summary = summarize_one(pdf, oc)
|
summary = summarize_one(pdf, oc)
|
||||||
if summary is not None:
|
if summary is not None:
|
||||||
append_insight(insights, _json.loads(side.read_text()))
|
append_insight(insights, _json.loads(side.read_text()))
|
||||||
done += 1
|
done += 1
|
||||||
status.update(f"Summarizing... {i}/{len(pdfs)} (done {done})")
|
if i % 10 == 0:
|
||||||
|
console.print(f" summarize {i}/{total} (done {done}, skipped {skipped})")
|
||||||
console.print(f"[green]Summaries complete[/green] done={done} skipped={skipped}")
|
console.print(f"[green]Summaries complete[/green] done={done} skipped={skipped}")
|
||||||
console.print(f"Insight digest: {insights}")
|
console.print(f"Insight digest: {insights}")
|
||||||
return 0
|
return 0
|
||||||
@@ -228,24 +229,24 @@ def cmd_embed(args: argparse.Namespace) -> int:
|
|||||||
pdfs = pdfs[: args.limit]
|
pdfs = pdfs[: args.limit]
|
||||||
|
|
||||||
added = skipped = 0
|
added = skipped = 0
|
||||||
with console.status("Embedding...") as status:
|
total = len(pdfs)
|
||||||
for i, pdf in enumerate(pdfs, 1):
|
for i, pdf in enumerate(pdfs, 1):
|
||||||
data = json.loads(pdf.with_suffix(".json").read_text())
|
data = json.loads(pdf.with_suffix(".json").read_text())
|
||||||
doi = data.get("doi") or data.get("id") or pdf.stem
|
doi = data.get("doi") or data.get("id") or pdf.stem
|
||||||
if doi in seen:
|
if doi in seen:
|
||||||
skipped += 1
|
skipped += 1
|
||||||
continue
|
continue
|
||||||
text = pdf.with_suffix(".txt").read_text()
|
text = pdf.with_suffix(".txt").read_text()
|
||||||
vecs, rows = add_document(
|
vecs, rows = add_document(
|
||||||
oc, text=text, doi=doi, title=data.get("title", ""),
|
oc, text=text, doi=doi, title=data.get("title", ""),
|
||||||
topic=data.get("topic", ""), text_path=str(pdf.with_suffix(".txt")),
|
topic=data.get("topic", ""), text_path=str(pdf.with_suffix(".txt")),
|
||||||
)
|
)
|
||||||
store = merge(store, vecs, rows)
|
store = merge(store, vecs, rows)
|
||||||
seen.add(doi)
|
seen.add(doi)
|
||||||
added += 1
|
added += 1
|
||||||
if i % 20 == 0:
|
if i % 20 == 0:
|
||||||
store.save(root) # periodic checkpoint for resumability
|
store.save(root) # periodic checkpoint for resumability
|
||||||
status.update(f"Embedding... {i}/{len(pdfs)} (added {added})")
|
console.print(f" embed {i}/{total} (added {added}, vectors {store.vectors.shape[0]})")
|
||||||
store.save(root)
|
store.save(root)
|
||||||
console.print(
|
console.print(
|
||||||
f"[green]Embedding complete[/green] papers_added={added} skipped={skipped} "
|
f"[green]Embedding complete[/green] papers_added={added} skipped={skipped} "
|
||||||
|
|||||||
Reference in New Issue
Block a user