/ 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())