"""冒烟测试:build_plan 结构 + aura 引擎直接渲染。 用法: python tests/smoke_build_plan.py # 仅构建 plan 并打印结构 python tests/smoke_build_plan.py --render # 追加真实渲染 + 保真验证 """ import json import sys import tempfile from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[1])) from src.agent.perception import GenerateConfig # noqa: E402 from src.agent.planning import build_plan # noqa: E402 SAMPLE_ZH = """# 本月完成情况 完成模块A开发,进度符合计划 修复线上3个缺陷,系统可用性提升至99.9% 新增用户反馈收集通道 # 下月计划 启动模块B概要设计 组织跨部门代码评审 开展性能压测与容量评估 补充核心链路自动化测试用例 # 风险与求助 人力存在缺口,希望增援1名后端 第三方接口联调依赖对方排期 """ SAMPLE_JA = """# 今月の進捗 モジュールAの開発完了、予定どおり 本番障害3件を修正し、可用性99.9%を達成 # 来月の計画 モジュールBの概要設計を開始 性能テストを実施する """ def make_cfg(lang="zh"): return GenerateConfig( title="七月项目周报" if lang == "zh" else "7月度プロジェクト報告", user_id=1, content=SAMPLE_ZH if lang == "zh" else SAMPLE_JA, scene="report", language=lang, canvas="ppt169", image_strategy="off", color_scheme="blue", page_min=6, page_max=10, ) def show(plan): print(f"design={plan['design']} slides={len(plan['slides'])}") for i, s in enumerate(plan["slides"], 1): n = len(s.get("content") or []) print(f" {i:02d}. [{s['type']:9s}] {s.get('title','')[:30]} bullets={n}") def main(): failures = [] for lang in ("zh", "ja"): r = build_plan(make_cfg(lang)) plan = r.plan print(f"\n===== {lang} ===== warnings={r.warnings}") show(plan) types = [s["type"] for s in plan["slides"]] if types[0] != "cover" or types[-1] != "end": failures.append(f"{lang}: 首尾页面类型错误") if not (6 <= len(plan["slides"]) <= 10) and lang == "zh": failures.append(f"{lang}: 页数 {len(plan['slides'])} 超出目标区间") if lang == "ja" and plan["design"] != "report-jp": failures.append("ja 未映射到 report-jp") if lang == "zh" and plan["design"] != "corp-blue": failures.append("zh/blue 未映射到 corp-blue") if "--render" in sys.argv: from config import COMPANY_TEMPLATE from src.engine_bridge import render_plan, verify_output tmp = Path(tempfile.mkdtemp(prefix="aura_smoke_")) for lang in ("zh", "ja"): r = build_plan(make_cfg(lang)) p = tmp / f"plan_{lang}.json" p.write_text(json.dumps(r.plan, ensure_ascii=False, indent=2), encoding="utf-8") out = tmp / f"smoke_{lang}.pptx" tpl = COMPANY_TEMPLATE if (lang == "ja" and COMPANY_TEMPLATE.exists()) else None render_plan(p, out, template=tpl) ok, detail = verify_output(out, p) print(f"\n[render {lang}] -> {out}") print(f"[verify {lang}] passed={ok}\n{detail}") if not ok: failures.append(f"{lang}: 渲染保真验证未通过") print("\n" + ("ALL SMOKE PASSED" if not failures else "FAILURES: " + "; ".join(failures))) sys.exit(1 if failures else 0) if __name__ == "__main__": main()