acescripters

api.py

Nov 12th, 2025
515
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.79 KB | Source Code | 0 0
  1. #!/usr/bin/env python3
  2. # api.py - Fixed API Calls berdasarkan CupidHelper
  3. import time
  4. import requests
  5. import random
  6. from datetime import datetime
  7.  
  8. class APIManager:
  9.     def __init__(self):
  10.         self.apis = {
  11.             "groq": {
  12.                 "name": "Groq",
  13.                 "key": "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",
  14.                 "url": "https://api.groq.com/openai/v1/chat/completions",
  15.                 "model": "llama-3.1-8b-instant",  # 🆕 Model yang betul
  16.                 "active": True,
  17.                 "last_used": None
  18.             },
  19.             "deepseek": {
  20.                 "name": "DeepSeek",
  21.                 "key": "sk-018cc05d3a574de68947e669673fdf65",
  22.                 "url": "https://api.deepseek.com/chat/completions",  # 🆕 URL yang betul
  23.                 "model": "deepseek-chat",
  24.                 "active": True,
  25.                 "last_used": None
  26.             },
  27.             "gemini": {
  28.                 "name": "Gemini",
  29.                 "key": "AIzaSyDVoBSniv6CtvNZDPxvPNRPfRXWvj3304M",
  30.                 "url": "https://generativelanguage.googleapis.com/v1/models/gemini-2.0-flash:generateContent",  # 🆕 URL yang betul
  31.                 "active": True,
  32.                 "last_used": None
  33.             }
  34.         }
  35.  
  36.         self.request_history = []
  37.         self.fallback_order = ["groq", "deepseek", "gemini"]  # 🆕 Order berdasarkan CupidHelper
  38.  
  39.     def get_ai_response(self, prompt, bot_name="www", max_retries=2):
  40.         """Get AI response dengan fallback - FIXED"""
  41.         print(f"🤖 [{bot_name}] Requesting AI response...")
  42.  
  43.         for attempt in range(max_retries):
  44.             for api_name in self.fallback_order:
  45.                 if self.apis[api_name]["active"]:
  46.                     try:
  47.                         response = self._call_api(api_name, prompt)
  48.                         if response and len(response.strip()) > 3:
  49.                             return response
  50.                     except Exception as e:
  51.                         print(f"❌ {api_name} failed: {e}")
  52.                         self.apis[api_name]["active"] = False
  53.  
  54.             if attempt < max_retries - 1:
  55.                 print(f"🔄 Attempt {attempt + 1} failed, retrying...")
  56.                 time.sleep(1)
  57.  
  58.         return "Maaf, semua API sedang sibuk. Cuba sebentar lagi."
  59.  
  60.     def _call_api(self, api_name, prompt):
  61.         """Call specific API - FIXED berdasarkan CupidHelper"""
  62.         api_config = self.apis[api_name]
  63.  
  64.         try:
  65.             if api_name == "groq":
  66.                 return self._call_groq(prompt, api_config)
  67.             elif api_name == "deepseek":
  68.                 return self._call_deepseek(prompt, api_config)
  69.             elif api_name == "gemini":
  70.                 return self._call_gemini(prompt, api_config)
  71.         except Exception as e:
  72.             print(f"❌ {api_name} error: {e}")
  73.             raise
  74.  
  75.     def _call_groq(self, prompt, config):
  76.         """Call Groq API - FIXED"""
  77.         headers = {
  78.             "Authorization": f"Bearer {config['key']}",
  79.             "Content-Type": "application/json"
  80.         }
  81.  
  82.         data = {
  83.             "model": config["model"],  # 🆕 Gunakan model yang betul
  84.             "messages": [
  85.                 {
  86.                     "role": "user",
  87.                     "content": prompt
  88.                 }
  89.             ],
  90.             "temperature": 0.7,
  91.             "max_tokens": 150
  92.         }
  93.  
  94.         response = requests.post(config["url"], headers=headers, json=data, timeout=10)
  95.  
  96.         if response.status_code != 200:
  97.             raise Exception(f"HTTP {response.status_code}: {response.text}")
  98.  
  99.         result = response.json()
  100.         content = result["choices"][0]["message"]["content"].strip()
  101.  
  102.         config["last_used"] = time.time()
  103.         self._log_request("groq", True, len(content))
  104.  
  105.         return self._trim_response(content)
  106.  
  107.     def _call_deepseek(self, prompt, config):
  108.         """Call DeepSeek API - FIXED"""
  109.         headers = {
  110.             "Authorization": f"Bearer {config['key']}",
  111.             "Content-Type": "application/json"
  112.         }
  113.  
  114.         data = {
  115.             "model": config["model"],
  116.             "messages": [
  117.                 {
  118.                     "role": "user",
  119.                     "content": prompt
  120.                 }
  121.             ],
  122.             "temperature": 0.7,
  123.             "max_tokens": 150
  124.         }
  125.  
  126.         response = requests.post(config["url"], headers=headers, json=data, timeout=10)
  127.  
  128.         if response.status_code != 200:
  129.             raise Exception(f"HTTP {response.status_code}: {response.text}")
  130.  
  131.         result = response.json()
  132.         content = result["choices"][0]["message"]["content"].strip()
  133.  
  134.         config["last_used"] = time.time()
  135.         self._log_request("deepseek", True, len(content))
  136.  
  137.         return self._trim_response(content)
  138.  
  139.     def _call_gemini(self, prompt, config):
  140.         """Call Gemini API - FIXED"""
  141.         url = f"{config['url']}?key={config['key']}"
  142.  
  143.         data = {
  144.             "contents": [
  145.                 {
  146.                     "parts": [
  147.                         {"text": prompt}
  148.                     ]
  149.                 }
  150.             ],
  151.             "generationConfig": {
  152.                 "maxOutputTokens": 150,
  153.                 "temperature": 0.7
  154.             }
  155.         }
  156.  
  157.         response = requests.post(url, json=data, timeout=10)
  158.  
  159.         if response.status_code != 200:
  160.             raise Exception(f"HTTP {response.status_code}: {response.text}")
  161.  
  162.         result = response.json()
  163.         content = result["candidates"][0]["content"]["parts"][0]["text"].strip()
  164.  
  165.         config["last_used"] = time.time()
  166.         self._log_request("gemini", True, len(content))
  167.  
  168.         return self._trim_response(content)
  169.  
  170.     def _trim_response(self, text, max_length=200):
  171.         """Trim response to max length"""
  172.         if len(text) > max_length:
  173.             text = text[:max_length-3] + "..."
  174.         return text
  175.  
  176.     def _log_request(self, api_name, success, response_length):
  177.         """Log API requests"""
  178.         log_entry = {
  179.             "timestamp": datetime.now(),
  180.             "api": api_name,
  181.             "success": success,
  182.             "response_length": response_length
  183.         }
  184.  
  185.         self.request_history.append(log_entry)
  186.  
  187.         if len(self.request_history) > 50:
  188.             self.request_history.pop(0)
  189.  
  190.     def get_api_status(self):
  191.         """Get status of all APIs"""
  192.         status = {}
  193.         for api_name, config in self.apis.items():
  194.             status[api_name] = {
  195.                 "active": config["active"],
  196.                 "last_used": config["last_used"],
  197.                 "requests_count": len([r for r in self.request_history if r["api"] == api_name])
  198.             }
  199.         return status
  200.  
  201. # Global instance
  202. api_manager = APIManager()
Advertisement
Add Comment
Please, Sign In to add comment