bbqddt2/Antigravity
0
1# -*- coding: utf-8 -*-2"""3Antigravity V17 — Gradio Web界面4=================================5展示多AI协同进化引擎的实时状态和预测结果。6 7HF Spaces 自动运行: python app.py8本地运行: python app.py --server-name 0.0.0.0 --port 78609"""10import os11import json12import sys13from pathlib import Path14from datetime import datetime15from typing import Optional, Dict, Any16 17sys.stdout.reconfigure(encoding="utf-8") if hasattr(sys.stdout, 'reconfigure') else None18 19try:20 import gradio as gr21except ImportError:22 print("[WARN] gradio未安装,跳过Web界面")23 gr = None24 25try:26 from gradio_spaces import spaces27 HAS_SPACES = True28except ImportError:29 try:30 import spaces31 HAS_SPACES = True32 except ImportError:33 spaces = None34 HAS_SPACES = False35 36if not HAS_SPACES:37 print("[INFO] spaces module not available, running without GPU acceleration")38 39 40# ═══════════════════════════════════════════════════════════41# ZeroGPU 兼容入口 — HF Spaces ZeroGPU 要求至少一个 @spaces.GPU 函数42# ═══════════════════════════════════════════════════════════43 44if HAS_SPACES:45 @spaces.GPU46 def _gpu_init():47 """初始化入口:满足 ZeroGPU 要求,同时触发一次状态加载"""48 return get_latest_state()49 50# 项目根目录: HF Spaces中是 /src,本地是 E:/享中51_BASE_DIR = Path(__file__).resolve().parent52_DATA_DIR = _BASE_DIR53 54def load_json_safe(path: str) -> Optional[Dict]:55 """安全读取JSON文件"""56 try:57 with open(path, "r", encoding="utf-8") as f:58 return json.load(f)59 except (FileNotFoundError, json.JSONDecodeError):60 return None61 62 63def get_latest_state() -> Dict[str, Any]:64 """获取最新进化状态"""65 return {66 "timestamp": datetime.now().isoformat(),67 "state": load_json_safe(str(_DATA_DIR / "evolution_state_v20.json")),68 "best_formulas": load_json_safe(str(_DATA_DIR / "best_formulas_v19.json")),69 "top_candidates": load_json_safe(str(_DATA_DIR / "top_candidates_export.json")),70 }71 72 73def format_state_summary(state: Dict) -> str:74 """格式化状态摘要"""75 if not state:76 return "暂无进化数据\n\n💡 点击「启动进化循环」运行一轮进化后即可查看。"77 78 lines = [79 f"**最后更新**: {state.get('last_updated', '未知')}",80 f"**总周期数**: {state.get('cycle_count', 0)}",81 f"**已生成假设**: {state.get('total_hypotheses_generated', 0)}",82 f"**存活**: {state.get('survived_count', 0)} | 淘汰: {state.get('eliminated_count', 0)}",83 f"**原语数量**: {state.get('n_primitives', 0)}",84 ]85 return "\n".join(lines)86 87 88def format_best_formula(best: Dict) -> str:89 """格式化最佳公式信息"""90 if not best or not best.get("best_formula"):91 return "暂无最佳公式\n\n💡 运行进化循环后自动显示。"92 93 bf = best["best_formula"]94 lines = [95 f"**名称**: {bf.get('name', 'N/A')}",96 f"**来源**: {bf.get('source', 'N/A')}",97 f"**Brier Score**: {bf.get('brier_score', bf.get('fitness_score', 'N/A'))}",98 f"**平均命中**: {bf.get('avg_hits', 0):.2f} ± {bf.get('std_hits', 0):.2f}",99 f"**P值**: {bf.get('p_value', 0):.4f}",100 f"**原语**: {', '.join(bf.get('primitive_names', []))}",101 f"**组合方式**: {bf.get('operators', [])[-1] if bf.get('operators') else 'N/A'}",102 ]103 return "\n".join(lines)104 105 106def format_survival_pool(pool: list) -> str:107 """格式化存活公式池"""108 if not pool:109 return "暂无存活公式\n\n💡 运行进化循环后会显示 Top-10 公式。"110 111 lines = ["| 排名 | 公式名 | Brier Score | 平均命中 | 原语 |",112 "|------|--------|-------------|----------|------|"]113 114 for i, formula in enumerate(pool[:10], 1):115 name = formula.get("name", "N/A")[:15]116 brier = formula.get("brier_score", formula.get("fitness_score", "N/A"))117 hits = formula.get("avg_hits", 0)118 prims = ", ".join(formula.get("primitives", [])[:3])119 lines.append(f"| {i} | {name} | {brier} | {hits:.2f} | {prims} |")120 121 return "\n".join(lines)122 123 124def format_evolution_history(history: list) -> str:125 """格式化进化历史"""126 if not history:127 return "暂无历史记录\n\n💡 运行进化循环后显示代际变化曲线。"128 129 lines = ["| 代数 | 最佳Brier | 平均命中 | 时间 |",130 "|------|-----------|----------|------|"]131 132 for h in history[-10:]:133 gen = h.get("generation", "?")134 fit = h.get("best_fitness", h.get("best_brier", "?"))135 hits = h.get("best_avg_hits", "?")136 ts = h.get("timestamp", "")[:19]137 lines.append(f"| {gen} | {fit:.4f} | {hits:.2f} | {ts} |")138 139 return "\n".join(lines)140 141 142def run_evolution() -> str:143 """触发进化循环"""144 engine_path = _DATA_DIR / "multi_ai_evolution_engine.py"145 146 if not engine_path.exists():147 return (148 "⚠️ 进化引擎文件不存在\n\n"149 "HF Spaces 目前作为可视化面板运行。\n"150 "完整进化引擎在本地 `E:/享中/multi_ai_evolution_engine.py`\n\n"151 "**本地运行命令:**\n"152 "```bash\n"153 "cd E:/享中\n"154 "python multi_ai_evolution_engine.py --generations 10 --candidates 15\n"155 "```\n\n"156 "**云端计划:**\n"157 "- GitHub Actions: 每天8:00 + 每6小时定时进化\n"158 "- 腾讯云: 每2小时守护进程\n"159 "- HF Spaces: 本页面可视化"160 )161 162 # 本地模式:实际运行进化163 import subprocess164 result = subprocess.run(165 [sys.executable, str(engine_path), "--generations", "3", "--candidates", "5"],166 capture_output=True, text=True, timeout=600, cwd=str(_DATA_DIR)167 )168 return f"✅ 进化已启动!\n\n```\n{result.stdout[-2000:]}\n```"169 170 171def show_predictions() -> str:172 """显示预测结果"""173 best = load_json_safe(str(_DATA_DIR / "best_formulas_v19.json"))174 if not best:175 return "暂无预测数据\n\n💡 运行进化循环后自动显示。"176 177 math_preds = best.get("math_engine_predictions", {})178 if not math_preds:179 return "暂无数学引擎预测\n\n💡 运行进化循环后显示 Luckcast V15 + Enhanced V2 输出。"180 181 lines = ["### 当前预测引擎输出\n"]182 for engine, preds in math_preds.items():183 reds = preds.get("red", [])184 blue = preds.get("blue", [])185 lines.append(f"**{engine}**: 红球 {reds} + 蓝球 {blue}")186 187 # 也显示存活公式池188 pool = best.get("survival_pool", [])189 if pool:190 lines.append(f"\n### 存活公式池 ({len(pool)} 个)")191 for f in pool[:5]:192 lines.append(f"- **{f.get('name', '?')}** — Brier {f.get('brier_score', '?')} | "193 f"原语: {', '.join(f.get('primitives', [])[:3])}")194 195 return "\n".join(lines)196 197 198def show_system_info() -> str:199 """显示系统信息"""200 return """201### 🏗️ Antigravity V17 架构202 203| 组件 | 状态 | 说明 |204|------|------|------|205| 公式语言 Pillar 1 | ✅ 完整 | 33个原语,6大类别 |206| 策略框架 Pillar 2 | ✅ 完整 | 假设生成→验证→进化 |207| LLM创新 Pillar 3 | ✅ 完整 | Gemini/OpenRouter/Gemma2 |208| Multi-AI引擎 V19 | ✅ 完成 | 10代×15候选=195公式 |209| HF Spaces | ✅ 本页面 | Web可视化 |210| GitHub Actions | ⏳ 待推送 | 定时触发进化 |211| 腾讯云 CVM | ⏳ 等IP | 长期守护进程 |212 213### 📊 关键指标214 215- **随机基线 Brier Score**: ~0.139216- **当前最佳**: 0.1723 (比随机差24%)217- **核心瓶颈**: 所有原语在频率统计空间内搜索218- **下一步方向**: 卡方物理偏差检测 / 贝叶斯先验更新 / 新信号源探索219 220### 🔬 三大支柱221 222**Pillar 1 — 公式语言**22333个数学原语覆盖时序、关系、结构、频谱、几何、混沌六大类别。224每个原语是一等公民:有名字、来源、类别、可突变参数。225 226**Pillar 2 — 自研策略框架**227从数据信号自动生成假设 → Walk-Forward验证 → 存活/淘汰 → 进化繁殖。228完整生命周期追踪:诞生→测试→存活→淘汰→变异→重生。229 230**Pillar 3 — LLM驱动创新**231Gemini/OpenRouter/Gemma2 协同提议新原语规格。232失败分析 → 范式转移建议 → 语法演进。233"""234 235 236def create_ui() -> gr.Blocks:237 """创建Gradio界面"""238 if gr is None:239 return None240 241 with gr.Blocks(title="Antigravity V17 - 多AI协同进化引擎") as demo:242 gr.Markdown("""243 # 🚀 Antigravity V17 — 多AI协同进化引擎244 245 **三大支柱架构 · 云端分布式计算 · 实时可视化**246 247 ---248 """)249 250 with gr.Tabs():251 # Tab 1: 实时状态252 with gr.Tab("📊 实时状态"):253 with gr.Row():254 with gr.Column():255 state_btn = gr.Button("刷新状态", variant="primary")256 state_md = gr.Markdown(value=format_state_summary(None))257 258 with gr.Column():259 best_btn = gr.Button("查看最佳公式", variant="secondary")260 best_md = gr.Markdown(value=format_best_formula(None))261 262 with gr.Row():263 pool_btn = gr.Button("存活公式池", variant="secondary")264 pool_md = gr.Markdown(value=format_survival_pool([]))265 266 def refresh_all():267 s = get_latest_state()268 return (269 format_state_summary(s.get("state")),270 format_best_formula(s.get("best_formulas")),271 format_survival_pool(s.get("state", {}).get("survival_pool", [])),272 )273 274 state_btn.click(refresh_all, outputs=[state_md, best_md, pool_md])275 pool_btn.click(refresh_all, outputs=[state_md, best_md, pool_md])276 277 # Tab 2: 进化历史278 with gr.Tab("📈 进化历史"):279 history_btn = gr.Button("加载进化历史")280 history_md = gr.Markdown(value=format_evolution_history([]))281 282 def load_history():283 state = get_latest_state().get("state")284 history = state.get("evolution_history", []) if state else []285 return format_evolution_history(history)286 287 history_btn.click(load_history, outputs=[history_md])288 289 # Tab 3: 预测结果290 with gr.Tab("🎯 最新预测"):291 pred_btn = gr.Button("查看预测")292 pred_md = gr.Markdown(value="点击按钮查看最新预测结果...")293 pred_btn.click(show_predictions, outputs=[pred_md])294 295 # Tab 4: 启动进化296 with gr.Tab("🔥 启动进化"):297 ev_btn = gr.Button("启动进化循环", variant="primary")298 ev_md = gr.Markdown(value=(299 "点击下方按钮触发进化循环。\n\n"300 "⚠️ HF Spaces 当前作为可视化面板运行。\n"301 "完整引擎在本地运行,结果会同步到这里。"302 ))303 ev_btn.click(run_evolution, outputs=[ev_md])304 305 # Tab 5: 系统信息306 with gr.Tab("ℹ️ 系统信息"):307 info_btn = gr.Button("加载系统信息")308 info_md = gr.Markdown(value=show_system_info())309 info_btn.click(show_system_info, outputs=[info_md])310 311 return demo312 313 314if __name__ == "__main__":315 demo = create_ui()316 if demo:317 port = int(os.environ.get("SPACE_PORT", 7860))318 demo.launch(319 server_name="0.0.0.0",320 server_port=port,321 share=False,322 show_error=True,323 )324 else:325 print("Gradio未安装,请运行: pip install gradio")326 