()
| 401 | |
| 402 | |
| 403 | def main() -> None: |
| 404 | parser = argparse.ArgumentParser(description="Measure real embedding / LLM token usage for one day's dataset pipeline.") |
| 405 | parser.add_argument("--date", default="2026-03-01", help="Target day in YYYY-MM-DD.") |
| 406 | parser.add_argument("--must-count", type=int, default=1, help="How many must_read papers to include per user.") |
| 407 | parser.add_argument("--high-count", type=int, default=1, help="How many high_relevant papers to include per user.") |
| 408 | parser.add_argument("--maybe-count", type=int, default=2, help="How many maybe_interested papers to include per user.") |
| 409 | parser.add_argument("--edge-count", type=int, default=1, help="How many edge_relevant papers to include per user.") |
| 410 | parser.add_argument("--pdf-mode", default=os.environ.get("READING_REPORT_PDF_MODE", "always"), help="Reading report PDF mode: always / smart / off.") |
| 411 | args = parser.parse_args() |
| 412 | |
| 413 | timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") |
| 414 | measurement_dir = MEASUREMENT_ROOT / f"measure_{args.date.replace('-', '')}_{timestamp}" |
| 415 | measurement_dir.mkdir(parents=True, exist_ok=True) |
| 416 | |
| 417 | tracker = TokenTracker() |
| 418 | original_init, original_get_client = _patch_token_usage(tracker) |
| 419 | _reset_embedding_runtime_cache(measurement_dir) |
| 420 | os.environ["READING_REPORT_PDF_MODE"] = str(args.pdf_mode).strip() |
| 421 | |
| 422 | try: |
| 423 | papers = _fetch_papers_for_exact_day(args.date) |
| 424 | print(f"[Collected] {len(papers)} unique papers for {args.date}") |
| 425 | |
| 426 | with tracker.stage("paper_embedding"): |
| 427 | prepared_papers = daily_push_agent.prepare_paper_features(copy.deepcopy(papers)) |
| 428 | |
| 429 | profiles = _load_profiles() |
| 430 | roles = _load_roles() |
| 431 | weights = daily_push_agent.load_scoring_weights() |
| 432 | report_cache = _build_existing_report_cache() |
| 433 | |
| 434 | per_user_rows: List[Dict[str, Any]] = [] |
| 435 | |
| 436 | for role_name, role_data in sorted(roles.items(), key=lambda item: item[0]): |
| 437 | user_id = str(role_data.get("user_id") or "") |
| 438 | profile = profiles.get(user_id) |
| 439 | if not profile: |
| 440 | continue |
| 441 | |
| 442 | scored = daily_push_agent.sort_and_categorize(copy.deepcopy(prepared_papers), profile, weights) |
| 443 | selected = _simulate_selection( |
| 444 | scored, |
| 445 | must_count=args.must_count, |
| 446 | high_count=args.high_count, |
| 447 | maybe_count=args.maybe_count, |
| 448 | edge_count=args.edge_count, |
| 449 | ) |
| 450 | |
| 451 | if not selected: |
| 452 | per_user_rows.append( |
| 453 | { |
| 454 | "role_name": role_name, |
| 455 | "user_id": user_id, |
| 456 | "paper_pool_count": len(scored), |
| 457 | "selected_reports": 0, |
| 458 | "generated_reports": 0, |
| 459 | "reused_reports": 0, |
| 460 | "must_read_selected": 0, |
no test coverage detected