| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- """
- templateHtml.py - 生成 Trace 执行流程可视化 HTML
- 参考 visualize.py 的样式设计
- """
- import json
- import os
- from pathlib import Path
- def generate_trace_visualization_html(goal_list: list, msg_groups: dict, output_path: str = None):
- """
- 生成 Trace 可视化 HTML 文件
- Args:
- goal_list: 节点列表
- msg_groups: 节点消息分组
- output_path: 输出的 HTML 文件路径
- """
- if goal_list is None:
- goal_list = []
- if msg_groups is None:
- msg_groups = {}
- # 1.新建一个数组goal_list_new = goal_list
- goal_list_new = list(goal_list)
- # 2.查找msg_groups如果里面包含START,那么需要在goal_list_new添加一个对象
- if "START" in msg_groups:
- start_node = {
- "id": "START",
- "description": "START",
- "reason": None,
- "parent_id": None,
- "type": "start",
- "status": "completed",
- "summary": None,
- "sub_trace_ids": None,
- "agent_call_mode": None,
- "self_stats": None,
- "cumulative_stats": None,
- "created_at": None,
- "sub_trace_metadata": None
- }
- # 确保 START 节点在最前面或合适位置,这里直接 append
- # 如果需要它作为根节点被正确渲染,它应该在列表里即可
- goal_list_new.insert(0, start_node)
- # 读取 HTML 模板
- template_path = Path(__file__).parent / "trace_template.html"
- with open(template_path, "r", encoding="utf-8") as f:
- template_content = f.read()
- html_content = template_content.replace(
- '"__GOAL_LIST__"',
- json.dumps(goal_list_new, ensure_ascii=False)
- ).replace(
- '"__MSG_GROUPS__"',
- json.dumps(msg_groups, ensure_ascii=False)
- )
- # 确定输出路径
- if output_path is None:
- output_path = Path(__file__).parent / "trace_visualization.html"
- else:
- output_path = Path(output_path)
- mock_dir = Path(__file__).parent / "mock_data"
- mock_dir.mkdir(parents=True, exist_ok=True)
- with open(mock_dir / "goal_list.json", "w", encoding="utf-8") as f:
- json.dump(goal_list_new, f, ensure_ascii=False, indent=2)
- with open(mock_dir / "msg_groups.json", "w", encoding="utf-8") as f:
- json.dump(msg_groups, f, ensure_ascii=False, indent=2)
- # 写入 HTML 文件
- with open(output_path, 'w', encoding='utf-8') as f:
- f.write(html_content)
- print(f"可视化文件已生成: {output_path}")
- return output_path
- if __name__ == "__main__":
- generate_trace_visualization_html([], {})
|