import json import os from datetime import datetime from typing import List, Dict, Optional, Any import uuid class ChatManager: def __init__(self, base_dir="chat_history"): self.base_dir = base_dir self.template_path = os.path.join(base_dir, "chat_template.html") self.sessions_dir = os.path.join(base_dir, "sessions") # Create sessions directory if it doesn't exist os.makedirs(self.sessions_dir, exist_ok=True) def create_session(self, title: str = None) -> str: """Create a new chat session and return session ID""" session_id = str(uuid.uuid4()) if not title: title = f"回测会话 {datetime.now().strftime('%Y-%m-%d %H:%M')}" session_data = { "session_id": session_id, "title": title, "created_at": datetime.now().isoformat(), "updated_at": datetime.now().isoformat(), "messages": [], "strategies": {}, "backtest_results": {} } self._save_session(session_id, session_data) return session_id def add_message(self, session_id: str, content: str, is_user: bool = True, strategy_info: Optional[Dict] = None, backtest_results: Optional[List[Dict]] = None): """Add a message to the chat session""" session_data = self._load_session(session_id) message = { "id": str(uuid.uuid4()), "content": content, "is_user": is_user, "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "strategy_info": strategy_info, "backtest_results": backtest_results } session_data["messages"].append(message) session_data["updated_at"] = datetime.now().isoformat() # If strategy info is provided, store it if strategy_info: session_data["strategies"][strategy_info["name"]] = strategy_info # If backtest results are provided, store them if backtest_results: result_id = f"result_{len(session_data['backtest_results'])}" session_data["backtest_results"][result_id] = { "timestamp": datetime.now().isoformat(), "results": backtest_results, "strategy": strategy_info["name"] if strategy_info else "Unknown" } self._save_session(session_id, session_data) def generate_html_report(self, session_id: str) -> str: """Generate HTML report for a session""" session_data = self._load_session(session_id) # Read HTML template with open(self.template_path, 'r', encoding='utf-8') as f: template = f.read() # Prepare template variables template_vars = { "session_title": session_data["title"], "created_at": datetime.fromisoformat(session_data["created_at"]).strftime("%Y-%m-%d %H:%M"), "message_count": len(session_data["messages"]), "strategy_count": len(session_data["strategies"]), "generated_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S") } # Generate messages HTML messages_html = "" for msg in session_data["messages"]: message_class = "user-message" if msg["is_user"] else "assistant-message" avatar_class = "user-avatar" if msg["is_user"] else "assistant-avatar" avatar_text = "U" if msg["is_user"] else "A" role_text = "用户" if msg["is_user"] else "助手" # Format content (basic markdown-like formatting) content = self._format_content(msg["content"]) message_html = f'''
''' messages_html += message_html # Replace template variables html_content = template.replace("{{session_title}}", template_vars["session_title"]) html_content = html_content.replace("{{created_at}}", template_vars["created_at"]) html_content = html_content.replace("{{message_count}}", str(template_vars["message_count"])) html_content = html_content.replace("{{strategy_count}}", str(template_vars["strategy_count"])) html_content = html_content.replace("{{generated_at}}", template_vars["generated_at"]) html_content = html_content.replace("{{#messages}}{{/messages}}", messages_html) # Save HTML file html_filename = f"{session_id}_chat_report.html" html_path = os.path.join(self.sessions_dir, html_filename) with open(html_path, 'w', encoding='utf-8') as f: f.write(html_content) return html_path def _format_content(self, content: str) -> str: """Basic content formatting""" # Replace newlines with