Spaces:
Sleeping
Sleeping
| import asyncio | |
| import sys | |
| import os | |
| import json | |
| from dotenv import load_dotenv | |
| # Load real environment variables (API Keys) | |
| load_dotenv() | |
| # Add project root to path | |
| sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) | |
| from backend.agent.state import create_initial_state | |
| from backend.agent.nodes import planner_node, parallel_executor_node, synthetic_agent_node, reasoning_agent_node | |
| from langchain_core.messages import HumanMessage | |
| # Colors | |
| GREEN = "\033[92m" | |
| BLUE = "\033[94m" | |
| RED = "\033[91m" | |
| RESET = "\033[0m" | |
| def log(msg, color=RESET): | |
| print(f"{color}{msg}{RESET}") | |
| async def test_real_agent_flow(): | |
| log("🚀 STARTING REAL AGENT INTEGRATION TEST (NO MOCKS)", BLUE) | |
| log("⚠️ This will consume real API credits (LLM + Wolfram) and generate LangSmith traces.", BLUE) | |
| # Complex query to trigger Planner -> Executor -> Wolfram | |
| user_query = "Hãy tính đạo hàm của sin(x) và giải phương trình x^2 - 5x + 6 = 0" | |
| log(f"\n📝 User Input: '{user_query}'", RESET) | |
| state = create_initial_state(session_id="integration_test_live") | |
| state["messages"] = [HumanMessage(content=user_query)] | |
| # 1. PLANNER NODE | |
| log("\n1️⃣ Running Planner Node (Real LLM)...", BLUE) | |
| try: | |
| state = await planner_node(state) | |
| plan = state.get("execution_plan") | |
| if plan: | |
| log(f"✅ Plan created: {json.dumps(plan, indent=2, ensure_ascii=False)}", GREEN) | |
| else: | |
| log("⚠️ No plan generated (Direct response mode?)", RED) | |
| except Exception as e: | |
| log(f"❌ Planner Error: {e}", RED) | |
| return | |
| # 2. EXECUTOR NODE (If plan exists) | |
| if state["current_agent"] == "executor": | |
| log("\n2️⃣ Running Parallel Executor (Real Wolfram/Code)...", BLUE) | |
| try: | |
| state = await parallel_executor_node(state) | |
| results = state.get("question_results", []) | |
| log(f"✅ Execution complete. Got {len(results)} results.", GREEN) | |
| for r in results: | |
| log(f" - [{r['type'].upper()}] {r.get('content')[:30]}... -> {str(r.get('result'))[:50]}...", RESET) | |
| except Exception as e: | |
| log(f"❌ Executor Error: {e}", RED) | |
| return | |
| # 3. SYNTHESIZER | |
| log("\n3️⃣ Running Synthesizer (Real LLM)...", BLUE) | |
| try: | |
| state = await synthetic_agent_node(state) | |
| log("✅ Synthesis complete.", GREEN) | |
| except Exception as e: | |
| log(f"❌ Synthesizer Error: {e}", RED) | |
| return | |
| elif state["current_agent"] == "reasoning": | |
| # Fallback to direct reasoning | |
| log("\n2️⃣ Running Reasoning Agent (Direct LLM)...", BLUE) | |
| state = await reasoning_agent_node(state) | |
| log("\n🎯 FINAL AGENT RESPONSE:", BLUE) | |
| print("-" * 50) | |
| print(state.get("final_response")) | |
| print("-" * 50) | |
| log("\n✅ Test Finished. Check LangSmith for trace 'integration_test_live'.", GREEN) | |
| if __name__ == "__main__": | |
| if not os.getenv("GROQ_API_KEY"): | |
| log("❌ GROQ_API_KEY not found in env. Cannot run real test.", RED) | |
| else: | |
| asyncio.run(test_real_agent_flow()) | |