from __future__ import annotations import json from pathlib import Path import pandas as pd from openai import OpenAI from analysis.llm_analyzer import analyze_with_llm from report.diagnostic_report import generate_report_with_openai def load_jsonl(path: Path): rows = [] with path.open("r", encoding="utf-8") as f: for line in f: line = line.strip() if line: rows.append(json.loads(line)) return rows def main(run_id: str, runs_dir: str = "runs", model: str = "gpt-4.1-mini"): run_dir = Path(runs_dir) / run_id df_align = pd.DataFrame(load_jsonl(run_dir / "aligned.jsonl")) df_events = pd.read_parquet(run_dir / "events.parquet") if (run_dir / "events.parquet").exists() else pd.DataFrame() summary = json.loads((run_dir / "summary.json").read_text(encoding="utf-8")) if (run_dir / "summary.json").exists() else {} client = OpenAI() llm_diagnosis = analyze_with_llm(df_align, df_events, summary, model=model, client=client) (run_dir / "llm_diagnosis.json").write_text( json.dumps(llm_diagnosis, ensure_ascii=False, indent=2), encoding="utf-8" ) report = generate_report_with_openai(llm_diagnosis, summary, client, model=model) (run_dir / "diagnostic_report.md").write_text(report, encoding="utf-8") print(f"Diagnostic report written to: {run_dir / 'diagnostic_report.md'}") if __name__ == "__main__": import argparse ap = argparse.ArgumentParser() ap.add_argument("--run_id", required=True) ap.add_argument("--runs_dir", default="runs") ap.add_argument("--model", default="gpt-4.1-mini") args = ap.parse_args() main(args.run_id, args.runs_dir, args.model)