| import os | |
| from jinja2 import Environment, FileSystemLoader | |
| import pandas as pd | |
| from ..utils.tracing import Tracer | |
| class ReportTool: | |
| def __init__(self, cfg, tracer: Tracer): | |
| self.cfg = cfg | |
| self.tracer = tracer | |
| self.env = Environment(loader=FileSystemLoader("templates")) | |
| def render_and_save(self, user_query: str, sql_preview: pd.DataFrame | None, predict_preview: pd.DataFrame | None, explain_images: dict, plan: dict): | |
| tmpl = self.env.get_template("report_template.md") | |
| html = tmpl.render( | |
| user_query=user_query, | |
| plan=plan, | |
| sql_preview=sql_preview.to_markdown(index=False) if sql_preview is not None else "", | |
| predict_preview=predict_preview.to_markdown(index=False) if predict_preview is not None else "", | |
| explain_images=explain_images, | |
| ) | |
| out_path = f"report_{pd.Timestamp.utcnow().strftime('%Y%m%d_%H%M%S')}.html" | |
| with open(out_path, "w", encoding="utf-8") as f: | |
| f.write("<link rel=\"stylesheet\" href=\"templates/report_styles.css\">\n" + html) | |
| self.tracer.trace_event("report", {"path": out_path}) | |
| return out_path |