"""Dashboard 提示词管理视图 —— 集成到 MoFin Web Dashboard 注册 API 路由和前端页面。 """ import json from pathlib import Path from datetime import datetime from .registry import ( list_prompts, get_prompt, add_prompt, update_prompt, add_version, set_active_version, get_version_history, get_categories, ) from .tracking import ( get_strategy_version_stats, get_associations_for_stock, ) from .analytics import ( get_prompt_version_comparison, generate_report, ) from .models import PromptDef, PromptVersion def register_routes(server): """在主 server.py 中调用,注册所有 /api/prompts/* 路由 用法: from prompt_manager.dashboard_views import register_routes register_routes(app) # app = Flask instance """ # ═══════════════════════════════════════════ # API: 提示词列表 # ═══════════════════════════════════════════ @server.route("/api/prompts") def api_prompts_list(): from flask import request, jsonify category = request.args.get("category") prompts = list_prompts(category) return jsonify({ "prompts": prompts, "categories": get_categories(), }) # ═══════════════════════════════════════════ # API: 单个提示词详情 # ═══════════════════════════════════════════ @server.route("/api/prompts/") def api_prompt_detail(prompt_id): from flask import jsonify from prompt_manager.registry import get_version_content prompt = get_prompt(prompt_id) if not prompt: return jsonify({"error": "not found"}), 404 # 从文件中加载完整内容(registry.json 只存了摘要) prompt_dict = prompt.to_dict() for v in prompt_dict.get("versions", []): if v.get("content_path"): full = get_version_content(prompt_id, v["version"]) if full: v["content"] = full else: # 回退:从文件直接读取 cp = v["content_path"] try: with open(cp, encoding="utf-8") as f: v["content"] = f.read() except: pass # 保持摘要 history = get_version_history(prompt_id) return jsonify({ "prompt": prompt_dict, "version_history": history, }) # ═══════════════════════════════════════════ # API: 新增提示词 # ═══════════════════════════════════════════ @server.route("/api/prompts", methods=["POST"]) def api_prompt_create(): from flask import request, jsonify data = request.get_json() if not data or "id" not in data: return jsonify({"error": "缺少 id"}), 400 now = datetime.now().isoformat() prompt = PromptDef( id=data["id"], name=data.get("name", data["id"]), description=data.get("description", ""), category=data.get("category", ""), locations=data.get("locations", []), versions=[], created_at=now, updated_at=now, current_version="", ) add_prompt(prompt) return jsonify({"status": "ok", "prompt": prompt.to_dict()}) # ═══════════════════════════════════════════ # API: 添加版本 # ═══════════════════════════════════════════ @server.route("/api/prompts//versions", methods=["POST"]) def api_prompt_add_version(prompt_id): from flask import request, jsonify data = request.get_json() if not data or "version" not in data: return jsonify({"error": "缺少 version"}), 400 now = datetime.now().isoformat() version = PromptVersion( version=data["version"], label=data.get("label", data["version"]), created_at=now, changelog=data.get("changelog", ""), content=data.get("content", ""), content_path="", author=data.get("author", "知微"), status=data.get("status", "active"), tags=data.get("tags", []), ) try: add_version(prompt_id, version) return jsonify({"status": "ok"}) except ValueError as e: return jsonify({"error": str(e)}), 400 # ═══════════════════════════════════════════ # API: 切换活跃版本 # ═══════════════════════════════════════════ @server.route("/api/prompts//activate", methods=["POST"]) def api_prompt_activate(prompt_id): from flask import request, jsonify data = request.get_json() if not data or "version" not in data: return jsonify({"error": "缺少 version"}), 400 try: set_active_version(prompt_id, data["version"]) return jsonify({"status": "ok"}) except ValueError as e: return jsonify({"error": str(e)}), 400 # ═══════════════════════════════════════════ # API: 版本统计 # ═══════════════════════════════════════════ @server.route("/api/prompts/stats") def api_prompt_stats(): from flask import jsonify version_stats = get_strategy_version_stats() return jsonify(version_stats) # ═══════════════════════════════════════════ # API: 版本有效性对比 # ═══════════════════════════════════════════ @server.route("/api/prompts/effectiveness") def api_prompt_effectiveness(): from flask import jsonify comparison = get_prompt_version_comparison() return jsonify(comparison) # ═══════════════════════════════════════════ # API: 生成分析报告(文本) # ═══════════════════════════════════════════ @server.route("/api/prompts/report") def api_prompt_report(): from flask import jsonify report = generate_report() return jsonify({"report": report}) # ═══════════════════════════════════════════ # API: 获取某只股票的策略关联记录 # ═══════════════════════════════════════════ @server.route("/api/prompts/associations/") def api_prompt_associations(code): from flask import jsonify records = get_associations_for_stock(code) return jsonify({"code": code, "records": records}) # ═══════════════════════════════════════════ # 前端页面模板 # ═══════════════════════════════════════════ def get_dashboard_tab_html(): """返回提示词管理 Tab 的 HTML,嵌入到 Dashboard 的
中""" return """\
📝 提示词管理
加载中...
"""