File size: 2,257 Bytes
bb6d5ae
 
 
 
 
 
 
 
 
 
 
a8bc4f1
 
 
 
bb6d5ae
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import concurrent.futures
import time
import json
from typing import Dict, List, Any, Optional

import llm_agent

# Active agents for the MVM2 Parallel reasoning layer.
# For Hugging Face Spaces we default all agents to simulated mode so that
# the demo does not depend on external API keys or outbound network access.
AGENT_PROFILES = [
    {"name": "Gemini 2.0 Flash (Primary)", "use_real_api": True},
    {"name": "Llama 3 (Agentic Mode)", "use_real_api": True},
    {"name": "GPT-4 (Verification Layer)", "use_real_api": True},
    {"name": "Qwen-2.5-Math (Symbolic Focus)", "use_real_api": True},
]

def run_agent_orchestrator(problem: str) -> List[Dict[str, Any]]:
    """
    Dispatches the problem to heterogeneous LLM agents.
    """
    print(f"[Orchestrator] Dispatching to {len(AGENT_PROFILES)} Parallel Models...")
    results = []
    
    with concurrent.futures.ThreadPoolExecutor() as executor:
        future_to_agent = {
            executor.submit(llm_agent.LLMAgent(agent["name"], use_real_api=agent["use_real_api"]).generate_solution, problem): agent 
            for agent in AGENT_PROFILES
        }
        
        for future in concurrent.futures.as_completed(future_to_agent):
            agent_info = future_to_agent[future]
            try:
                raw_res = future.result()
                
                normalized_res = {
                    "Answer": str(raw_res.get("final_answer", raw_res.get("Answer", "ERROR"))),
                    "Reasoning Trace": raw_res.get("reasoning_trace", raw_res.get("Reasoning Trace", [])),
                    "Confidence Explanation": raw_res.get("confidence_explanation", raw_res.get("Confidence Explanation", ""))
                }
                
                results.append({
                    "agent": agent_info["name"],
                    "response": normalized_res
                })
                print(f"[OK] {agent_info['name']} completed reasoning.")
            except Exception as exc:
                print(f"[ERROR] {agent_info['name']} generated an exception: {exc}")
                
    return results

if __name__ == "__main__":
    test_out = run_agent_orchestrator("\\int_{0}^{\\pi} \\sin(x^{2}) \\, dx")
    print(json.dumps(test_out, indent=2))