/ cloud_orchestrator.py
cloud_orchestrator.py
1 #!/usr/bin/env python3 2 """ 3 CLOUD AI ORCHESTRATOR USING FREE APIS 4 """ 5 6 import os 7 import sys 8 import asyncio 9 import aiohttp 10 import json 11 import time 12 from datetime import datetime 13 14 class CloudOrchestrator: 15 def __init__(self): 16 self.apis = { 17 "openrouter": { 18 "url": "https://openrouter.ai/api/v1/chat/completions", 19 "headers": {"Authorization": f"Bearer {os.getenv('OPENROUTER_API_KEY')}"}, 20 "model": "mistralai/mistral-7b-instruct:free" 21 }, 22 "groq": { 23 "url": "https://api.groq.com/openai/v1/chat/completions", 24 "headers": {"Authorization": f"Bearer {os.getenv('GROQ_API_KEY')}"}, 25 "model": "mixtral-8x7b-32768" 26 } 27 } 28 29 async def call_api(self, api_name: str, prompt: str) -> str: 30 """Call a specific API""" 31 if api_name not in self.apis: 32 return None 33 34 config = self.apis[api_name] 35 headers = config["headers"].copy() 36 headers["Content-Type"] = "application/json" 37 38 data = { 39 "model": config["model"], 40 "messages": [{"role": "user", "content": prompt}], 41 "max_tokens": 300 42 } 43 44 try: 45 timeout = aiohttp.ClientTimeout(total=15) 46 async with aiohttp.ClientSession(timeout=timeout) as session: 47 async with session.post(config["url"], headers=headers, json=data) as response: 48 if response.status == 200: 49 result = await response.json() 50 return result["choices"][0]["message"]["content"] 51 else: 52 print(f" ā ļø {api_name} error: {response.status}") 53 return None 54 except Exception as e: 55 print(f" ā ļø {api_name} failed: {str(e)[:50]}") 56 return None 57 58 async def orchestrate(self, query: str) -> dict: 59 """Orchestrate across available APIs""" 60 print(f"\nš Processing: {query[:60]}...") 61 62 results = {} 63 tasks = [] 64 65 # Try both APIs in parallel 66 for api_name in self.apis.keys(): 67 task = self.call_api(api_name, query) 68 tasks.append((api_name, task)) 69 70 for api_name, task in tasks: 71 result = await task 72 if result: 73 results[api_name] = result 74 print(f"ā {api_name.upper()}: Got response") 75 76 # Combine results if we got multiple 77 if len(results) == 0: 78 final = "No cloud APIs responded. Try local fallback." 79 elif len(results) == 1: 80 final = list(results.values())[0] 81 else: 82 # Combine the best parts of each 83 responses = list(results.values()) 84 final = f"Combined from {len(responses)} sources:\n\n" 85 for i, resp in enumerate(responses, 1): 86 final += f"Source {i}: {resp[:200]}...\n\n" 87 88 return { 89 "query": query, 90 "responses": results, 91 "final_answer": final, 92 "timestamp": datetime.now().isoformat(), 93 "apis_used": list(results.keys()) 94 } 95 96 async def main(): 97 if len(sys.argv) < 2: 98 print("Usage: python cloud_orchestrator.py \"Your query here\"") 99 sys.exit(1) 100 101 query = " ".join(sys.argv[1:]) 102 103 print("\n" + "="*60) 104 print("š CLOUD AI ORCHESTRATOR") 105 print("="*60) 106 print("Using: OpenRouter (free) + Groq (free)") 107 print("="*60) 108 109 orchestrator = CloudOrchestrator() 110 start_time = time.time() 111 result = await orchestrator.orchestrate(query) 112 elapsed = time.time() - start_time 113 114 print("\n" + "="*60) 115 print("ā COMPLETE") 116 print("="*60) 117 print(f"Query: {result['query'][:80]}...") 118 print(f"Time: {elapsed:.1f}s") 119 print(f"APIs used: {', '.join(result['apis_used']) if result['apis_used'] else 'None'}") 120 print("\nšÆ ANSWER:") 121 print("="*60) 122 print(result['final_answer']) 123 print("="*60) 124 125 # Save result 126 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") 127 filename = f"cloud_result_{timestamp}.json" 128 with open(filename, "w") as f: 129 json.dump(result, f, indent=2) 130 print(f"\nš¾ Saved to: {filename}") 131 132 if __name__ == "__main__": 133 asyncio.run(main())