calculus-agent / backend /tests /test_real_integration.py
Đỗ Hải Nam
feat(backend): core multi-agent orchestration and API
ba5110e
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())