228 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Python
		
	
	
	
| #!/usr/bin/env python3
 | ||
| """
 | ||
| 炼妖壶 (Lianyaohu) - 稷下学宫AI辩论系统
 | ||
| 主Streamlit应用入口
 | ||
| 
 | ||
| 重构版本:
 | ||
| - 清晰的模块化结构
 | ||
| - 统一的配置管理
 | ||
| - 安全的密钥处理
 | ||
| """
 | ||
| 
 | ||
| import streamlit as st
 | ||
| import sys
 | ||
| from pathlib import Path
 | ||
| 
 | ||
| # 添加项目根目录到Python路径
 | ||
| project_root = Path(__file__).parent.parent
 | ||
| sys.path.insert(0, str(project_root))
 | ||
| 
 | ||
| def configure_page():
 | ||
|     """配置页面基本设置"""
 | ||
|     st.set_page_config(
 | ||
|         page_title="炼妖壶 - 稷下学宫AI辩论系统",
 | ||
|         page_icon="🏛️",
 | ||
|         layout="wide",
 | ||
|         initial_sidebar_state="expanded"
 | ||
|     )
 | ||
| 
 | ||
| def show_header():
 | ||
|     """显示页面头部"""
 | ||
|     st.title("🏛️ 炼妖壶 - 稷下学宫AI辩论系统")
 | ||
|     st.markdown("**基于中国哲学传统的多AI智能体辩论平台**")
 | ||
|     
 | ||
|     # 显示系统状态
 | ||
|     col1, col2, col3 = st.columns(3)
 | ||
|     with col1:
 | ||
|         st.metric("系统状态", "🟢 运行中")
 | ||
|     with col2:
 | ||
|         st.metric("AI模型", "OpenRouter")
 | ||
|     with col3:
 | ||
|         # 更新数据源展示,加入 OpenBB
 | ||
|         st.metric("数据源", "RapidAPI + OpenBB")
 | ||
| 
 | ||
| def show_sidebar():
 | ||
|     """显示侧边栏"""
 | ||
|     with st.sidebar:
 | ||
|         st.markdown("## 🎛️ 控制面板")
 | ||
|         
 | ||
|         # 系统信息
 | ||
|         st.markdown("### 📊 系统信息")
 | ||
|         st.info("**版本**: v2.0 (重构版)")
 | ||
|         st.info("**状态**: 迁移完成")
 | ||
|         
 | ||
|         # 配置检查
 | ||
|         st.markdown("### 🔧 配置状态")
 | ||
|         try:
 | ||
|             from config.doppler_config import validate_config
 | ||
|             if validate_config():
 | ||
|                 st.success("✅ 配置正常")
 | ||
|             else:
 | ||
|                 st.error("❌ 配置异常")
 | ||
|         except Exception as e:
 | ||
|             st.warning(f"⚠️ 配置检查失败: {str(e)}")
 | ||
|         
 | ||
|         # 快速操作
 | ||
|         st.markdown("### ⚡ 快速操作")
 | ||
|         if st.button("🧪 测试API连接"):
 | ||
|             test_api_connections()
 | ||
|         
 | ||
|         if st.button("🏛️ 启动八仙论道"):
 | ||
|             start_jixia_debate()
 | ||
| 
 | ||
| def test_api_connections():
 | ||
|     """测试API连接"""
 | ||
|     with st.spinner("正在测试API连接..."):
 | ||
|         try:
 | ||
|             from scripts.api_health_check import test_openrouter_api, test_rapidapi_connection
 | ||
|             
 | ||
|             openrouter_ok = test_openrouter_api()
 | ||
|             rapidapi_ok = test_rapidapi_connection()
 | ||
|             
 | ||
|             if openrouter_ok and rapidapi_ok:
 | ||
|                 st.success("✅ 所有API连接正常")
 | ||
|             else:
 | ||
|                 st.error("❌ 部分API连接失败")
 | ||
|         except Exception as e:
 | ||
|             st.error(f"❌ API测试异常: {str(e)}")
 | ||
| 
 | ||
| def start_jixia_debate():
 | ||
|     """启动稷下学宫辩论"""
 | ||
|     with st.spinner("正在启动稷下学宫八仙论道..."):
 | ||
|         try:
 | ||
|             from config.settings import get_rapidapi_key
 | ||
|             from src.jixia.engines.perpetual_engine import JixiaPerpetualEngine
 | ||
|             
 | ||
|             api_key = get_rapidapi_key()
 | ||
|             engine = JixiaPerpetualEngine(api_key)
 | ||
|             
 | ||
|             # 运行辩论
 | ||
|             results = engine.simulate_jixia_debate('TSLA')
 | ||
|             
 | ||
|             st.success("✅ 八仙论道完成")
 | ||
|             st.json(results)
 | ||
|         except Exception as e:
 | ||
|             st.error(f"❌ 辩论启动失败: {str(e)}")
 | ||
| 
 | ||
| def main():
 | ||
|     """主函数"""
 | ||
|     configure_page()
 | ||
|     show_header()
 | ||
|     show_sidebar()
 | ||
|     
 | ||
|     # 主内容区域
 | ||
|     st.markdown("---")
 | ||
|     
 | ||
|     # 选项卡(新增 OpenBB 数据页签和AI协作页签)
 | ||
|     tab1, tab2, tab3, tab4, tab5 = st.tabs(["🏛️ 稷下学宫", "🌍 天下体系", "📊 数据分析", "📈 OpenBB 数据", "🤖 AI协作"])
 | ||
