""" 交互式 CLI —— 四层架构自适应分析 用法: python3 cli.py [数据库路径] """ import os import sys sys.path.insert(0, os.path.dirname(__file__)) from config import DB_PATH, LLM_CONFIG, MAX_EXPLORATION_ROUNDS from agent import DataAnalysisAgent def print_help(): print(""" 可用命令: <问题> 分析一个问题 rounds= <问题> 设置探索轮数 schema 查看数据库 Schema history 查看分析历史 audit 查看 SQL 审计日志 clear 清空分析历史 help 显示帮助 quit / q 退出 """) def main(): db_path = sys.argv[1] if len(sys.argv) > 1 else DB_PATH if not os.path.exists(db_path): print(f"❌ 数据库不存在: {db_path}") print(f" 请先运行 python3 demo.py 创建示例数据库,或指定已有数据库路径") sys.exit(1) if not LLM_CONFIG["api_key"]: print("⚠️ 未配置 LLM_API_KEY,请先设置环境变量:") print(" export LLM_API_KEY=sk-xxx") print(" export LLM_BASE_URL=https://api.openai.com/v1 # 或 Ollama 等") print(" export LLM_MODEL=gpt-4o") sys.exit(1) # 初始化 Agent agent = DataAnalysisAgent(db_path) print("=" * 60) print(" 🤖 数据分析 Agent —— 四层架构") print("=" * 60) print(f"\n🔗 LLM: {LLM_CONFIG['model']} @ {LLM_CONFIG['base_url']}") print(f"🔄 最大探索轮数: {MAX_EXPLORATION_ROUNDS}") print(f"💾 数据库: {db_path}") print(f"\n💬 输入分析问题(help 查看命令)\n") while True: try: user_input = input("📊 > ").strip() except (EOFError, KeyboardInterrupt): print("\n👋 再见!") break if not user_input: continue cmd = user_input.lower() if cmd in ("quit", "exit", "q"): print("👋 再见!") break elif cmd == "help": print_help() continue elif cmd == "schema": print(agent.get_schema()) continue elif cmd == "history": print(agent.get_history()) continue elif cmd == "audit": print(agent.get_audit()) continue elif cmd == "clear": agent.clear_history() print("✅ 历史已清空") continue # 解析可选参数:rounds=3 max_rounds = MAX_EXPLORATION_ROUNDS question = user_input if "rounds=" in question.lower(): parts = question.split("rounds=") question = parts[0].strip() try: max_rounds = int(parts[1].strip().split()[0]) except (ValueError, IndexError): pass try: report = agent.analyze(question, max_rounds=max_rounds) print("\n" + report) print("\n" + "~" * 60) except Exception as e: print(f"\n❌ 分析出错: {e}") import traceback traceback.print_exc() # 退出时显示审计 print("\n📋 本次会话审计:") print(agent.get_audit()) if __name__ == "__main__": main()