|     
 | ||
|     with tab1:
 | ||
|         st.markdown("### 🏛️ 稷下学宫 - 八仙论道")
 | ||
|         st.markdown("**多AI智能体辩论系统,基于中国传统八仙文化**")
 | ||
|         
 | ||
|         # 辩论模式选择
 | ||
|         debate_mode = st.selectbox(
 | ||
|             "选择辩论模式",
 | ||
|             ["ADK模式 (太上老君主持)", "传统模式 (RapidAPI数据)"]
 | ||
|         )
 | ||
| 
 | ||
|         if debate_mode == "ADK模式 (太上老君主持)":
 | ||
|             from app.tabs.adk_debate_tab import render_adk_debate_tab
 | ||
|             render_adk_debate_tab()
 | ||
|         
 | ||
|         else:
 | ||
|             # 传统模式
 | ||
|             col1, col2 = st.columns([2, 1])
 | ||
|             with col1:
 | ||
|                 topic = st.text_input("辩论主题 (股票代码)", value="TSLA")
 | ||
|             with col2:
 | ||
|                 if st.button("🎭 开始辩论", type="primary"):
 | ||
|                     start_debate_session(topic)
 | ||
|         
 | ||
|         # 显示辩论历史
 | ||
|         if 'debate_history' in st.session_state:
 | ||
|             st.markdown("#### 📜 辩论记录")
 | ||
|             for record in st.session_state.debate_history[-3:]:  # 显示最近3次
 | ||
|                 with st.expander(f"🎭 {record['topic']} - {record['time']}"):
 | ||
|                     st.json(record['results'])
 | ||
|     
 | ||
|     with tab2:
 | ||
|         st.markdown("### 🌍 天下体系分析")
 | ||
|         try:
 | ||
|             from app.tabs.tianxia_tab import render_tianxia_tab
 | ||
|             render_tianxia_tab()
 | ||
|         except Exception as e:
 | ||
|             st.error(f"❌ 天下体系模块加载失败: {str(e)}")
 | ||
|     
 | ||
|     with tab3:
 | ||
|         st.markdown("### 📊 数据分析")
 | ||
|         st.info("🚧 数据分析模块开发中...")
 | ||
|         
 | ||
|         # 显示系统统计
 | ||
|         try:
 | ||
|             from config.settings import get_rapidapi_key
 | ||
|             from src.jixia.engines.perpetual_engine import JixiaPerpetualEngine
 | ||
|             
 | ||
|             api_key = get_rapidapi_key()
 | ||
|             engine = JixiaPerpetualEngine(api_key)
 | ||
|             stats = engine.get_usage_stats()
 | ||
|             
 | ||
|             col1, col2, col3 = st.columns(3)
 | ||
|             with col1:
 | ||
|                 st.metric("API调用总数", stats['total_calls'])
 | ||
|             with col2:
 | ||
|                 st.metric("活跃API数", f"{stats['active_apis']}/{stats['total_apis']}")
 | ||
|             with col3:
 | ||
|                 st.metric("未使用API", stats['unused_count'])
 | ||
|                 
 | ||
|         except Exception as e:
 | ||
|             st.warning(f"⚠️ 无法加载统计数据: {str(e)}")
 | ||
| 
 | ||
|     with tab5:
 | ||
|         st.markdown("### 🤖 AI协作")
 | ||
|         try:
 | ||
|             from app.tabs.ai_collaboration_tab import main as ai_collaboration_main
 | ||
|             ai_collaboration_main()
 | ||
|         except Exception as e:
 | ||
|             st.error(f"❌ AI协作模块加载失败: {str(e)}")
 | ||
| 
 | ||
| def start_debate_session(topic: str):
 | ||
|     """启动辩论会话"""
 | ||
|     if not topic:
 | ||
|         st.error("请输入辩论主题")
 | ||
|         return
 | ||
|     
 | ||
|     with st.spinner(f"🏛️ 八仙正在就 {topic} 展开论道..."):
 | ||
|         try:
 | ||
|             from config.settings import get_rapidapi_key
 | ||
|             from src.jixia.engines.perpetual_engine import JixiaPerpetualEngine
 | ||
|             from datetime import datetime
 | ||
|             
 | ||
|             api_key = get_rapidapi_key()
 | ||
|             engine = JixiaPerpetualEngine(api_key)
 | ||
|             
 | ||
|             # 运行辩论
 | ||
|             results = engine.simulate_jixia_debate(topic)
 | ||
|             
 | ||
|             # 保存到会话状态
 | ||
|             if 'debate_history' not in st.session_state:
 | ||
|                 st.session_state.debate_history = []
 | ||
|             
 | ||
|             st.session_state.debate_history.append({
 | ||
|                 'topic': topic,
 | ||
|                 'time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
 | ||
|                 'results': {name: {'success': result.success, 'api_used': result.api_used} 
 | ||
|                            for name, result in results.items()}
 | ||
|             })
 | ||
|             
 | ||
|             st.success(f"✅ 八仙论道完成!共有 {len(results)} 位仙人参与")
 | ||
|             
 | ||
|             # 显示结果摘要
 | ||
|             successful_debates = sum(1 for result in results.values() if result.success)
 | ||
|             st.info(f"📊 成功获取数据: {successful_debates}/{len(results)} 位仙人")
 | ||
|             
 | ||
|         except Exception as e:
 | ||
|             st.error(f"❌ 辩论启动失败: {str(e)}")
 | ||
| 
 | ||
| if __name__ == "__main__":
 | ||
|     main() |